Skip to content

fix(runtime): recover poisoned activated-tool lock reads#7755

Open
77382104 wants to merge 1 commit into
zeroclaw-labs:masterfrom
77382104:fix/runtime-activated-tool-lock-poison-recovery
Open

fix(runtime): recover poisoned activated-tool lock reads#7755
77382104 wants to merge 1 commit into
zeroclaw-labs:masterfrom
77382104:fix/runtime-activated-tool-lock-poison-recovery

Conversation

@77382104

@77382104 77382104 commented Jun 16, 2026

Copy link
Copy Markdown

Summary

  • Base branch: master (all contributions)
  • What changed and why:
    • Replaced poisoned ActivatedToolSet lock panics in per-iteration tool-spec assembly with explicit poison recovery for read-only access so a prior lock poison no longer crashes the turn path.
    • Replaced the remaining poisoned ActivatedToolSet lock panic in deferred tool resolution during tool execution with the same read-recovery behavior so activated deferred tools remain usable after poison.
    • Added focused regression tests for both read paths to verify poisoned ActivatedToolSet locks are recovered and existing activated-tool behavior still works.
    • Preserved existing runtime behavior outside the poison case by limiting the change to read-only ActivatedToolSet access and leaving the rest of the turn/tool execution flow unchanged.
  • Scope boundary: This PR does not change how ActivatedToolSet is populated, does not replace the underlying mutex type, and does not add any new config, CLI, or persistence behavior.
  • Blast radius: Affects deferred MCP tool handling in zeroclaw-runtime, specifically turn-time tool spec assembly and activated-tool lookup during tool execution. Other runtime subsystems should be unaffected.
  • Linked issue(s): Resolves bug(runtime): handle poisoned activated-tool lock without panicking #7735
  • Labels: type: bug, risk: medium, size: S

Validation Evidence (required)

Local validation is the signal CI cannot replace. Run the full battery and paste literal output (tails, failures, warnings — not "all passed").

