AbstractRuntime 0.15.1__tar.gz → 0.15.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/CHANGELOG.md +15 -1
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/PKG-INFO +9 -3
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/README.md +8 -2
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/README.md +5 -2
- abstractruntime-0.15.1/docs/backlog/completed/0857_is_empty_accepts_lists.md → abstractruntime-0.15.2/docs/backlog/completed/0862_is_empty_accepts_lists.md +2 -2
- abstractruntime-0.15.2/docs/backlog/completed/0863_index_build_never_loses_a_run_created_during_it.md +48 -0
- abstractruntime-0.15.2/docs/backlog/proposed/0862_replay_view_message_artifacts_exclude_bookkeeping.md +48 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/llms-full.txt +8 -2
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/llms.txt +1 -1
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/pyproject.toml +1 -1
- abstractruntime-0.15.2/release-notes.md +11 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/json_files.py +42 -1
- abstractruntime-0.15.2/tests/test_json_file_run_store_index_build_race.py +93 -0
- abstractruntime-0.15.1/release-notes.md +0 -3
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/.github/workflows/ci.yml +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/.github/workflows/release.yml +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/.gitignore +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/ACKNOWLEDGMENTS.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/CODE_OF_CONDUCT.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/CONTRIBUTING.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/LICENSE +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/ROADMAP.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/SECURITY.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/README.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/adr/0001_layered_coupling_with_abstractcore.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/adr/0002_execution_modes_local_remote_hybrid.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/adr/0003_provenance_tamper_evident_hash_chain.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/adr/0004_runtime_owns_run_scoped_media_execution_truth.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/adr/0005_runtime_owns_abstractcore_host_discovery_queries.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/adr/0006_runtime_owns_durable_abstractcore_bloc_prompt_cache.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/adr/0007_runtime_relays_core_owned_model_residency_truth.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/adr/0008_integration_facades_are_the_complete_host_surface.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/adr/0010_one_replay_many_views.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/adr/0011_memory_facade_is_the_complete_host_surface_for_abstractmemory.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/adr/README.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/api.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/architecture.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/artifacts.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/automations.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/001_runtime_kernel.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0030_runtime_host_facades_for_comms_telegram_and_tool_specs.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0032_runtime_durable_outbound_comms_truth.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0033_runtime_host_local_prompt_cache_export_import_surface.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0035_model_residency_provider_truth_for_local_http_clients.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0037_visualflow_generate_music_node_compiler_parity.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0039_runtime_music_structure_prompt_bool_contract.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/003_wait_primitives.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0040_task_agnostic_local_residency_listing.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0041_runtime_hardware_extras_avoid_nonpermissive_document_stacks.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0042_core_vision_upscale_and_parameter_surface.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0043_runtime_vision_adapter_and_batch_surface.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/004_scheduler_driver.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/005_abstractcore_integration.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/006_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/007_provenance_hash_chain.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/009_artifact_store.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/010_examples_and_composition.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/011_subworkflow_support.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/012_run_store_query_and_scheduler_support.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/013_effect_retries_and_idempotency.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/016_runtime_aware_parameters.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/019_runtime_host_facade_for_core_operator_surfaces.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/020_runtime_gateway_install_boundary.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/021_runtime_gateway_env_namespace_cleanup.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/022_model_residency_control_plane.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/023_truthful_local_media_residency_boundaries.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/024_runtime_owned_run_scoped_media_execution.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/026_runtime_host_discovery_facade_for_core_catalogs.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/027_runtime_durable_bloc_prompt_cache_facade.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/028_runtime_bloc_kv_lifecycle_and_pruning.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/029_runtime_music_generation_and_discovery_via_abstractcore.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0846_mlx_instance_scheduling_and_execution_controls.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0847_automations_v1_controller_contracts_occurrences_triggers.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0851_per_account_voice_stores.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0852_capability_refusals_are_not_retried.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0855_prefix_stability_contract_of_consecutive_llm_calls.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/0856_memory_facade_and_ledger_provenance.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/001_integrations_abstractcore.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/001_runtime_kernel.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/002_persistence_and_ledger.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/002_snapshots_bookmarks.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/0034_agent_runtime_convenience_constructor.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/003_provenance_ledger_chain.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/003_wait_resume_and_scheduler.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/004_effect_handlers_and_integrations.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/004_tests.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/005_docs_updates.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/005_examples_and_composition.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/006_ai_fingerprint_and_provenance.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/DEPRECATED_README.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/README.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/deprecated/abstractruntime_docs_final_02a7373b.plan.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/0070_standalone_wui_browser_session_security_contract.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/008_signatures_and_keys.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/014_remote_tool_worker_executor.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/017_limit_warnings_and_observability.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/018_workspace_access_policy_for_media_and_tools.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/0233_real_run_cancellation.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/025_runtime_retention_and_purge_contract.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/026_context_checkpoint_self_compression.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/027_quote_provenance_discipline.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/028_selective_artifact_rehydration.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/0845_session_prompt_cache_resume_and_purge_contract.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/0848_automations_v2_external_event_inbox_and_run_triggers.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/0853_session_tool_policy_before_the_approval_wait.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/0854_replay_view.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/0857_entity_direct_memory_writes_provenance.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/0858_typed_runs_run_type_stamped_at_start.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/0859_replay_view_ephemeral_text_deltas.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_portability/0065_portable_process_and_lock_layer.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_portability/0066_portable_io_and_media_reader.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_portability/README.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0044_meta_analysis_record.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0045_crash_replay_harness_and_ordering_invariant.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0046_per_run_driver_exclusion.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0047_indexed_idempotency_lookup.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0048_durable_io_unification.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0049_llm_client_mechanical_split.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0050_control_sidecar_all_writers.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0051_runtime_owned_durable_event_mailbox.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0052_sync_store_event_loop_tripwire.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0053_bounded_run_vars_growth.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0054_runtime_health_counters.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0055_jsonl_store_honesty.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0064_prompt_cache_fingerprint_stability.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0067_durable_write_discipline.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/0068_hot_path_store_reads.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/planned/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/0031_runtime_tool_spec_adapters_for_gateway_and_mcp.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/0036_local_media_residency_bridge_to_core_residency.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/0038_core_server_pool_residency_affinity.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/0069_document_renderer_professional_figures.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/0849_conversation_search_tool_usage_outputs_and_thinking.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/0850_growing_automation_history_out_of_the_controller_ledger.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/0860_replay_view_stop_wording_from_the_ledger.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/0861_replay_view_activity_tool_sandbox_and_call_timings.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0056_schema_version_and_quarantine_loading.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0057_trust_boundary_stamp_registry.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0058_terminal_run_archival_helper.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0059_memory_span_handler_extraction.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0060_visualflow_compiler_decomposition.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0061_root_api_deprecation_machinery.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0062_dependency_honesty_extras.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/0063_b3_envelope_lane_unification.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/proposed/runtime_systemic_reliability/README.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/email.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/entity-runtime.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/evidence.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/faq.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/getting-started.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/integrations/abstractcore.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/integrations/abstractmemory.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/limits.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/manual_testing.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/mcp-worker.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/proposal.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/provenance.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/replay.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/snapshots.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/tool-approval.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/tools-comms.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/troubleshooting.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/workflow-bundles.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/examples/01_hello_world.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/examples/02_ask_user.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/examples/03_wait_until.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/examples/04_multi_step.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/examples/05_persistence.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/examples/06_llm_integration.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/examples/07_react_agent.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/examples/README.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/mkdocs.yml +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/pytest.ini +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/scripts/backfill_diary_edges.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/scripts/generate_llms_full.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/scripts/regen_replay_conformance.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automation_queries.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/adapters.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/attention.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/bundle.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/bundles/automation-controller/flows/controller.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/bundles/automation-controller/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/commands.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/consumers.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/controller.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/ledger.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/models.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/samples.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/service.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/automations/wakes.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/conversation_search.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/config.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/effect_cancellation.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/event_keys.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/health.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/live_deltas.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/models.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/policy.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/progress_channel.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/publish.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/run_attribution.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/run_identity.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/run_lifecycle.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/run_origin.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/runtime.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/spec.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/step_context.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/tool_scope.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/core/vars.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/documents/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/documents/charts.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/documents/docx.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/documents/pdf.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/email/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/email/actions.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/email/automations.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/email/binding.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/email/feeder.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/email/frame.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/email/inbox.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/evidence/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/evidence/recorder.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/history_bundle.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/act_only.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/chat.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/communities.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/diary.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/digest.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/entity_runtime.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/fingerprint.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/lease.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/life.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/memory_reader.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/night_voice.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/phase_graph.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/phase_spec.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/prelude.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/prompt_overlay.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/reflection.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/spec/entity_phases.vendored.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/substrate.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/tool_effects.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/tool_policy.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/tools.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/identity/visit_workflow.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/agora_tools.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/command_sandbox_host.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/comms_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/config_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/constants.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/data_registry_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/default_tools.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/discovery_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/discovery_queries.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/effect_handlers.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/email_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/embeddings_client.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/factory.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/host_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/llm_client.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/local_helper_tools.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/logging.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/mcp_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/mcp_worker.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/media_subprocess.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/observability.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/output_specs.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/run_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/server_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/session_attachments.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/structured_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/summarizer.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/telegram_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/tool_effects.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/tool_executor.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/tool_inventory_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/voice_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/voice_library.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractcore/workspace_scoped_tools.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractmemory/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractmemory/brain_handlers.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractmemory/effect_handlers.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractmemory/identity_support.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractmemory/memory_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/integrations/abstractmemory/seam_handlers.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/mail_verbs.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/memory/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/memory/active_context.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/memory/active_memory.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/memory/compaction.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/memory/kg_packets.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/memory/memact_composer.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/memory/recall_levels.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/memory/token_budget.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/rendering/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/rendering/agent_trace_report.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/rendering/json_stringify.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a2_delegated_approval_completed/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a_delegated_child_approval/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a_delegated_child_approval/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a_delegated_child_approval/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/a_delegated_child_approval/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/b_timer_without_resume/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/b_timer_without_resume/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/b_timer_without_resume/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/b_timer_without_resume/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/c_parallel_tool_batch/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/d_cancellation/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/d_cancellation/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/d_cancellation/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/d_cancellation/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e2_structured_repeated_node/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e_structured_output_agents/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e_structured_output_agents/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e_structured_output_agents/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/e_structured_output_agents/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/f_windowed_slim/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/f_windowed_slim/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/f_windowed_slim/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/f_windowed_slim/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/g_ask_user/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/g_ask_user/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/g_ask_user/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/g_ask_user/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/h_denied_approval/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/h_denied_approval/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/h_denied_approval/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/h_denied_approval/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/i_wait_kinds/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/i_wait_kinds/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/i_wait_kinds/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/i_wait_kinds/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/j_event_answered_then_pause/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/k_nested_delegation/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/k_nested_delegation/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/k_nested_delegation/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/k_nested_delegation/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/l_answer_then_completion/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/l_answer_then_completion/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/l_answer_then_completion/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/l_answer_then_completion/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/m_session_tool_policy/expected_view.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/m_session_tool_policy/manifest.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/m_session_tool_policy/records.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/conformance/m_session_tool_policy/runs.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/delta.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/executions.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/replay/view.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/scheduler/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/scheduler/convenience.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/scheduler/multi_store.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/scheduler/registry.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/scheduler/scheduler.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/session_history.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/session_turns.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/artifacts.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/base.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/change_ring.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/commands.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/in_memory.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/lease.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/ledger_chain.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/ledger_slim.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/observable.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/offloading.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/serialize.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/session_tool_policy.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/snapshots.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/sqlite.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/storage/steer_sidecar.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/triggers/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/triggers/cloudevents.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/triggers/connection_events.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/triggers/connections.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/triggers/email_received.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/triggers/event_frame.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/triggers/feed.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/triggers/manual.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/triggers/protocol.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/triggers/registry.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/triggers/schedule.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/triggers/webhook.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/turn_grounding.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/utils/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/utils/atomic_files.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/utils/file_filters.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/utils/workspace_paths.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/agent_adapter.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/context_adapter.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/control_adapter.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/effect_adapter.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/event_adapter.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/function_adapter.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/memact_adapter.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/subflow_adapter.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/adapters/variable_adapter.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/compiler.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/flow.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/agent_ids.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/builtins.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/code_executor.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/execution_metrics.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/executor.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/function_library.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/loop_back_check.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/loop_limit_lowering.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/models.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/multi_entry_lowering.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/pin_expressions.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/visualflow_compiler/visual/reroute_lowering.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/workflow_bundle/__init__.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/workflow_bundle/models.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/workflow_bundle/packer.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/workflow_bundle/reader.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/src/abstractruntime/workflow_bundle/registry.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/README.md +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/automation_harness.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/conftest.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/email_wp2_support.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/fixtures/feeds/atom.xml +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/fixtures/feeds/rdf-not-a-feed.xml +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/fixtures/feeds/rss1-malformed.xml +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/fixtures/feeds/rss1.xml +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/fixtures/feeds/rss2.xml +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/fixtures/schedule_v1_corpus.json +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/live_email/conftest.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/live_email/live_email_support.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/live_email/test_email_live_runtime.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/media_endpoint_profile_probe.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_abstractcore_comms_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_abstractcore_discovery_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_abstractcore_host_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_abstractcore_run_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_abstractcore_server_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_abstractcore_structured_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_abstractcore_telegram_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_active_consumers_index.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_active_context_policy.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_active_index.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_active_memory.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_agora_agent_alias_identity.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_agora_tools_http.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_analyze_media_addressing_and_walling.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_answer_user_effect.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_artifact_session_candidates.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_artifacts.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_calendar_schedule.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_commands.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_controller.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_controller_recovery.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_definition.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_discussion_isolation.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_email_results.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_growing_context.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_index.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_list_reads.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_named_policy_compiler.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_next_fire.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_occurrence_input_resolver.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_occurrence_recovery.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_replay_read_only.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_retry.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_session_turns.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_status.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_automation_tool_approval.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_browser_probe_target_walling.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_budget_law_no_unrequested_caps.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_capability_default_reasoning.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_chat_summarizer_integration.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_code_node_imports.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_code_node_restricted_python.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_command_sandbox_host_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_command_store.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_compaction_helpers.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_compaction_summarizer_route.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_config_facade_models_engines.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_config_facade_voice_input_hint.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_control_adapter_while.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_controller_bundle_packaged.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_conversation_search.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_crash_ordering_inversions.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_create_if_absent.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_data_registry_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_default_model_warmup_switch.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_default_tools_camera_gating.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_default_tools_comms_gating.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_default_tools_include_skim_files.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_default_tools_include_skim_folders.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_default_tools_include_skim_web.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_default_tools_search_files_executor.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_diary_capture.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_diary_write_rescue.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_directory_lease.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_disabled_toolsets_seam.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_discovery_survives_unbuildable_default.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_discovery_tts_unavailable_reason.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_discovery_voice_openai_api_key.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_discussion_session_anchor.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_document_markdown_tables.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_document_renderers_hr_quote.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_durable_toolsets.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_durable_write_discipline.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_e2e_tool_calls_idempotency_lmstudio.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_effect_cancellation.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_effect_issuance_idempotency.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_effect_payload_stays_json_serializable.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_election_consequence_teaching.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_email_binding_and_refiner.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_email_feeder_batched.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_email_feeder_flags.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_email_gate_fixes.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_email_inbox_and_trigger.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_email_received_mailbox_id.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_email_regate_fixes.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_email_review_fixes.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_email_self_trigger_loop.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_email_stream_consumers.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_email_toolset_and_walls.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_emergence_experiment.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_emit_event_uses_wait_index.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_emit_event_without_workflow_registry.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_endpoint_profile_media_end_to_end.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_endpoint_profile_media_in_process.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_endpoint_profile_media_specs_keep_provider.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_endpoint_profile_route_context.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_awake_memory_fixes.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_brain_effects.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_chat_driver.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_chat_tools_reflection.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_diary.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_execute_tool.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_fetch_url_tool.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_history_window.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_life_loop.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_memory_richness.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_phase_graph_conformance.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_react_visit_window.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_recent_memories.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_runtime.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_search_memory.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_sleep_bound_and_yield_attribution.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_substrate_resolution.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_visit_honesty.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_workspace_cap.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_entity_workspace_tools.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_event_index_cross_process.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_event_wait_index.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_every_path_bearing_tool_is_walled.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_evidence_recorder.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_evidence_recorder_post_policy_envelope.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_execute_command_output_offload.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_execution_capability_discovery.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_explicit_eject_other_clients.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_factory_default_retry_policy.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_factory_timeouts_default_to_abstractcore_config.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_format_repair_nudge.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_fresh_install_no_provider.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_gateway_facades_c4899.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_git_read_only_refiner.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_hf_process_residency_merge.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_history_window_multimodal.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_hot_path_store_reads.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_indexed_idempotency_lookup.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_integration_abstractcore.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_integrations_abstractcore.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_json_file_run_store_children_index.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_json_run_cache_bound.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_json_store_scan_memo.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_jsonl_ledger_recovery.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_jsonl_ledger_seq_cross_process.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_jsonl_row_index.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_kg_learn_and_recall_contract.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_ledger_chain.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_ledger_cursor_invariants.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_ledger_get_record.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_ledger_record_slimming.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_ledger_subscription.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_live_token_deltas.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_call_media_artifact_refs.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_call_media_artifact_refs_persist_across_restart.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_call_media_uses_source_path_label.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_call_payload_shape_refusal.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_call_prefix_stability_contract.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_call_requires_prompt.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_call_response_schema_normalization.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_call_structured_output_fallback.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_call_text_phase_progress.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_call_truncation_retry_contract.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_call_use_context_appends_turn.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_call_verbatim_payload_capture.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_client_grounding_tail.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_client_media_artifacts.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_client_system_context.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_client_tool_call_parsing.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_retry_classification.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_llm_streaming_on_token.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_local_helper_tool_exposure.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_local_residency_host_sweep.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_local_runtime_timeout_kwarg_policy.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_mail_verbs.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_mailbox_index.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_max_iterations_ceiling.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_mcp_remote_tool_executor.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_mcp_runs_untrusted_and_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_mcp_worker_logging.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_mcp_worker_security.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_mcp_worker_stdio.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_media_artifact_resolution.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_media_capability_default_routing.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_media_host_endpoint_resolver.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_media_only_requests_skip_text_client.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_media_subprocess.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memact_composer_from_kg_result.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_appraise_handler.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_communities.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_kg_assert_attributes_defaults.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_kg_packets.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_kg_predicate_aliasing.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_kg_query_packetization_restart.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_kg_query_recall_level_policy.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_kg_semantic_query_ranking.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_note_effect.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_query_effect.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_query_rich_filters.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_revise.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_scope_and_rehydrate_effect.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_seam_handlers.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_seam_sqlite_durability.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_step_provenance.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_memory_tag_effect.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_mlx_generation_serialization.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_mlx_process_residency_merge.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_model_eject_cancel.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_model_residency_clean_switch.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_model_residency_control_plane.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_model_residency_lock_and_context_estimate.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_multi_store_scheduler.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_multimodal_abstractcore_integration.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_native_mlx_application_wiring.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_native_mlx_execution_controls_live.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_native_tool_channel.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_night_voice.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_no_default_provider_refusal_ux.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_occurrence_named_inputs.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_occurrence_samples.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_offload_answer_chain_c4978.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_offloaded_node_traces_report_unknown_not_zero.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_offloading.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_packaging_extras.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_parallel_readonly_tool_execution.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_pause_resume.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_pdf_unicode_rendering.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_personal_cycle.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_phantom_attachment_index.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_phase_graph_artifact_control.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_phase_graph_obedience.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_phase_vocabulary_migration.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_pooled_client_strips_construction_cache_key.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_prompt_cache_export_import.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_prompt_cache_fingerprint_stability.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_prompt_cache_modules.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_prompt_cache_posture_inheritance.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_prompt_cache_thinking_and_prompt_only.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_prompt_overlay.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_provider_endpoint_profile_resolution.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_provider_pin_routing_isolation.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_publish_event.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_queryable_run_store.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_r12_workspace_sandbox.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_read_file_fallback_to_session_attachments.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_read_idle_threading.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_readoption_experiment.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_real_integration.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_realize_election.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_recall_levels_policy.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_remote_client_cancel.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_remote_llm_client.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_remote_speculation_defaults.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_rendering_agent_trace_report.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_rendering_json_stringify.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_replay_conformance.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_replay_conformance_package.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_replay_cursor_token.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_replay_delta_cost.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_replay_invariants.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_replay_review_findings.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_replay_tool_policy.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_report_branding.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_resident_media_generation.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_resume_concurrent_same_wait.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_retry_idempotency.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_run_history_bundle.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_run_index_workspace_root.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_run_mutation_lock.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_run_origin.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_run_scoped_tool_policy.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_run_store_change_token.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_run_tool_scope_ceiling.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_runtime_browser_session_boundary.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_runtime_config_max_output_tokens_fallback.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_runtime_default_provider_model_refresh.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_runtime_effect_invocation_trace.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_runtime_health_and_bounded_vars.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_runtime_install_boundary.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_runtime_llm_call_grounding_in_ledger.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_runtime_node_traces.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_runtime_start_seeds_tool_support.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_runtime_tick_step_gate.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_schedule_run.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_schedule_v1_corpus.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_schedule_v2_calendar.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_scheduler.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_send_email_refiner.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_send_email_self_default_policy.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_session_attachments_registry_and_open_tool.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_session_history.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_session_prompt_cache_attribution.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_session_prompt_cache_visibility.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_session_route_stamp.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_session_start_cost.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_session_tool_policy.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_shell_tool_exposure.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_snapshots.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_speculation_inheritance.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_speculation_reaches_provider_construction.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_sqlite_ledger_store.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_start_subworkflow_async_wait.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_start_subworkflow_inherit_context_merges_messages.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_start_subworkflow_workspace_inheritance.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_steer_sidecar.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_step_context.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_storage_deletion.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_streamed_voice_namespace.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_structured_output_schema_enum.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_subworkflow.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_terminal_effect_completion.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_terminal_resume_appends_ledger_completion.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_thinking_inheritance.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tick_completion_includes_output_in_ledger.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_approval_executor.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_approval_resume_executes.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_approval_wait_key_identity.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_calls_idempotency_keys.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_catalog.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_descriptor_registry.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_executor_argument_sanitization.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_executor_error_output_detection.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_executor_filename_alias.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_executor_kwarg_canonicalization.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_executor_read_file_aliases.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_executor_timeout.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_inventory_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_invoke_effect.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_policy_and_mounts.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_tool_wait_allowlist_safety.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_topic_election_world_model.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_trace_context_propagation.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_trigger_cloudevents.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_trigger_connection_listening.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_trigger_connections.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_trigger_feed.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_trigger_registry.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_trigger_schedule_math.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_trigger_webhook.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_trusted_run_index.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_turn_grounding_byte_stability.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_turn_grounding_carriers_a3.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_vars_query_effect.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visit_ab_fixture.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visit_midturn_elections.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visit_midturn_resume.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visit_workflow.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_agent_output_context_includes_messages.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_agent_skills_block_passthrough.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_agent_tool_observations_persist_across_restart.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_agent_use_context_inherits_attachments.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_agent_use_context_persists_tool_observations.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_agent_use_context_persists_turn.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_entity_memory_nodes.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_flow_end_effect_only_persistence.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_llm_call_partial_override.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_llm_call_schema_ref_resolution.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_loop_back_out_of_body.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_loop_limit_and_list_nodes.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_loop_limit_on_wire.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_memact_compose_node.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_memory_kg_query_outputs_propagate.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_memory_kg_resolve_outputs_propagate.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_multi_entry_loop_overrides.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_reroute_lowering.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_set_vars_pins.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_unknown_node_type_refuses.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visual_wait_event_deadline_passthrough.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_add_message_builtin.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_add_message_node_appends_to_active_context.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_agora_react_agent.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_call_tool_node.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_capability_routes_and_thinking.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_compiler_basic.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_context_and_builder_nodes.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_continue_on_error.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_edit_json_schema_node.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_event_inbox_react_agent.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_file_nodes_workspace.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_function_library.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_get_element_node.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_get_random_element_node.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_get_var_node.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_has_tools_builtin.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_llm_call_context_attachments_map_to_media.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_llm_call_multimodal_output.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_make_object_node.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_media_nodes.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_memory_effect_nodes.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_memory_source_pins.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_pin_expressions.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_prompt_only.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_random_nodes.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_schema_enum_switch.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_string_contains_replace.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_visualflow_tool_parameters_node.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_voice_library_facade.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_voice_openai_api_key_path.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_voice_stream_is_not_a_wait.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_w4_feelings_lens.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_wait_event_deadline.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_wait_event_prompt_metadata.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_wait_until_streak.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_wait_until_utc_normalization.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_workflow_bundle_registry.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_workspace_builtin_deny.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_workspace_context_allowed_workspaces.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_workspace_policy_absolute_reanchor.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_workspace_policy_allowlist_mode.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_workspace_policy_mount_virtual_paths.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_workspace_policy_tool_calls_persist_across_restart.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_workspace_prompt_context.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_workspace_read_only.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_workspace_writable_paths.py +0 -0
- {abstractruntime-0.15.1 → abstractruntime-0.15.2}/tests/test_write_chart.py +0 -0
|
@@ -7,11 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.15.2] - 2026-10-28
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **An index build no longer loses a run another store object creates during it** (`JsonFileRunStore`, backlog 0863).
|
|
15
|
+
A new run's `+` journal line is written before its file is published; a session/children/active index build that
|
|
16
|
+
marked the journal between the two and scanned the folder before the file landed missed the run: the listing until
|
|
17
|
+
the next reconciliation, the session and children indexes for the life of the store object (the reconciliation
|
|
18
|
+
repaired only the listing). Seen as a gateway that answered 404 `session_not_found` when archiving a session written
|
|
19
|
+
while it booted (AbstractGateway backlog 0963); a split-mode runner creating a run during the API process's boot
|
|
20
|
+
hit the same window. The first sync after a build now re-applies the journal's last 16 KiB before the build's mark
|
|
21
|
+
(`JOURNAL_REPLAY_TAIL_BYTES`; idempotent, once per build), and the reconciliation re-files a run it repairs into
|
|
22
|
+
the session and children indexes too (and drops a vanished one from them).
|
|
23
|
+
|
|
10
24
|
## [0.15.1] - 2026-10-28
|
|
11
25
|
|
|
12
26
|
### Changed
|
|
13
27
|
|
|
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.
|
|
28
|
+
- **Is Empty (`is_empty_string`) accepts lists.** Nothing (unset / `None`), an empty text, and a list, tuple, set or object with no elements are empty; whitespace, `0`, `False` and a list with any element are not. Before, a list was turned into text (`"[]"`) and was never empty, so a flow checking a list variable needed Array Length + Compare (operator QA 2026-10-28, the email-triage flow). Backlog 0862 (numbered 0857 in the 0.15.1 package). AbstractFlow lets the node take a list once this is released.
|
|
15
29
|
|
|
16
30
|
## [0.15.0] - 2026-10-28
|
|
17
31
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: AbstractRuntime
|
|
3
|
-
Version: 0.15.
|
|
3
|
+
Version: 0.15.2
|
|
4
4
|
Summary: AbstractRuntime: a durable graph runner designed to pair with AbstractCore.
|
|
5
5
|
Project-URL: AbstractCore (website), https://www.abstractcore.ai/
|
|
6
6
|
Project-URL: AbstractRuntime (GitHub), https://github.com/lpalbou/abstractruntime
|
|
@@ -55,14 +55,20 @@ 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.
|
|
58
|
+
**Version:** 0.15.2 • **Python:** 3.10+
|
|
59
59
|
|
|
60
60
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
61
61
|
|
|
62
|
+
## What's new in 0.15.2
|
|
63
|
+
|
|
64
|
+
- **Run index builds never lose a run created during them**: a run another process (or store object) wrote while
|
|
65
|
+
this store built its indexes is in the session and children indexes and the listing at once (before, the session
|
|
66
|
+
index could miss it for the life of the store object; backlog 0863).
|
|
67
|
+
|
|
62
68
|
## What's new in 0.15.1
|
|
63
69
|
|
|
64
70
|
- **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
|
|
71
|
+
node `is_empty_string`; backlog 0862).
|
|
66
72
|
|
|
67
73
|
## What's new in 0.15.0
|
|
68
74
|
|
|
@@ -4,14 +4,20 @@
|
|
|
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.
|
|
7
|
+
**Version:** 0.15.2 • **Python:** 3.10+
|
|
8
8
|
|
|
9
9
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
10
10
|
|
|
11
|
+
## What's new in 0.15.2
|
|
12
|
+
|
|
13
|
+
- **Run index builds never lose a run created during them**: a run another process (or store object) wrote while
|
|
14
|
+
this store built its indexes is in the session and children indexes and the listing at once (before, the session
|
|
15
|
+
index could miss it for the life of the store object; backlog 0863).
|
|
16
|
+
|
|
11
17
|
## What's new in 0.15.1
|
|
12
18
|
|
|
13
19
|
- **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
|
|
20
|
+
node `is_empty_string`; backlog 0862).
|
|
15
21
|
|
|
16
22
|
## What's new in 0.15.0
|
|
17
23
|
|
|
@@ -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:
|
|
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
|
-
|
|
|
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
|
-
#
|
|
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,20 @@ 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.
|
|
58
|
+
**Version:** 0.15.2 • **Python:** 3.10+
|
|
59
59
|
|
|
60
60
|
**Status:** pre-1.0 (API may evolve). For production use, pin versions and follow `CHANGELOG.md`.
|
|
61
61
|
|
|
62
|
+
## What's new in 0.15.2
|
|
63
|
+
|
|
64
|
+
- **Run index builds never lose a run created during them**: a run another process (or store object) wrote while
|
|
65
|
+
this store built its indexes is in the session and children indexes and the listing at once (before, the session
|
|
66
|
+
index could miss it for the life of the store object; backlog 0863).
|
|
67
|
+
|
|
62
68
|
## What's new in 0.15.1
|
|
63
69
|
|
|
64
70
|
- **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
|
|
71
|
+
node `is_empty_string`; backlog 0862).
|
|
66
72
|
|
|
67
73
|
## What's new in 0.15.0
|
|
68
74
|
|
|
@@ -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.
|
|
6
|
+
- Version: 0.15.2
|
|
7
7
|
- Ecosystem: [AbstractFramework](https://github.com/lpalbou/AbstractFramework) umbrella, integrates with [AbstractCore](https://github.com/lpalbou/abstractcore)
|
|
8
8
|
- Hard invariant: `RunState.vars` must be JSON-serializable (`src/abstractruntime/core/models.py`)
|
|
9
9
|
- Current AbstractCore baseline: base `abstractruntime` requires AbstractCore 2.30.0 or newer with its light install (remote providers, tools and the MCP worker, media routing); `abstractruntime[apple]` and `abstractruntime[gpu]` require AbstractCore's `apple` and `gpu` settings (`pyproject.toml`)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
### Fixed
|
|
2
|
+
|
|
3
|
+
- **An index build no longer loses a run another store object creates during it** (`JsonFileRunStore`, backlog 0863).
|
|
4
|
+
A new run's `+` journal line is written before its file is published; a session/children/active index build that
|
|
5
|
+
marked the journal between the two and scanned the folder before the file landed missed the run: the listing until
|
|
6
|
+
the next reconciliation, the session and children indexes for the life of the store object (the reconciliation
|
|
7
|
+
repaired only the listing). Seen as a gateway that answered 404 `session_not_found` when archiving a session written
|
|
8
|
+
while it booted (AbstractGateway backlog 0963); a split-mode runner creating a run during the API process's boot
|
|
9
|
+
hit the same window. The first sync after a build now re-applies the journal's last 16 KiB before the build's mark
|
|
10
|
+
(`JOURNAL_REPLAY_TAIL_BYTES`; idempotent, once per build), and the reconciliation re-files a run it repairs into
|
|
11
|
+
the session and children indexes too (and drops a vanished one from them).
|
|
@@ -130,6 +130,10 @@ class JsonFileRunStore(RunStore):
|
|
|
130
130
|
# A run temp file older than this is an orphan of a crashed writer (a
|
|
131
131
|
# save()/create_if_absent() publishes its temp within milliseconds).
|
|
132
132
|
STALE_TEMP_AGE_S = 600.0
|
|
133
|
+
# An index build re-applies the journal records written in this many bytes BEFORE its mark
|
|
134
|
+
# (`_mark_journal_start`; ~400 records): a run whose `+` line landed before the mark while its
|
|
135
|
+
# file was published after the folder scan is otherwise in neither (gateway backlog 0963).
|
|
136
|
+
JOURNAL_REPLAY_TAIL_BYTES = 16 * 1024
|
|
133
137
|
# Background reconciliation of the active index (foreign writers that bypass the journal).
|
|
134
138
|
ACTIVE_INDEX_RESCAN_S = 60.0
|
|
135
139
|
# Trusted run index: with the folder and the creation log unchanged since the last
|
|
@@ -701,6 +705,7 @@ class JsonFileRunStore(RunStore):
|
|
|
701
705
|
self._children_index = children
|
|
702
706
|
self._run_parent_index = run_parent
|
|
703
707
|
self._maybe_persist_scan_memo()
|
|
708
|
+
self._sync_indexes() # the journal tail before the mark (`_journal_replay_start`), at once
|
|
704
709
|
|
|
705
710
|
# --- creation journal ------------------------------------------------
|
|
706
711
|
|
|
@@ -745,7 +750,32 @@ class JsonFileRunStore(RunStore):
|
|
|
745
750
|
with self._journal_lock:
|
|
746
751
|
if self._journal_offset is None:
|
|
747
752
|
size = self._journal_size()
|
|
748
|
-
self._journal_offset = size if size is not None else 0
|
|
753
|
+
self._journal_offset = self._journal_replay_start(size) if size is not None else 0
|
|
754
|
+
|
|
755
|
+
def _journal_replay_start(self, size: int) -> int:
|
|
756
|
+
"""Where the first sync after an index build starts reading: the first record boundary
|
|
757
|
+
within JOURNAL_REPLAY_TAIL_BYTES before `size` (the journal's size at the mark).
|
|
758
|
+
|
|
759
|
+
`_save` appends a new run's `+id` BEFORE publishing its file (J53-1). A build that marks
|
|
760
|
+
the journal at `size` and then scans the folder misses a run whose line is before the
|
|
761
|
+
mark and whose file lands after the scan; re-applying the tail (idempotent: a `+` whose
|
|
762
|
+
file exists is filed, one whose file is still absent stays pending until it appears)
|
|
763
|
+
closes that window. Cost: one read of at most JOURNAL_REPLAY_TAIL_BYTES and one stat per
|
|
764
|
+
record in it, once per build. A record older than the tail is still caught by the
|
|
765
|
+
periodic reconciliation, which re-files what it repairs in every index and logs it."""
|
|
766
|
+
start = max(0, int(size) - int(self.JOURNAL_REPLAY_TAIL_BYTES))
|
|
767
|
+
if start == 0:
|
|
768
|
+
return 0
|
|
769
|
+
try:
|
|
770
|
+
with open(self._journal_path, "rb") as f:
|
|
771
|
+
f.seek(start)
|
|
772
|
+
chunk = f.read(int(size) - start)
|
|
773
|
+
except OSError:
|
|
774
|
+
logger.warning("JsonFileRunStore: creation journal tail unreadable; index build replays nothing before its mark",
|
|
775
|
+
exc_info=True)
|
|
776
|
+
return int(size)
|
|
777
|
+
boundary = chunk.find(b"\n") # records are framed `\n<op><run_id>\n`: start after a newline
|
|
778
|
+
return start + boundary + 1 if boundary >= 0 else int(size)
|
|
749
779
|
|
|
750
780
|
def _sync_indexes(self) -> None:
|
|
751
781
|
"""Apply journal lines appended since the last sync (one stat when
|
|
@@ -880,6 +910,7 @@ class JsonFileRunStore(RunStore):
|
|
|
880
910
|
self._session_index = index
|
|
881
911
|
self._run_session = by_run
|
|
882
912
|
self._maybe_persist_scan_memo()
|
|
913
|
+
self._sync_indexes() # the journal tail before the mark (`_journal_replay_start`), at once
|
|
883
914
|
|
|
884
915
|
def _update_session_index_on_save(self, run: RunState) -> None:
|
|
885
916
|
rid = str(run.run_id)
|
|
@@ -1324,6 +1355,7 @@ class JsonFileRunStore(RunStore):
|
|
|
1324
1355
|
t0 = time.monotonic()
|
|
1325
1356
|
settled_ns = time.time_ns() - int(float(self.RUN_INDEX_IN_FLIGHT_S) * 1e9)
|
|
1326
1357
|
repaired: List[str] = []
|
|
1358
|
+
refile: Dict[str, Dict[str, Any]] = {}
|
|
1327
1359
|
found: set[str] = set()
|
|
1328
1360
|
seen: set[str] = set()
|
|
1329
1361
|
for p in self._base.glob("run_*.json"):
|
|
@@ -1341,6 +1373,8 @@ class JsonFileRunStore(RunStore):
|
|
|
1341
1373
|
cur_tok = tuple(cur[0]) if cur is not None else None
|
|
1342
1374
|
if cur_tok is not None and cur_tok != prev_tok and cur_tok[0] < settled_ns:
|
|
1343
1375
|
repaired.append(rid)
|
|
1376
|
+
if fields is not None and rid:
|
|
1377
|
+
refile[rid] = fields
|
|
1344
1378
|
if fields is None:
|
|
1345
1379
|
continue
|
|
1346
1380
|
if self._is_active_status(fields.get("status")):
|
|
@@ -1349,6 +1383,13 @@ class JsonFileRunStore(RunStore):
|
|
|
1349
1383
|
self._sync_indexes()
|
|
1350
1384
|
dropped = self._scan_memo_prune(seen)
|
|
1351
1385
|
if complete:
|
|
1386
|
+
# A run the session/children indexes missed (gateway backlog 0963) is re-filed there
|
|
1387
|
+
# too, not only in the memo and the active set; a vanished one leaves them.
|
|
1388
|
+
for rid, fields in refile.items():
|
|
1389
|
+
self._index_fields_into_indexes(rid, fields)
|
|
1390
|
+
for rid in dropped:
|
|
1391
|
+
self._drop_from_children_index(rid)
|
|
1392
|
+
self._drop_from_session_index(rid)
|
|
1352
1393
|
repaired.extend(dropped)
|
|
1353
1394
|
self._note_reconcile(repaired, files=len(seen), seconds=time.monotonic() - t0)
|
|
1354
1395
|
return found
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""An index build never loses a run created by another store object while it builds (gateway backlog 0963).
|
|
2
|
+
|
|
3
|
+
`JsonFileRunStore._save` appends a new run's `+` journal line BEFORE it publishes the file. An index build
|
|
4
|
+
marks the journal, then scans the folder: a run whose line landed before the mark and whose file landed after
|
|
5
|
+
the scan was in neither, so `list_run_index(session_id=...)` missed it until the full reconciliation (600 s).
|
|
6
|
+
Seen as a flaky gateway test: archiving a session just written answered 404 `session_not_found` because the
|
|
7
|
+
gateway's boot thread warmed its store's index while the test wrote the runs.
|
|
8
|
+
"""
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
from abstractruntime.core.models import RunState, RunStatus
|
|
14
|
+
from abstractruntime.storage.json_files import JsonFileRunStore
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _run(rid: str, sid: str) -> RunState:
|
|
18
|
+
return RunState(run_id=rid, workflow_id="chat", status=RunStatus.COMPLETED, current_node="n", vars={}, session_id=sid)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _foreign_with_build_in_the_window(base: Path, service: JsonFileRunStore) -> JsonFileRunStore:
|
|
22
|
+
"""Another writer whose new run's `+` line is followed by `service`'s index build BEFORE the file
|
|
23
|
+
is published (the narrow window a busy machine hits by chance)."""
|
|
24
|
+
foreign = JsonFileRunStore(base)
|
|
25
|
+
real_append = foreign._journal_append
|
|
26
|
+
|
|
27
|
+
def append_then_build(line: str) -> None:
|
|
28
|
+
real_append(line)
|
|
29
|
+
if line.startswith("+"):
|
|
30
|
+
service.warm_session_index()
|
|
31
|
+
|
|
32
|
+
foreign._journal_append = append_then_build # type: ignore[method-assign]
|
|
33
|
+
return foreign
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_a_run_published_after_the_build_scanned_is_found(tmp_path: Path) -> None:
|
|
37
|
+
service = JsonFileRunStore(tmp_path)
|
|
38
|
+
foreign = _foreign_with_build_in_the_window(tmp_path, service)
|
|
39
|
+
foreign.save(_run("root-s1", "s1"))
|
|
40
|
+
assert (tmp_path / "run_root-s1.json").exists()
|
|
41
|
+
assert [r["run_id"] if isinstance(r, dict) else getattr(r, "run_id", r) for r in service.list_run_index(session_id="s1", limit=5)] == ["root-s1"]
|
|
42
|
+
assert "root-s1" in {r["run_id"] if isinstance(r, dict) else getattr(r, "run_id", r) for r in service.list_run_index(limit=50)}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def test_a_long_journal_replays_only_its_tail(tmp_path: Path) -> None:
|
|
46
|
+
"""The replay is bounded (one read of the tail, once per build) and still finds the run."""
|
|
47
|
+
filler = JsonFileRunStore(tmp_path)
|
|
48
|
+
for i in range(1200): # ~50 KB of records before the race, more than the replayed tail
|
|
49
|
+
filler._journal_append(f"+old-{i:05d}-0123456789abcdef0123456789abcdef")
|
|
50
|
+
service = JsonFileRunStore(tmp_path)
|
|
51
|
+
foreign = _foreign_with_build_in_the_window(tmp_path, service)
|
|
52
|
+
foreign.save(_run("root-s2", "s2"))
|
|
53
|
+
size = service._journal_path.stat().st_size
|
|
54
|
+
assert len(service.list_run_index(session_id="s2", limit=5)) == 1
|
|
55
|
+
start = service._journal_replay_start(size)
|
|
56
|
+
assert 0 < size - start <= JsonFileRunStore.JOURNAL_REPLAY_TAIL_BYTES
|
|
57
|
+
assert service._journal_path.read_bytes()[start - 1:start] == b"\n" # a record boundary
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def test_the_reconciliation_refiles_a_run_the_session_and_children_indexes_missed(tmp_path: Path) -> None:
|
|
61
|
+
"""Beyond the replayed tail (more than JOURNAL_REPLAY_TAIL_BYTES of records between the run's `+` line and
|
|
62
|
+
the build), the reconciliation repairs the session and children indexes, not only the listing memo."""
|
|
63
|
+
import os
|
|
64
|
+
import time
|
|
65
|
+
|
|
66
|
+
service = JsonFileRunStore(tmp_path)
|
|
67
|
+
service.warm_session_index() # the memo is complete: rescans are reconciliations
|
|
68
|
+
foreign = JsonFileRunStore(tmp_path)
|
|
69
|
+
real_append = foreign._journal_append
|
|
70
|
+
|
|
71
|
+
def flood_then_rebuild(line: str) -> None:
|
|
72
|
+
real_append(line)
|
|
73
|
+
if line.startswith("+root-"):
|
|
74
|
+
for i in range(600): # ~25 KB of other records after this one
|
|
75
|
+
real_append(f"+other-{i:05d}-0123456789abcdef0123456789abcdef")
|
|
76
|
+
service._session_index = None # the next query rebuilds (a fresh store object would)
|
|
77
|
+
service._children_index = None
|
|
78
|
+
service._journal_offset = None
|
|
79
|
+
service.warm_session_index()
|
|
80
|
+
|
|
81
|
+
foreign._journal_append = flood_then_rebuild # type: ignore[method-assign]
|
|
82
|
+
foreign.save(_run("root-s3", "s3"))
|
|
83
|
+
child = RunState(run_id="child-s3", workflow_id="c", status=RunStatus.COMPLETED, current_node="n", vars={},
|
|
84
|
+
session_id="s3", parent_run_id="root-s3")
|
|
85
|
+
JsonFileRunStore(tmp_path).save(child)
|
|
86
|
+
service._session_index.get("s3", {}).pop("root-s3", None) # what the build missed
|
|
87
|
+
settled = time.time() - JsonFileRunStore.RUN_INDEX_IN_FLIGHT_S - 1 # changed long enough ago to be a miss
|
|
88
|
+
p = tmp_path / "run_root-s3.json"
|
|
89
|
+
os.utime(p, (settled, settled))
|
|
90
|
+
with service._scan_memo_lock:
|
|
91
|
+
service._scan_memo.pop("root-s3", None)
|
|
92
|
+
service.rescan_active_index()
|
|
93
|
+
assert "root-s3" in (service._session_index or {}).get("s3", {})
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
### Changed
|
|
2
|
-
|
|
3
|
-
- **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.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/001_runtime_kernel.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/003_wait_primitives.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/004_scheduler_driver.md
RENAMED
|
File without changes
|
|
File without changes
|
{abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/006_snapshots_bookmarks.md
RENAMED
|
File without changes
|
|
File without changes
|
{abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/009_artifact_store.md
RENAMED
|
File without changes
|
|
File without changes
|
{abstractruntime-0.15.1 → abstractruntime-0.15.2}/docs/backlog/completed/011_subworkflow_support.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|