[INFO] cloning repository https://github.com/knoxio/room-ralph
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/knoxio/room-ralph" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fknoxio%2Froom-ralph", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fknoxio%2Froom-ralph'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 7f147575aebf06cfa4c030fb91c9e951e8b1b9e8
[INFO] testing knoxio/room-ralph against try#33835004928d3bf65db4d4712e1330766263b0bd for pr-155739-1
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fknoxio%2Froom-ralph" "/workspace/builds/worker-6-tc2/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-6-tc2/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/knoxio/room-ralph
[INFO] finished tweaking git repo https://github.com/knoxio/room-ralph
[INFO] tweaked toml for git repo https://github.com/knoxio/room-ralph written to /workspace/builds/worker-6-tc2/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/knoxio/room-ralph on toolchain 33835004928d3bf65db4d4712e1330766263b0bd
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+33835004928d3bf65db4d4712e1330766263b0bd" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/knoxio/room-ralph already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+33835004928d3bf65db4d4712e1330766263b0bd" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+33835004928d3bf65db4d4712e1330766263b0bd" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] 35b0c761ffa20326343ddeb2c935bd6892f27f98914485be70b4bdf6e222d039
[INFO] running `Command { std: "docker" "start" "-a" "35b0c761ffa20326343ddeb2c935bd6892f27f98914485be70b4bdf6e222d039", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "35b0c761ffa20326343ddeb2c935bd6892f27f98914485be70b4bdf6e222d039", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "35b0c761ffa20326343ddeb2c935bd6892f27f98914485be70b4bdf6e222d039", kill_on_drop: false }`
[INFO] [stdout] 35b0c761ffa20326343ddeb2c935bd6892f27f98914485be70b4bdf6e222d039
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+33835004928d3bf65db4d4712e1330766263b0bd" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 9bcf9ad745667e9abe5ba07074219b2e257ce784975a8f75acbd460cbf4f2902
[INFO] running `Command { std: "docker" "start" "-a" "9bcf9ad745667e9abe5ba07074219b2e257ce784975a8f75acbd460cbf4f2902", kill_on_drop: false }`
[INFO] [stderr]    Compiling libc v0.2.183
[INFO] [stderr]    Compiling getrandom v0.4.2
[INFO] [stderr]    Compiling anyhow v1.0.102
[INFO] [stderr]    Compiling once_cell v1.21.4
[INFO] [stderr]    Compiling anstyle-parse v1.0.0
[INFO] [stderr]    Compiling colorchoice v1.0.5
[INFO] [stderr]    Compiling memchr v2.8.0
[INFO] [stderr]    Compiling anstyle v1.0.14
[INFO] [stderr]    Compiling syn v2.0.117
[INFO] [stderr]    Compiling regex-syntax v0.8.10
[INFO] [stderr]    Compiling clap_lex v1.1.0
[INFO] [stderr]    Compiling toml_write v0.1.2
[INFO] [stderr]    Compiling winnow v0.7.15
[INFO] [stderr]    Compiling tracing-core v0.1.36
[INFO] [stderr]    Compiling anstream v1.0.0
[INFO] [stderr]    Compiling serde_json v1.0.149
[INFO] [stderr]    Compiling clap_builder v4.6.0
[INFO] [stderr]    Compiling tracing-log v0.2.0
[INFO] [stderr]    Compiling errno v0.3.14
[INFO] [stderr]    Compiling parking_lot_core v0.9.12
[INFO] [stderr]    Compiling mio v1.1.1
[INFO] [stderr]    Compiling socket2 v0.6.3
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling uuid v1.22.0
[INFO] [stderr]    Compiling signal-hook-registry v1.4.8
[INFO] [stderr]    Compiling parking_lot v0.12.5
[INFO] [stderr]    Compiling matchers v0.2.0
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling tracing-attributes v0.1.31
[INFO] [stderr]    Compiling tokio-macros v2.6.1
[INFO] [stderr]    Compiling clap_derive v4.6.0
[INFO] [stderr]    Compiling tokio v1.50.0
[INFO] [stderr]    Compiling tracing v0.1.44
[INFO] [stderr]    Compiling tracing-subscriber v0.3.23
[INFO] [stderr]    Compiling clap v4.6.0
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling chrono v0.4.44
[INFO] [stderr]    Compiling serde_spanned v0.6.9
[INFO] [stderr]    Compiling toml_datetime v0.6.11
[INFO] [stderr]    Compiling toml_edit v0.22.27
[INFO] [stderr]    Compiling room-protocol v3.5.1
[INFO] [stderr]    Compiling toml v0.8.23
[INFO] [stderr]    Compiling room-ralph v3.5.1 (/opt/rustwide/workdir/crates/room-ralph)
[INFO] [stderr]    Compiling room-plugin-agent v3.5.1 (/opt/rustwide/workdir/crates/room-plugin-agent)
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 34.29s
[INFO] running `Command { std: "docker" "inspect" "9bcf9ad745667e9abe5ba07074219b2e257ce784975a8f75acbd460cbf4f2902", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "9bcf9ad745667e9abe5ba07074219b2e257ce784975a8f75acbd460cbf4f2902", kill_on_drop: false }`
[INFO] [stdout] 9bcf9ad745667e9abe5ba07074219b2e257ce784975a8f75acbd460cbf4f2902
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+33835004928d3bf65db4d4712e1330766263b0bd" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 99d7655f1d48e5dcb5f4d86e32e903937b7d36ca9fca30d107e5f571278a62a1
[INFO] running `Command { std: "docker" "start" "-a" "99d7655f1d48e5dcb5f4d86e32e903937b7d36ca9fca30d107e5f571278a62a1", kill_on_drop: false }`
[INFO] [stderr]    Compiling rustix v1.1.4
[INFO] [stderr]    Compiling bitflags v2.11.0
[INFO] [stderr]    Compiling linux-raw-sys v0.12.1
[INFO] [stderr]    Compiling tempfile v3.27.0
[INFO] [stderr]    Compiling room-ralph v3.5.1 (/opt/rustwide/workdir/crates/room-ralph)
[INFO] [stderr]    Compiling room-plugin-agent v3.5.1 (/opt/rustwide/workdir/crates/room-plugin-agent)
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 8.89s
[INFO] running `Command { std: "docker" "inspect" "99d7655f1d48e5dcb5f4d86e32e903937b7d36ca9fca30d107e5f571278a62a1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "99d7655f1d48e5dcb5f4d86e32e903937b7d36ca9fca30d107e5f571278a62a1", kill_on_drop: false }`
[INFO] [stdout] 99d7655f1d48e5dcb5f4d86e32e903937b7d36ca9fca30d107e5f571278a62a1
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+33835004928d3bf65db4d4712e1330766263b0bd" "test" "--frozen", kill_on_drop: false }`
[INFO] [stdout] 8ba4684ec95f966c24e33496483a688004848d82eec2b2c097940f234d5af755
[INFO] running `Command { std: "docker" "start" "-a" "8ba4684ec95f966c24e33496483a688004848d82eec2b2c097940f234d5af755", kill_on_drop: false }`
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.17s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/room_plugin_agent-9fdc2fc539924458)
[INFO] [stdout] running 102 tests
[INFO] [stdout] test personalities::tests::all_personality_names_includes_builtins ... ok
[INFO] [stdout] test personalities::tests::all_personalities_includes_builtins ... ok
[INFO] [stdout] test personalities::tests::all_personality_names_uses_all_personalities ... ok
[INFO] [stdout] test personalities::tests::builtin_coder_has_opus_model ... ok
[INFO] [stdout] test personalities::tests::all_personality_names_sorted ... ok
[INFO] [stdout] test personalities::tests::generate_username_fallback_to_uuid_when_pool_exhausted ... ok
[INFO] [stdout] test personalities::tests::generate_username_from_name_pool ... ok
[INFO] [stdout] test personalities::tests::generate_username_skips_used_names ... ok
[INFO] [stdout] test personalities::tests::builtin_reviewer_disallows_write_edit ... ok
[INFO] [stdout] test personalities::tests::builtin_personalities_has_all_five ... ok
[INFO] [stdout] test personalities::tests::load_personality_toml_io_error ... ok
[INFO] [stdout] test personalities::tests::personality_error_display_validation ... ok
[INFO] [stdout] test personalities::tests::merge_allow_all_requires_both ... ok
[INFO] [stdout] test personalities::tests::resolve_personality_returns_none_for_unknown ... ok
[INFO] [stdout] test personalities::tests::resolve_personality_returns_builtin ... ok
[INFO] [stdout] test personalities::tests::merge_deny_lists_unioned ... ok
[INFO] [stdout] test personalities::tests::merge_user_overrides_scalar_fields ... ok
[INFO] [stdout] test personalities::tests::personality_error_display_io ... ok
[INFO] [stdout] test personalities::tests::merge_empty_prompt_inherits_base ... ok
[INFO] [stdout] test personalities::tests::generate_username_empty_pool_uses_uuid ... ok
[INFO] [stdout] test personalities::tests::merge_user_cannot_remove_base_deny ... ok
[INFO] [stdout] test personalities::tests::toml_deserialization_allow_all ... ok
[INFO] [stdout] test personalities::tests::load_personality_toml_missing_required_field ... ok
[INFO] [stdout] test personalities::tests::toml_deserialization_minimal ... ok
[INFO] [stdout] test personalities::tests::toml_deserialization_roundtrip ... ok
[INFO] [stdout] test personalities::tests::load_personality_toml_validation_error ... ok
[INFO] [stdout] test personalities::tests::load_personality_toml_parse_error ... ok
[INFO] [stdout] test personalities::tests::validate_builtin_personalities_all_pass ... ok
[INFO] [stdout] test personalities::tests::validate_empty_description_rejected ... ok
[INFO] [stdout] test personalities::tests::scan_dir_collects_errors_for_invalid_files ... ok
[INFO] [stdout] test personalities::tests::resolve_personality_user_toml_overrides_builtin ... ok
[INFO] [stdout] test personalities::tests::validate_multiple_errors_collected ... ok
[INFO] [stdout] test personalities::tests::validate_empty_name_rejected ... ok
[INFO] [stdout] test personalities::tests::validate_name_pool_invalid_chars_rejected ... ok
[INFO] [stdout] test personalities::tests::validate_empty_name_pool_entry_rejected ... ok
[INFO] [stdout] test personalities::tests::scan_dir_loads_valid_files ... ok
[INFO] [stdout] test personalities::tests::validate_unknown_model_rejected ... ok
[INFO] [stdout] test personalities::tests::scan_empty_dir_returns_nothing ... ok
[INFO] [stdout] test personalities::tests::validate_valid_personality_passes ... ok
[INFO] [stdout] test tests::abi_create_with_empty_config ... ok
[INFO] [stdout] test tests::health_healthy_when_never_seen_but_alive ... ok
[INFO] [stdout] test tests::health_healthy_when_recently_seen ... ok
[INFO] [stdout] test tests::abi_declaration_matches_plugin ... ok
[INFO] [stdout] test tests::abi_create_with_json_config ... ok
[INFO] [stdout] test tests::abi_destroy_frees_plugin ... ok
[INFO] [stdout] test tests::abi_destroy_null_is_safe ... ok
[INFO] [stdout] test tests::compute_health_exited_with_code ... ok
[INFO] [stdout] test tests::compute_health_exited_process ... ok
[INFO] [stdout] test tests::health_status_display_exited_signal ... ok
[INFO] [stdout] test tests::health_status_display_exited_code ... ok
[INFO] [stdout] test tests::health_status_display_healthy ... ok
[INFO] [stdout] test tests::handle_list_includes_health_column ... ok
[INFO] [stdout] test tests::health_stale_when_last_seen_exceeds_threshold ... ok
[INFO] [stdout] test tests::default_commands_includes_spawn ... ok
[INFO] [stdout] test tests::list_empty ... ok
[INFO] [stdout] test tests::health_status_equality ... ok
[INFO] [stdout] test tests::list_empty_data_has_empty_agents ... ok
[INFO] [stdout] test tests::list_shows_exited_unknown_for_dead_process_without_child ... ok
[INFO] [stdout] test tests::list_shows_exit_code_when_recorded ... ok
[INFO] [stdout] test tests::list_shows_dash_for_empty_personality ... ok
[INFO] [stdout] test tests::list_header_includes_personality_column ... ok
[INFO] [stdout] test tests::health_status_display_stale ... ok
[INFO] [stdout] test tests::list_sorts_by_spawn_time ... ok
[INFO] [stdout] test tests::list_with_personality_and_exit_code_full_row ... ok
[INFO] [stdout] test personalities::tests::merge_user_allow_overrides_base ... ok
[INFO] [stdout] test tests::list_data_contains_agents_array ... ok
[INFO] [stdout] test tests::logs_custom_tail ... ok
[INFO] [stdout] test personalities::tests::merge_empty_name_pool_inherits_base ... ok
[INFO] [stdout] test tests::list_shows_running_for_alive_process ... ok
[INFO] [stdout] test tests::logs_default_tail ... ok
[INFO] [stdout] test tests::logs_zero_tail_rejected ... ok
[INFO] [stdout] test tests::list_shows_signal_when_no_exit_code ... ok
[INFO] [stdout] test tests::logs_tail_larger_than_file ... ok
[INFO] [stdout] test tests::spawn_command_has_personality_choice_param ... ok
[INFO] [stdout] test tests::on_message_updates_last_seen ... ok
[INFO] [stdout] test tests::on_message_ignores_untracked_users ... ok
[INFO] [stdout] test tests::spawn_invalid_username ... ok
[INFO] [stdout] test tests::logs_empty_file ... ok
[INFO] [stdout] test tests::logs_invalid_tail_value ... ok
[INFO] [stdout] test tests::prune_dead_agents_on_load ... ok
[INFO] [stdout] test tests::logs_missing_username ... ok
[INFO] [stdout] test tests::logs_unknown_agent ... ok
[INFO] [stdout] test tests::list_with_agents ... ok
[INFO] [stdout] test tests::logs_missing_log_file ... ok
[INFO] [stdout] test tests::spawn_missing_username ... ok
[INFO] [stdout] test personalities::tests::builtin_scout_disallows_write_edit_bash ... ok
[INFO] [stdout] test tests::spawn_personality_collision_with_online_user ... ok
[INFO] [stdout] test tests::spawn_username_collision_with_running_agent ... ok
[INFO] [stdout] test tests::spawn_username_collision_with_online_user ... ok
[INFO] [stdout] test tests::spawn_personality_unknown_returns_error ... ok
[INFO] [stdout] test tests::spawn_personality_auto_name_skips_used ... ok
[INFO] [stdout] test tests::stale_threshold_default_is_five_minutes ... ok
[INFO] [stdout] test tests::spawn_personality_missing_returns_usage ... ok
[INFO] [stdout] test tests::unknown_action_returns_usage ... ok
[INFO] [stdout] test tests::stop_missing_username ... ok
[INFO] [stdout] test tests::persist_and_load_roundtrip ... ok
[INFO] [stdout] test tests::stop_data_includes_action_and_username ... ok
[INFO] [stdout] test tests::stop_already_exited_agent ... ok
[INFO] [stdout] test tests::stop_host_can_stop_agent ... ok
[INFO] [stdout] test tests::stop_non_host_denied ... ok
[INFO] [stdout] test tests::stop_unknown_agent ... ok
[INFO] [stdout] test tests::persist_roundtrip_with_personality ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 102 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/room_ralph-a4d3c8a8d9912e45)
[INFO] [stdout] running 187 tests
[INFO] [stdout] test agent_meta::tests::cleanup_missing_file_no_error ... ok
[INFO] [stdout] test agent_meta::tests::meta_path_returns_expected ... ok
[INFO] [stdout] test claude::tests::build_command_both_allowed_and_disallowed ... ok
[INFO] [stdout] test claude::tests::build_command_empty_disallowed_tools ... ok
[INFO] [stdout] test claude::tests::build_command_empty_allowed_tools ... ok
[INFO] [stdout] test agent_meta::tests::serialization_skips_none_fields ... ok
[INFO] [stdout] test claude::tests::build_command_strips_claudecode_env_vars ... ok
[INFO] [stdout] test agent_meta::tests::write_to_nonexistent_dir_fails ... ok
[INFO] [stdout] test claude::tests::build_command_with_add_dirs ... ok
[INFO] [stdout] test agent_meta::tests::cleanup_removes_file ... ok
[INFO] [stdout] test claude::tests::build_command_with_allowed_tools ... ok
[INFO] [stdout] test claude::tests::extract_response_from_result_field ... ok
[INFO] [stdout] test claude::tests::build_command_with_dirs_and_tools ... ok
[INFO] [stdout] test agent_meta::tests::read_missing_returns_none ... ok
[INFO] [stdout] test claude::tests::build_command_with_disallowed_tools ... ok
[INFO] [stdout] test claude::tests::detect_context_exhaustion_false_on_unrelated ... ok
[INFO] [stdout] test claude::tests::extract_response_non_json ... ok
[INFO] [stdout] test agent_meta::tests::write_and_read_roundtrip ... ok
[INFO] [stdout] test claude::tests::extract_response_empty_input ... ok
[INFO] [stdout] test claude::tests::detect_context_exhaustion_exit_zero ... ok
[INFO] [stdout] test claude::tests::merge_no_profile_passes_through ... ok
[INFO] [stdout] test claude::tests::merge_profile_deduplicates_allow ... ok
[INFO] [stdout] test claude::tests::merge_profile_deduplicates_disallow ... ok
[INFO] [stdout] test claude::tests::merge_profile_only_no_overrides ... ok
[INFO] [stdout] test claude::tests::extract_response_from_content_field ... ok
[INFO] [stdout] test claude::tests::build_command_base_args ... ok
[INFO] [stdout] test claude::tests::merge_profile_both_overrides ... ok
[INFO] [stdout] test claude::tests::profile_reviewer_blocks_writes ... ok
[INFO] [stdout] test claude::tests::merge_profile_with_extra_disallow ... ok
[INFO] [stdout] test claude::tests::profile_coder_has_full_access ... ok
[INFO] [stdout] test claude::tests::profile_coordinator_blocks_writes ... ok
[INFO] [stdout] test claude::tests::profile_display_roundtrip ... ok
[INFO] [stdout] test claude::tests::profile_notion_has_notion_tools_and_blocks_push ... ok
[INFO] [stdout] test claude::tests::profile_parse_all_variants ... ok
[INFO] [stdout] test claude::tests::profile_parse_case_insensitive ... ok
[INFO] [stdout] test claude::tests::profile_reader_is_minimal ... ok
[INFO] [stdout] test claude::tests::profile_parse_invalid ... ok
[INFO] [stdout] test claude::tests::merge_profile_with_extra_allow ... ok
[INFO] [stdout] test claude::tests::detect_context_exhaustion_patterns ... ok
[INFO] [stdout] test claude::tests::extract_response_json_without_known_fields ... ok
[INFO] [stdout] test claude::tests::extract_response_from_error_field ... ok
[INFO] [stdout] test claude::tests::resolve_cli_none_disables_restrictions ... ok
[INFO] [stdout] test claude::tests::resolve_disallowed_env_none_clears ... ok
[INFO] [stdout] test claude::tests::resolve_cli_overrides_defaults ... ok
[INFO] [stdout] test claude::tests::resolve_env_overrides_defaults ... ok
[INFO] [stdout] test claude::tests::resolve_disallowed_env_overrides ... ok
[INFO] [stdout] test claude::tests::resolve_env_empty_string_uses_defaults ... ok
[INFO] [stdout] test claude::tests::resolve_disallowed_env_empty_uses_defaults ... ok
[INFO] [stdout] test claude::tests::resolve_disallowed_env_trims_whitespace ... ok
[INFO] [stdout] test claude::tests::resolve_defaults_when_empty ... ok
[INFO] [stdout] test claude::tests::resolve_disallowed_cli_overrides ... ok
[INFO] [stdout] test claude::tests::resolve_disallowed_cli_takes_precedence_over_env ... ok
[INFO] [stdout] test loop_runner::tests::format_heartbeat_with_issue ... ok
[INFO] [stdout] test claude::tests::resolve_cli_takes_precedence_over_env ... ok
[INFO] [stdout] test claude::tests::resolve_env_none_disables_restrictions ... ok
[INFO] [stdout] test claude::tests::resolve_disallowed_defaults_empty ... ok
[INFO] [stdout] test claude::tests::stripped_env_vars_contains_expected_entries ... ok
[INFO] [stdout] test loop_runner::tests::format_duration_hours ... ok
[INFO] [stdout] test loop_runner::tests::format_duration_minutes_and_seconds ... ok
[INFO] [stdout] test loop_runner::tests::format_duration_seconds_only ... ok
[INFO] [stdout] test loop_runner::tests::format_heartbeat_large_iteration ... ok
[INFO] [stdout] test claude::tests::resolve_cli_none_case_insensitive ... ok
[INFO] [stdout] test monitor::tests::format_usage_summary_over_threshold ... ok
[INFO] [stdout] test loop_runner::tests::format_heartbeat_without_issue ... ok
[INFO] [stdout] test monitor::tests::context_limit_default ... ok
[INFO] [stdout] test monitor::tests::parse_cost_empty_returns_zero ... ok
[INFO] [stdout] test monitor::tests::parse_cost_cost_usd_path ... ok
[INFO] [stdout] test monitor::tests::parse_cost_result_nested ... ok
[INFO] [stdout] test monitor::tests::parse_cost_usage_total_cost ... ok
[INFO] [stdout] test monitor::tests::parse_cost_no_cost_returns_zero ... ok
[INFO] [stdout] test monitor::tests::parse_output_tokens_empty_returns_zero ... ok
[INFO] [stdout] test monitor::tests::format_usage_summary_under_threshold ... ok
[INFO] [stdout] test monitor::tests::log_usage_restart_annotation ... ok
[INFO] [stdout] test monitor::tests::log_usage_no_restart_under_threshold ... ok
[INFO] [stdout] test monitor::tests::log_usage_creates_section_in_new_file ... ok
[INFO] [stdout] test monitor::tests::parse_output_tokens_nested ... ok
[INFO] [stdout] test monitor::tests::parse_output_tokens_missing_returns_zero ... ok
[INFO] [stdout] test monitor::tests::log_usage_appends_to_existing_section ... ok
[INFO] [stdout] test monitor::tests::parse_output_tokens_statistics ... ok
[INFO] [stdout] test monitor::tests::parse_usage_invalid_json_returns_zero ... ok
[INFO] [stdout] test monitor::tests::parse_output_tokens_top_level ... ok
[INFO] [stdout] test monitor::tests::parse_usage_missing_returns_zero ... ok
[INFO] [stdout] test monitor::tests::parse_usage_nested_under_result ... ok
[INFO] [stdout] test monitor::tests::parse_usage_empty_string_returns_zero ... ok
[INFO] [stdout] test monitor::tests::parse_cost_total_cost_path ... ok
[INFO] [stdout] test monitor::tests::resolve_path_missing_returns_none ... ok
[INFO] [stdout] test monitor::tests::parse_usage_null_tokens_returns_zero ... ok
[INFO] [stdout] test monitor::tests::resolve_path_nested ... ok
[INFO] [stdout] test monitor::tests::should_restart_at_limit ... ok
[INFO] [stdout] test monitor::tests::should_restart_under_threshold ... ok
[INFO] [stdout] test monitor::tests::should_restart_zero_tokens ... ok
[INFO] [stdout] test monitor::tests::threshold_tokens_default ... ok
[INFO] [stdout] test monitor::tests::usage_pct_fifty ... ok
[INFO] [stdout] test monitor::tests::usage_pct_hundred ... ok
[INFO] [stdout] test monitor::tests::should_restart_at_threshold ... ok
[INFO] [stdout] test monitor::tests::should_restart_over_threshold ... ok
[INFO] [stdout] test monitor::tests::usage_pct_zero ... ok
[INFO] [stdout] test monitor::tests::should_restart_just_below_threshold ... ok
[INFO] [stdout] test personalities::tests::all_names_returns_five ... ok
[INFO] [stdout] test personalities::tests::all_returns_five_personalities ... ok
[INFO] [stdout] test personalities::tests::coder_profile_is_coder ... ok
[INFO] [stdout] test personalities::tests::documenter_profile_is_notion ... ok
[INFO] [stdout] test personalities::tests::each_personality_has_non_empty_description ... ok
[INFO] [stdout] test personalities::tests::each_personality_has_non_empty_prompt ... ok
[INFO] [stdout] test monitor::tests::usage_pct_seventy_five ... ok
[INFO] [stdout] test monitor::tests::parse_usage_statistics_path ... ok
[INFO] [stdout] test monitor::tests::parse_usage_top_level ... ok
[INFO] [stdout] test personalities::tests::coordinator_profile_is_coordinator ... ok
[INFO] [stdout] test monitor::tests::resolve_path_single_segment ... ok
[INFO] [stdout] test personalities::tests::coder_defaults_to_opus ... ok
[INFO] [stdout] test personalities::tests::lookup_all_builtins ... ok
[INFO] [stdout] test claude::tests::resolve_env_trims_whitespace ... ok
[INFO] [stdout] test personalities::tests::researcher_defaults_to_sonnet ... ok
[INFO] [stdout] test personalities::tests::format_list_contains_all_names ... ok
[INFO] [stdout] test personalities::tests::resolve_builtin_name ... ok
[INFO] [stdout] test personalities::tests::lookup_case_insensitive ... ok
[INFO] [stdout] test loop_runner::tests::format_heartbeat_zero_uptime ... ok
[INFO] [stdout] test personalities::tests::researcher_profile_is_reader ... ok
[INFO] [stdout] test personalities::tests::reviewer_profile_is_reviewer ... ok
[INFO] [stdout] test progress::tests::delete_progress_nonexistent_is_ok ... ok
[INFO] [stdout] test progress::tests::delete_progress_removes_file ... ok
[INFO] [stdout] test personalities::tests::resolve_from_str_file ... ok
[INFO] [stdout] test personalities::tests::resolve_file_path ... ok
[INFO] [stdout] test personalities::tests::lookup_unknown_returns_none ... ok
[INFO] [stdout] test personalities::tests::resolve_file_path_for_unknown_name ... ok
[INFO] [stdout] test progress::tests::write_progress_creates_file_with_metadata ... ok
[INFO] [stdout] test personalities::tests::resolve_from_str_builtin ... ok
[INFO] [stdout] test progress::tests::log_usage_to_file_delegates_to_monitor ... ok
[INFO] [stdout] test progress::tests::progress_file_path_empty_issue_uses_username ... ok
[INFO] [stdout] test progress::tests::progress_file_path_with_issue ... ok
[INFO] [stdout] test progress::tests::write_progress_overwrites_existing_file ... ok
[INFO] [stdout] test progress::tests::read_progress_empty_file_returns_some_empty ... ok
[INFO] [stdout] test progress::tests::progress_file_path_without_issue_uses_username ... ok
[INFO] [stdout] test progress::tests::write_progress_short_response_not_truncated ... ok
[INFO] [stdout] test progress::tests::read_progress_missing_file_returns_none ... ok
[INFO] [stdout] test progress::tests::read_progress_existing_file ... ok
[INFO] [stdout] test prompt::tests::build_prompt_no_issue_gives_generic_instruction ... ok
[INFO] [stdout] test prompt::tests::build_prompt_default_system_context ... ok
[INFO] [stdout] test prompt::tests::build_prompt_no_personality_produces_default ... ok
[INFO] [stdout] test room::tests::detect_token_expiry_patterns ... ok
[INFO] [stdout] test prompt::tests::build_prompt_with_personality_text ... ok
[INFO] [stdout] test progress::tests::write_progress_truncates_long_response ... ok
[INFO] [stdout] test progress::tests::write_progress_without_issue ... ok
[INFO] [stdout] test prompt::tests::build_prompt_with_messages ... ok
[INFO] [stdout] test progress::tests::write_read_roundtrip ... ok
[INFO] [stdout] test prompt::tests::build_prompt_personality_with_custom_prompt ... ok
[INFO] [stdout] test prompt::tests::build_prompt_with_progress_file ... ok
[INFO] [stdout] test room::tests::is_username_taken_rejects_unrelated_errors ... ok
[INFO] [stdout] test room::tests::join_room_uses_room_token_env_when_set ... ok
[INFO] [stdout] test room::tests::legacy_token_file_path_format ... ok
[INFO] [stdout] test room::tests::extract_token_from_valid_json ... ok
[INFO] [stdout] test room::tests::set_status_message_with_status_text ... ok
[INFO] [stdout] test room::tests::is_username_taken_detects_already_taken ... ok
[INFO] [stdout] test room::tests::extract_token_fails_on_garbage ... ok
[INFO] [stdout] test room::tests::log_file_path_format ... ok
[INFO] [stdout] test room::tests::room_token_env_constant_value ... ok
[INFO] [stdout] test room::tests::token_file_path_format ... ok
[INFO] [stdout] test room::tests::is_username_taken_detects_already_in_use ... ok
[INFO] [stdout] test room::tests::set_status_message_empty_clears_status ... ok
[INFO] [stdout] test room::tests::extract_token_from_multiline ... ok
[INFO] [stdout] test room::tests::watch_room_nonexistent_socket_returns_error ... ok
[INFO] [stdout] test tests::allow_all_flag_defaults_to_false ... ok
[INFO] [stdout] test room::tests::join_room_ignores_empty_room_token_env ... ok
[INFO] [stdout] test claude::tests::resolve_disallowed_cli_none_clears ... ok
[INFO] [stdout] test tests::allow_all_coexists_with_profile ... ok
[INFO] [stdout] test tests::allow_all_flag_sets_true ... ok
[INFO] [stdout] test tests::allow_all_from_env_var ... ok
[INFO] [stdout] test tests::env_vars_used_when_args_omitted ... ok
[INFO] [stdout] test tests::cli_args_take_precedence_over_env ... ok
[INFO] [stdout] test tests::heartbeat_interval_defaults_to_five ... ok
[INFO] [stdout] test tests::heartbeat_interval_from_env ... ok
[INFO] [stdout] test tests::heartbeat_interval_flag_overrides_env ... ok
[INFO] [stdout] test tests::heartbeat_interval_from_flag ... ok
[INFO] [stdout] test tests::missing_required_without_env_fails ... ok
[INFO] [stdout] test tests::model_default_used_without_env_or_flag ... ok
[INFO] [stdout] test tests::heartbeat_interval_zero_disables ... ok
[INFO] [stdout] test tests::issue_env_is_optional ... ok
[INFO] [stdout] test tests::partial_env_with_partial_args ... ok
[INFO] [stdout] test tests::profile_defaults_to_none ... ok
[INFO] [stdout] test tests::profile_flag_overrides_env ... ok
[INFO] [stdout] test tests::profile_flag_parses_valid ... ok
[INFO] [stdout] test tests::profile_flag_rejects_invalid ... ok
[INFO] [stdout] test tests::profile_from_env_var ... ok
[INFO] [stdout] test tests::socket_defaults_to_none ... ok
[INFO] [stdout] test tests::socket_flag_overrides_env ... ok
[INFO] [stdout] test tests::socket_flag_sets_path ... ok
[INFO] [stdout] test tests::socket_from_env_var ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 187 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/main.rs (/opt/rustwide/target/debug/deps/room_ralph-37db44d0e665108f)
[INFO] [stdout] 
[INFO] [stderr]      Running tests/integration.rs (/opt/rustwide/target/debug/deps/integration-e8469261154a51b1)
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 17 tests
[INFO] [stdout] test live_broker_join_and_announce ... ignored, requires a running broker: `room ralph-live-test host &`
[INFO] [stdout] test log_file_created_after_run ... ignored, requires claude binary or running broker
[INFO] [stdout] test max_iter_one_stops_after_single_iteration ... ignored, requires claude binary or running broker
[INFO] [stdout] test max_iter_zero_runs_until_signal ... ignored, requires claude binary or running broker
[INFO] [stdout] test multi_iteration_max_iter_three ... ignored, requires claude binary or running broker
[INFO] [stdout] test poll_messages_parses_ndjson ... ignored, requires claude binary or running broker
[INFO] [stdout] test progress_file_records_issue_number ... ignored, requires claude binary or running broker
[INFO] [stdout] test send_message_succeeds_with_mock ... ignored, requires claude binary or running broker
[INFO] [stdout] test token_obtained_from_room_join ... ignored, requires claude binary or running broker
[INFO] [stdout] test token_expiry_detected_across_formats ... ok
[INFO] [stdout] test list_personalities_returns_all_builtins ... ok
[INFO] [stdout] test personality_builtin_in_dry_run ... ok
[INFO] [stdout] test allow_all_dry_run_succeeds ... ok
[INFO] [stdout] test dry_run_prints_prompt_and_exits ... ok
[INFO] [stdout] test personality_file_appears_in_dry_run_output ... ok
[INFO] [stdout] test context_exhaustion_writes_progress ... ok
[INFO] [stderr]    Doc-tests room_plugin_agent
[INFO] [stdout] test claude_failure_continues_loop ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 8 passed; 0 failed; 9 ignored; 0 measured; 0 filtered out; finished in 0.13s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests room_ralph
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] running `Command { std: "docker" "inspect" "8ba4684ec95f966c24e33496483a688004848d82eec2b2c097940f234d5af755", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "8ba4684ec95f966c24e33496483a688004848d82eec2b2c097940f234d5af755", kill_on_drop: false }`
[INFO] [stdout] 8ba4684ec95f966c24e33496483a688004848d82eec2b2c097940f234d5af755