cargo fmt --all -- --check
cargo clippy --all-targets -- -D warnings
cargo test
  • Commands run and tail output:
    • cargo fmt --all -- --check

      • exited with code 0 and produced no output
    • cargo clippy --all-targets -- -D warnings

      • Finished dev profile [unoptimized + debuginfo] target(s) in 1.12s
    • cargo test

      Output
      running 227 tests
      test approval::tests::always_ask_overrides_auto_approve ... ok
      test approval::tests::approval_request_serde ... ok
      test approval::tests::approval_response_serde_roundtrip ... ok
      test approval::tests::always_ask_tools_always_prompt ... ok
      test approval::tests::always_ask_overrides_session_allowlist ... ok
      test approval::tests::audit_log_contains_timestamp_and_channel ... ok
      test approval::tests::audit_log_records_decisions ... ok
      test approval::tests::auto_approve_tools_skip_prompt ... ok
      test approval::tests::always_response_adds_to_session_allowlist ... ok
      test approval::tests::interactive_manager_reports_interactive ... ok
      test approval::tests::non_interactive_allows_default_auto_approve_tools ... ok
      test approval::tests::non_interactive_always_ask_tools_need_approval ... ok
      test approval::tests::non_interactive_auto_approve_tools_skip_approval ... ok
      test approval::tests::non_interactive_denies_unknown_tools ... ok
      test approval::tests::non_interactive_always_ask_overrides_session_allowlist ... ok
      test approval::tests::non_interactive_full_autonomy_never_needs_approval ... ok
      test approval::tests::non_interactive_shell_skips_outer_approval_by_default ... ok
      test approval::tests::non_interactive_session_allowlist_still_works ... ok
      test approval::tests::non_interactive_manager_reports_non_interactive ... ok
      test approval::tests::non_interactive_unknown_tools_need_approval_in_supervised ... ok
      test approval::tests::readonly_never_prompts ... ok
      test approval::tests::non_interactive_weather_is_auto_approved ... ok
      test approval::tests::summarize_args_non_object ... ok
      test approval::tests::summarize_args_object ... ok
      test approval::tests::summarize_args_truncates_long_values ... ok
      test approval::tests::unknown_tool_needs_approval_in_supervised ... ok
      test approval::tests::summarize_args_unicode_safe_truncation ... ok
      test commands::self_test::tests::format_probe_url_concrete_host_no_probe_suffix ... ok
      test approval::tests::yes_response_does_not_add_to_allowlist ... ok
      test commands::self_test::tests::format_probe_url_ipv6_wildcard_bracketed_shows_valid_url ... ok
      test commands::self_test::tests::format_probe_url_ipv4_wildcard_shows_both ... ok
      test commands::self_test::tests::format_probe_url_ipv6_wildcard_unbracketed_shows_valid_url ... ok
      test commands::self_test::tests::resolve_probe_host_concrete_host_passthrough ... ok
      test commands::self_test::tests::resolve_probe_host_ipv4_wildcard ... ok
      test commands::self_test::tests::resolve_probe_host_ipv6_wildcard_bracketed ... ok
      test commands::self_test::tests::resolve_probe_host_ipv6_wildcard_unbracketed_normalises_to_brackets ... ok
      test commands::self_test::tests::web_dist_dir_with_env_var_resolves_to_dollar_reason_key ... ok
      test commands::self_test::tests::web_dist_dir_with_tilde_resolves_to_tilde_reason_key ... ok
      test approval::tests::non_interactive_readonly_never_needs_approval ... ok
      test commands::update::tests::current_target_triple_is_not_empty ... ok
      test approval::tests::full_autonomy_never_prompts ... ok
      test commands::update::tests::detect_arch_elf_aarch64 ... ok
      test commands::update::tests::detect_arch_macho_x86_64 ... ok
      test commands::update::tests::detect_arch_macho_aarch64 ... ok
      test commands::update::tests::detect_arch_too_short ... ok
      test commands::update::tests::detect_arch_unknown_format ... ok
      test commands::update::tests::asset_name_from_url_uses_last_path_component ... ok
      test commands::update::tests::detect_arch_elf_x86_64 ... ok
      test commands::update::tests::expected_sha256_for_asset_matches_text_and_binary_mode_entries ... ok
      test commands::update::tests::expected_sha256_for_asset_rejects_missing_or_malformed_entry ... ok
      test commands::update::tests::extract_tar_gz_errors_on_missing_binary ... ok
      test commands::update::tests::find_asset_url_ignores_non_installable_assets ... ok
      test commands::update::tests::extract_tar_gz_finds_binary ... ok
      test commands::update::tests::find_asset_url_picks_correct_gnu_over_android ... ok
      test commands::update::tests::find_asset_url_ignores_non_zeroclaw_assets ... ok
      test commands::self_test::tests::check_web_dist_dir_emits_localized_pass_when_unset ... ok
      test commands::update::tests::find_asset_url_returns_none_for_empty_assets ... ok
      test commands::update::tests::find_asset_url_returns_none_for_missing_assets ... ok
      test commands::update::tests::find_asset_url_skips_matching_asset_with_unusable_url ... ok
      test commands::update::tests::find_sha256sums_url_is_case_insensitive ... ok
      test commands::update::tests::find_sha256sums_url_prefers_canonical_asset ... ok
      test commands::update::tests::find_sha256sums_url_skips_missing_or_unusable_url ... ok
      test commands::update::tests::find_sha256sums_url_accepts_common_names ... ok
      test commands::update::tests::host_architecture_is_known ... ok
      test commands::self_test::tests::check_web_dist_dir_emits_localized_pass_for_literal ... ok
      test commands::update::tests::target_triple_for_distinguishes_windows_envs ... ok
      test commands::update::tests::target_triple_for_rejects_unsupported_architectures ... ok
      test commands::update::tests::test_version_comparison ... ok
      test commands::update::tests::installable_release_asset_rejects_unknown_target ... ok
      test commands::self_test::tests::check_web_dist_dir_emits_localized_fail_for_tilde ... ok
      test commands::update::tests::verify_checksum_bytes_accepts_matching_digest_and_rejects_mismatch ... ok
      test config::tests::reexported_channel_configs_are_constructible ... ok
      test health::tests::mark_component_ok_initializes_component_state ... ok
      test health::tests::mark_component_error_then_ok_clears_last_error ... ok
      test health::tests::bump_component_restart_increments_counter ... ok
      test config::tests::reexported_config_default_is_constructible ... ok
      test health::tests::snapshot_json_contains_registered_component_fields ... ok
      test heartbeat::tests::heartbeat_engine_is_constructible_via_module_export ... ok
      test cron::tests::cli_add_at_rejects_timestamp_without_explicit_offset_with_actionable_error ... ok
      test heartbeat::tests::ensure_heartbeat_file_creates_expected_file ... ok
      test memory::battle_tests::tests::conflict_detection_identical_content_not_flagged ... ok
      test memory::battle_tests::tests::conflict_detection_skips_already_superseded ... ok
      test memory::battle_tests::tests::conflict_detection_skips_non_core ... ok
      test memory::battle_tests::tests::deterministic_tiebreaker_in_hybrid_merge ... ok
      test commands::update::tests::download_binary_rejects_checksum_mismatch_without_writing ... ok
      test commands::update::tests::download_binary_verifies_checksum_before_writing ... ok
      test commands::update::tests::download_binary_preserves_missing_checksum_fallback ... ok
      test memory::battle_tests::tests::importance_core_higher_than_daily ... ok
      test memory::battle_tests::tests::importance_empty_content ... ok
      test memory::battle_tests::tests::importance_keywords_increase_score ... ok
      test memory::battle_tests::tests::audit_with_namespaced_operations ... ok
      test memory::battle_tests::tests::audit_logs_all_operation_types ... ok
      test memory::battle_tests::tests::audit_concurrent_operations ... ok
      test memory::battle_tests::tests::importance_score_stays_in_bounds ... ok
      test memory::battle_tests::tests::jaccard_similarity_case_sensitive ... ok
      test memory::battle_tests::tests::jaccard_similarity_identical ... ok
      test memory::battle_tests::tests::jaccard_similarity_no_overlap ... ok
      test memory::battle_tests::tests::memory_entry_deserialize_without_new_fields_uses_defaults ... ok
      test memory::battle_tests::tests::memory_entry_serde_roundtrip_with_new_fields ... ok
      test memory::battle_tests::tests::empty_namespace_recall_returns_nothing ... ok
      test memory::battle_tests::tests::audit_wrapping_sqlite_backend ... ok
      test memory::battle_tests::tests::forget_cleans_up_namespaced_entry ... ok
      test memory::battle_tests::tests::full_lifecycle_store_recall_supersede ... ok
      test memory::battle_tests::tests::importance_persists_in_sqlite ... ok
      test memory::battle_tests::tests::many_namespaces_sequential_writes ... ok
      test memory::battle_tests::tests::namespace_default_assignment ... ok
      test memory::battle_tests::tests::policy_custom_category_retention ... ok
      test memory::battle_tests::tests::policy_quota_boundary_conditions ... ok
      test memory::battle_tests::tests::policy_read_only_multiple_namespaces ... ok
      test memory::battle_tests::tests::policy_validate_store_rejects_read_only ... ok
      test memory::battle_tests::tests::policy_zero_quota_means_unlimited ... ok
      test memory::battle_tests::tests::importance_survives_upsert ... ok
      test memory::battle_tests::tests::namespace_empty_string_works ... ok
      test memory::battle_tests::tests::namespace_isolation_with_session_id_cross_filter ... ok
      test memory::battle_tests::tests::namespace_isolation_between_agents ... ok
      test memory::battle_tests::tests::namespace_with_special_characters ... ok
      test memory::battle_tests::tests::namespace_survives_upsert ... ok
      test memory::battle_tests::tests::retrieval_pipeline_caches_sqlite_results ... ok
      test memory::battle_tests::tests::pipeline_with_audited_sqlite ... ok
      test memory::battle_tests::tests::weighted_final_score_all_ones ... ok
      test memory::battle_tests::tests::weighted_final_score_all_zeros ... ok
      test memory::battle_tests::tests::weighted_final_score_hybrid_dominant ... ok
      test memory::cli::tests::clear_rejects_append_only_markdown_backend ... ok
      test memory::cli::tests::clear_rejects_dotted_qdrant_backend ... ok
      test memory::cli::tests::clear_rejects_qdrant_backend_constructed_as_markdown ... ok
      test memory::cli::tests::parse_category_custom_fallback ... ok
      test memory::cli::tests::parse_category_known_variants ... ok
      test memory::cli::tests::truncate_content_empty_string ... ok
      test memory::cli::tests::truncate_content_long_text_truncated ... ok
      test memory::cli::tests::truncate_content_multiline_uses_first_line ... ok
      test memory::cli::tests::truncate_content_short_text_unchanged ... ok
      test memory::traits::tests::memory_category_custom_roundtrip ... ok
      test memory::traits::tests::memory_category_display_outputs_expected_values ... ok
      test memory::traits::tests::memory_category_serde_uses_snake_case ... ok
      test memory::traits::tests::memory_entry_roundtrip_preserves_optional_fields ... ok
      test providers::traits::tests::build_tool_instructions_text_empty ... ok
      test providers::traits::tests::build_tool_instructions_text_format ... ok
      test providers::traits::tests::chat_message_constructors ... ok
      test providers::traits::tests::chat_response_helpers ... ok
      test memory::battle_tests::tests::retrieval_pipeline_empty_query_works ... ok
      test providers::traits::tests::conversation_message_variants ... ok
      test providers::traits::tests::chat_response_with_usage ... ok
      test providers::traits::tests::provider_capabilities_default ... ok
      test providers::traits::tests::provider_chat_prompt_guided_fallback ... ok
      test providers::traits::tests::provider_chat_prompt_guided_preserves_existing_system_not_first ... ok
      test providers::traits::tests::provider_chat_prompt_guided_rejects_non_prompt_payload ... ok
      test providers::traits::tests::provider_chat_prompt_guided_uses_convert_tools_override ... ok
      test providers::traits::tests::provider_chat_without_tools ... ok
      test providers::traits::tests::provider_convert_tools_default ... ok
      test providers::traits::tests::provider_capabilities_equality ... ok
      test providers::traits::tests::supports_native_tools_reflects_capabilities_default_mapping ... ok
      test providers::traits::tests::provider_stream_chat_default_maps_legacy_chunks_to_events ... ok
      test providers::traits::tests::supports_vision_reflects_capabilities_default_mapping ... ok
      test providers::traits::tests::token_usage_default_is_none ... ok
      test providers::traits::tests::tool_call_serialization ... ok
      test rag::tests::hardware_rag_load_and_retrieve ... ok
      test providers::traits::tests::tools_payload_variants ... ok
      test rag::tests::infer_board_from_path_nucleo ... ok
      test rag::tests::infer_board_generic_none ... ok
      test rag::tests::parse_pin_aliases_empty ... ok
      test rag::tests::hardware_rag_load_empty_dir ... ok
      test rag::tests::parse_pin_aliases_key_value ... ok
      test security::tests::redact_handles_multibyte_utf8_without_panic ... ok
      test rag::tests::parse_pin_aliases_table ... ok
      test security::tests::redact_hides_most_of_value ... ok
      test security::tests::reexported_policy_and_pairing_types_are_usable ... ok
      test security::tests::reexported_secret_store_encrypt_decrypt_roundtrip ... ok
      test sop::tests::extract_bold_title_no_separator ... ok
      test sop::tests::deterministic_flag_overrides_execution_mode ... ok
      test sop::tests::extract_bold_title_with_dash ... ok
      test sop::tests::extract_bold_title_none ... ok
      test sop::tests::load_sop_toml_only_no_md ... ok
      test sop::tests::load_sop_from_directory ... ok
      test sop::tests::load_sops_empty_dir ... ok
      test sop::tests::load_sop_uses_config_default_execution_mode_when_omitted ... ok
      test sop::tests::load_sops_nonexistent_dir ... ok
      test sop::tests::parse_all_trigger_types ... ok
      test sop::tests::parse_steps_empty_md ... ok
      test sop::tests::parse_steps_basic ... ok
      test sop::tests::parse_steps_multiline_body ... ok
      test sop::tests::parse_steps_no_bold_title ... ok
      test sop::tests::parse_steps_with_checkpoint_kind ... ok
      test sop::tests::resolve_sops_dir_default ... ok
      test sop::tests::resolve_sops_dir_override ... ok
      test sop::tests::validate_sop_clean ... ok
      test sop::tests::validate_sop_warnings ... ok
      test tunnel::tests::cloudflare_health_false_before_start ... ok
      test tunnel::tests::cloudflare_tunnel_name ... ok
      test tunnel::tests::custom_health_false_before_start_without_health_url ... ok
      test tunnel::tests::custom_tunnel_name ... ok
      test tunnel::tests::factory_cloudflare_missing_config_errors ... ok
      test tunnel::tests::factory_cloudflare_with_config_ok ... ok
      test tunnel::tests::factory_custom_with_config_ok ... ok
      test tunnel::tests::factory_empty_string_returns_none ... ok
      test tunnel::tests::factory_ngrok_missing_config_errors ... ok
      test tunnel::tests::factory_ngrok_with_config_ok ... ok
      test tunnel::tests::factory_none_returns_none ... ok
      test tunnel::tests::factory_openvpn_missing_config_errors ... ok
      test tunnel::tests::factory_openvpn_with_config_ok ... ok
      test tunnel::tests::factory_pinggy_missing_config_errors ... ok
      test tunnel::tests::factory_pinggy_with_config_ok ... ok
      test tunnel::tests::factory_tailscale_defaults_ok ... ok
      test tunnel::tests::factory_custom_missing_config_errors ... ok
      test tunnel::tests::kill_shared_no_process_is_ok ... ok
      test tunnel::tests::factory_unknown_provider_errors ... ok
      test memory::battle_tests::tests::retrieval_pipeline_invalidation_forces_fresh_results ... ok
      test tunnel::tests::ngrok_tunnel_name ... ok
      test tunnel::tests::ngrok_health_false_before_start ... ok
      test tunnel::tests::ngrok_with_domain ... ok
      test tunnel::tests::none_tunnel_health_always_true ... ok
      test tunnel::tests::none_tunnel_name ... ok
      test tunnel::tests::kill_shared_terminates_and_clears_child ... ok
      test tunnel::tests::openvpn_health_false_before_start ... ok
      test tunnel::tests::openvpn_tunnel_name ... ok
      test tunnel::tests::pinggy_health_false_before_start ... ok
      test tunnel::tests::pinggy_tunnel_name ... ok
      test tunnel::tests::pinggy_without_token ... ok
      test tunnel::tests::tailscale_funnel_mode ... ok
      test tunnel::tests::tailscale_health_false_before_start ... ok
      test tunnel::tests::tailscale_tunnel_name ... ok
      test tunnel::tests::none_tunnel_start_returns_local ... ok
      test tunnel::tests::none_tunnel_public_url_is_none ... ok
      test memory::battle_tests::tests::retrieval_pipeline_respects_limit ... ok
      test memory::battle_tests::tests::retrieval_pipeline_with_namespace_filter ... ok
      test memory::battle_tests::tests::superseded_entries_hidden_from_recall ... ok
      test memory::battle_tests::tests::schema_migration_idempotent_with_new_columns ... ok
      test memory::battle_tests::tests::superseded_entry_still_accessible_via_get ... ok
      
      test result: ok. 227 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.66s
      
      Running unittests src/main.rs (target/debug/deps/zeroclaw-e12b99c424a2975a)
      
      running 267 tests
      test approval::tests::approval_response_serde_roundtrip ... ok
      test approval::tests::approval_request_serde ... ok
      test approval::tests::full_autonomy_never_prompts ... ok
      test approval::tests::always_ask_overrides_auto_approve ... ok
      test approval::tests::always_ask_tools_always_prompt ... ok
      test approval::tests::auto_approve_tools_skip_prompt ... ok
      test approval::tests::always_ask_overrides_session_allowlist ... ok
      test approval::tests::always_response_adds_to_session_allowlist ... ok
      test approval::tests::audit_log_contains_timestamp_and_channel ... ok
      test approval::tests::audit_log_records_decisions ... ok
      test approval::tests::interactive_manager_reports_interactive ... ok
      test approval::tests::non_interactive_allows_default_auto_approve_tools ... ok
      test approval::tests::non_interactive_auto_approve_tools_skip_approval ... ok
      test approval::tests::non_interactive_always_ask_tools_need_approval ... ok
      test approval::tests::non_interactive_always_ask_overrides_session_allowlist ... ok
      test approval::tests::non_interactive_denies_unknown_tools ... ok
      test approval::tests::non_interactive_full_autonomy_never_needs_approval ... ok
      test approval::tests::non_interactive_shell_skips_outer_approval_by_default ... ok
      test approval::tests::non_interactive_readonly_never_needs_approval ... ok
      test approval::tests::non_interactive_manager_reports_non_interactive ... ok
      test approval::tests::non_interactive_unknown_tools_need_approval_in_supervised ... ok
      test approval::tests::non_interactive_weather_is_auto_approved ... ok
      test approval::tests::readonly_never_prompts ... ok
      test approval::tests::summarize_args_object ... ok
      test approval::tests::summarize_args_non_object ... ok
      test approval::tests::unknown_tool_needs_approval_in_supervised ... ok
      test approval::tests::summarize_args_truncates_long_values ... ok
      test approval::tests::non_interactive_session_allowlist_still_works ... ok
      test approval::tests::yes_response_does_not_add_to_allowlist ... ok
      test approval::tests::summarize_args_unicode_safe_truncation ... ok
      test commands::self_test::tests::format_probe_url_ipv6_wildcard_unbracketed_shows_valid_url ... ok
      test commands::self_test::tests::format_probe_url_ipv6_wildcard_bracketed_shows_valid_url ... ok
      test commands::self_test::tests::format_probe_url_concrete_host_no_probe_suffix ... ok
      test commands::self_test::tests::format_probe_url_ipv4_wildcard_shows_both ... ok
      test commands::self_test::tests::resolve_probe_host_ipv4_wildcard ... ok
      test commands::self_test::tests::resolve_probe_host_concrete_host_passthrough ... ok
      test commands::self_test::tests::web_dist_dir_with_env_var_resolves_to_dollar_reason_key ... ok
      test commands::self_test::tests::resolve_probe_host_ipv6_wildcard_unbracketed_normalises_to_brackets ... ok
      test commands::self_test::tests::web_dist_dir_with_tilde_resolves_to_tilde_reason_key ... ok
      test commands::self_test::tests::resolve_probe_host_ipv6_wildcard_bracketed ... ok
      test commands::update::tests::asset_name_from_url_uses_last_path_component ... ok
      test commands::update::tests::detect_arch_macho_aarch64 ... ok
      test commands::update::tests::detect_arch_elf_aarch64 ... ok
      test commands::update::tests::detect_arch_elf_x86_64 ... ok
      test commands::update::tests::detect_arch_macho_x86_64 ... ok
      test commands::update::tests::current_target_triple_is_not_empty ... ok
      test commands::update::tests::detect_arch_too_short ... ok
      test commands::update::tests::detect_arch_unknown_format ... ok
      test commands::update::tests::expected_sha256_for_asset_matches_text_and_binary_mode_entries ... ok
      test commands::update::tests::expected_sha256_for_asset_rejects_missing_or_malformed_entry ... ok
      test commands::update::tests::extract_tar_gz_finds_binary ... ok
      test commands::update::tests::find_asset_url_ignores_non_installable_assets ... ok
      test commands::update::tests::find_asset_url_ignores_non_zeroclaw_assets ... ok
      test commands::update::tests::find_asset_url_picks_correct_gnu_over_android ... ok
      test commands::update::tests::find_asset_url_returns_none_for_empty_assets ... ok
      test commands::update::tests::find_asset_url_returns_none_for_missing_assets ... ok
      test commands::update::tests::find_asset_url_skips_matching_asset_with_unusable_url ... ok
      test commands::update::tests::extract_tar_gz_errors_on_missing_binary ... ok
      test commands::update::tests::find_sha256sums_url_accepts_common_names ... ok
      test commands::update::tests::find_sha256sums_url_is_case_insensitive ... ok
      test commands::update::tests::find_sha256sums_url_prefers_canonical_asset ... ok
      test commands::update::tests::find_sha256sums_url_skips_missing_or_unusable_url ... ok
      test commands::self_test::tests::check_web_dist_dir_emits_localized_pass_when_unset ... ok
      test commands::update::tests::host_architecture_is_known ... ok
      test commands::update::tests::installable_release_asset_rejects_unknown_target ... ok
      test commands::update::tests::test_version_comparison ... ok
      test commands::update::tests::verify_checksum_bytes_accepts_matching_digest_and_rejects_mismatch ... ok
      test commands::update::tests::target_triple_for_rejects_unsupported_architectures ... ok
      test config::tests::reexported_channel_configs_are_constructible ... ok
      test commands::update::tests::target_triple_for_distinguishes_windows_envs ... ok
      test commands::self_test::tests::check_web_dist_dir_emits_localized_fail_for_tilde ... ok
      test health::tests::bump_component_restart_increments_counter ... ok
      test health::tests::mark_component_error_then_ok_clears_last_error ... ok
      test health::tests::mark_component_ok_initializes_component_state ... ok
      test config::tests::reexported_config_default_is_constructible ... ok
      test heartbeat::tests::heartbeat_engine_is_constructible_via_module_export ... ok
      test health::tests::snapshot_json_contains_registered_component_fields ... ok
      test cron::tests::cli_add_at_rejects_timestamp_without_explicit_offset_with_actionable_error ... ok
      test heartbeat::tests::ensure_heartbeat_file_creates_expected_file ... ok
      test commands::self_test::tests::check_web_dist_dir_emits_localized_pass_for_literal ... ok
      test memory::battle_tests::tests::conflict_detection_identical_content_not_flagged ... ok
      test memory::battle_tests::tests::conflict_detection_skips_already_superseded ... ok
      test memory::battle_tests::tests::conflict_detection_skips_non_core ... ok
      test memory::battle_tests::tests::deterministic_tiebreaker_in_hybrid_merge ... ok
      test commands::update::tests::download_binary_rejects_checksum_mismatch_without_writing ... ok
      test commands::update::tests::download_binary_preserves_missing_checksum_fallback ... ok
      test commands::update::tests::download_binary_verifies_checksum_before_writing ... ok
      test memory::battle_tests::tests::importance_core_higher_than_daily ... ok
      test memory::battle_tests::tests::importance_empty_content ... ok
      test memory::battle_tests::tests::importance_keywords_increase_score ... ok
      test memory::battle_tests::tests::audit_concurrent_operations ... ok
      test memory::battle_tests::tests::importance_score_stays_in_bounds ... ok
      test memory::battle_tests::tests::audit_logs_all_operation_types ... ok
      test memory::battle_tests::tests::audit_with_namespaced_operations ... ok
      test memory::battle_tests::tests::jaccard_similarity_identical ... ok
      test memory::battle_tests::tests::jaccard_similarity_no_overlap ... ok
      test memory::battle_tests::tests::jaccard_similarity_case_sensitive ... ok
      test memory::battle_tests::tests::memory_entry_deserialize_without_new_fields_uses_defaults ... ok
      test memory::battle_tests::tests::memory_entry_serde_roundtrip_with_new_fields ... ok
      test memory::battle_tests::tests::empty_namespace_recall_returns_nothing ... ok
      test memory::battle_tests::tests::audit_wrapping_sqlite_backend ... ok
      test memory::battle_tests::tests::forget_cleans_up_namespaced_entry ... ok
      test memory::battle_tests::tests::importance_persists_in_sqlite ... ok
      test memory::battle_tests::tests::full_lifecycle_store_recall_supersede ... ok
      test memory::battle_tests::tests::importance_survives_upsert ... ok
      test memory::battle_tests::tests::namespace_default_assignment ... ok
      test memory::battle_tests::tests::policy_custom_category_retention ... ok
      test memory::battle_tests::tests::policy_quota_boundary_conditions ... ok
      test memory::battle_tests::tests::policy_read_only_multiple_namespaces ... ok
      test memory::battle_tests::tests::policy_validate_store_rejects_read_only ... ok
      test memory::battle_tests::tests::policy_zero_quota_means_unlimited ... ok
      test memory::battle_tests::tests::many_namespaces_sequential_writes ... ok
      test memory::battle_tests::tests::namespace_empty_string_works ... ok
      test memory::battle_tests::tests::namespace_isolation_between_agents ... ok
      test memory::battle_tests::tests::namespace_isolation_with_session_id_cross_filter ... ok
      test memory::battle_tests::tests::namespace_survives_upsert ... ok
      test memory::battle_tests::tests::namespace_with_special_characters ... ok
      test memory::battle_tests::tests::pipeline_with_audited_sqlite ... ok
      test memory::battle_tests::tests::retrieval_pipeline_caches_sqlite_results ... ok
      test memory::battle_tests::tests::weighted_final_score_all_ones ... ok
      test memory::battle_tests::tests::weighted_final_score_all_zeros ... ok
      test memory::battle_tests::tests::weighted_final_score_hybrid_dominant ... ok
      test memory::cli::tests::clear_rejects_append_only_markdown_backend ... ok
      test memory::cli::tests::clear_rejects_dotted_qdrant_backend ... ok
      test memory::cli::tests::clear_rejects_qdrant_backend_constructed_as_markdown ... ok
      test memory::cli::tests::parse_category_custom_fallback ... ok
      test memory::cli::tests::parse_category_known_variants ... ok
      test memory::cli::tests::truncate_content_empty_string ... ok
      test memory::cli::tests::truncate_content_long_text_truncated ... ok
      test memory::cli::tests::truncate_content_multiline_uses_first_line ... ok
      test memory::cli::tests::truncate_content_short_text_unchanged ... ok
      test memory::traits::tests::memory_category_custom_roundtrip ... ok
      test memory::traits::tests::memory_category_display_outputs_expected_values ... ok
      test memory::traits::tests::memory_category_serde_uses_snake_case ... ok
      test memory::traits::tests::memory_entry_roundtrip_preserves_optional_fields ... ok
      test providers::traits::tests::build_tool_instructions_text_empty ... ok
      test providers::traits::tests::build_tool_instructions_text_format ... ok
      test providers::traits::tests::chat_message_constructors ... ok
      test providers::traits::tests::chat_response_helpers ... ok
      test providers::traits::tests::chat_response_with_usage ... ok
      test providers::traits::tests::conversation_message_variants ... ok
      test providers::traits::tests::provider_capabilities_default ... ok
      test providers::traits::tests::provider_capabilities_equality ... ok
      test providers::traits::tests::provider_chat_prompt_guided_fallback ... ok
      test providers::traits::tests::provider_chat_prompt_guided_preserves_existing_system_not_first ... ok
      test providers::traits::tests::provider_chat_prompt_guided_rejects_non_prompt_payload ... ok
      test providers::traits::tests::provider_chat_prompt_guided_uses_convert_tools_override ... ok
      test memory::battle_tests::tests::retrieval_pipeline_empty_query_works ... ok
      test providers::traits::tests::provider_convert_tools_default ... ok
      test providers::traits::tests::provider_stream_chat_default_maps_legacy_chunks_to_events ... ok
      test providers::traits::tests::supports_native_tools_reflects_capabilities_default_mapping ... ok
      test providers::traits::tests::supports_vision_reflects_capabilities_default_mapping ... ok
      test providers::traits::tests::token_usage_default_is_none ... ok
      test providers::traits::tests::tool_call_serialization ... ok
      test providers::traits::tests::tools_payload_variants ... ok
      test security::tests::redact_handles_multibyte_utf8_without_panic ... ok
      test security::tests::redact_hides_most_of_value ... ok
      test security::tests::reexported_policy_and_pairing_types_are_usable ... ok
      test security::tests::reexported_secret_store_encrypt_decrypt_roundtrip ... ok
      test skillforge::tests::default_config_values ... ok
      test skillforge::tests::disabled_forge_returns_empty_report ... ok
      test sop::tests::deterministic_flag_overrides_execution_mode ... ok
      test sop::tests::extract_bold_title_no_separator ... ok
      test sop::tests::extract_bold_title_none ... ok
      test sop::tests::extract_bold_title_with_dash ... ok
      test sop::tests::load_sop_from_directory ... ok
      test sop::tests::load_sop_toml_only_no_md ... ok
      test sop::tests::load_sop_uses_config_default_execution_mode_when_omitted ... ok
      test sop::tests::load_sops_empty_dir ... ok
      test sop::tests::load_sops_nonexistent_dir ... ok
      test sop::tests::parse_all_trigger_types ... ok
      test sop::tests::parse_steps_basic ... ok
      test providers::traits::tests::provider_chat_without_tools ... ok
      test sop::tests::parse_steps_empty_md ... ok
      test sop::tests::parse_steps_multiline_body ... ok
      test sop::tests::parse_steps_with_checkpoint_kind ... ok
      test sop::tests::resolve_sops_dir_default ... ok
      test sop::tests::resolve_sops_dir_override ... ok
      test sop::tests::parse_steps_no_bold_title ... ok
      test sop::tests::validate_sop_warnings ... ok
      test sop::tests::validate_sop_clean ... ok
      test memory::battle_tests::tests::retrieval_pipeline_invalidation_forces_fresh_results ... ok
      test tests::agent_command_parses_session_state_file ... ok
      test tests::agent_command_parses_with_temperature ... ok
      test tests::agent_uses_provider_temperature_when_unset ... ok
      test tests::agent_fallback_uses_hardcoded_when_config_uses_default ... ok
      test tests::apply_homebrew_onboard_config_dir_skips_explicit_config_dir ... ok
      test tests::apply_homebrew_onboard_config_dir_sets_detected_config_dir ... ok
      test tests::agent_command_parses_without_temperature ... ok
      test tests::cli_parses_estop_default_engage ... ok
      test tests::cli_parses_estop_resume_domain ... ok
      test tests::cli_definition_has_no_flag_conflicts ... ok
      test tests::completions_cli_parses_supported_shells ... ok
      test tests::config_set_does_not_materialize_non_provider_map_keys ... ok
      test tests::bash_completion_avoids_infinite_recursion ... ok
      test tests::config_set_materializes_missing_tts_provider_alias ... ok
      test memory::battle_tests::tests::retrieval_pipeline_with_namespace_filter ... ok
      test memory::battle_tests::tests::retrieval_pipeline_respects_limit ... ok
      test tests::config_set_materializes_missing_transcription_provider_alias ... ok
      test tests::ensure_map_key_ignores_non_map_paths ... ok
      test tests::gateway_addr_in_use_detector_recognizes_nested_io_error ... ok
      test tests::completion_generation_mentions_binary_name ... ok
      test tests::ensure_map_key_materializes_typed_provider_entries ... ok
      test tests::gateway_addr_in_use_message_guides_default_gateway_recovery ... ok
      test tests::gateway_admin_url_prepends_configured_path_prefix ... ok
      test tests::gateway_addr_in_use_message_uses_configured_default_gateway_recovery ... ok
      test tests::config_set_materializes_missing_typed_provider_alias ... ok
      test tests::gateway_addr_in_use_message_keeps_non_default_host_context ... ok
      test tests::homebrew_onboard_config_dir_detects_brew_bin_symlink_layout ... ok
      test tests::gate_security_posture_fails_closed_unless_allowed ... ok
      test tests::gateway_admin_url_uses_unprefixed_admin_path_by_default ... ok
      test tests::homebrew_onboard_config_dir_detects_cellar_paths ... ok
      test tests::homebrew_onboard_config_dir_preserves_explicit_runtime_paths ... ok
      test tests::homebrew_onboard_config_dir_treats_workspace_whitespace_as_explicit ... ok
      test tests::gateway_get_paircode_cli_accepts_port_and_host_overrides ... ok
      test tests::onboard_cli_accepts_force_flag ... ok
      test tests::onboard_cli_accepts_model_provider_and_api_key_in_quick_mode ... ok
      test tests::onboard_cli_parses_quick_flag ... ok
      test tests::gateway_get_paircode_rotate_flags_parse_and_conflict ... ok
      test tests::onboard_cli_bare_parses ... ok
      test tests::paircode_no_code_message_explains_bare_command_does_not_mint ... ok
      test tests::paircode_no_code_message_for_new_suggests_rotate ... ok
      test tests::onboard_help_includes_model_flag ... ok
      test tests::onboard_cli_quick_and_channels_only_conflict ... ok
      test tests::onboard_cli_rejects_removed_interactive_flag ... ok
      test tests::paircode_no_code_message_preserves_host_port_on_suggestions ... ok
      test tests::paircode_url_combines_host_port_override_with_configured_path_prefix ... ok
      test tunnel::tests::cloudflare_health_false_before_start ... ok
      test tests::paircode_no_code_message_omits_configured_default_host_port ... ok
      test tunnel::tests::custom_tunnel_name ... ok
      test tunnel::tests::factory_cloudflare_with_config_ok ... ok
      test tunnel::tests::factory_cloudflare_missing_config_errors ... ok
      test tunnel::tests::factory_custom_missing_config_errors ... ok
      test tunnel::tests::cloudflare_tunnel_name ... ok
      test tunnel::tests::factory_empty_string_returns_none ... ok
      test tunnel::tests::custom_health_false_before_start_without_health_url ... ok
      test tunnel::tests::factory_ngrok_missing_config_errors ... ok
      test tunnel::tests::factory_custom_with_config_ok ... ok
      test tunnel::tests::factory_none_returns_none ... ok
      test tunnel::tests::factory_ngrok_with_config_ok ... ok
      test tunnel::tests::factory_openvpn_missing_config_errors ... ok
      test tunnel::tests::factory_pinggy_missing_config_errors ... ok
      test tunnel::tests::factory_openvpn_with_config_ok ... ok
      test tunnel::tests::factory_pinggy_with_config_ok ... ok
      test tunnel::tests::factory_tailscale_defaults_ok ... ok
      test tunnel::tests::factory_unknown_provider_errors ... ok
      test tunnel::tests::ngrok_health_false_before_start ... ok
      test tunnel::tests::ngrok_with_domain ... ok
      test tunnel::tests::none_tunnel_health_always_true ... ok
      test tunnel::tests::none_tunnel_name ... ok
      test tunnel::tests::kill_shared_no_process_is_ok ... ok
      test tunnel::tests::none_tunnel_start_returns_local ... ok
      test tunnel::tests::openvpn_health_false_before_start ... ok
      test tunnel::tests::ngrok_tunnel_name ... ok
      test tunnel::tests::openvpn_tunnel_name ... ok
      test tunnel::tests::pinggy_health_false_before_start ... ok
      test tunnel::tests::pinggy_without_token ... ok
      test tunnel::tests::pinggy_tunnel_name ... ok
      test tunnel::tests::tailscale_funnel_mode ... ok
      test tunnel::tests::tailscale_health_false_before_start ... ok
      test tunnel::tests::tailscale_tunnel_name ... ok
      test tests::onboard_cli_positional_sections_parse ... ok
      test tunnel::tests::none_tunnel_public_url_is_none ... ok
      test memory::battle_tests::tests::superseded_entries_hidden_from_recall ... ok
      test tunnel::tests::kill_shared_terminates_and_clears_child ... ok
      test memory::battle_tests::tests::superseded_entry_still_accessible_via_get ... ok
      test memory::battle_tests::tests::schema_migration_idempotent_with_new_columns ... ok
      
      test result: ok. 267 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.61s
      
      Running unittests src/bin/zeroclaw-acp-bridge.rs (target/debug/deps/zeroclaw_acp_bridge-ce872ffb1ae3ae81)
      
      running 19 tests
      test tests::acp_bridge_target_allows_unpaired_local_gateway ... ok
      test tests::acp_bridge_target_does_not_use_persisted_paired_token_hashes_as_bearer_tokens ... ok
      test tests::acp_bridge_target_fails_when_pairing_required_without_token ... ok
      test tests::acp_bridge_target_honors_tls_and_path_prefix ... ok
      test tests::acp_websocket_url_brackets_ipv6_hosts ... ok
      test tests::acp_websocket_url_includes_path_prefix ... ok
      test tests::acp_websocket_url_uses_config_host_and_port ... ok
      test tests::acp_websocket_url_uses_wss_for_tls_gateway ... ok
      test tests::cached_token_path_lives_next_to_config_without_using_config_toml ... ok
      test tests::config_dir_from_args_supports_flag_forms ... ok
      test tests::http_gateway_url_honors_path_prefix_and_ipv6 ... ok
      test tests::missing_config_error_matches_acp_client_guidance ... ok
      test tests::pair_code_from_args_supports_flag_forms ... ok
      test tests::token_from_env_uses_plaintext_bridge_token ... ok
      test tests::write_frame_appends_newline ... ok
      test tests::read_cached_token_trims_private_token_file ... ok
      test tests::write_cached_token_persists_token_for_future_bridge_starts ... ok
      test tests::fetch_pairing_code_reads_gateway_pair_code_response ... ok
      test tests::exchange_pairing_code_posts_code_and_returns_token ... ok
      
      test result: ok. 19 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s
      
      Running tests/test_architecture.rs (target/debug/deps/architecture-9aab0f2e2dbac939)
      
      running 3 tests
      test cli_fluent_coverage::user_facing_strings_route_through_fluent ... ok
      test no_duplicate_state::no_channel_handle_caches_peer_authorization_state ... ok
      test config_save_isolation::tests_that_persist_config_isolate_the_path ... ok
      
      test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.60s
      
      Running tests/test_component.rs (target/debug/deps/component-301678993e9c618f)
      
      running 188 tests
      test component::config_persistence::config_default_has_no_resolved_model ... ok
      test component::config_persistence::config_default_has_no_model_provider_profiles ... ok
      test component::config_persistence::config_default_validates_without_provider_profiles ... ok
      test component::config_persistence::memory_config_default_backend ... ok
      test component::config_persistence::memory_config_default_embedding_provider ... ok
      test component::config_persistence::config_file_with_missing_optional_fields_uses_defaults ... ok
      test component::config_persistence::config_file_with_custom_agent_section ... ok
      test component::config_persistence::memory_config_default_vector_keyword_weights_sum_to_one ... ok
      test component::config_persistence::nested_workspace_dir_creation ... ok
      test component::config_persistence::workspace_dir_creation_in_tempdir ... ok
      test component::config_schema::autonomy_config_default_is_supervised ... ok
      test component::config_schema::config_channels_all_optional_channels_none_by_default ... ok
      test component::config_schema::config_channels_default_cli_enabled ... ok
      test component::config_schema::config_channels_without_cli_field ... ok
      test component::config_schema::config_channels_explicit_cli_true_with_whatsapp ... ok
      test component::config_schema::config_memory_defaults_when_section_absent ... ok
      test component::config_schema::config_empty_toml_uses_default_temperature ... ok
      test component::config_schema::config_multiple_channels_coexist ... ok
      test component::config_schema::config_empty_parses_with_all_defaults ... ok
      test component::config_schema::config_extra_unknown_keys_ignored ... ok
      test component::config_schema::config_negative_port_fails ... ok
      test component::config_schema::config_nested_optional_sections_default_when_absent ... ok
      test component::config_schema::config_negative_temperature_fails ... ok
      test component::config_schema::config_minimal_toml_with_temperature_uses_defaults ... ok
      test component::config_schema::config_only_whatsapp_channel_parses ... ok
      test component::config_schema::config_only_temperature_parses ... ok
      test component::config_schema::config_out_of_range_temperature_fails ... ok
      test component::config_schema::config_overflow_port_fails ... ok
      test component::config_schema::config_toplevel_cli_section_with_whatsapp_parses ... ok
      test component::config_schema::config_wrong_type_for_port_fails ... ok
      test component::config_persistence::config_toml_roundtrip_preserves_memory_config ... ok
      test component::config_persistence::config_toml_roundtrip_preserves_agent_config ... ok
      test component::config_persistence::config_toml_roundtrip_preserves_provider ... ok
      test component::config_schema::config_wrong_type_for_temperature_fails ... ok
      test component::config_schema::config_unknown_keys_parse_without_error ... ok
      test component::config_persistence::config_file_write_read_roundtrip ... ok
      test component::config_schema::gateway_config_idempotency_defaults ... ok
      test component::config_schema::gateway_config_defaults_are_secure ... ok
      test component::config_schema::gateway_config_missing_section_uses_defaults ... ok
      test component::config_schema::config_valid_keys_not_flagged_as_unknown ... ok
      test component::config_schema::gateway_config_rate_limit_defaults ... ok
      test component::config_schema::gateway_config_toml_roundtrip ... ok
      test component::config_schema::gateway_config_partial_section_fills_defaults ... ok
      test component::config_schema::gateway_path_prefix_accepts_none ... ok
      test component::config_schema::gateway_path_prefix_rejects_trailing_slash ... ok
      test component::config_schema::gateway_path_prefix_rejects_bare_slash ... ok
      test component::config_schema::gateway_path_prefix_accepts_valid_prefixes ... ok
      test component::config_schema::security_config_defaults ... ok
      test component::config_schema::risk_profile_allowed_path_alias_maps_to_allowed_roots ... ok
      test component::config_schema::gateway_path_prefix_rejects_unsafe_characters ... ok
      test component::config_schema::risk_profile_allowed_paths_alias_maps_to_allowed_roots ... ok
      test component::config_schema::gateway_path_prefix_rejects_missing_leading_slash ... ok
      test component::config_schema::security_config_toml_roundtrip ... ok
      test component::dockerignore_test::dockerignore_excludes_git_directory ... ok
      test component::dockerignore_test::dockerignore_excludes_image_files ... ok
      test component::dockerignore_test::dockerignore_excludes_ci_configs ... ok
      test component::dockerignore_test::dockerignore_excludes_database_files ... ok
      test component::dockerignore_test::dockerignore_does_not_exclude_build_essentials ... ok
      test component::dockerignore_test::dockerignore_file_exists ... ok
      test component::dockerignore_test::dockerignore_excludes_markdown_files ... ok
      test component::gateway::gateway_body_limit_is_reasonable ... ok
      test component::dockerignore_test::dockerignore_pattern_matching_edge_cases ... ok
      test component::dockerignore_test::dockerignore_excludes_target_directory ... ok
      test component::dockerignore_test::dockerignore_has_valid_syntax ... ok
      test component::dockerignore_test::dockerignore_excludes_security_critical_paths ... ok
      test component::gateway::gateway_whatsapp_empty_signature_rejected ... ok
      test component::gateway::gateway_timeout_is_reasonable ... ok
      test component::gateway::gateway_rate_limit_window_is_60s ... ok
      test component::gateway::gateway_whatsapp_missing_prefix_rejected ... ok
      test component::gateway::gateway_whatsapp_tampered_body_rejected ... ok
      test component::gateway::gateway_whatsapp_valid_signature_accepted ... ok
      test component::gateway::gateway_whatsapp_different_secrets_differ ... ok
      test component::gateway::gateway_whatsapp_wrong_signature_rejected ... ok
      test component::dockerignore_test::dockerignore_excludes_env_files ... ok
      test component::config_schema::risk_profile_workspace_only_round_trips_through_toml ... ok
      test component::provider_resolution::compatible_provider_base_url_trailing_slash_normalized ... ok
      test component::provider_resolution::compatible_provider_bearer_auth_style ... ok
      test component::config_schema::runtime_profile_max_actions_per_hour_round_trips_through_toml ... ok
      test component::provider_resolution::compatible_provider_custom_auth_header ... ok
      test component::otel_dependency_feature_regression::opentelemetry_otlp_uses_blocking_reqwest_client ... ok
      test component::provider_resolution::compatible_provider_no_credential ... ok
      test component::provider_resolution::compatible_provider_xapikey_auth_style ... ok
      test component::provider_resolution::convenience_factory_ollama_no_key ... ok
      test component::provider_resolution::factory_anthropic_custom_endpoint_resolves ... ok
      test component::provider_resolution::convenience_factory_resolves_major_providers ... ok
      test component::provider_resolution::factory_build_nvidia_com_alias_resolves_to_nvidia ... ok
      test component::provider_resolution::factory_aws_bedrock_alias_resolves_to_bedrock ... ok
      test component::provider_resolution::factory_custom_empty_url_rejected ... ok
      test component::provider_resolution::factory_custom_ftp_url_rejected ... ok
      test component::provider_resolution::factory_custom_http_url_resolves ... ok
      test component::provider_resolution::factory_custom_https_url_resolves ... ok
      test component::provider_resolution::factory_cloudflare_ai_alias_resolves_to_cloudflare ... ok
      test component::provider_resolution::factory_github_copilot_alias_resolves_to_copilot ... ok
      test component::provider_resolution::factory_grok_alias_resolves_to_xai ... ok
      test component::gemini_capabilities::gemini_convert_tools_returns_prompt_guided ... ok
      test component::provider_resolution::factory_kimi_alias_resolves_to_moonshot ... ok
      test component::gemini_capabilities::gemini_reports_vision_support ... ok
      test component::gemini_capabilities::gemini_supports_native_tools_returns_false ... ok
      test component::provider_resolution::factory_nvidia_nim_alias_resolves_to_nvidia ... ok
      test component::provider_resolution::factory_llama_cpp_alias_resolves_to_llamacpp ... ok
      test component::provider_resolution::factory_openai_with_custom_api_url ... ok
      test component::provider_resolution::factory_opencode_zen_alias_resolves_to_opencode ... ok
      test component::provider_resolution::factory_ovh_alias_resolves_to_ovhcloud ... ok
      test component::provider_resolution::factory_resolves_anthropic_provider ... ok
      test component::provider_resolution::factory_resolves_astrai_provider ... ok
      test component::provider_resolution::factory_lm_studio_alias_resolves_to_lmstudio ... ok
      test component::provider_resolution::factory_resolves_bedrock_provider ... ok
      test component::provider_resolution::factory_resolves_cohere_provider ... ok
      test component::provider_resolution::factory_resolves_cloudflare_provider ... ok
      test component::provider_resolution::factory_resolves_doubao_provider ... ok
      test component::provider_resolution::factory_resolves_deepseek_provider ... ok
      test component::provider_resolution::factory_ollama_with_custom_api_url ... ok
      test component::provider_resolution::factory_resolves_copilot_provider ... ok
      test component::provider_resolution::factory_resolves_groq_provider ... ok
      test component::provider_resolution::factory_resolves_kimi_code_provider ... ok
      test component::provider_resolution::factory_resolves_fireworks_provider ... ok
      test component::provider_resolution::factory_resolves_glm_provider ... ok
      test component::provider_resolution::factory_resolves_llamacpp_provider ... ok
      test component::provider_resolution::factory_resolves_lmstudio_provider ... ok
      test component::gemini_capabilities::gemini_reports_no_native_tool_calling ... ok
      test component::provider_resolution::factory_resolves_gemini_provider ... ok
      test component::provider_resolution::factory_resolves_mistral_provider ... ok
      test component::provider_resolution::factory_resolves_nvidia_provider ... ok
      test component::provider_resolution::factory_resolves_moonshot_provider ... ok
      test component::gemini_capabilities::gemini_supports_vision_returns_true ... ok
      test component::provider_resolution::factory_resolves_minimax_provider ... ok
      test component::provider_resolution::factory_google_alias_resolves_to_gemini ... ok
      test component::provider_resolution::factory_resolves_opencode_go_provider ... ok
      test component::provider_resolution::factory_resolves_ovhcloud_provider ... ok
      test component::provider_resolution::factory_resolves_qianfan_provider ... ok
      test component::provider_resolution::factory_resolves_openrouter_provider ... ok
      test component::provider_resolution::factory_resolves_synthetic_provider ... ok
      test component::provider_resolution::factory_resolves_together_provider ... ok
      test component::provider_resolution::factory_resolves_perplexity_provider ... ok
      test component::provider_resolution::factory_resolves_venice_provider ... ok
      test component::provider_resolution::factory_resolves_vercel_provider ... ok
      test component::provider_resolution::factory_resolves_vllm_provider ... ok
      test component::provider_resolution::factory_resolves_zai_provider ... ok
      test component::provider_resolution::factory_unknown_provider_rejected ... ok
      test component::provider_resolution::factory_vercel_ai_alias_resolves_to_vercel ... ok
      test component::provider_resolution::factory_zhipu_alias_resolves_to_glm ... ok
      test component::provider_resolution::factory_resolves_ollama_provider ... ok
      test component::provider_schema::auth_style_bearer_is_constructible ... ok
      test component::provider_schema::auth_style_custom_header ... ok
      test component::provider_schema::auth_style_xapikey_is_constructible ... ok
      test component::provider_schema::chat_message_assistant_role_correct ... ok
      test component::provider_schema::chat_message_serializes_to_json_with_required_fields ... ok
      test component::provider_resolution::factory_resolves_xai_provider ... ok
      test component::provider_schema::chat_message_system_role_correct ... ok
      test component::provider_schema::chat_message_tool_role_correct ... ok
      test component::provider_schema::chat_message_json_roundtrip ... ok
      test component::provider_schema::chat_message_user_role_correct ... ok
      test component::provider_resolution::factory_resolves_opencode_provider ... ok
      test component::provider_schema::chat_response_multiple_tool_calls ... ok
      test component::provider_schema::chat_response_text_only ... ok
      test component::provider_schema::chat_response_text_or_empty_handles_none ... ok
      test component::provider_schema::chat_response_with_tool_calls ... ok
      test component::provider_schema::provider_construction_with_different_auth_styles ... ok
      test component::provider_schema::provider_construction_with_different_names ... ok
      test component::provider_resolution::factory_resolves_openai_provider ... ok
      test component::provider_schema::tool_call_arguments_contain_valid_json ... ok
      test component::provider_schema::tool_call_id_preserved_in_serialization ... ok
      test component::provider_schema::tool_response_message_can_embed_tool_call_id ... ok
      test component::provider_schema::chat_messages_maintain_role_sequence ... ok
      test component::provider_schema::chat_messages_with_tool_calls_maintain_sequence ... ok
      test component::security::security_autonomy_config_toml_roundtrip ... ok
      test component::security::security_default_autonomy_is_supervised ... ok
      test component::security::security_default_require_approval_for_medium_risk ... ok
      test component::security::security_default_risk_profile_is_supervised ... ok
      test component::security::security_default_workspace_only ... ok
      test component::security::security_full_autonomy_parses ... ok
      test component::provider_schema::tool_call_has_required_fields ... ok
      test component::security::security_readonly_autonomy_parses ... ok
      test component::security::security_secrets_encryption_default ... ok
      test component::whatsapp_webhook_security::whatsapp_signature_accepts_valid_signature ... ok
      test component::whatsapp_webhook_security::whatsapp_signature_rejects_empty_signature ... ok
      test component::whatsapp_webhook_security::whatsapp_signature_rejects_invalid_hex ... ok
      test component::whatsapp_webhook_security::whatsapp_signature_rejects_missing_sha256_prefix ... ok
      test component::whatsapp_webhook_security::whatsapp_signature_rejects_tampered_body ... ok
      test component::whatsapp_webhook_security::whatsapp_signature_rejects_wrong_secret ... ok
      test component::whatsapp_webhook_security::whatsapp_signature_rejects_wrong_signature ... ok
      test component::provider_resolution::factory_google_gemini_alias_resolves_to_gemini ... ok
      test component::provider_resolution::factory_resolves_qwen_provider ... ok
      test component::security::security_config_secret_property_readback_masks_api_key ... ok
      test component::security::security_default_block_high_risk_commands ... ok
      test component::whatsapp_webhook_security::whatsapp_signature_different_secrets_produce_different_sigs ... ok
      test component::reply_target_field_regression::source_does_not_use_legacy_reply_to_field ... ok
      test component::provider_resolution::factory_resolves_openai_codex_provider ... ok
      
      test result: ok. 188 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.30s
      
      Running tests/test_integration.rs (target/debug/deps/integration-ab1a622aa2c4da56)
      
      running 159 tests
      test integration::agent::e2e_multi_turn_with_memory_enrichment ... ok
      test integration::agent::e2e_memory_enrichment_injects_context ... ok
      test integration::agent::e2e_multi_turn_history_fidelity ... ok
      test integration::agent::e2e_empty_memory_context_passthrough ... ok
      test integration::agent::e2e_multi_turn_conversation ... ok
      test integration::agent::e2e_parallel_tool_dispatch ... ok
      test integration::agent_robustness::agent_handles_empty_provider_response ... ok
      test integration::agent_robustness::agent_handles_failing_tool ... ok
      test integration::agent::e2e_simple_text_response ... ok
      test integration::agent::e2e_unknown_tool_recovery ... ok
      test integration::agent_robustness::agent_handles_mixed_tool_success_and_failure ... ok
      test integration::agent::e2e_single_tool_call_cycle ... ok
      test integration::agent_robustness::agent_handles_none_text_response ... ok
      test integration::agent::e2e_xml_dispatcher_tool_call ... ok
      test integration::agent::e2e_multi_step_tool_chain ... ok
      test integration::agent_robustness::agent_handles_nonexistent_tool_gracefully ... ok
      test integration::agent_robustness::agent_recovers_from_text_with_xml_residue ... ok
      test integration::agent_robustness::agent_handles_whitespace_only_response ... ok
      test integration::agent_robustness::agent_handles_nested_json_tool_arguments ... ok
      test integration::agent_robustness::agent_handles_tool_call_with_empty_arguments ... ok
      test integration::agent_robustness::agent_handles_unicode_tool_arguments ... ok
      test integration::backup_cron_scheduling::backup_cron_job_not_synced_when_schedule_none ... ok
      test integration::agent_robustness::agent_handles_sequential_tool_then_text ... ok
      test integration::agent_robustness::agent_respects_max_tool_iterations ... ok
      test integration::channel_matrix::all_platforms_channel_field_matches_platform_name ... ok
      test integration::channel_matrix::all_platforms_have_non_empty_fields ... ok
      test integration::channel_matrix::alternating_channels_preserve_isolation ... ok
      test integration::channel_matrix::capability_matrix_spec ... ok
      test integration::channel_matrix::channel_message_max_timestamp ... ok
      test integration::channel_matrix::channel_message_none_thread_ts_preserved ... ok
      test integration::channel_matrix::channel_message_thread_ts_preserved_on_clone ... ok
      test integration::channel_matrix::channel_message_zero_timestamp ... ok
      test integration::channel_matrix::channel_platforms_have_distinct_sender_and_reply_target ... ok
      test integration::channel_matrix::concurrent_reactions_all_recorded ... ok
      test integration::channel_matrix::concurrent_sends_all_recorded ... ok
      test integration::channel_matrix::concurrent_typing_events_all_recorded ... ok
      test integration::channel_matrix::dm_platforms_have_same_sender_and_reply_target ... ok
      test integration::channel_matrix::draft_cancel_lifecycle ... ok
      test integration::channel_matrix::draft_channel_reports_support ... ok
      test integration::channel_matrix::draft_full_lifecycle_send_update_finalize ... ok
      test integration::channel_matrix::draft_multiple_sequential_drafts_get_unique_ids ... ok
      test integration::channel_matrix::draft_non_supporting_channel_returns_none ... ok
      test integration::channel_matrix::dyn_channel_dispatch_works ... ok
      test integration::channel_matrix::full_conversation_lifecycle ... ok
      test integration::channel_matrix::messages_routed_to_correct_channel ... ok
      test integration::channel_matrix::minimal_channel_all_defaults_succeed ... ok
      test integration::channel_matrix::multi_channel_listen_produces_channel_tagged_messages ... ok
      test integration::channel_matrix::non_draft_channel_reports_no_support ... ok
      test integration::channel_matrix::pin_multiple_messages_in_same_channel ... ok
      test integration::channel_matrix::pin_unpin_lifecycle ... ok
      test integration::channel_matrix::rapid_send_burst ... ok
      test integration::channel_matrix::reaction_across_different_channels_and_messages ... ok
      test integration::channel_matrix::reaction_add_remove_lifecycle ... ok
      test integration::channel_matrix::reaction_multiple_emojis_on_same_message ... ok
      test integration::channel_matrix::reaction_unicode_emoji_preserved ... ok
      test integration::channel_matrix::redact_message_lifecycle ... ok
      test integration::channel_matrix::reply_uses_reply_target_not_sender ... ok
      test integration::channel_matrix::send_content_with_newlines_and_special_chars ... ok
      test integration::channel_matrix::send_empty_content ... ok
      test integration::channel_matrix::send_message_empty_subject ... ok
      test integration::channel_matrix::send_message_in_thread_builder ... ok
      test integration::channel_matrix::send_message_in_thread_none_clears_thread ... ok
      test integration::channel_matrix::send_message_subject_none_by_default ... ok
      test integration::channel_matrix::send_message_with_subject_preserves_thread ... ok
      test integration::channel_matrix::send_unicode_content ... ok
      test integration::channel_matrix::send_very_long_content ... ok
      test integration::channel_matrix::threaded_platforms_have_thread_ts ... ok
      test integration::channel_matrix::threaded_reply_preserves_thread_ts ... ok
      test integration::channel_matrix::trait_health_check_configurable ... ok
      test integration::channel_matrix::trait_listen_produces_well_formed_message ... ok
      test integration::channel_matrix::trait_name_returns_configured_name ... ok
      test integration::channel_matrix::trait_send_records_content_and_recipient ... ok
      test integration::channel_matrix::typing_empty_recipient_does_not_panic ... ok
      test integration::channel_matrix::typing_multiple_recipients_interleaved ... ok
      test integration::channel_matrix::typing_start_stop_cycle ... ok
      test integration::channel_routing::channel_draft_defaults ... ok
      test integration::channel_routing::channel_health_check_default_returns_true ... ok
      test integration::channel_routing::channel_listen_produces_correct_identity_fields ... ok
      test integration::channel_routing::channel_message_fields_not_swapped ... ok
      test integration::channel_routing::channel_message_preserves_all_fields_on_clone ... ok
      test integration::channel_routing::channel_message_reply_target_distinct_from_sender ... ok
      test integration::channel_routing::channel_message_sender_field_holds_platform_user_id ... ok
      test integration::channel_routing::channel_multiple_sends_preserve_order_and_recipients ... ok
      test integration::channel_routing::channel_send_preserves_recipient ... ok
      test integration::channel_routing::channel_send_reply_uses_sender_from_listen ... ok
      test integration::channel_routing::channel_typing_defaults_succeed ... ok
      test integration::channel_routing::send_message_new_sets_content_and_recipient ... ok
      test integration::channel_routing::send_message_recipient_carries_platform_target ... ok
      test integration::channel_routing::send_message_with_subject_sets_all_fields ... ok
      test integration::email_attachments::extract_attachments_from_multipart_email ... ok
      test integration::email_attachments::extract_attachments_respects_size_limit ... ok
      test integration::email_attachments::extract_attachments_skips_text_parts ... ok
      test integration::email_attachments::send_message_attachments_default_empty ... ok
      test integration::email_attachments::send_message_with_attachments_builder ... ok
      test integration::hooks::hook_runner_full_pipeline ... ok
      test integration::memory_comparison::compare_category_filter ... ok
      test integration::memory_comparison::compare_forget ... ok
      test integration::backup_cron_scheduling::backup_cron_job_synced_when_schedule_set ... ok
      test integration::backup_cron_scheduling::backup_cron_job_command_is_backup_create ... ok
      test integration::backup_cron_scheduling::backup_cron_job_type_is_shell ... ok
      test integration::backup_cron_scheduling::backup_cron_job_id_is_stable ... ok
      test integration::backup_cron_scheduling::backup_cron_job_removed_when_schedule_cleared ... ok
      test integration::backup_cron_scheduling::backup_cron_job_source_is_declarative ... ok
      test integration::backup_cron_scheduling::backup_cron_job_schedule_updated ... ok
      test integration::memory_comparison::compare_recall_quality ... ok
      test integration::memory_comparison::compare_upsert ... ok
      test integration::memory_loop_continuity::agent_completes_five_step_tool_chain ... ok
      test integration::memory_comparison::compare_persistence ... ok
      test integration::memory_loop_continuity::agent_handles_interleaved_tools_and_text ... ok
      test integration::memory_loop_continuity::agent_handles_parallel_tool_calls ... ok
      test integration::memory_loop_continuity::agent_auto_saves_and_recalls_memory ... ok
      test integration::memory_comparison::compare_store_speed ... ok
      test integration::memory_loop_continuity::agent_maintains_history_across_turns ... ok
      test integration::memory_loop_continuity::agent_multi_turn_with_tools_builds_context ... ok
      test integration::memory_loop_continuity::agent_survives_large_tool_output ... ok
      test integration::memory_loop_continuity::compressor_with_memory_saves_summary ... ok
      test integration::memory_loop_continuity::session_backend_persists_messages ... ok
      test integration::memory_loop_continuity::consolidation_extracts_facts_to_memory ... ok
      test integration::memory_loop_continuity::session_state_transitions ... ok
      test integration::memory_loop_continuity::memory_recall_returns_relevant_entries ... ok
      test integration::memory_comparison::compare_recall_speed ... ok
      test integration::memory_loop_continuity::memory_survives_rapid_consolidation ... ok
      test integration::memory_restart::sqlite_memory_forget_nonexistent_returns_false ... ok
      test integration::memory_restart::sqlite_memory_concurrent_stores_no_data_loss ... ok
      test integration::memory_loop_continuity::memory_persists_across_instances ... ok
      test integration::memory_restart::sqlite_memory_forget_removes_entry ... ok
      test integration::memory_restart::sqlite_memory_global_recall_includes_all_sessions ... ok
      test integration::memory_restart::sqlite_memory_health_check_returns_true ... ok
      test integration::memory_restart::sqlite_memory_list_by_category ... ok
      test integration::memory_restart::sqlite_memory_recall_empty_query_returns_recent_entries ... ok
      test integration::report_template_tool_test::default_language_is_en ... ok
      test integration::report_template_tool_test::empty_variables_map_renders ... ok
      test integration::report_template_tool_test::injection_protection_enforced ... ok
      test integration::report_template_tool_test::invalid_language_code_fails ... ok
      test integration::report_template_tool_test::invalid_template_name_fails ... ok
      test integration::report_template_tool_test::missing_template_param_fails ... ok
      test integration::report_template_tool_test::missing_variables_param_fails ... ok
      test integration::report_template_tool_test::non_string_variable_values_coerced ... ok
      test integration::report_template_tool_test::render_milestone_report_it ... ok
      test integration::report_template_tool_test::render_risk_register_fr ... ok
      test integration::report_template_tool_test::render_sprint_review_de ... ok
      test integration::report_template_tool_test::render_weekly_status_en ... ok
      test integration::memory_restart::sqlite_memory_recall_respects_limit ... ok
      test integration::memory_restart::sqlite_memory_recall_returns_relevant_results ... ok
      test integration::telegram_attachment_fallback::document_only_message_falls_back_to_text ... ok
      test integration::telegram_attachment_fallback::document_url_failure_falls_back_to_text_link ... ok
      test integration::telegram_attachment_fallback::photo_url_failure_falls_back_to_text_link ... ok
      test integration::memory_restart::sqlite_memory_session_scoped_store_and_recall ... ok
      test integration::telegram_attachment_fallback::multiple_attachments_independent_fallback ... ok
      test integration::telegram_attachment_fallback::successful_attachment_no_fallback ... ok
      test integration::memory_restart::sqlite_memory_store_different_keys_creates_separate_entries ... ok
      test integration::memory_restart::sqlite_memory_persists_across_reinitialization ... ok
      test integration::memory_restart::sqlite_memory_restart_does_not_duplicate_on_rewrite ... ok
      test integration::telegram_attachment_fallback::text_portion_delivered_before_attachment_failure ... ok
      test integration::telegram_finalize_draft::finalize_draft_sends_fresh_message_after_successful_delete ... ok
      test integration::memory_restart::sqlite_memory_store_same_key_deduplicates ... ok
      test integration::telegram_finalize_draft::finalize_draft_treats_not_modified_as_success ... ok
      test integration::telegram_finalize_draft::finalize_draft_plain_retry_treats_not_modified_as_success ... ok
      test integration::telegram_finalize_draft::finalize_draft_skips_send_message_when_delete_fails ... ok
      
      test result: ok. 159 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.00s
      
  • Beyond CI — what did you manually verify?
    • Verified both read-only ActivatedToolSet access paths recover from a poisoned mutex instead of panicking.
    • Verified the recovered state still exposes activated deferred tool specs.
    • Verified activated deferred tool resolution still executes the expected tool after poison.
    • Did not manually verify a full interactive end-to-end daemon/session workflow.

Security & Privacy Impact (required)

Yes/No for each. Answer any Yes with a 1–2 sentence explanation.

  • New permissions, capabilities, or file system access scope? (No)
  • New external network calls? (No)
  • Secrets / tokens / credentials handling changed? (No)
  • PII, real identities, or personal data in diff, tests, fixtures, or docs? (No)
  • If any Yes, describe the risk and mitigation:

Compatibility (required)

  • Backward compatible? (Yes)
  • Config / env / CLI surface changed? (No)
  • If No or Yes to either: exact upgrade steps for existing users:

Rollback (required for risk: medium and risk: high)

  • Fast rollback command/path: git revert <merge_commit_sha>
  • Feature flags or config toggles: None
  • Observable failure symptoms: Look for warnings containing activated-tool lock poisoned while assembling iteration tool specs; recovering guard for read or activated-tool lock poisoned while resolving tool; recovering guard for read. A regression would likely show deferred MCP tools missing from per-turn tool specs or activated deferred tools failing to resolve during execution.

Supersede Attribution (required only when Supersedes # is used)

  • Superseded PRs + authors (#<pr> by @<author>, one per line):
  • Scope materially carried forward:
  • Co-authored-by trailers added in commit messages for incorporated contributors? (No)
  • If No, why (inspiration-only, no direct code/design carry-over):

Labels live in the GitHub label UI, not in the body. Maintainers and reviewers with label permissions set risk:*, size:*, and any missing manual labels via the sidebar. The PR path labeler only owns path/scope labels from .github/labeler.yml. Contributors without label permission can note obvious label mismatches in a comment.

Do not add bot/AI attribution footers such as Co-authored-by: Claude ...
or Created with Claude Code to the PR body or commit-message tail. Human
co-author trailers are appropriate only for incorporated contributor work under
the supersede-attribution section and privacy contract.

Privacy contract (docs/book/src/contributing/privacy.md) is a merge gate. Never commit real identities, secrets, personal emails, or PII in diff, tests, fixtures, or docs.

@77382104 77382104 requested a review from Audacity88 as a code owner June 16, 2026 03:05
@github-actions github-actions Bot added agent Auto scope: src/agent/** changed. runtime Auto scope: src/runtime/** changed. labels Jun 16, 2026
@77382104 77382104 force-pushed the fix/runtime-activated-tool-lock-poison-recovery branch from f047957 to 352cb5f Compare June 16, 2026 03:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent Auto scope: src/agent/** changed. runtime Auto scope: src/runtime/** changed.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug(runtime): handle poisoned activated-tool lock without panicking

1 participant