[INFO] cloning repository https://github.com/douglaz/multibackend-orchestration [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/douglaz/multibackend-orchestration" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fdouglaz%2Fmultibackend-orchestration", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fdouglaz%2Fmultibackend-orchestration'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] ccb9a80f4a3d2ff9ce7a5ea685bc5bdbe079ea6a [INFO] testing douglaz/multibackend-orchestration against master#d933cf483edf1605142ac6899ff32536c0ad8b22 for pr-150933 [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fdouglaz%2Fmultibackend-orchestration" "/workspace/builds/worker-4-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-4-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/douglaz/multibackend-orchestration [INFO] finished tweaking git repo https://github.com/douglaz/multibackend-orchestration [INFO] tweaked toml for git repo https://github.com/douglaz/multibackend-orchestration written to /workspace/builds/worker-4-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/douglaz/multibackend-orchestration on toolchain d933cf483edf1605142ac6899ff32536c0ad8b22 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+d933cf483edf1605142ac6899ff32536c0ad8b22" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/douglaz/multibackend-orchestration 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" "+d933cf483edf1605142ac6899ff32536c0ad8b22" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/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:cfa559dde23f44738f9990739aaa3487d8df3af37eb5df0572f7cf76004a604a" "/opt/rustwide/cargo-home/bin/cargo" "+d933cf483edf1605142ac6899ff32536c0ad8b22" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 51697adbd4bde6a31ff1b998b74fc7c0b1c753088f67365d9e309ba54441be49 [INFO] running `Command { std: "docker" "start" "-a" "51697adbd4bde6a31ff1b998b74fc7c0b1c753088f67365d9e309ba54441be49", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "51697adbd4bde6a31ff1b998b74fc7c0b1c753088f67365d9e309ba54441be49", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "51697adbd4bde6a31ff1b998b74fc7c0b1c753088f67365d9e309ba54441be49", kill_on_drop: false }` [INFO] [stdout] 51697adbd4bde6a31ff1b998b74fc7c0b1c753088f67365d9e309ba54441be49 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/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:cfa559dde23f44738f9990739aaa3487d8df3af37eb5df0572f7cf76004a604a" "/opt/rustwide/cargo-home/bin/cargo" "+d933cf483edf1605142ac6899ff32536c0ad8b22" "build" "--frozen" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 94303dab0fadfc3f813a7783723757a3423f3515399ce97f36b18a902d4624ab [INFO] running `Command { std: "docker" "start" "-a" "94303dab0fadfc3f813a7783723757a3423f3515399ce97f36b18a902d4624ab", kill_on_drop: false }` [INFO] [stderr] Compiling libc v0.2.180 [INFO] [stderr] Compiling syn v2.0.114 [INFO] [stderr] Compiling regex-automata v0.4.14 [INFO] [stderr] Compiling tracing-core v0.1.36 [INFO] [stderr] Compiling cfg_aliases v0.2.1 [INFO] [stderr] Compiling slab v0.4.12 [INFO] [stderr] Compiling winnow v0.7.14 [INFO] [stderr] Compiling futures-task v0.3.32 [INFO] [stderr] Compiling nix v0.29.0 [INFO] [stderr] Compiling toml_write v0.1.2 [INFO] [stderr] Compiling futures-core v0.3.32 [INFO] [stderr] Compiling clap_builder v4.5.57 [INFO] [stderr] Compiling sharded-slab v0.1.7 [INFO] [stderr] Compiling thread_local v1.1.9 [INFO] [stderr] Compiling tracing-log v0.2.0 [INFO] [stderr] Compiling futures-sink v0.3.32 [INFO] [stderr] Compiling iana-time-zone v0.1.65 [INFO] [stderr] Compiling nu-ansi-term v0.50.3 [INFO] [stderr] Compiling which v7.0.3 [INFO] [stderr] Compiling sha2 v0.10.9 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Compiling parking_lot_core v0.9.12 [INFO] [stderr] Compiling errno v0.3.14 [INFO] [stderr] Compiling mio v1.1.1 [INFO] [stderr] Compiling socket2 v0.6.2 [INFO] [stderr] Compiling signal-hook-registry v1.4.8 [INFO] [stderr] Compiling parking_lot v0.12.5 [INFO] [stderr] Compiling getrandom v0.3.4 [INFO] [stderr] Compiling tempfile v3.24.0 [INFO] [stderr] Compiling fs2 v0.4.3 [INFO] [stderr] Compiling matchers v0.2.0 [INFO] [stderr] Compiling regex v1.12.3 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling futures-macro v0.3.32 [INFO] [stderr] Compiling tokio-macros v2.6.0 [INFO] [stderr] Compiling tracing-attributes v0.1.31 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling clap_derive v4.5.55 [INFO] [stderr] Compiling async-trait v0.1.89 [INFO] [stderr] Compiling tokio v1.49.0 [INFO] [stderr] Compiling futures-util v0.3.32 [INFO] [stderr] Compiling tracing v0.1.44 [INFO] [stderr] Compiling tracing-subscriber v0.3.22 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling clap v4.5.57 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling serde_spanned v0.6.9 [INFO] [stderr] Compiling toml_datetime v0.6.11 [INFO] [stderr] Compiling serde_yaml v0.9.34+deprecated [INFO] [stderr] Compiling chrono v0.4.43 [INFO] [stderr] Compiling toml_edit v0.22.27 [INFO] [stderr] Compiling tokio-util v0.7.18 [INFO] [stderr] Compiling toml v0.8.23 [INFO] [stderr] Compiling ralph v0.1.0 (/opt/rustwide/workdir) [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 53s [INFO] running `Command { std: "docker" "inspect" "94303dab0fadfc3f813a7783723757a3423f3515399ce97f36b18a902d4624ab", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "94303dab0fadfc3f813a7783723757a3423f3515399ce97f36b18a902d4624ab", kill_on_drop: false }` [INFO] [stdout] 94303dab0fadfc3f813a7783723757a3423f3515399ce97f36b18a902d4624ab [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/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:cfa559dde23f44738f9990739aaa3487d8df3af37eb5df0572f7cf76004a604a" "/opt/rustwide/cargo-home/bin/cargo" "+d933cf483edf1605142ac6899ff32536c0ad8b22" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] b52b691011b70cc2850b23ce6b09f989660b916ad067b36a27fbac33811f09c8 [INFO] running `Command { std: "docker" "start" "-a" "b52b691011b70cc2850b23ce6b09f989660b916ad067b36a27fbac33811f09c8", kill_on_drop: false }` [INFO] [stderr] Compiling futures-executor v0.3.32 [INFO] [stderr] Compiling serial_test_derive v3.4.0 [INFO] [stderr] Compiling serial_test v3.4.0 [INFO] [stderr] Compiling ralph v0.1.0 (/opt/rustwide/workdir) [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 1m 19s [INFO] running `Command { std: "docker" "inspect" "b52b691011b70cc2850b23ce6b09f989660b916ad067b36a27fbac33811f09c8", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "b52b691011b70cc2850b23ce6b09f989660b916ad067b36a27fbac33811f09c8", kill_on_drop: false }` [INFO] [stdout] b52b691011b70cc2850b23ce6b09f989660b916ad067b36a27fbac33811f09c8 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/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:cfa559dde23f44738f9990739aaa3487d8df3af37eb5df0572f7cf76004a604a" "/opt/rustwide/cargo-home/bin/cargo" "+d933cf483edf1605142ac6899ff32536c0ad8b22" "test" "--frozen", kill_on_drop: false }` [INFO] [stdout] c37a8d8ee01f2559eb45a0265658288a63d2277bb97e19ce070fc4ef882fbbbe [INFO] running `Command { std: "docker" "start" "-a" "c37a8d8ee01f2559eb45a0265658288a63d2277bb97e19ce070fc4ef882fbbbe", kill_on_drop: false }` [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 0.24s [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/ralph-3694632ff4e432e9) [INFO] [stdout] [INFO] [stdout] running 956 tests [INFO] [stdout] test backend::claude::tests::effective_args_claude_without_model_has_single_stream_json_pair ... ok [INFO] [stdout] test backend::claude::tests::ensure_stream_json_adds_verbose_when_print_flag_present ... ok [INFO] [stdout] test backend::claude::tests::effective_args_claude_with_model_still_has_single_stream_json_pair ... ok [INFO] [stdout] test backend::claude::tests::ensure_stream_json_args_is_idempotent ... ok [INFO] [stdout] test backend::claude::tests::ensure_stream_json_no_duplicate_verbose ... ok [INFO] [stdout] test backend::claude::tests::ensure_stream_json_args_strips_flag_and_equals_variants ... ok [INFO] [stdout] test backend::codex::tests::parse_codex_model_effort_unknown_suffix ... ok [INFO] [stdout] test backend::codex::tests::parse_codex_model_effort_strips_medium ... ok [INFO] [stdout] test backend::claude::tests::ensure_stream_json_no_verbose_without_print ... ok [INFO] [stdout] test backend::codex::tests::parse_codex_model_effort_no_suffix ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_claude_cli_verbose_extracts_text_and_metadata ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_claude_cli_verbose_no_result_uses_assistant_text ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_claude_cli_verbose_falls_back_to_result_text ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_429_error_before_response_json ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_claude_cli_verbose_multiple_results_keeps_longest ... ok [INFO] [stdout] test backend::codex::tests::parse_codex_model_effort_strips_high ... ok [INFO] [stdout] test backend::codex::tests::parse_codex_model_effort_strips_low ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_claude_cli_verbose_prefers_result_over_assistant ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_claude_cli_verbose_result_overrides_concatenated_narration ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_codex_cli_extracts_text_and_metadata ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_goose_cli_multiple_text_messages ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_goose_cli_extracts_text_and_tokens ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_goose_cli_token_streaming_preserves_fenced_json ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_markdown_with_embedded_json_returns_raw ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_markdown_with_json_block_still_returns_raw ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_message_event_requires_assistant_role_for_text ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_multiline_json_without_preamble ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_opencode_cli_extracts_text_and_metadata ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_opencode_cli_multiple_text_events ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_pipe_multiline_json_with_preamble ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_returns_raw_text_when_no_json_events_exist ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_codex_cli_separates_multiple_agent_messages ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_routes_single_json_when_first_json_has_no_type ... ok [INFO] [stdout] test backend::codex::tests::parse_codex_model_effort_strips_xhigh ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_routes_stream_json_when_first_line_is_stream_event ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_single_json_with_type_field_routes_to_single ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_stream_events_extracts_session_and_text ... ok [INFO] [stdout] test backend::output_normalizer::tests::stream_json_errors_when_events_exist_without_text_deltas ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_extracts_json_after_non_json_preamble ... ok [INFO] [stdout] test backend::output_normalizer::tests::stream_json_concatenates_deltas_in_order_and_extracts_metadata ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_goose_cli_filters_reasoning_and_notifications ... ok [INFO] [stdout] test backend::output_normalizer::tests::stream_json_extracts_usage_from_summary_event ... ok [INFO] [stdout] test backend::tests::assign_feature_backends_uses_openrouter_when_codex_disabled ... ok [INFO] [stdout] test backend::output_normalizer::tests::stream_json_skips_unknown_events_and_malformed_lines ... ok [INFO] [stdout] test backend::tests::backend_registry_rejects_disabled_backend ... ok [INFO] [stdout] test backend::tests::backend_registry_timeout_for_role_falls_back_to_default_for_unknown_or_invalid_spec ... ok [INFO] [stdout] test backend::tests::backend_registry_creates_openrouter_backend_for_modeled_spec ... ok [INFO] [stdout] test backend::tests::backend_registry_timeout_for_role_uses_backend_role_override_for_bare_and_modeled_specs ... ok [INFO] [stdout] test backend::tests::effective_args_claude_idempotent ... ok [INFO] [stdout] test backend::tests::effective_args_claude_produces_exact_token_sequence ... ok [INFO] [stdout] test backend::tests::effective_args_claude_requires_p_flag ... ok [INFO] [stdout] test backend::tests::effective_args_claude_rewrites_for_resume ... ok [INFO] [stdout] test backend::tests::effective_args_claude_with_existing_resume_replaces_cleanly ... ok [INFO] [stdout] test backend::tests::effective_args_codex_idempotent ... ok [INFO] [stdout] test backend::tests::effective_args_codex_produces_exact_token_sequence ... ok [INFO] [stdout] test backend::tests::effective_args_codex_requires_exec_in_base_form ... ok [INFO] [stdout] test backend::tests::effective_args_codex_requires_trailing_dash ... ok [INFO] [stdout] test backend::tests::effective_args_codex_rewrites_for_resume ... ok [INFO] [stdout] test backend::tests::effective_args_codex_with_existing_resume_replaces_cleanly ... ok [INFO] [stdout] test backend::tests::effective_args_no_session_adds_json_output ... ok [INFO] [stdout] test backend::tests::effective_args_no_session_no_json_returns_unchanged ... ok [INFO] [stdout] test backend::tests::effective_args_no_session_openrouter_rewrites_output_format_to_stream_json ... ok [INFO] [stdout] test backend::tests::effective_args_openrouter_resume_rewrite_is_idempotent ... ok [INFO] [stdout] test backend::tests::effective_args_openrouter_rewrites_for_resume_and_preserves_other_flags ... ok [INFO] [stdout] test backend::tests::is_backend_available_returns_false_for_disabled_backend ... ok [INFO] [stdout] test backend::tests::is_backend_available_returns_false_for_empty_string ... ok [INFO] [stdout] test backend::tests::cli_backend_execute_uses_configured_cwd ... ok [INFO] [stdout] test backend::tests::is_backend_available_returns_false_for_unknown_backend ... ok [INFO] [stdout] test backend::tests::is_backend_available_returns_true_for_enabled_backend ... ok [INFO] [stdout] test backend::tests::is_backend_available_with_recalculation_workflow ... ok [INFO] [stdout] test backend::tests::opposite_falls_back_to_openrouter_when_codex_disabled ... ok [INFO] [stdout] test backend::tests::opposite_returns_codex_for_claude_when_codex_enabled ... ok [INFO] [stdout] test backend::tests::parse_backend_spec_accepts_bare_name ... ok [INFO] [stdout] test backend::tests::parse_backend_spec_accepts_name_with_model ... ok [INFO] [stdout] test backend::tests::parse_backend_spec_accepts_optional_bare_name ... ok [INFO] [stdout] test backend::tests::parse_backend_spec_accepts_optional_name_with_model ... ok [INFO] [stdout] test backend::tests::parse_backend_spec_rejects_empty_model ... ok [INFO] [stdout] test backend::tests::parse_backend_spec_rejects_empty_name ... ok [INFO] [stdout] test backend::tests::parse_backend_spec_rejects_missing_closing_paren ... ok [INFO] [stdout] test backend::tests::parse_backend_spec_rejects_missing_name_after_optional_prefix ... ok [INFO] [stdout] test backend::tests::parse_backend_spec_rejects_missing_opening_paren ... ok [INFO] [stdout] test backend::tmux::tests::create_window_returns_identifier ... ok [INFO] [stdout] test backend::tmux::tests::create_window_with_retry_retries_on_missing_session ... ok [INFO] [stdout] test backend::tmux::tests::create_window_with_retry_succeeds_on_first_try ... ok [INFO] [stdout] test backend::tmux::tests::ensure_session_creates_when_missing ... ok [INFO] [stdout] test backend::tmux::tests::format_window_label_basic ... ok [INFO] [stdout] test backend::tmux::tests::format_window_label_long_values_truncated ... ok [INFO] [stdout] test backend::tmux::tests::format_window_label_planner_role ... ok [INFO] [stdout] test backend::tmux::tests::format_window_label_reviewer_role ... ok [INFO] [stdout] test backend::tmux::tests::has_session_returns_false_when_session_missing ... ok [INFO] [stdout] test backend::output_normalizer::tests::normalize_output_codex_cli_filters_reasoning_items ... ok [INFO] [stdout] test backend::tmux::tests::has_session_returns_true_when_session_exists ... ok [INFO] [stdout] test backend::tmux::tests::ensure_session_skips_creation_when_session_exists ... ok [INFO] [stdout] test backend::tmux::tests::has_window_returns_false_when_session_missing ... ok [INFO] [stdout] test backend::tmux::tests::has_window_returns_false_when_window_missing ... ok [INFO] [stdout] test backend::tmux::tests::kill_window_best_effort_does_not_panic_on_error ... ok [INFO] [stdout] test backend::tmux::tests::kill_window_best_effort_succeeds_silently ... ok [INFO] [stdout] test backend::tmux::tests::has_window_returns_true_when_window_exists ... ok [INFO] [stdout] test backend::tmux::tests::kill_window_invokes_kill_window ... ok [INFO] [stdout] test backend::tmux::tests::sanitize_tmux_label_collapses_replacement_dashes ... ok [INFO] [stdout] test backend::tmux::tests::sanitize_tmux_label_strips_trailing_dash ... ok [INFO] [stdout] test backend::tmux::tests::set_remain_on_exit_sends_correct_command ... ok [INFO] [stdout] test backend::tmux::tests::wait_for_exit_returns_non_zero_exit_code ... ok [INFO] [stdout] test backend::tmux::tests::sanitize_tmux_label_strips_invalid_chars ... ok [INFO] [stdout] test backend::tmux::tests::wait_for_exit_returns_zero_exit_code ... ok [INFO] [stdout] test backend::tests::cli_backend_streaming_preserves_exact_bytes_in_log ... ok [INFO] [stdout] test backend::tmux::tests::wait_for_exit_times_out ... ok [INFO] [stdout] test backend::tmux_backend::tests::build_shell_command_basic ... ok [INFO] [stdout] test backend::tmux_backend::tests::build_shell_command_escapes_single_quotes ... ok [INFO] [stdout] test backend::tmux_backend::tests::build_shell_command_includes_env ... ok [INFO] [stdout] test backend::tmux_backend::tests::build_shell_command_preserves_args ... ok [INFO] [stdout] test backend::tmux::tests::wait_for_exit_with_activity_stall_times_out_idle ... ok [INFO] [stdout] test backend::tmux_backend::tests::execute_nonzero_exit_returns_error ... ok [INFO] [stdout] test backend::tmux_backend::tests::execute_success_returns_output ... ok [INFO] [stdout] test backend::tmux::tests::wait_for_exit_with_activity_stderr_growth_counts ... ok [INFO] [stdout] test backend::tmux_backend::tests::kill_window_called_on_nonzero_exit ... ok [INFO] [stdout] test backend::tmux_backend::tests::name_delegates_to_inner ... ok [INFO] [stdout] test backend::tmux_backend::tests::shell_escape_simple ... ok [INFO] [stdout] test backend::tmux_backend::tests::shell_escape_with_single_quotes ... ok [INFO] [stdout] test backend::tmux_backend::tests::shell_escape_with_spaces ... ok [INFO] [stdout] test backend::tmux_backend::tests::temp_files_cleaned_up_on_failure ... ok [INFO] [stdout] test backend::tests::cli_backend_stall_after_partial_output_times_out_idle ... ok [INFO] [stdout] test cli::auto::tests::ensure_workspace_creates_workspace_when_missing ... ok [INFO] [stdout] test cli::auto::tests::ensure_workspace_with_explicit_root_creates_workspace ... ok [INFO] [stdout] test cli::auto::tests::ensure_workspace_with_explicit_root_loads_existing ... ok [INFO] [stdout] test cli::auto::tests::parses_auto_command_with_all_args ... ok [INFO] [stdout] test cli::auto::tests::parses_auto_command_with_defaults ... ok [INFO] [stdout] test cli::auto::tests::rejects_auto_with_empty_idea ... ok [INFO] [stdout] test cli::auto::tests::test_slugify_idea_basic ... ok [INFO] [stdout] test cli::auto::tests::test_slugify_idea_consecutive_dashes ... ok [INFO] [stdout] test cli::auto::tests::test_slugify_idea_special_chars ... ok [INFO] [stdout] test cli::auto::tests::test_slugify_idea_truncation ... ok [INFO] [stdout] test cli::backend_spec::tests::reject_empty_model_in_parens ... ok [INFO] [stdout] test cli::backend_spec::tests::reject_empty_name_with_model ... ok [INFO] [stdout] test cli::backend_spec::tests::reject_empty_spec ... ok [INFO] [stdout] test cli::backend_spec::tests::reject_missing_closing_paren ... ok [INFO] [stdout] test cli::backend_spec::tests::reject_unknown_bare_backend ... ok [INFO] [stdout] test cli::backend_spec::tests::reject_unknown_base_backend ... ok [INFO] [stdout] test cli::backend_spec::tests::validate_bare_claude ... ok [INFO] [stdout] test cli::backend_spec::tests::validate_bare_codex ... ok [INFO] [stdout] test cli::backend_spec::tests::validate_claude_with_model ... ok [INFO] [stdout] test cli::backend_spec::tests::validate_codex_with_model ... ok [INFO] [stdout] test cli::backend_spec::tests::validate_name_only_accepts_optional_openrouter_with_model ... ok [INFO] [stdout] test cli::backend_spec::tests::validate_name_only_bare_claude ... ok [INFO] [stdout] test cli::backend_spec::tests::validate_name_only_rejects_unknown ... ok [INFO] [stdout] test cli::backend_spec::tests::validate_name_only_with_model ... ok [INFO] [stdout] test cli::config::tests::ensure_backend_accepts_bare_claude ... ok [INFO] [stdout] test cli::config::tests::ensure_backend_accepts_bare_codex ... ok [INFO] [stdout] test cli::config::tests::ensure_backend_accepts_claude_with_model ... ok [INFO] [stdout] test cli::config::tests::ensure_backend_accepts_codex_with_model ... ok [INFO] [stdout] test cli::config::tests::ensure_backend_rejects_empty_model ... ok [INFO] [stdout] test cli::config::tests::ensure_backend_rejects_empty_name_with_model ... ok [INFO] [stdout] test cli::config::tests::ensure_backend_rejects_missing_close_paren ... ok [INFO] [stdout] test cli::config::tests::ensure_backend_rejects_unknown_bare ... ok [INFO] [stdout] test cli::config::tests::ensure_backend_rejects_unknown_base ... ok [INFO] [stdout] test cli::config::tests::ensure_required_backend_rejects_optional_syntax ... ok [INFO] [stdout] test cli::config::tests::parse_optional_backend_accepts_bare_name ... ok [INFO] [stdout] test cli::config::tests::parse_optional_backend_accepts_claude_with_model ... ok [INFO] [stdout] test cli::config::tests::parse_optional_backend_accepts_null ... ok [INFO] [stdout] test cli::config::tests::parse_optional_backend_accepts_optional_openrouter ... ok [INFO] [stdout] test cli::config::tests::parse_optional_backend_rejects_malformed ... ok [INFO] [stdout] test cli::config::tests::parse_optional_backend_rejects_unknown ... ok [INFO] [stdout] test cli::config::tests::resolve_config_alias_maps_qa_backend ... ok [INFO] [stdout] test cli::config::tests::set_global_value_rejects_optional_prompt_review_backend_alias ... ok [INFO] [stdout] test cli::config::tests::set_global_value_rejects_unknown_role_timeout ... ok [INFO] [stdout] test cli::config::tests::set_global_value_sets_and_clears_role_timeout ... ok [INFO] [stdout] test cli::config::tests::set_global_value_updates_history_capping_fields ... ok [INFO] [stdout] test cli::config::tests::set_project_value_rejects_optional_prompt_review_backend_alias ... ok [INFO] [stdout] test cli::config::tests::set_project_value_updates_history_capping_fields ... ok [INFO] [stdout] test backend::tmux::tests::wait_for_exit_with_activity_file_growth_resets_idle ... ok [INFO] [stdout] test backend::tests::cli_backend_timeout_kills_and_reaps_child_and_writes_footer ... ok [INFO] [stdout] test cli::init::tests::merge_overlay_config_fills_missing_keys ... ok [INFO] [stdout] test backend::tmux_backend::tests::execute_genuine_timeout_returns_backend_timeout ... ok [INFO] [stdout] test cli::init::tests::create_workspace_full_plan_writes_all_templates ... ok [INFO] [stdout] test cli::init::tests::merge_overlay_config_fills_missing_keys_verifiable_in_file ... ok [INFO] [stdout] test cli::init::tests::merge_overlay_config_handles_inline_tables ... ok [INFO] [stdout] test cli::init::tests::plan_full_actions_uses_shared_constants_in_stable_order ... ok [INFO] [stdout] test cli::init::tests::plan_minimal_actions_keeps_only_minimal_workspace_steps ... ok [INFO] [stdout] test cli::init::tests::plan_overlay_actions_includes_overlay_config ... ok [INFO] [stdout] test cli::init::tests::plan_overlay_actions_skips_existing_templates ... ok [INFO] [stdout] test cli::init::tests::validate_copy_files_target_empty_dir ... ok [INFO] [stdout] test cli::init::tests::validate_copy_files_target_existing_workspace ... ok [INFO] [stdout] test cli::init::tests::validate_copy_files_target_malformed_toml ... ok [INFO] [stdout] test cli::init::tests::validate_copy_files_target_new_dir ... ok [INFO] [stdout] test cli::init::tests::validate_copy_files_target_nonempty_no_toml ... ok [INFO] [stdout] test cli::init::tests::validate_target_rejects_file_target ... ok [INFO] [stdout] test cli::init::tests::validate_target_rejects_nonempty_directory ... ok [INFO] [stdout] test cli::prd::tests::resolved_ask_max_falls_back_to_full_default ... ok [INFO] [stdout] test cli::prd::tests::resolved_ask_max_falls_back_to_preset_default ... ok [INFO] [stdout] test cli::prd::tests::resolved_ask_max_prefers_explicit_flag_over_preset ... ok [INFO] [stdout] test cli::project::tests::project_backend_accepts_bare_claude ... ok [INFO] [stdout] test cli::project::tests::project_backend_accepts_bare_codex ... ok [INFO] [stdout] test cli::project::tests::project_backend_accepts_claude_with_model ... ok [INFO] [stdout] test cli::project::tests::project_backend_accepts_codex_with_model ... ok [INFO] [stdout] test cli::project::tests::project_backend_rejects_malformed_empty_model ... ok [INFO] [stdout] test cli::project::tests::project_backend_rejects_malformed_empty_name ... ok [INFO] [stdout] test cli::project::tests::project_backend_rejects_malformed_missing_close_paren ... ok [INFO] [stdout] test cli::project::tests::project_backend_rejects_unknown_base ... ok [INFO] [stdout] test cli::status::tests::extract_required_change_lines_unchanged_behavior ... ok [INFO] [stdout] test cli::status::tests::extract_section_lines_handles_body_with_frontmatter_stripped ... ok [INFO] [stdout] test cli::status::tests::extract_section_lines_returns_empty_when_section_has_no_content ... ok [INFO] [stdout] test cli::status::tests::extract_section_lines_returns_empty_when_section_missing ... ok [INFO] [stdout] test cli::status::tests::extract_section_lines_returns_up_to_3_lines_from_acceptance_criteria_verification ... ok [INFO] [stdout] test cli::status::tests::extract_section_lines_returns_up_to_3_lines_from_failures ... ok [INFO] [stdout] test cli::tail::tests::emits_phase_change_event_with_new_phase_details ... ok [INFO] [stdout] test cli::tail::tests::labels_use_expected_wire_format ... ok [INFO] [stdout] test cli::tail::tests::normalizes_timestamps_preferring_created_at ... ok [INFO] [stdout] test cli::tail::tests::parses_filename_timestamp_as_utc ... ok [INFO] [stdout] test cli::tail::tests::serializes_json_with_event_specific_fields ... ok [INFO] [stdout] test cli::tail::tests::sorts_by_epoch_then_type_then_signature ... ok [INFO] [stdout] test cli::tail::tests::splits_frontmatter_and_extracts_heading ... ok [INFO] [stdout] test cli::tests::parses_auto_with_skip_prompt_review ... ok [INFO] [stdout] test cli::tests::parses_daemon_abort_with_task_selector ... ok [INFO] [stdout] test cli::tests::parses_daemon_retrigger_with_task_id ... ok [INFO] [stdout] test cli::tests::parses_daemon_start_with_all_overrides ... ok [INFO] [stdout] test cli::tests::parses_daemon_start_with_max_concurrent_one ... ok [INFO] [stdout] test cli::tests::parses_daemon_status_with_data_dir ... ok [INFO] [stdout] test cli::tests::parses_init_with_dry_run_long_flag ... ok [INFO] [stdout] test cli::tests::parses_init_with_dry_run_short_flag ... ok [INFO] [stdout] test cli::init::tests::merge_overlay_config_preserves_comments ... ok [INFO] [stdout] test cli::tests::parses_prd_command_with_expected_arguments ... ok [INFO] [stdout] test cli::tests::parses_prd_command_with_implicit_defaults ... ok [INFO] [stdout] test cli::init::tests::merge_overlay_config_preserves_user_values ... ok [INFO] [stdout] test cli::tests::parses_quick_dev_auto_with_all_args ... ok [INFO] [stdout] test backend::tmux_backend::tests::execute_window_disappeared_returns_actionable_error ... ok [INFO] [stdout] test cli::tests::parses_quick_dev_run_with_defaults ... ok [INFO] [stdout] test cli::tests::parses_quick_prd_with_all_args ... ok [INFO] [stdout] test cli::tests::parses_quick_prd_with_defaults ... ok [INFO] [stdout] test cli::tests::parses_run_with_no_tmux_flag ... ok [INFO] [stdout] test cli::tests::parses_run_with_role_backend_overrides ... ok [INFO] [stdout] test cli::tests::parses_run_with_skip_prompt_review ... ok [INFO] [stdout] test cli::tests::parses_run_with_tmux_flag ... ok [INFO] [stdout] test cli::tests::parses_run_without_tmux_flags ... ok [INFO] [stdout] test cli::tests::parses_validate_command_with_expected_arguments ... ok [INFO] [stdout] test cli::tests::rejects_prd_with_conflicting_interactive_flags ... ok [INFO] [stdout] test cli::tests::rejects_quick_dev_auto_with_empty_idea ... ok [INFO] [stdout] test cli::init::tests::create_workspace_minimal_plan_writes_no_templates ... ok [INFO] [stdout] test cli::tests::parses_quick_dev_auto_with_defaults ... ok [INFO] [stdout] test cli::tests::parses_quick_dev_run_with_all_args ... ok [INFO] [stdout] test cli::tests::rejects_quick_dev_auto_with_zero_max_final_review_retries ... ok [INFO] [stdout] test cli::tests::rejects_quick_dev_auto_with_zero_max_review_iterations ... ok [INFO] [stdout] test cli::tests::rejects_quick_dev_run_with_zero_max_final_review_retries ... ok [INFO] [stdout] test cli::tests::rejects_quick_dev_run_with_zero_max_review_iterations ... ok [INFO] [stdout] test cli::tests::rejects_quick_prd_with_conflicting_interactive_flags ... ok [INFO] [stdout] test cli::tests::rejects_run_with_conflicting_tmux_flags ... ok [INFO] [stdout] test cli::tests::test_quick_prd_dry_run_skips_backends ... ok [INFO] [stdout] test config::global::tests::backend_config_timeout_for_role_prefers_override_and_falls_back ... ok [INFO] [stdout] test config::global::tests::backend_enabled_accepts_bool_and_auto_string ... ok [INFO] [stdout] test cli::tests::rejects_quick_dev_auto_with_whitespace_idea ... ok [INFO] [stdout] test cli::tests::parses_prd_command_with_preset ... ok [INFO] [stdout] test config::global::tests::backend_role_timeouts_toml_deserialize_without_table_uses_fallback_timeout ... ok [INFO] [stdout] test config::global::tests::backend_role_timeouts_toml_deserialize_with_table_sets_overrides ... ok [INFO] [stdout] test backend::tmux_backend::tests::temp_files_cleaned_up_on_success ... ok [INFO] [stdout] test config::global::tests::deserializes_workspace_tmux_defaults_when_fields_are_missing ... ok [INFO] [stdout] test config::global::tests::deserializes_workspace_tmux_fields_when_present ... ok [INFO] [stdout] test config::global::tests::empty_toml_deserializes_to_defaults ... ok [INFO] [stdout] test config::global::tests::fill_from_fills_none_fields_from_defaults ... ok [INFO] [stdout] test config::global::tests::for_role_returns_expected_model_for_each_role ... ok [INFO] [stdout] test config::global::tests::load_fills_missing_models_from_code_defaults ... ok [INFO] [stdout] test config::global::tests::minimal_toml_parses_to_default ... ok [INFO] [stdout] test config::global::tests::backend_role_models_default_is_empty ... ok [INFO] [stdout] test config::global::tests::default_workspace_tmux_settings_match_expected_values ... ok [INFO] [stdout] test config::global::tests::openrouter_defaults_match_expected_values ... ok [INFO] [stdout] test config::global::tests::missing_single_backend_uses_backend_specific_default ... ok [INFO] [stdout] test config::global::tests::deserializes_prompt_review_fields_when_present ... ok [INFO] [stdout] test config::global::tests::planner_state_in_prompt_default_is_summary ... ok [INFO] [stdout] test config::global::tests::planner_state_in_prompt_serde_roundtrips ... ok [INFO] [stdout] test config::global::tests::previous_specs_in_prompt_default_is_titles ... ok [INFO] [stdout] test config::global::tests::previous_specs_in_prompt_kebab_case_serde ... ok [INFO] [stdout] test config::global::tests::previous_specs_in_prompt_serde_roundtrips ... ok [INFO] [stdout] test config::global::tests::role_timeouts_fill_from_fills_none_fields_from_defaults ... ok [INFO] [stdout] test config::global::tests::planner_state_in_prompt_kebab_case_serde ... ok [INFO] [stdout] test config::global::tests::role_timeouts_for_role_returns_expected_timeout_for_each_role ... ok [INFO] [stdout] test config::global::tests::deserializes_backend_models_when_present ... ok [INFO] [stdout] test config::global::tests::partial_sections_default_correctly ... ok [INFO] [stdout] test config::global::tests::save_sparse_falls_back_to_full_save_on_missing_file ... ok [INFO] [stdout] test config::global::tests::save_sparse_handles_env_dotted_literal_keys ... ok [INFO] [stdout] test config::global::tests::save_sparse_handles_models_role_clear ... ok [INFO] [stdout] test config::global::tests::save_sparse_handles_role_timeouts_clear ... ok [INFO] [stdout] test config::global::tests::backend_enabled_serde_roundtrip_preserves_values ... ok [INFO] [stdout] test config::global::tests::save_sparse_creates_intermediate_tables ... ok [INFO] [stdout] test config::global::tests::save_sparse_inline_table_nested_set ... ok [INFO] [stdout] test config::global::tests::save_sparse_inline_table_path_clear ... ok [INFO] [stdout] test config::global::tests::save_sparse_errors_on_non_table_path_segment ... ok [INFO] [stdout] test config::global::tests::save_sparse_removes_optional_key_on_null ... ok [INFO] [stdout] test config::global::tests::shared_mutator_rejects_invalid_bool ... ok [INFO] [stdout] test config::global::tests::shared_mutator_rejects_invalid_integer ... ok [INFO] [stdout] test config::global::tests::shared_mutator_rejects_daemon_prd_keys ... ok [INFO] [stdout] test config::global::tests::shared_mutator_sets_backend_fields ... ok [INFO] [stdout] test config::global::tests::shared_mutator_sets_workflow_fields ... ok [INFO] [stdout] test config::global::tests::save_sparse_preserves_comments_and_unrelated_formatting ... ok [INFO] [stdout] test config::global::tests::shared_mutator_rejects_unknown_key ... ok [INFO] [stdout] test backend::tests::cli_backend_active_stream_does_not_timeout ... ok [INFO] [stdout] test config::global::tests::sparse_key_segments_splits_models_and_timeouts_normally ... ok [INFO] [stdout] test config::global::tests::sparse_key_segments_splits_normal_keys ... ok [INFO] [stdout] test config::global::tests::shared_mutator_sets_workspace_fields ... ok [INFO] [stdout] test config::global::tests::save_sparse_inline_table_path_set ... ok [INFO] [stdout] test config::global::tests::whitespace_toml_deserializes_to_defaults ... ok [INFO] [stdout] test config::global::tests::template_config_serde_defaults_quick_dev_fields ... ok [INFO] [stdout] test config::global::tests::workflow_config_default_planner_compression_fields ... ok [INFO] [stdout] test config::global::tests::workflow_config_deserializes_planner_compression_fields ... ok [INFO] [stdout] test config::global::tests::sparse_key_segments_treats_env_rest_as_literal ... ok [INFO] [stdout] test config::global::tests::workflow_config_deserializes_planner_max_prior_loops_absent_uses_default ... ok [INFO] [stdout] test config::tests::completion_panel_accepts_valid_partial_threshold ... ok [INFO] [stdout] test config::tests::completion_panel_rejects_duplicate_specs_after_canonicalization ... ok [INFO] [stdout] test config::tests::completion_panel_rejects_min_completers_zero ... ok [INFO] [stdout] test config::tests::completion_panel_rejects_empty_backends ... ok [INFO] [stdout] test config::tests::completion_panel_rejects_role_resolution_collapse ... ok [INFO] [stdout] test config::tests::completion_verdict_filename_matches_artifact_slug ... ok [INFO] [stdout] test config::tests::completion_panel_rejects_threshold_out_of_range ... ok [INFO] [stdout] test config::tests::prompt_review_alias_rejects_optional_global_singular_backend ... ok [INFO] [stdout] test config::tests::prompt_review_alias_explicit_global_plural_wins_even_when_equal_to_default ... ok [INFO] [stdout] test config::tests::final_review_overlap_warning_detection_triggers_for_matching_backend_family ... ok [INFO] [stdout] test config::tests::prompt_review_alias_rejects_optional_project_singular_backend ... ok [INFO] [stdout] test config::tests::prompt_review_panel_rejects_duplicate_specs_after_canonicalization ... ok [INFO] [stdout] test config::tests::prompt_review_alias_synthesizes_plural_when_plural_unset ... ok [INFO] [stdout] test config::tests::prompt_review_panel_rejects_empty_backends ... ok [INFO] [stdout] test config::tests::prompt_review_panel_rejects_min_reviewers_zero ... ok [INFO] [stdout] test config::tests::prompt_review_project_singular_override_wins_over_global_plural_when_project_plural_absent ... ok [INFO] [stdout] test config::tests::prompt_review_plural_project_override_takes_precedence_over_singular ... ok [INFO] [stdout] test config::tests::resolve_effective_config_accepts_optional_syntax_in_final_review_list ... ok [INFO] [stdout] test config::tests::resolve_effective_config_applies_role_override_precedence ... ok [INFO] [stdout] test config::tests::resolve_effective_config_accepts_starting_backend_with_model_spec ... ok [INFO] [stdout] test config::tests::resolve_effective_config_deduplicates_final_review_backends_before_minimum_check ... ok [INFO] [stdout] test config::tests::resolve_effective_config_defaults_planner_compression_fields ... ok [INFO] [stdout] test config::tests::resolve_effective_config_final_review_fields_follow_precedence ... ok [INFO] [stdout] test config::tests::resolve_effective_config_history_capping_fields_follow_precedence ... ok [INFO] [stdout] test config::tests::resolve_effective_config_global_overrides_planner_compression ... ok [INFO] [stdout] test config::tests::resolve_effective_config_project_absent_inherits_global ... ok [INFO] [stdout] test config::tests::resolve_effective_config_project_overrides_planner_compression ... ok [INFO] [stdout] test config::tests::resolve_effective_config_rejects_empty_final_review_backends_when_enabled ... ok [INFO] [stdout] test config::tests::resolve_effective_config_project_override_unlimited_loops ... ok [INFO] [stdout] test config::tests::resolve_effective_config_rejects_invalid_final_review_threshold_bounds ... ok [INFO] [stdout] test config::tests::resolve_effective_config_rejects_optional_backend_on_required_surface ... ok [INFO] [stdout] test config::tests::resolve_effective_config_rejects_optional_syntax_on_final_review_arbiter ... ok [INFO] [stdout] test config::tests::resolve_effective_config_rejects_unknown_base_backend_in_spec ... ok [INFO] [stdout] test config::tests::resolve_effective_config_rejects_unknown_prompt_review_backend ... ok [INFO] [stdout] test config::tests::resolve_effective_config_rejects_unknown_backend_on_required_surfaces ... ok [INFO] [stdout] test config::tests::resolve_effective_config_rejects_unknown_final_review_arbiter_family ... ok [INFO] [stdout] test config::tests::resolve_effective_config_rejects_unknown_role_override_backend ... ok [INFO] [stdout] test config::tests::resolve_effective_config_rejects_when_unique_reviewer_count_below_minimum ... ok [INFO] [stdout] test config::tests::validate_daemon_workspace_config_rejects_unknown_refinement_backend ... ok [INFO] [stdout] test config::tests::resolve_effective_config_resolves_quick_dev_template_paths ... ok [INFO] [stdout] test config::tests::validate_effective_daemon_config_rejects_project_unknown_refinement_backend ... ok [INFO] [stdout] test config::tests::validate_prd_config_rejects_invalid_backend_specs ... ok [INFO] [stdout] test config::tests::resolve_effective_config_resolves_qa_precedence_and_template_paths ... ok [INFO] [stdout] test config::tests::validate_prd_config_rejects_invalid_question_backend_count ... ok [INFO] [stdout] test config::tests::validate_prd_config_rejects_unknown_backend_specs ... ok [INFO] [stdout] test config::tests::resolve_daemon_config_applies_project_overrides_over_workspace_defaults ... ok [INFO] [stdout] test daemon::bootstrap::tests::bootstrap_bare_repo_returns_unsupported_error ... ok [INFO] [stdout] test daemon::github::tests::branch_name_with_numeric_code_does_not_affect_classification ... ok [INFO] [stdout] test daemon::github::tests::classify_lifecycle_labels_empty_for_no_ralph_labels ... ok [INFO] [stdout] test daemon::github::tests::classify_lifecycle_labels_excludes_ralph_quick ... ok [INFO] [stdout] test daemon::github::tests::classify_lifecycle_labels_filters_correctly ... ok [INFO] [stdout] test daemon::github::tests::deserialize_graphql_comment_with_string_id_and_url ... ok [INFO] [stdout] test daemon::github::tests::deserialize_numeric_comment_id_without_url ... ok [INFO] [stdout] test daemon::github::tests::dns_error_with_url_containing_403_is_retryable ... ok [INFO] [stdout] test daemon::github::tests::explicit_http_401_is_non_retryable ... ok [INFO] [stdout] test daemon::github::tests::explicit_http_403_is_non_retryable ... ok [INFO] [stdout] test daemon::github::tests::explicit_http_503_is_retryable ... ok [INFO] [stdout] test daemon::github::tests::extract_http_status_codes_bounded_context ... ok [INFO] [stdout] test daemon::github::tests::extract_numeric_comment_id_from_graphql_url ... ok [INFO] [stdout] test daemon::github::tests::extract_numeric_comment_id_from_invalid_url ... ok [INFO] [stdout] test daemon::github::tests::extract_numeric_comment_id_from_none ... ok [INFO] [stdout] test daemon::github::tests::extract_numeric_comment_id_from_rest_url ... ok [INFO] [stdout] test daemon::github::tests::extract_pr_number_from_standard_url ... ok [INFO] [stdout] test daemon::github::tests::extract_pr_number_from_trailing_slash ... ok [INFO] [stdout] test daemon::github::tests::extract_pr_number_returns_none_for_non_pr_url ... ok [INFO] [stdout] test daemon::github::tests::gh_issue_deserialization_supports_body_absent ... ok [INFO] [stdout] test daemon::github::tests::gh_issue_deserialization_supports_body_null ... ok [INFO] [stdout] test daemon::github::tests::gh_issue_deserialization_supports_body_present ... ok [INFO] [stdout] test daemon::github::tests::gh_issue_struct_includes_body_field ... ok [INFO] [stdout] test daemon::bootstrap::tests::bootstrap_non_git_dir_creates_git_commit_and_workspace ... ok [INFO] [stdout] test daemon::github::tests::invalid_revision_patterns_are_detected ... ok [INFO] [stdout] test daemon::github::tests::is_lease_rejection_detects_rejected ... ok [INFO] [stdout] test daemon::github::tests::is_lease_rejection_detects_stale_info ... ok [INFO] [stdout] test daemon::github::tests::is_lease_rejection_returns_false_for_unrelated ... ok [INFO] [stdout] test daemon::github::tests::is_retryable_gh_error_detects_409_conflict ... ok [INFO] [stdout] test daemon::github::tests::is_retryable_gh_error_detects_503 ... ok [INFO] [stdout] test daemon::github::tests::is_retryable_gh_error_detects_conflict_keyword ... ok [INFO] [stdout] test daemon::github::tests::is_retryable_gh_error_detects_rate_limit ... ok [INFO] [stdout] test daemon::github::tests::is_retryable_gh_error_returns_false_for_auth_errors ... ok [INFO] [stdout] test daemon::github::tests::is_retryable_push_error_branch_name_collision_safety ... ok [INFO] [stdout] test daemon::github::tests::is_retryable_push_error_classifies_transient_and_permanent ... ok [INFO] [stdout] test daemon::github::tests::is_retryable_push_error_non_push_error_fallback ... ok [INFO] [stdout] test daemon::github::tests::is_retryable_push_error_unknown_stderr_is_non_retryable ... ok [INFO] [stdout] test daemon::github::tests::is_retryable_push_stderr_classifies_transient_and_permanent_errors ... ok [INFO] [stdout] test daemon::github::tests::is_retryable_push_stderr_ignores_branch_name_collisions ... ok [INFO] [stdout] test daemon::github::tests::parse_authenticated_login_rejects_empty ... ok [INFO] [stdout] test daemon::github::tests::parse_authenticated_login_trims_and_returns_value ... ok [INFO] [stdout] test daemon::github::tests::parse_pr_is_draft_false ... ok [INFO] [stdout] test daemon::github::tests::parse_pr_is_draft_true ... ok [INFO] [stdout] test daemon::github::tests::pr_merge_info_parses_expected_fields ... ok [INFO] [stdout] test daemon::github::tests::pr_merge_status_maps_conflicting ... ok [INFO] [stdout] test daemon::github::tests::pr_merge_status_maps_unknown ... ok [INFO] [stdout] test daemon::bootstrap::tests::bootstrap_is_idempotent_for_unborn_repo ... ok [INFO] [stdout] test daemon::github::tests::push_branch_with_retry_impl_does_not_retry_permanent_failure ... ok [INFO] [stdout] test daemon::bootstrap::tests::bootstrap_existing_repo_is_noop ... ok [INFO] [stdout] test daemon::github::tests::push_branch_with_retry_impl_does_not_retry_unknown_failure ... ok [INFO] [stdout] test daemon::github::tests::has_diff_returns_false_for_single_commit_head_tilde_base ... ok [INFO] [stdout] test daemon::github::tests::push_branch_with_retry_impl_classifies_on_stderr_not_branch_name ... ok [INFO] [stdout] test daemon::github::tests::ralph_quick_is_in_required_labels ... ok [INFO] [stdout] test daemon::github::tests::ralph_quick_is_not_a_lifecycle_label ... ok [INFO] [stdout] test daemon::github::tests::required_labels_are_unique_and_include_lifecycle_labels ... ok [INFO] [stdout] test daemon::github::tests::unknown_errors_are_not_retried ... ok [INFO] [stdout] test daemon::github::tests::url_containing_500_plus_http_401_is_non_retryable ... ok [INFO] [stdout] test daemon::interactive_prd::tests::answer_comment_detection_respects_last_processed_comment_id ... ok [INFO] [stdout] test daemon::github::tests::push_branch_with_retry_impl_retries_transient_then_succeeds ... ok [INFO] [stdout] test daemon::interactive_prd::tests::answer_comment_detection_skips_bot_and_selects_first_valid_user_comment ... ok [INFO] [stdout] test daemon::interactive_prd::tests::answer_comment_detection_returns_none_when_no_qualifying_comment ... ok [INFO] [stdout] test daemon::interactive_prd::tests::clean_draft_body_empty_after_cleanup_returns_none ... ok [INFO] [stdout] test daemon::interactive_prd::tests::clean_draft_body_removes_markers_heading_footer_and_trims ... ok [INFO] [stdout] test daemon::interactive_prd::tests::clean_draft_body_strips_heading_after_marker_when_blank_lines_precede_it ... ok [INFO] [stdout] test daemon::github::tests::push_branch_with_retry_impl_exhausts_retries_for_transient_failure ... ok [INFO] [stdout] test config::tests::prompt_review_panel_accepts_optional_openrouter_backend ... ok [INFO] [stdout] test config::global::tests::shared_mutator_sets_template_and_git_fields ... ok [INFO] [stdout] test config::global::tests::partial_backend_config_merge_fills_role_timeouts_from_defaults ... ok [INFO] [stdout] test backend::tests::cli_backend_idle_timeout_resets_on_activity ... ok [INFO] [stdout] test daemon::interactive_prd::tests::detect_approval_question_about_lgtm_still_matches ... ok [INFO] [stdout] test daemon::interactive_prd::tests::detect_approval_mixed_signals_return_false ... ok [INFO] [stdout] test daemon::interactive_prd::tests::draft_prompt_contains_issue_questions_and_answers ... ok [INFO] [stdout] test daemon::interactive_prd::tests::extract_questions_text_by_id_prefers_bot_author ... ok [INFO] [stdout] test daemon::interactive_prd::tests::extract_questions_text_ignores_user_spoof_marker ... ok [INFO] [stdout] test daemon::interactive_prd::tests::extract_questions_text_prefers_comment_id_and_strips_marker ... ok [INFO] [stdout] test daemon::interactive_prd::tests::feedback_revision_prompt_contains_placeholders ... ok [INFO] [stdout] test daemon::interactive_prd::tests::find_new_feedback_comments_draft_boundary_takes_precedence_over_cursor ... ok [INFO] [stdout] test daemon::interactive_prd::tests::find_new_feedback_comments_filters_bot_and_old ... ok [INFO] [stdout] test daemon::interactive_prd::tests::find_new_feedback_comments_respects_draft_boundary ... ok [INFO] [stdout] test daemon::interactive_prd::tests::find_new_feedback_comments_returns_all_non_bot_when_no_cursor ... ok [INFO] [stdout] test daemon::interactive_prd::tests::find_new_feedback_comments_returns_empty_when_all_bot ... ok [INFO] [stdout] test daemon::interactive_prd::tests::find_new_feedback_comments_returns_empty_when_all_processed ... ok [INFO] [stdout] test daemon::interactive_prd::tests::format_draft_comment_and_parse_roundtrip_consistency ... ok [INFO] [stdout] test daemon::interactive_prd::tests::detect_approval_positive_cases ... ok [INFO] [stdout] test daemon::interactive_prd::tests::detect_approval_plain_feedback_returns_false ... ok [INFO] [stdout] test daemon::interactive_prd::tests::format_draft_comment_round_trip_includes_shared_heading_body_and_footer ... ok [INFO] [stdout] test daemon::interactive_prd::tests::generate_draft_complete_writer_output_succeeds ... ok [INFO] [stdout] test daemon::interactive_prd::tests::generate_draft_incomplete_writer_output_fails_after_exhaustion ... ok [INFO] [stdout] test daemon::interactive_prd::tests::all_feedback_comments_without_approval_triggers_revision ... ok [INFO] [stdout] test daemon::interactive_prd::tests::detect_approval_approval_with_feedback_returns_true ... ok [INFO] [stdout] test daemon::interactive_prd::tests::generate_draft_reviewer_approval_does_not_bypass_section_gating ... ok [INFO] [stdout] test daemon::interactive_prd::tests::has_in_progress_prd_label_done_precedence_overrides_mixed_labels ... ok [INFO] [stdout] test daemon::interactive_prd::tests::has_in_progress_prd_label_matches_each_in_progress_label ... ok [INFO] [stdout] test daemon::interactive_prd::tests::has_in_progress_prd_label_rejects_done_empty_and_unrelated_labels ... ok [INFO] [stdout] test daemon::interactive_prd::tests::has_prd_label_matches_waiting_feedback_label ... ok [INFO] [stdout] test daemon::interactive_prd::tests::has_prd_label_still_matches_done_label ... ok [INFO] [stdout] test daemon::interactive_prd::tests::is_terminal_only_true_for_done_and_failed ... ok [INFO] [stdout] test daemon::interactive_prd::tests::generate_revision_complete_writer_output_succeeds ... ok [INFO] [stdout] test daemon::interactive_prd::tests::marker_generation_matches_expected_format ... ok [INFO] [stdout] test daemon::interactive_prd::tests::load_returns_none_when_state_file_missing ... ok [INFO] [stdout] test daemon::interactive_prd::tests::parse_approved_spec_bot_only_filtering_ignores_user_spoof ... ok [INFO] [stdout] test daemon::interactive_prd::tests::parse_approved_spec_duplicate_draft_latest_wins ... ok [INFO] [stdout] test daemon::interactive_prd::tests::parse_approved_spec_highest_revision_wins ... ok [INFO] [stdout] test daemon::interactive_prd::tests::generate_questions_runs_in_repo_clone_dir ... ok [INFO] [stdout] test daemon::interactive_prd::tests::parse_approved_spec_no_approval_marker_returns_none ... ok [INFO] [stdout] test daemon::interactive_prd::tests::parse_approved_spec_ignores_bot_comment_that_only_references_draft_marker ... ok [INFO] [stdout] test daemon::interactive_prd::tests::parse_approved_spec_no_matching_draft_returns_none ... ok [INFO] [stdout] test daemon::interactive_prd::tests::prd_label_constants_include_waiting_feedback ... ok [INFO] [stdout] test daemon::interactive_prd::tests::prd_labels_alias_matches_lifecycle_labels ... ok [INFO] [stdout] test daemon::interactive_prd::tests::prd_workflow_state_serialization_roundtrip_for_all_variants ... ok [INFO] [stdout] test daemon::interactive_prd::tests::pre_draft_comments_ignored_for_revision_aggregation ... ok [INFO] [stdout] test daemon::interactive_prd::tests::generate_revision_reviewer_approval_does_not_bypass_section_gating ... ok [INFO] [stdout] test daemon::interactive_prd::tests::refresh_repo_clone_skips_when_no_git_dir ... ok [INFO] [stdout] test daemon::interactive_prd::tests::repo_clone_path_joins_owner_and_repo ... ok [INFO] [stdout] test daemon::interactive_prd::tests::run_draft_with_section_retry_sync_complete_output_succeeds ... ok [INFO] [stdout] test daemon::interactive_prd::tests::pre_draft_comments_ignored_for_approval_detection ... ok [INFO] [stdout] test daemon::interactive_prd::tests::save_and_load_roundtrip ... ok [INFO] [stdout] test daemon::interactive_prd::tests::save_failure_increments_error_count_in_apply_transition_result ... ok [INFO] [stdout] test daemon::interactive_prd::tests::section_complete_spec_passes_validation ... ok [INFO] [stdout] test daemon::interactive_prd::tests::section_empty_spec_reports_all_missing ... ok [INFO] [stdout] test daemon::interactive_prd::tests::section_incomplete_spec_reports_missing_sections ... ok [INFO] [stdout] test daemon::interactive_prd::tests::section_incomplete_writer_output_would_fail_after_retries ... ok [INFO] [stdout] test daemon::interactive_prd::tests::section_retry_constants_are_correct ... ok [INFO] [stdout] test daemon::interactive_prd::tests::section_reviewer_approval_does_not_bypass_completeness ... ok [INFO] [stdout] test daemon::interactive_prd::tests::run_draft_with_section_retry_sync_incomplete_output_fails ... ok [INFO] [stdout] test daemon::interactive_prd::tests::status_approved_marker_format ... ok [INFO] [stdout] test daemon::interactive_prd::tests::successful_transition_result_clears_previous_error_state ... ok [INFO] [stdout] test daemon::interactive_prd::tests::transition_error_accumulation_triggers_failure_on_third_error ... ok [INFO] [stdout] test daemon::interactive_prd::tests::transition_path_awaiting_answers_selects_first_valid_answer ... ok [INFO] [stdout] test daemon::interactive_prd::tests::transition_path_awaiting_feedback_approval ... ok [INFO] [stdout] test daemon::interactive_prd::tests::transition_path_pending_idempotent_marker_reuse ... ok [INFO] [stdout] test daemon::interactive_prd::tests::transition_path_pending_pickup_starts_non_terminal ... ok [INFO] [stdout] test daemon::interactive_prd::tests::transition_path_retry_exhaustion_triggers_failed ... ok [INFO] [stdout] test daemon::process::tests::append_mode_separator_has_blank_lines_when_no_trailing_newline ... ok [INFO] [stdout] test daemon::process::tests::append_mode_writes_retrigger_separator_for_non_empty_log ... ok [INFO] [stdout] test daemon::process::tests::conservative_separator_format_is_used_on_probe_failure ... ok [INFO] [stdout] test daemon::process::tests::metadata_inspection_failure_forces_conservative_separator_path ... ok [INFO] [stdout] test daemon::process::tests::quick_dev_auto_command_basic ... ok [INFO] [stdout] test daemon::process::tests::quick_dev_auto_command_includes_pr_url ... ok [INFO] [stdout] test daemon::process::tests::quick_dev_auto_command_includes_project_id ... ok [INFO] [stdout] test daemon::process::tests::quick_dev_run_command_basic ... ok [INFO] [stdout] test daemon::process::tests::quick_dev_run_command_includes_pr_url ... ok [INFO] [stdout] test daemon::process::tests::spawn_auto_command_includes_pr_url ... ok [INFO] [stdout] test daemon::process::tests::spawn_auto_command_includes_project_id ... ok [INFO] [stdout] test daemon::process::tests::spawn_command_uses_long_idea_flag ... ok [INFO] [stdout] test daemon::process::tests::spawn_run_command_includes_pr_url ... ok [INFO] [stdout] test daemon::process::tests::spawn_run_command_uses_project_flag ... ok [INFO] [stdout] test daemon::process::tests::test_pid_exists_bogus ... ok [INFO] [stdout] test daemon::process::tests::test_pid_exists_rejects_low_pids ... ok [INFO] [stdout] test daemon::process::tests::test_pid_exists_self ... ok [INFO] [stdout] test daemon::process::tests::test_terminate_process_group_dead_pgid ... ok [INFO] [stdout] test daemon::process::tests::test_terminate_process_group_noop_for_low_pgid ... ok [INFO] [stdout] test daemon::interactive_prd::tests::detect_approval_negative_cases ... ok [INFO] [stdout] test daemon::interactive_prd::tests::refresh_repo_clone_fetches_and_resets_real_repo ... ok [INFO] [stdout] test daemon::rebase_agent::tests::agent_error_messages_say_attempted ... ok [INFO] [stdout] test daemon::interactive_prd::tests::generate_revision_incomplete_writer_output_fails_after_exhaustion ... FAILED [INFO] [stdout] test daemon::rebase_agent::tests::classify_pure_conflict_exit_code_1_with_conflict_marker ... ok [INFO] [stdout] test daemon::rebase_agent::tests::classify_pure_conflict_exit_code_1_with_could_not_apply ... ok [INFO] [stdout] test daemon::rebase_agent::tests::classify_pure_non_conflict_exit_code_not_1 ... ok [INFO] [stdout] test daemon::rebase_agent::tests::classify_pure_non_conflict_no_indicator ... ok [INFO] [stdout] test daemon::interactive_prd::tests::detect_approval_uses_word_boundaries ... ok [INFO] [stdout] test daemon::rebase_agent::tests::classify_rebase_failure_has_conflicts_false ... ok [INFO] [stdout] test daemon::rebase_agent::tests::is_rebase_in_progress_false_for_clean_repo ... ok [INFO] [stdout] test daemon::rebase_agent::tests::max_iterations_constant_is_10 ... ok [INFO] [stdout] test daemon::interactive_prd::tests::transition_path_awaiting_feedback_revision ... ok [INFO] [stdout] test daemon::rebase_agent::tests::parse_rebase_agent_backend_claude_defaults_to_opus ... ok [INFO] [stdout] test daemon::rebase_agent::tests::parse_rebase_agent_backend_claude_opus ... ok [INFO] [stdout] test daemon::rebase_agent::tests::parse_rebase_agent_backend_claude_sonnet ... ok [INFO] [stdout] test daemon::rebase_agent::tests::parse_rebase_agent_backend_none ... ok [INFO] [stdout] test daemon::rebase_agent::tests::none_backend_error_says_skipped_disabled ... ok [INFO] [stdout] test daemon::rebase_agent::tests::parse_rebase_agent_backend_rejects_empty_string ... ok [INFO] [stdout] test daemon::rebase_agent::tests::classify_rebase_failure_missing_conflict_indicator_in_stderr ... ok [INFO] [stdout] test daemon::interactive_prd::tests::mixed_comments_approval_plus_feedback_triggers_approval ... ok [INFO] [stdout] test daemon::rebase_agent::tests::classify_rebase_failure_non_conflict_exit_code ... ok [INFO] [stdout] test daemon::rebase_agent::tests::classify_rebase_failure_detects_conflict ... ok [INFO] [stdout] test daemon::interactive_prd::tests::detect_approval_strips_fenced_and_inline_code ... ok [INFO] [stdout] test daemon::rebase_agent::tests::parse_rebase_agent_backend_trimmed_none ... ok [INFO] [stdout] test daemon::rebase_agent::tests::prompt_forbids_unrelated_file_edits ... ok [INFO] [stdout] test daemon::rebase_agent::tests::parse_rebase_agent_backend_rejects_unknown_value ... ok [INFO] [stdout] test daemon::rebase_agent::tests::prompt_includes_rebase_target_and_files ... ok [INFO] [stdout] test daemon::rebase_agent::tests::remaining_budget_returns_duration_when_not_expired ... ok [INFO] [stdout] test daemon::rebase_agent::tests::remaining_budget_returns_error_when_expired ... ok [INFO] [stdout] test daemon::rebase_agent::tests::prompt_forbids_rebase_continue_and_abort ... ok [INFO] [stdout] test daemon::rebase_agent::tests::prompt_requires_git_add ... ok [INFO] [stdout] test daemon::refine::tests::build_refinement_prompt_includes_system_instructions ... ok [INFO] [stdout] test daemon::rebase_agent::tests::remaining_budget_expired_message_contains_timeout ... ok [INFO] [stdout] test daemon::refine::tests::build_refinement_prompt_wraps_raw_idea ... ok [INFO] [stdout] test daemon::refine::tests::create_backend_accepts_bare_name ... ok [INFO] [stdout] test daemon::refine::tests::create_backend_accepts_claude ... ok [INFO] [stdout] test daemon::refine::tests::create_backend_accepts_codex ... ok [INFO] [stdout] test daemon::refine::tests::create_backend_rejects_unknown ... ok [INFO] [stdout] test daemon::refine::tests::parse_refined_output_cleaned_body_preserves_structure ... ok [INFO] [stdout] test daemon::refine::tests::parse_refined_output_delimiter_in_content_not_split ... ok [INFO] [stdout] test daemon::refine::tests::parse_refined_output_enforces_body_validation_for_structured_output ... ok [INFO] [stdout] test daemon::refine::tests::parse_refined_output_multi_delimiter_first_split_point ... ok [INFO] [stdout] test daemon::refine::tests::parse_refined_output_no_cleaned_body_fallback ... ok [INFO] [stdout] test daemon::refine::tests::parse_refined_output_rejects_empty_structured_title ... ok [INFO] [stdout] test daemon::refine::tests::parse_refined_output_rejects_overlong_title ... ok [INFO] [stdout] test daemon::refine::tests::parse_refined_output_empty_cleaned_body_degraded ... ok [INFO] [stdout] test daemon::refine::tests::parse_refined_output_truncated_cleaned_body_rejected ... ok [INFO] [stdout] test daemon::refine::tests::validate_output_accepts_valid_length ... ok [INFO] [stdout] test daemon::refine::tests::validate_output_boundary_at_min_length ... ok [INFO] [stdout] test daemon::refine::tests::parse_refined_output_short_cleaned_body_accepted ... ok [INFO] [stdout] test daemon::refine::tests::parse_refined_output_three_section_success ... ok [INFO] [stdout] test daemon::refine::tests::validate_output_rejects_empty ... ok [INFO] [stdout] test daemon::refine::tests::validate_output_rejects_too_short ... ok [INFO] [stdout] test daemon::refine::tests::validate_output_rejects_whitespace_only ... ok [INFO] [stdout] test daemon::refine::tests::validate_output_trims_whitespace ... ok [INFO] [stdout] test daemon::runtime::tests::build_pr_body_diff_stat_cap ... ok [INFO] [stdout] test daemon::rebase_agent::tests::resolve_with_invalid_backend_returns_clear_error ... ok [INFO] [stdout] test daemon::runtime::tests::build_pr_body_no_context_legacy_task ... ok [INFO] [stdout] test daemon::runtime::tests::build_pr_body_context_cap ... ok [INFO] [stdout] test daemon::runtime::tests::build_pr_title_sanitizes_newlines ... ok [INFO] [stdout] test daemon::runtime::tests::complete_task_retry_policy_has_required_cap_and_delay ... ok [INFO] [stdout] test daemon::runtime::tests::build_pr_title_truncates_long_title ... ok [INFO] [stdout] test daemon::runtime::tests::daemon_branch_format_validation_accepts_default ... ok [INFO] [stdout] test daemon::runtime::tests::daemon_branch_format_validation_rejects_incompatible_format ... ok [INFO] [stdout] test daemon::runtime::tests::extract_issue_body_handles_missing_or_empty_body ... ok [INFO] [stdout] test daemon::runtime::tests::extract_issue_body_reads_body_after_title_separator ... ok [INFO] [stdout] test daemon::runtime::tests::extract_original_title_body_only ... ok [INFO] [stdout] test daemon::runtime::tests::extract_original_title_empty ... ok [INFO] [stdout] test daemon::runtime::tests::extract_original_title_no_body ... ok [INFO] [stdout] test daemon::runtime::tests::extract_original_title_with_body ... ok [INFO] [stdout] test daemon::runtime::tests::extract_project_ref_non_matching_branches ... ok [INFO] [stdout] test daemon::runtime::tests::extract_project_ref_success ... ok [INFO] [stdout] test daemon::rebase_agent::tests::resolve_with_empty_backend_returns_clear_error ... ok [INFO] [stdout] test daemon::runtime::tests::final_prompt_uses_prompt_original_signal_and_reads_prompt_md ... ok [INFO] [stdout] test daemon::runtime::tests::quick_prd_detection_posts_correct_marker_header_and_body ... ok [INFO] [stdout] test daemon::runtime::tests::resume_decision_requires_issue_prompt_md ... ok [INFO] [stdout] test daemon::runtime::tests::runtime_pr_diff_stat_failure_fallback ... ok [INFO] [stdout] test daemon::runtime::tests::should_close_no_diff_draft_pr_only_for_no_diff_drafts ... ok [INFO] [stdout] test daemon::runtime::tests::should_mark_draft_pr_ready_only_on_completed_with_changes ... ok [INFO] [stdout] test daemon::runtime::tests::should_retry_complete_task_retries_only_transient_errors_under_cap ... ok [INFO] [stdout] test daemon::rebase_agent::tests::resolve_with_none_backend_returns_error_via_string_entrypoint ... ok [INFO] [stdout] test daemon::runtime::tests::single_watcher_run_posts_both_artifact_comments ... ok [INFO] [stdout] test daemon::runtime::tests::truncate_for_github_appends_note_within_limit ... ok [INFO] [stdout] test daemon::runtime::tests::watcher_idempotency_prevents_duplicate_comments_on_redispatch ... ok [INFO] [stdout] test daemon::runtime::tests::write_body_file_creates_readable_temp ... ok [INFO] [stdout] test daemon::tests::format_task_id_constructs_expected_string ... ok [INFO] [stdout] test daemon::rebase_agent::tests::resolve_with_trimmed_none_backend_returns_skipped_error ... ok [INFO] [stdout] test daemon::runtime::tests::multiple_spec_candidates_choose_newest_then_lexical_tiebreak ... ok [INFO] [stdout] test daemon::runtime::tests::stale_artifacts_older_than_child_start_are_ignored ... ok [INFO] [stdout] test error::tests::backend_timeout_display_and_debug_include_idle_variant_context ... ok [INFO] [stdout] test error::tests::backend_timeout_display_and_debug_include_walltime_variant_context ... ok [INFO] [stdout] test error::tests::branch_mismatch_display_includes_expected_and_actual ... ok [INFO] [stdout] test error::tests::interactive_prd_failed_has_expected_exit_code ... ok [INFO] [stdout] test error::tests::is_quota_error_matches_known_patterns ... ok [INFO] [stdout] test error::tests::is_quota_error_rejects_unrelated_errors ... ok [INFO] [stdout] test error::tests::is_transient_distinguishes_terminal_and_transient_errors ... ok [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpLXBIC7/.git/ [INFO] [stdout] test daemon::runtime::tests::await_watcher_with_timeout_impl_aborts_stuck_task ... ok [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpfF6B1L/.git/ [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] test daemon::runtime::tests::cancellation_triggers_final_sweep_without_missing_artifact ... ok [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpvEpeDy/remote.git/ [INFO] [stdout] [master (root-commit) 6121c28] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpvEpeDy/setup/.git/ [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stdout] test daemon::runtime::tests::github_post_failure_retries_without_panic ... ok [INFO] [stderr] hint: [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpNnpnVa/remote.git/ [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stdout] test daemon::worktree::tests::create_worktree_returns_expected_worktree_path ... ok [INFO] [stderr] hint: [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpNnpnVa/work/.git/ [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stdout] [master (root-commit) 6121c28] initial [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stderr] hint: [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpLy0ofl/remote.git/ [INFO] [stderr] Switched to a new branch 'ralph/test' [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpLy0ofl/setup/.git/ [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stdout] [master (root-commit) c4aa3f1] ralph: bootstrap empty commit [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stdout] test git::branch::tests::merge_base_branch_noop_when_up_to_date ... ok [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stdout] [main (root-commit) 49286c9] initial on main [INFO] [stderr] hint: [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] hint: [INFO] [stdout] [master e448417] add project state [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stdout] create mode 100644 project-state.txt [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpdGL8Lf/remote.git/ [INFO] [stderr] Switched to a new branch 'ralph/daemon/test-task' [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpdGL8Lf/setup/.git/ [INFO] [stdout] [master (root-commit) 6121c28] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] Switched to branch 'ralph/test' [INFO] [stdout] test git::branch::tests::merge_base_branch_syncs_new_commits ... ok [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] [master (root-commit) 6121c28] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpxKKGgf/remote.git/ [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpxKKGgf/setup/.git/ [INFO] [stdout] [master (root-commit) 6121c28] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stdout] test daemon::worktree::tests::verify_worktree_branch_returns_ok_for_matching_branch ... ok [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmptX3EVX/remote.git/ [INFO] [stderr] To /tmp/.tmpdGL8Lf/remote.git [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stderr] To /tmp/.tmpLy0ofl/remote.git [INFO] [stdout] branch 'master' set up to track 'origin/master'. [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stdout] branch 'master' set up to track 'origin/master'. [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stderr] Cloning into '/tmp/.tmpdGL8Lf/clone'... [INFO] [stderr] Cloning into '/tmp/.tmpLy0ofl/clone'... [INFO] [stderr] To /tmp/.tmpvEpeDy/remote.git [INFO] [stderr] * [new branch] main -> main [INFO] [stdout] Initialized empty Git repository in /tmp/.tmptX3EVX/setup/.git/ [INFO] [stdout] branch 'main' set up to track 'origin/main'. [INFO] [stderr] done. [INFO] [stderr] Cloning into '/tmp/.tmpvEpeDy/clone'... [INFO] [stderr] done. [INFO] [stderr] done. [INFO] [stdout] test daemon::worktree::tests::verify_worktree_branch_returns_error_for_missing_expected_branch ... ok [INFO] [stderr] Switched to a new branch 'ralph/issue-10' [INFO] [stderr] To /tmp/.tmpxKKGgf/remote.git [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stdout] branch 'master' set up to track 'origin/master'. [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpFRSiTK/remote.git/ [INFO] [stderr] Cloning into '/tmp/.tmpxKKGgf/clone'... [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpFRSiTK/setup/.git/ [INFO] [stderr] done. [INFO] [stdout] [master (root-commit) 6121c28] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stdout] [ralph/issue-10 cdf47aa] base commit [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 base.txt [INFO] [stdout] test git::branch::tests::sync_project_branch_bootstraps_empty_remote ... ok [INFO] [stderr] Switched to a new branch 'scratch' [INFO] [stdout] [master (root-commit) 6121c28] initial [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stdout] Deleted branch master (was 6121c28). [INFO] [stderr] hint: [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpHppx60/remote.git/ [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpHppx60/setup/.git/ [INFO] [stderr] To /tmp/.tmpFRSiTK/remote.git [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stderr] Cloning into '/tmp/.tmpFRSiTK/clone'... [INFO] [stderr] To /tmp/.tmpdGL8Lf/remote.git [INFO] [stderr] * [new branch] ralph/issue-10 -> ralph/issue-10 [INFO] [stdout] branch 'master' set up to track 'origin/master'. [INFO] [stdout] [master (root-commit) 6121c28] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] done. [INFO] [stdout] [ralph/issue-10 50b964c] local only: should vanish [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 local-artifact.txt [INFO] [stderr] To /tmp/.tmptX3EVX/remote.git [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stderr] Cloning into '/tmp/.tmptX3EVX/clone'... [INFO] [stderr] Switched to a new branch 'scratch' [INFO] [stdout] test git::branch::tests::sync_project_branch_autodetects_when_configured_base_missing ... ok [INFO] [stdout] branch 'master' set up to track 'origin/master'. [INFO] [stdout] Initialized empty Git repository in /tmp/.tmp1NNDkg/remote.git/ [INFO] [stderr] done. [INFO] [stderr] Cloning into 'work'... [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stderr] done. [INFO] [stderr] To /tmp/.tmpHppx60/remote.git [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stdout] branch 'master' set up to track 'origin/master'. [INFO] [stderr] Cloning into '/tmp/.tmpHppx60/clone'... [INFO] [stdout] [master (root-commit) 6121c28] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stdout] [master b94a108] advance remote base [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 remote-base.txt [INFO] [stderr] Switched to a new branch 'main' [INFO] [stdout] test git::branch::tests::sync_project_branch_discards_local_only_commit ... ok [INFO] [stdout] test git::branch::tests::sync_project_branch_falls_back_to_local_base_when_origin_missing ... ok [INFO] [stderr] To /tmp/.tmpFRSiTK/remote.git [INFO] [stderr] 6121c28..b94a108 master -> master [INFO] [stdout] branch 'master' set up to track 'origin/master'. [INFO] [stderr] To /tmp/.tmp1NNDkg/remote.git [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpB9Eyyf/remote.git/ [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stderr] done. [INFO] [stderr] Cloning into 'work'... [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stdout] [main c320722] main base commit 1 [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 main-base-1.txt [INFO] [stdout] HEAD is now at 6121c28 initial [INFO] [stdout] test git::branch::tests::sync_project_branch_creates_from_origin_head_when_missing ... ok [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stderr] done. [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmptbc8tO/remote.git/ [INFO] [stderr] Cloning into 'work'... [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpSeqwNG/remote.git/ [INFO] [stderr] Cloning into 'work'... [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stderr] done. [INFO] [stderr] Switched to a new branch 'scratch' [INFO] [stderr] To /tmp/.tmptX3EVX/remote.git [INFO] [stderr] * [new branch] main -> main [INFO] [stdout] branch 'main' set up to track 'origin/main'. [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stderr] done. [INFO] [stdout] [master (root-commit) 6121c28] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stdout] [main ac92e7e] main base commit 2 [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 main-base-2.txt [INFO] [stdout] [master (root-commit) 6121c28] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stderr] To /tmp/.tmp1NNDkg/remote.git [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stderr] Switched to a new branch 'ralph/issue-99' [INFO] [stdout] test git::commit::tests::commit_and_push_initial_prompt_fails_on_branch_mismatch ... ok [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpKqRSkn/.git/ [INFO] [stdout] [ralph/issue-42 f9d7c99] remote commit [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 remote-file.txt [INFO] [stdout] [master (root-commit) 6121c28] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stdout] [master (root-commit) 425ff81] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] To /tmp/.tmptbc8tO/remote.git [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stdout] branch 'master' set up to track 'origin/master'. [INFO] [stderr] To /tmp/.tmpB9Eyyf/remote.git [INFO] [stdout] branch 'master' set up to track 'origin/master'. [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stderr] To /tmp/.tmptX3EVX/remote.git [INFO] [stderr] c320722..ac92e7e main -> main [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stdout] HEAD is now at c320722 main base commit 1 [INFO] [stderr] To /tmp/.tmptbc8tO/remote.git [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stderr] To /tmp/.tmpHppx60/remote.git [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stderr] Already on 'ralph/issue-42' [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stderr] To /tmp/.tmpB9Eyyf/remote.git [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stdout] [ralph/issue-42 49efcb1] local only commit [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 local-only.txt [INFO] [stderr] Switched to branch 'master' [INFO] [stdout] test git::branch::tests::sync_project_branch_force_updates_local_base_branch ... ok [INFO] [stdout] test git::commit::tests::is_stray_impl_artifact_canonical_notes ... ok [INFO] [stderr] To /tmp/.tmpSeqwNG/remote.git [INFO] [stdout] test git::commit::tests::is_stray_impl_artifact_canonical_response ... ok [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stdout] test git::commit::tests::is_stray_impl_artifact_extra_suffix ... ok [INFO] [stdout] test git::commit::tests::is_stray_impl_artifact_four_digit_seq ... ok [INFO] [stdout] branch 'master' set up to track 'origin/master'. [INFO] [stdout] test git::commit::tests::is_stray_impl_artifact_no_timestamp ... ok [INFO] [stdout] test git::commit::tests::is_stray_impl_artifact_non_canonical_draft ... ok [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stdout] Your branch is up to date with 'origin/master'. [INFO] [stdout] test git::commit::tests::is_stray_impl_artifact_readme ... ok [INFO] [stdout] test git::commit::tests::is_stray_impl_artifact_response_999 ... ok [INFO] [stdout] test git::commit::tests::is_stray_impl_artifact_review_file ... ok [INFO] [stdout] test git::commit::tests::is_stray_impl_artifact_short_timestamp ... ok [INFO] [stdout] test git::commit::tests::is_stray_impl_artifact_spec ... ok [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpJVY6Se/.git/ [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stderr] To /tmp/.tmpSeqwNG/remote.git [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stdout] test git::commit::tests::commit_and_push_phase_transition_push_failure_keeps_local_commit_without_remote_advance ... ok [INFO] [stdout] [master (root-commit) 425ff81] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpGy18cR/remote.git/ [INFO] [stderr] Cloning into 'work'... [INFO] [stdout] [master 551cafc] add tracked stray files [INFO] [stderr] Switched to a new branch 'ralph/issue-99' [INFO] [stdout] 2 files changed, 2 insertions(+) [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stdout] create mode 100644 20260304120000-impl-notes.md [INFO] [stderr] done. [INFO] [stdout] create mode 100644 20260304120000-impl-response-001.md [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stdout] test git::commit::tests::commit_and_push_phase_transition_pushes_structured_checkpoint ... ok [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stdout] test git::ralph_commit::tests::build_and_parse_round_trip ... ok [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stdout] test git::branch::tests::sync_project_branch_resets_to_remote_when_exists ... ok [INFO] [stderr] hint: [INFO] [stdout] branch 'ralph/issue-99' set up to track 'origin/ralph/issue-99'. [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpQp4qlt/.git/ [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stderr] To /tmp/.tmpSeqwNG/remote.git [INFO] [stderr] * [new branch] ralph/issue-99 -> ralph/issue-99 [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] test git::commit::tests::remove_stray_impl_artifacts_cleans_tracked_and_untracked ... ok [INFO] [stdout] [master (root-commit) dccab9e] initial [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpZUNnPs/remote.git/ [INFO] [stderr] hint: [INFO] [stdout] test git::branch::tests::sync_project_branch_force_updates_custom_base_branch ... ok [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpnWV904/remote.git/ [INFO] [stderr] hint: [INFO] [stdout] test git::ralph_commit::tests::derive_position_defaults_when_no_ralph_commit_exists ... ok [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpwIy9ic/remote.git/ [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stderr] Cloning into 'work'... [INFO] [stderr] Cloning into 'work'... [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stderr] done. [INFO] [stderr] Cloning into 'work'... [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stderr] done. [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpD6IkgJ/remote.git/ [INFO] [stderr] Cloning into 'work'... [INFO] [stdout] [master (root-commit) dccab9e] initial [INFO] [stderr] done. [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stderr] done. [INFO] [stdout] [master (root-commit) dccab9e] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stdout] [master (root-commit) dccab9e] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] To /tmp/.tmpGy18cR/remote.git [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stdout] branch 'master' set up to track 'origin/master'. [INFO] [stdout] [master (root-commit) dccab9e] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stdout] [master (root-commit) dccab9e] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stderr] To /tmp/.tmpwIy9ic/remote.git [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stdout] test git::commit::tests::commit_and_push_initial_prompt_stages_only_prompt_inputs ... ok [INFO] [stderr] To /tmp/.tmpnWV904/remote.git [INFO] [stdout] test git::commit::tests::counts_only_matching_project_and_transition_messages ... ok [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stderr] To /tmp/.tmpD6IkgJ/remote.git [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stderr] To /tmp/.tmpZUNnPs/remote.git [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stdout] test git::ralph_commit::tests::parse_rejects_malformed_subject ... ok [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stdout] test git::ralph_commit::tests::parse_rejects_missing_required_trailer ... ok [INFO] [stdout] test git::ralph_commit::tests::parse_rejects_subject_and_trailer_disagreement ... ok [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpUUHn0J/remote.git/ [INFO] [stderr] Cloning into 'work'... [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stderr] done. [INFO] [stderr] To /tmp/.tmpwIy9ic/remote.git [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stderr] To /tmp/.tmpGy18cR/remote.git [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stdout] [ralph/issue-42 38344a4] ralph(issue-42): loop 1 planning -> implementing [INFO] [stderr] To /tmp/.tmpD6IkgJ/remote.git [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stdout] [master (root-commit) dccab9e] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmp9z1MmN/remote.git/ [INFO] [stdout] [ralph/issue-42 38344a4] ralph(issue-42): loop 1 planning -> implementing [INFO] [stderr] Cloning into 'work'... [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stderr] done. [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stderr] To /tmp/.tmpZUNnPs/remote.git [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stdout] [ralph/issue-42 38344a4] ralph(issue-42): loop 1 planning -> implementing [INFO] [stderr] To /tmp/.tmpnWV904/remote.git [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stderr] To /tmp/.tmpUUHn0J/remote.git [INFO] [stdout] [ralph/issue-42 1f4bfae] ralph(issue-42): loop 1 planning -> implementing [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stdout] [master (root-commit) dccab9e] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stderr] To /tmp/.tmpD6IkgJ/remote.git [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] dccab9e..38344a4 HEAD -> ralph/issue-42 [INFO] [stdout] [ralph/issue-42 0951069] chore: non-ralph commit [INFO] [stderr] To /tmp/.tmpGy18cR/remote.git [INFO] [stderr] dccab9e..38344a4 HEAD -> ralph/issue-42 [INFO] [stdout] test daemon::process::tests::test_terminate_spawned_process_group ... ok [INFO] [stderr] To /tmp/.tmp9z1MmN/remote.git [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stderr] To /tmp/.tmpUUHn0J/remote.git [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stderr] To /tmp/.tmpnWV904/remote.git [INFO] [stderr] dccab9e..1f4bfae HEAD -> ralph/issue-42 [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stderr] To /tmp/.tmpD6IkgJ/remote.git [INFO] [stderr] 38344a4..0951069 HEAD -> ralph/issue-42 [INFO] [stdout] [ralph/issue-42 2eeb4d0] ralph(issue-42): loop 2 implementing -> reviewing [INFO] [stdout] [ralph/issue-42 61957ae] ralph(issue-42): loop 2 implementing -> reviewing [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpKHjYE7/remote.git/ [INFO] [stderr] To /tmp/.tmpwIy9ic/remote.git [INFO] [stderr] dccab9e..38344a4 HEAD -> ralph/issue-42 [INFO] [stdout] [ralph/issue-42 b44ef0d] ralph(issue-42): loop 2 implementing -> reviewing [INFO] [stdout] [ralph/issue-42 38344a4] ralph(issue-42): loop 1 planning -> implementing [INFO] [stderr] To /tmp/.tmp9z1MmN/remote.git [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stdout] [ralph/issue-42 a599fb4] ralph(issue-42): loop 2 implementing -> reviewing [INFO] [stderr] Cloning into 'work'... [INFO] [stderr] To /tmp/.tmpUUHn0J/remote.git [INFO] [stderr] dccab9e..38344a4 HEAD -> ralph/issue-42 [INFO] [stdout] [ralph/issue-42 05e4600] ralph(issue-42): loop 2 implementing -> reviewing [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stderr] To /tmp/.tmpD6IkgJ/remote.git [INFO] [stderr] 0951069..2eeb4d0 HEAD -> ralph/issue-42 [INFO] [stderr] done. [INFO] [stdout] [ralph/issue-42 38344a4] ralph(issue-42): loop 1 planning -> implementing [INFO] [stdout] [master (root-commit) 0e88447] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stderr] To /tmp/.tmpwIy9ic/remote.git [INFO] [stderr] 38344a4..a599fb4 HEAD -> ralph/issue-42 [INFO] [stdout] test git::ralph_commit::tests::resolve_checkpoint_ref_prefers_local_when_ahead ... ok [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stdout] test git::ralph_commit::tests::no_checkpoint_defaults_to_loop_1_planning ... ok [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stdout] test git::ralph_commit::tests::parse_last_ralph_commit_reads_latest_remote_checkpoint ... ok [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stdout] test output_log::tests::collision_safe_across_projects ... ok [INFO] [stderr] hint: [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpXhbX4v/remote.git/ [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stdout] test output_log::tests::creates_missing_parent_directories ... ok [INFO] [stderr] hint: [INFO] [stdout] test output_log::tests::derives_loop_scoped_log_path ... ok [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stdout] test output_log::tests::derives_prompt_reviewer_log_path_when_loop_is_none ... ok [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stderr] To /tmp/.tmpnWV904/remote.git [INFO] [stderr] 1f4bfae..b44ef0d HEAD -> ralph/issue-42 [INFO] [stderr] Cloning into 'work'... [INFO] [stdout] test output_log::tests::fallback_flag_semantics_locked_down ... ok [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stderr] hint: [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stderr] hint: [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stderr] hint: [INFO] [stderr] hint: git branch -m [INFO] [stdout] test output_log::tests::formats_loop_number_edges_with_three_digits ... ok [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpTxOQXJ/remote.git/ [INFO] [stderr] done. [INFO] [stdout] test output_log::tests::log_writer_appends_across_instances ... ok [INFO] [stdout] test output_log::tests::log_writer_attempt_counter_increments ... ok [INFO] [stdout] test output_log::tests::log_writer_disabled_on_bad_path_continues_silently ... ok [INFO] [stdout] test output_log::tests::log_writer_opens_and_appends ... ok [INFO] [stderr] Cloning into 'work'... [INFO] [stdout] test output_log::tests::log_writer_preserves_cr_and_partial_line_bytes ... ok [INFO] [stderr] To /tmp/.tmpKHjYE7/remote.git [INFO] [stderr] * [new branch] To /tmp/.tmp9z1MmN/remote.git [INFO] [stderr] dccab9e..38344a4 HEAD -> ralph/issue-42 [INFO] [stderr] HEAD -> master [INFO] [stdout] test output_log::tests::log_writer_prompt_reviewer_uses_flat_path ... ok [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stdout] [master (root-commit) 0e88447] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stdout] test output_log::tests::log_writer_timeout_footer_appends ... ok [INFO] [stdout] test output_log::tests::mixed_timeout_and_parse_retry_numbering ... ok [INFO] [stdout] test output_log::tests::parse_retry_path_attempt_numbering ... ok [INFO] [stdout] test output_log::tests::sanitization_collapses_and_trims_underscores ... ok [INFO] [stdout] test output_log::tests::sanitization_handles_empty_input ... ok [INFO] [stdout] test output_log::tests::sanitizes_unsafe_filename_characters ... ok [INFO] [stdout] test output_log::tests::separator_format_contains_required_fields ... ok [INFO] [stdout] test output_log::tests::separator_format_fallback_flag ... ok [INFO] [stdout] test output_log::tests::timeout_footer_format_contains_timestamp ... ok [INFO] [stdout] test output_log::tests::timeout_retry_path_attempt_numbering ... ok [INFO] [stdout] test prd::answers::tests::hash_is_stable_for_same_content ... ok [INFO] [stdout] test prd::answers::tests::load_returns_empty_map_when_file_missing ... ok [INFO] [stderr] warning: You appear to have cloned an empty repository. [INFO] [stdout] [ralph/issue-42 05e4600] ralph(issue-42): loop 2 implementing -> reviewing [INFO] [stderr] done. [INFO] [stdout] test git::ralph_commit::tests::newest_valid_with_older_malformed_succeeds ... ok [INFO] [stdout] test prd::answers::tests::yaml_roundtrip ... ok [INFO] [stdout] test prd::cache::tests::creates_cache_dir_with_expected_hash ... ok [INFO] [stdout] test prd::answers::tests::merge_overwrites_existing_and_adds_new_keys ... ok [INFO] [stdout] test prd::cache::tests::meta_roundtrip ... ok [INFO] [stdout] test prd::cache::tests::prd_lock_releases_on_drop ... ok [INFO] [stderr] To /tmp/.tmpKHjYE7/remote.git [INFO] [stdout] test prd::cache::tests::prd_lock_acquisition_succeeds ... ok [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stdout] test git::ralph_commit::tests::parse_last_ralph_commit_rejects_malformed_newest_checkpoint ... ok [INFO] [stdout] test prd::cache::tests::should_skip_stage_when_input_hash_matches ... ok [INFO] [stdout] test prd::cache::tests::stage_output_roundtrip ... ok [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stdout] test prd::cache::tests::writes_missing_info_report ... ok [INFO] [stdout] test prd::gaps::tests::parse_gap_report_empty_questions_list ... ok [INFO] [stdout] test prd::gaps::tests::parse_gap_report_malformed_json_returns_error ... ok [INFO] [stdout] test prd::gaps::tests::parse_gap_report_missing_fence_markers_returns_error ... ok [INFO] [stdout] test prd::gaps::tests::parse_gap_report_valid_fenced_json ... ok [INFO] [stdout] test prd::gaps::tests::parse_validation_result_invalid_with_issues ... ok [INFO] [stdout] test prd::cache::tests::resume_validation_detects_idea_mismatch ... ok [INFO] [stdout] test prd::gaps::tests::parse_validation_result_valid ... ok [INFO] [stdout] test prd::gaps::tests::test_gap_report_serde_roundtrip ... ok [INFO] [stdout] test prd::gaps::tests::test_question_kind_serde_roundtrip ... ok [INFO] [stdout] test prd::gaps::tests::test_question_typed_impact_stage ... ok [INFO] [stdout] test prd::gaps::tests::validation_result_serde_roundtrip ... ok [INFO] [stdout] test prd::interaction::tests::mock_interaction_returns_canned_answers_and_none_when_exhausted ... ok [INFO] [stdout] test prd::interaction::tests::non_interactive_interaction_always_returns_none ... ok [INFO] [stdout] test prd::interaction::tests::parse_question_answer_handles_defaults_and_kinds ... ok [INFO] [stdout] test prd::interaction::tests::plain_interaction_dispatches_commands ... ok [INFO] [stdout] [ralph/issue-42 9f97801] ralph(issue-42): loop 1 planning -> implementing [INFO] [stdout] test prd::interaction::tests::plain_interaction_parses_commands ... ok [INFO] [stdout] test prd::quick::tests::test_check_spec_sections_all_present ... ok [INFO] [stdout] test prd::quick::tests::test_dry_run_renders_prompt ... ok [INFO] [stdout] [master (root-commit) 0e88447] initial [INFO] [stdout] 1 file changed, 1 insertion(+) [INFO] [stdout] create mode 100644 README.md [INFO] [stdout] test prd::quick::tests::test_check_spec_sections_with_frontmatter ... ok [INFO] [stdout] test prd::quick::tests::test_empty_issues_auto_approval ... ok [INFO] [stdout] test prd::quick::tests::test_format_issues ... ok [INFO] [stdout] test prd::quick::tests::test_malformed_revision_keeps_previous_spec ... ok [INFO] [stdout] test prd::quick::tests::test_parse_review_feedback_approved ... ok [INFO] [stdout] test prd::quick::tests::test_parse_review_feedback_malformed ... ok [INFO] [stdout] test prd::quick::tests::test_render_prompt ... ok [INFO] [stdout] test prd::quick::tests::test_review_feedback_serde_roundtrip ... ok [INFO] [stdout] test prd::quick::tests::test_check_spec_sections_some_missing ... ok [INFO] [stdout] test prd::quick::tests::test_review_parse_retry_success ... ok [INFO] [stdout] test prd::quick::tests::test_review_parse_retry_exhaustion ... ok [INFO] [stdout] test prd::quick::tests::test_parse_review_feedback_rejected ... ok [INFO] [stderr] To /tmp/.tmpXhbX4v/remote.git [INFO] [stdout] test prd::stages::tests::test_check_stage_output_missing_sections ... ok [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stdout] test prd::quick::tests::test_revision_artifact_writing ... ok [INFO] [stdout] test git::commit::tests::sync_project_branch_discards_local_only_checkpoint_and_position_reverts ... ok [INFO] [stdout] test prd::quick::tests::test_section_retry_limit ... ok [INFO] [stdout] test prd::stages::tests::test_check_stage_output_valid ... ok [INFO] [stdout] test prd::stages::tests::test_format_answers_empty ... ok [INFO] [stdout] test prd::stages::tests::test_gap_analysis_prompt ... ok [INFO] [stdout] test prd::stages::tests::test_check_stage_output_with_frontmatter ... ok [INFO] [stdout] test prd::stages::tests::test_format_answers_with_data ... ok [INFO] [stdout] test prd::stages::tests::test_prd_prompt ... ok [INFO] [stdout] test prd::stages::tests::test_render_template ... ok [INFO] [stdout] test prd::stages::tests::test_required_sections_per_stage ... ok [INFO] [stdout] test prd::stages::tests::test_research_prompt ... ok [INFO] [stdout] test prd::stages::tests::test_synthesis_prompt ... ok [INFO] [stdout] test prd::stages::tests::test_ideation_prompt ... ok [INFO] [stdout] test prd::stages::tests::test_validation_prompt ... ok [INFO] [stdout] test prd::state::tests::test_prd_meta_serde ... ok [INFO] [stdout] test prd::state::tests::test_stage_artifact_filename ... ok [INFO] [stdout] test prd::state::tests::test_pipeline_context_serde ... ok [INFO] [stdout] test prd::state::tests::test_stage_index ... ok [INFO] [stdout] test prd::state::tests::test_stage_ordering ... ok [INFO] [stdout] test project::artifacts::tests::final_review_artifact_kinds_render_expected_names_and_types ... ok [INFO] [stdout] test project::artifacts::tests::qa_and_acceptance_artifact_kinds_render_expected_names_and_types ... ok [INFO] [stdout] test project::artifacts::tests::resolve_artifact_path_by_suffix_prefers_latest_timestamped_file ... ok [INFO] [stdout] test prd::state::tests::test_stage_serde_roundtrip ... ok [INFO] [stdout] test project::artifacts::tests::write_project_scoped_artifact_writes_project_frontmatter_schema ... ok [INFO] [stdout] test project::lifecycle::tests::load_quick_dev_phase_ignores_malformed_state_json ... ok [INFO] [stdout] test project::artifacts::tests::write_artifact_prefixes_filename_with_timestamp ... ok [INFO] [stdout] test project::lifecycle::tests::reconstruction_project_override_takes_precedence_over_global ... ok [INFO] [stdout] test project::lifecycle::tests::load_quick_dev_phase_works_with_valid_state_json ... ok [INFO] [stdout] test project::lifecycle::tests::reconstruction_uses_global_completion_threshold_override ... ok [INFO] [stdout] test project::state::tests::final_review_requires_iteration_one ... ok [INFO] [stdout] test project::state::tests::legacy_state_without_created_at_deserializes_to_sentinel ... ok [INFO] [stdout] test project::state::tests::legacy_state_without_quick_dev_phase_deserializes_to_none ... ok [INFO] [stdout] test project::state::tests::legacy_state_without_session_store_deserializes_to_empty ... ok [INFO] [stdout] test project::state::tests::new_state_defaults_prompt_review_completed_to_false ... ok [INFO] [stdout] test project::state::tests::new_state_defaults_quick_dev_phase_to_none ... ok [INFO] [stdout] test project::state::tests::new_state_initializes_empty_session_store ... ok [INFO] [stdout] test project::state::tests::new_state_sets_created_at ... ok [INFO] [stdout] test project::state::tests::remove_loop_clears_session_records ... ok [INFO] [stdout] test project::state::tests::session_store_lookup_finds_matching_record ... ok [INFO] [stdout] test project::state::tests::session_store_remove_for_loop_clears_matching_records ... ok [INFO] [stdout] test project::state::tests::session_store_serde_roundtrip ... ok [INFO] [stdout] test project::state::tests::session_store_upsert_replaces_existing_record ... ok [INFO] [stdout] test project::state::tests::state_roundtrip_preserves_quick_dev_phase ... ok [INFO] [stdout] test prompts::template_introspection::tests::load_template_source_reads_file_when_present ... ok [INFO] [stdout] test prompts::template_introspection::tests::load_template_source_uses_fallback_when_missing ... ok [INFO] [stdout] test project::state::tests::legacy_state_without_prompt_review_field_deserializes_to_false ... ok [INFO] [stdout] test prompts::template_introspection::tests::template_uses_var_detects_present_placeholder ... ok [INFO] [stdout] test prompts::template_introspection::tests::template_uses_var_requires_exact_match ... ok [INFO] [stdout] test prompts::template_introspection::tests::template_uses_var_returns_true_for_repeated_placeholders ... ok [INFO] [stdout] test util::slug::tests::slugifies_per_convention ... ok [INFO] [stdout] test util::slug::tests::truncates_slug ... ok [INFO] [stdout] test prompts::template_introspection::tests::template_uses_var_detects_absent_placeholder ... ok [INFO] [stderr] To /tmp/.tmp9z1MmN/remote.git [INFO] [stderr] 38344a4..05e4600 HEAD -> ralph/issue-42 [INFO] [stderr] To /tmp/.tmpXhbX4v/remote.git [INFO] [stdout] test validate::harness::tests::env_removal_removes_variable_from_child ... ok [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stdout] test validate::tests_interactive_prd::parse_approved_spec_ignores_marker_inside_draft_body ... ok [INFO] [stdout] test workflow::orchestrator::tests::bootstrap_hash_changes_on_backend_change ... ok [INFO] [stdout] HEAD is now at 38344a4 ralph(issue-42): loop 1 planning -> implementing [INFO] [stdout] test workflow::orchestrator::tests::bootstrap_hash_changes_on_prompt_hash_change ... ok [INFO] [stdout] test workflow::orchestrator::tests::bootstrap_hash_changes_on_role_change ... ok [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stdout] test workflow::orchestrator::tests::bootstrap_hash_changes_on_spec_content_change ... ok [INFO] [stdout] test workflow::orchestrator::tests::bootstrap_hash_changes_on_template_content_change ... ok [INFO] [stdout] test workflow::orchestrator::tests::bootstrap_hash_includes_version_salt ... ok [INFO] [stdout] test workflow::orchestrator::tests::bootstrap_hash_is_deterministic ... ok [INFO] [stdout] test workflow::orchestrator::tests::collect_history_returns_empty_when_cap_is_zero ... ok [INFO] [stdout] test workflow::orchestrator::tests::collect_qa_history_caps_to_highest_two_non_sequential ... ok [INFO] [stdout] test workflow::orchestrator::tests::collect_review_history_caps_to_highest_two_non_sequential ... ok [INFO] [stdout] [ralph/issue-42 9c02fad] ralph(issue-42): loop 2 implementing -> qa [INFO] [stdout] test workflow::orchestrator::tests::collect_review_history_caps_to_latest_three_sequential ... ok [INFO] [stdout] test workflow::orchestrator::tests::consensus_insufficient_min_completers ... ok [INFO] [stdout] test workflow::orchestrator::tests::consensus_partial_threshold_half ... ok [INFO] [stdout] test workflow::orchestrator::tests::consensus_partial_threshold_three_quarters ... ok [INFO] [stdout] test workflow::orchestrator::tests::consensus_partial_threshold_two_thirds ... ok [INFO] [stdout] test workflow::orchestrator::tests::consensus_single_completer_complete ... ok [INFO] [stdout] test workflow::orchestrator::tests::consensus_single_completer_continue ... ok [INFO] [stdout] test workflow::orchestrator::tests::consensus_unanimity_all_complete ... ok [INFO] [stdout] test workflow::orchestrator::tests::consensus_unanimity_one_missing ... ok [INFO] [stdout] test workflow::orchestrator::tests::consensus_zero_total_completers ... ok [INFO] [stdout] test workflow::orchestrator::tests::expected_format_template_for_implementer_response_defaults_to_1 ... ok [INFO] [stdout] test workflow::orchestrator::tests::expected_format_template_for_implementer_response_substitutes_iteration ... ok [INFO] [stdout] test workflow::orchestrator::tests::expected_format_template_for_other_roles_ignores_iteration ... ok [INFO] [stdout] test workflow::orchestrator::tests::expected_format_template_for_qa_contains_pass_and_fail ... ok [INFO] [stdout] test workflow::orchestrator::tests::history_included_when_resume_rewrite_fallback_uses_fresh_prompt ... ok [INFO] [stdout] test workflow::orchestrator::tests::history_omitted_when_session_reused_and_config_disables_reused_history ... ok [INFO] [stdout] test validate::harness::tests::env_removal_preserves_non_removed_variables ... ok [INFO] [stdout] test workflow::orchestrator::tests::latest_completion_feedback_none_when_no_attempts ... ok [INFO] [stdout] test workflow::orchestrator::tests::latest_completion_feedback_acceptance_failures_take_priority ... ok [INFO] [stdout] test workflow::orchestrator::tests::latest_completion_feedback_returns_verdicts_on_continue ... ok [INFO] [stdout] test workflow::orchestrator::tests::latest_completion_feedback_uses_latest_attempt ... ok [INFO] [stdout] test workflow::orchestrator::tests::latest_completion_feedback_none_when_verdict_complete ... ok [INFO] [stdout] test workflow::orchestrator::tests::max_backend_retries_accepts_one ... ok [INFO] [stdout] test workflow::orchestrator::tests::max_backend_retries_accepts_five ... ok [INFO] [stdout] test workflow::orchestrator::tests::max_backend_retries_accepts_ten ... ok [INFO] [stdout] test workflow::orchestrator::tests::max_backend_retries_clamps_eleven_to_ten ... ok [INFO] [stdout] test workflow::orchestrator::tests::max_backend_retries_clamps_large_numeric_value ... ok [INFO] [stdout] test workflow::orchestrator::tests::max_backend_retries_rejects_empty_value ... ok [INFO] [stdout] test workflow::orchestrator::tests::max_backend_retries_rejects_non_numeric_value ... ok [INFO] [stdout] test workflow::orchestrator::tests::max_backend_retries_rejects_zero ... ok [INFO] [stdout] test workflow::orchestrator::tests::max_backend_retries_unset_defaults_to_three ... ok [INFO] [stdout] [ralph/issue-42 9f97801] ralph(issue-42): loop 1 planning -> implementing [INFO] [stdout] test workflow::orchestrator::tests::parse_retry_attempts_four_with_session_followup_and_token_metrics ... ok [INFO] [stderr] To /tmp/.tmpKHjYE7/remote.git [INFO] [stdout] test workflow::orchestrator::tests::parse_retry_attempts_are_three_without_session ... ok [INFO] [stderr] 0e88447..9f97801 HEAD -> ralph/issue-42 [INFO] [stdout] test workflow::orchestrator::tests::planner_prompt_custom_template_without_master_placeholder_appends_once ... ok [INFO] [stdout] test workflow::orchestrator::tests::planner_prompt_default_template_has_single_master_prompt_section ... ok [INFO] [stdout] test workflow::orchestrator::tests::planner_prompt_includes_final_review_amendments_when_file_exists ... ok [INFO] [stdout] test workflow::orchestrator::tests::planner_prompt_full_json_has_no_nested_code_fences ... ok [INFO] [stdout] test workflow::orchestrator::tests::planner_prompt_with_full_json_mode_includes_json ... ok [INFO] [stdout] test workflow::orchestrator::tests::planner_prompt_omits_final_review_amendments_when_file_absent ... ok [INFO] [stdout] [ralph/issue-42 ba8cb11] ralph(issue-42): loop 2 implementing -> reviewing [INFO] [stdout] test workflow::orchestrator::tests::planner_prompt_with_summary_mode_excludes_full_json ... ok [INFO] [stdout] test workflow::orchestrator::tests::preload_role_model_backends_covers_all_roles_for_all_backends ... ok [INFO] [stderr] To /tmp/.tmpTxOQXJ/remote.git [INFO] [stderr] * [new branch] HEAD -> master [INFO] [stdout] test git::ralph_commit::tests::resolve_checkpoint_ref_prefers_local_when_diverged ... ok [INFO] [stdout] test workflow::orchestrator::tests::preload_role_model_backends_creates_expected_entries_for_default_config ... ok [INFO] [stdout] test workflow::orchestrator::tests::preload_role_model_backends_is_noop_when_models_are_unset ... ok [INFO] [stdout] test project::lifecycle::tests::maybe_create_project_branch_still_errors_for_existing_non_head_branch ... ok [INFO] [stdout] test workflow::orchestrator::tests::resolve_tmux_settings_falls_back_to_config ... ok [INFO] [stdout] test workflow::orchestrator::tests::resolve_tmux_settings_prefers_cli_override ... ok [INFO] [stdout] test workflow::orchestrator::tests::summarize_specs_fulltext_mode_reads_spec_files ... ok [INFO] [stdout] test workflow::orchestrator::tests::summarize_specs_titles_mode_produces_bullet_titles ... ok [INFO] [stdout] test workflow::orchestrator::tests::summarize_state_cap_limits_to_latest_n ... ok [INFO] [stdout] test workflow::orchestrator::tests::summarize_state_cap_zero_shows_none ... ok [INFO] [stdout] test workflow::orchestrator::tests::summarize_state_includes_loop_metadata_excludes_feedback_body ... ok [INFO] [stdout] test workflow::orchestrator::tests::summarize_specs_titles_mode_cap_zero_returns_empty ... ok [INFO] [stdout] test workflow::orchestrator::tests::summarize_state_unlimited_includes_all ... ok [INFO] [stdout] test workflow::orchestrator::tests::summarize_specs_none_mode_returns_empty ... ok [INFO] [stdout] test workflow::orchestrator::tests::summarize_specs_cap_limits_to_latest_n ... ok [INFO] [stdout] test workflow::orchestrator::tests::summarize_state_verdict_deterministic_for_all_statuses ... ok [INFO] [stdout] test workflow::orchestrator::tests::validate_tmux_preflight_checks_when_enabled_and_not_dry_run ... ok [INFO] [stdout] test workflow::orchestrator::tests::validate_tmux_preflight_skips_check_for_dry_run ... ok [INFO] [stdout] test workflow::parser::tests::arbiter_output_rejects_invalid_ruling ... ok [INFO] [stdout] test workflow::parser::tests::arbiter_output_rejects_missing_rationale ... ok [INFO] [stdout] test workflow::parser::tests::arbiter_output_rejects_missing_ids ... ok [INFO] [stdout] test workflow::parser::tests::arbiter_output_rejects_wrong_h1 ... ok [INFO] [stdout] test workflow::parser::tests::codex_review_parser_rejects_wrong_h1 ... ok [INFO] [stdout] test workflow::parser::tests::arbiter_output_success ... ok [INFO] [stdout] test workflow::parser::tests::codex_review_parser_rejects_missing_h1 ... ok [INFO] [stdout] test workflow::parser::tests::codex_review_parser_tolerates_leading_whitespace ... ok [INFO] [stdout] test workflow::parser::tests::final_reviewer_amendments_h1_but_no_blocks_fails ... ok [INFO] [stdout] test workflow::parser::tests::codex_review_parser_strips_frontmatter ... ok [INFO] [stdout] test workflow::parser::tests::extracts_commit_message_block ... ok [INFO] [stdout] test workflow::parser::tests::final_reviewer_no_amendments_requires_summary ... ok [INFO] [stdout] test workflow::parser::tests::final_reviewer_no_amendments ... ok [INFO] [stdout] test workflow::parser::tests::final_reviewer_rejects_amendment_missing_problem ... ok [INFO] [stdout] test workflow::parser::tests::final_reviewer_rejects_amendment_missing_affected_files ... ok [INFO] [stdout] test workflow::parser::tests::final_reviewer_rejects_amendment_missing_proposed_change ... ok [INFO] [stdout] test workflow::parser::tests::final_reviewer_rejects_duplicate_amendment_ids ... ok [INFO] [stdout] test workflow::parser::tests::final_reviewer_rejects_missing_h1 ... ok [INFO] [stdout] test workflow::parser::tests::final_reviewer_rejects_second_amendment_missing_subsection ... ok [INFO] [stdout] test workflow::parser::tests::final_reviewer_rejects_wrong_h1 ... ok [INFO] [stdout] test workflow::parser::tests::final_reviewer_strips_frontmatter ... ok [INFO] [stdout] test workflow::parser::tests::parses_codex_review_changes_requested ... ok [INFO] [stdout] test workflow::parser::tests::parses_codex_review_satisfied ... ok [INFO] [stdout] test workflow::parser::tests::parses_completer_complete_verdict ... ok [INFO] [stdout] test workflow::parser::tests::parses_completer_verdict ... ok [INFO] [stdout] test workflow::parser::tests::parses_completion_heading ... ok [INFO] [stdout] test workflow::parser::tests::parses_feature_heading ... ok [INFO] [stdout] test workflow::parser::tests::parses_impl_notes ... ok [INFO] [stdout] test workflow::parser::tests::codex_review_parser_tolerates_trailing_whitespace ... ok [INFO] [stdout] test workflow::parser::tests::parses_prompt_reviewer_output ... ok [INFO] [stdout] test workflow::parser::tests::parses_qa_fail ... ok [INFO] [stdout] test workflow::parser::tests::parses_qa_pass ... ok [INFO] [stdout] test workflow::parser::tests::parses_impl_response_iteration ... ok [INFO] [stdout] test workflow::parser::tests::parses_review_approved ... ok [INFO] [stdout] test workflow::parser::tests::final_reviewer_with_amendments ... ok [INFO] [stderr] To /tmp/.tmpKHjYE7/remote.git [INFO] [stdout] test workflow::parser::tests::parses_quick_final_review_complete ... ok [INFO] [stderr] 9f97801..ba8cb11 HEAD -> ralph/issue-42 [INFO] [stdout] test workflow::parser::tests::parses_quick_final_review_issues_found ... ok [INFO] [stderr] Switched to a new branch 'ralph/issue-42' [INFO] [stdout] test workflow::parser::tests::parses_review_suggestions ... ok [INFO] [stderr] To /tmp/.tmpXhbX4v/remote.git [INFO] [stdout] test workflow::parser::tests::planner_position_rejects_duplicate_ids ... ok [INFO] [stderr] 0e88447..9f97801 HEAD -> ralph/issue-42 [INFO] [stdout] test workflow::parser::tests::planner_position_rejects_extra_id ... ok [INFO] [stdout] test workflow::parser::tests::planner_position_rejects_invalid_value ... ok [INFO] [stdout] test workflow::parser::tests::planner_position_rejects_missing_rationale ... ok [INFO] [stdout] test workflow::parser::tests::planner_position_rejects_partial_rationale_coverage ... ok [INFO] [stdout] test workflow::parser::tests::planner_position_success ... ok [INFO] [stdout] test workflow::parser::tests::prompt_review_validator_accepts_accept_verdict ... ok [INFO] [stdout] test workflow::parser::tests::prompt_review_validator_accepts_reject_verdict_with_reason ... ok [INFO] [stdout] test workflow::parser::tests::prompt_review_validator_rejects_empty_reason ... ok [INFO] [stdout] test workflow::parser::tests::prompt_review_validator_rejects_unknown_verdict ... ok [INFO] [stdout] test workflow::parser::tests::prompt_reviewer_output_extracts_refined_prompt_to_eof_with_nested_headings ... ok [INFO] [stdout] test workflow::parser::tests::prompt_reviewer_output_rejects_empty_refined_prompt ... ok [INFO] [stdout] test workflow::parser::tests::prompt_reviewer_output_rejects_too_short_refined_prompt ... ok [INFO] [stdout] test workflow::parser::tests::prompt_reviewer_output_rejects_wrong_section_order ... ok [INFO] [stdout] test workflow::parser::tests::prompt_reviewer_output_requires_h1 ... ok [INFO] [stdout] test workflow::parser::tests::prompt_reviewer_output_requires_issues_found ... ok [INFO] [stdout] test workflow::parser::tests::prompt_reviewer_output_requires_refined_prompt_section ... ok [INFO] [stdout] test workflow::parser::tests::qa_fail_requires_all_sections ... ok [INFO] [stdout] test workflow::parser::tests::qa_parser_rejects_malformed_output ... ok [INFO] [stdout] test workflow::parser::tests::qa_parser_rejects_missing_h1 ... ok [INFO] [stdout] test workflow::parser::tests::qa_parser_strips_frontmatter ... ok [INFO] [stdout] test workflow::parser::tests::qa_pass_requires_all_sections ... ok [INFO] [stdout] test workflow::parser::tests::quick_final_review_parser_rejects_missing_h1 ... ok [INFO] [stdout] test workflow::parser::tests::quick_final_review_parser_rejects_wrong_h1 ... ok [INFO] [stdout] test workflow::parser::tests::quick_final_review_parser_strips_frontmatter ... ok [INFO] [stdout] test workflow::parser::tests::quick_final_review_parser_tolerates_leading_whitespace ... ok [INFO] [stdout] test workflow::parser::tests::quick_final_review_parser_tolerates_trailing_whitespace ... ok [INFO] [stdout] test workflow::parser::tests::strip_frontmatter_ignores_triple_dash_inside_content ... ok [INFO] [stdout] test workflow::parser::tests::strip_frontmatter_preserves_tilde_fences ... ok [INFO] [stdout] test workflow::parser::tests::strip_frontmatter_removes_yaml_header ... ok [INFO] [stdout] test workflow::parser::tests::strip_frontmatter_with_dash_fences_around_raw_output_corrupts_parse ... ok [INFO] [stdout] test workflow::parser::tests::vote_output_rejects_duplicate_ids ... ok [INFO] [stdout] test workflow::parser::tests::vote_output_rejects_missing_h1 ... ok [INFO] [stdout] test workflow::parser::tests::vote_output_rejects_missing_ids ... ok [INFO] [stdout] test workflow::parser::tests::vote_output_rejects_missing_rationale ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::compute_phase_iteration_returns_correct_values ... ok [INFO] [stdout] test workflow::parser::tests::vote_output_success ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::default_max_values ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::guard_at_entry_codex_review_skips_when_at_limit ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::guard_at_entry_final_review_skips_when_at_limit ... ok [INFO] [stdout] test workflow::parser::tests::planner_position_rejects_missing_h1 ... ok [INFO] [stdout] test workflow::parser::tests::planner_position_rejects_missing_id ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::persist_quick_dev_state_apply_fixes ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::persist_quick_dev_state_final_review ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::persist_quick_dev_state_plan_and_implement ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::persist_quick_dev_state_sets_fields_correctly ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::quick_dev_phase_to_current_phase_mapping ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::resolve_implementer_backend_cli_override_takes_precedence ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::quick_dev_phase_display ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::resolve_implementer_backend_effective_fallback ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::resolve_implementer_backend_starting_fallback ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::resolve_reviewer_backend_cli_override ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::resolve_reviewer_backend_effective_fallback ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::resolve_reviewer_backend_missing_fails_with_exact_message ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::resume_from_codex_review ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::resume_from_final_review ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::resume_from_none_starts_at_plan_and_implement ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::validate_distinct_backends_accepts_different ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::validate_distinct_backends_rejects_equal ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::persist_destination_state_roundtrip ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::validate_distinct_backends_rejects_optional_prefix_with_model ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::validate_distinct_backends_rejects_whitespace_equal ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::validate_distinct_backends_rejects_optional_prefix_equal ... ok [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::save_state_to_disk_roundtrips ... ok [INFO] [stdout] HEAD is now at 9f97801 ralph(issue-42): loop 1 planning -> implementing [INFO] [stdout] test workflow::quick_dev_orchestrator::tests::persist_destination_state_with_counters ... ok [INFO] [stderr] Switched to branch 'master' [INFO] [stdout] test workspace::active::tests::missing_active_project_file_returns_none ... ok [INFO] [stderr] To /tmp/.tmpTxOQXJ/remote.git [INFO] [stdout] test workspace::active::tests::empty_or_whitespace_active_project_file_returns_none ... ok [INFO] [stderr] * [new branch] ralph/issue-42 -> ralph/issue-42 [INFO] [stdout] test project::lifecycle::tests::maybe_create_project_branch_is_idempotent_when_head_matches_target ... ok [INFO] [stdout] test workspace::active::tests::subprocess_helper_emits_empty_active_project_warning ... ignored [INFO] [stdout] test workspace::summary::tests::completed_at_is_none_for_non_completed_projects ... ok [INFO] [stdout] test workspace::summary::tests::legacy_state_uses_now_when_prompt_metadata_is_unavailable ... ok [INFO] [stdout] test workspace::summary::tests::legacy_state_without_created_at_falls_back_to_prompt_file_mtime ... ok [INFO] [stdout] test workspace::active::tests::invalid_active_project_file_returns_none ... ok [INFO] [stdout] Your branch is up to date with 'origin/master'. [INFO] [stdout] test workspace::summary::tests::summarizes_project_from_state ... ok [INFO] [stdout] test workspace::tests::list_projects_returns_empty_for_empty_projects_dir ... ok [INFO] [stdout] test workspace::active::tests::empty_or_whitespace_active_project_file_emits_warning ... ok [INFO] [stdout] branch 'ralph/issue-42' set up to track 'origin/ralph/issue-42'. [INFO] [stdout] test workspace::tests::active_project_set_and_read_roundtrip ... ok [INFO] [stderr] hint: Using 'master' as the name for the initial branch. This default branch name [INFO] [stdout] test workspace::active::tests::read_write_roundtrip_non_git_workspace ... ok [INFO] [stderr] hint: is subject to change. To configure the initial branch name to use in all [INFO] [stdout] test workspace::tests::list_projects_scans_and_sorts_by_project_id ... ok [INFO] [stderr] hint: of your new repositories, which will suppress this warning, call: [INFO] [stdout] test workspace::tests::load_project_summary_returns_not_found_for_missing_project ... ok [INFO] [stderr] hint: [INFO] [stdout] Deleted branch ralph/issue-42 (was 9f97801). [INFO] [stderr] hint: git config --global init.defaultBranch [INFO] [stdout] Initialized empty Git repository in /tmp/.tmpOK4gYh/.git/ [INFO] [stderr] hint: [INFO] [stdout] test workspace::tests::set_active_project_rejects_missing_project ... ok [INFO] [stderr] hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and [INFO] [stdout] test workspace::tests::project_exists_checks_for_prompt_file ... ok [INFO] [stderr] hint: 'development'. The just-created branch can be renamed via this command: [INFO] [stdout] test workspace::tests::load_project_summary_returns_summary_for_existing_project ... ok [INFO] [stderr] hint: [INFO] [stdout] test workspace::tests::list_projects_skips_non_dirs_and_missing_prompt ... ok [INFO] [stderr] hint: git branch -m [INFO] [stdout] test git::ralph_commit::tests::resolve_checkpoint_ref_prefers_remote_when_local_behind ... ok [INFO] [stdout] test git::ralph_commit::tests::resolve_checkpoint_ref_returns_none_when_neither_exists ... ok [INFO] [stdout] test workspace::active::tests::read_write_roundtrip_git_workspace ... ok [INFO] [stdout] test git::ralph_commit::tests::resolve_checkpoint_ref_uses_remote_when_only_remote_exists ... ok [INFO] [stdout] [INFO] [stdout] failures: [INFO] [stdout] [INFO] [stdout] ---- daemon::interactive_prd::tests::generate_revision_incomplete_writer_output_fails_after_exhaustion stdout ---- [INFO] [stdout] [INFO] [stdout] thread 'daemon::interactive_prd::tests::generate_revision_incomplete_writer_output_fails_after_exhaustion' (658) panicked at src/daemon/interactive_prd.rs:3485:9: [INFO] [stdout] error should mention missing sections: interactive PRD failed: backend execution failed: backend command failed for claude: Text file busy (os error 26) (command='/tmp/.tmpyvSV5w', resolved='/tmp/.tmpyvSV5w') [INFO] [stdout] stack backtrace: [INFO] [stdout] 0: 0x5ef63a16ccaa - std[69d51b4813ba037]::backtrace_rs::backtrace::libunwind::trace [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/../../backtrace/src/backtrace/libunwind.rs:117:9 [INFO] [stdout] 1: 0x5ef63a16ccaa - std[69d51b4813ba037]::backtrace_rs::backtrace::trace_unsynchronized:: [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/../../backtrace/src/backtrace/mod.rs:66:14 [INFO] [stdout] 2: 0x5ef63a16ccaa - std[69d51b4813ba037]::sys::backtrace::_print_fmt [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/sys/backtrace.rs:74:9 [INFO] [stdout] 3: 0x5ef63a16ccaa - <::print::DisplayBacktrace as core[51d4adbef590f61]::fmt::Display>::fmt [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/sys/backtrace.rs:44:26 [INFO] [stdout] 4: 0x5ef63a18532a - ::fmt [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/core/src/fmt/rt.rs:152:76 [INFO] [stdout] 5: 0x5ef63a18532a - core[51d4adbef590f61]::fmt::write [INFO] [stdout] 6: 0x5ef63a1729b2 - std[69d51b4813ba037]::io::default_write_fmt::> [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/io/mod.rs:639:11 [INFO] [stdout] 7: 0x5ef63a1729b2 - as std[69d51b4813ba037]::io::Write>::write_fmt [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/io/mod.rs:1994:13 [INFO] [stdout] 8: 0x5ef63a1465cf - ::print [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/sys/backtrace.rs:47:9 [INFO] [stdout] 9: 0x5ef63a1465cf - std[69d51b4813ba037]::panicking::default_hook::{closure#0} [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/panicking.rs:292:27 [INFO] [stdout] 10: 0x5ef63a162b59 - std[69d51b4813ba037]::panicking::default_hook [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/panicking.rs:316:9 [INFO] [stdout] 11: 0x5ef639a2a03c - core[51d4adbef590f61]::ops::function::Fn<(&'a std[69d51b4813ba037]::panic::PanicHookInfo<'b>,), Output = ()> + core[51d4adbef590f61]::marker::Sync + core[51d4adbef590f61]::marker::Send> as core[51d4adbef590f61]::ops::function::Fn<(&std[69d51b4813ba037]::panic::PanicHookInfo,)>>::call [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/alloc/src/boxed.rs:2254:9 [INFO] [stdout] 12: 0x5ef639a2a03c - test[8fe65b9e05bf4c74]::test_main_with_exit_callback::::{closure#0} [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/test/src/lib.rs:145:21 [INFO] [stdout] 13: 0x5ef63a162dd2 - core[51d4adbef590f61]::ops::function::Fn<(&'a std[69d51b4813ba037]::panic::PanicHookInfo<'b>,), Output = ()> + core[51d4adbef590f61]::marker::Sync + core[51d4adbef590f61]::marker::Send> as core[51d4adbef590f61]::ops::function::Fn<(&std[69d51b4813ba037]::panic::PanicHookInfo,)>>::call [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/alloc/src/boxed.rs:2254:9 [INFO] [stdout] 14: 0x5ef63a162dd2 - std[69d51b4813ba037]::panicking::panic_with_hook [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/panicking.rs:833:13 [INFO] [stdout] 15: 0x5ef63a146688 - std[69d51b4813ba037]::panicking::panic_handler::{closure#0} [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/panicking.rs:698:13 [INFO] [stdout] 16: 0x5ef63a13db09 - std[69d51b4813ba037]::sys::backtrace::__rust_end_short_backtrace:: [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/sys/backtrace.rs:182:18 [INFO] [stdout] 17: 0x5ef63a14777d - __rustc[cb16bc19fc993bd7]::rust_begin_unwind [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/panicking.rs:689:5 [INFO] [stdout] 18: 0x5ef63a185cbc - core[51d4adbef590f61]::panicking::panic_fmt [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/core/src/panicking.rs:80:14 [INFO] [stdout] 19: 0x5ef63976dfce - ralph[6e23db1b7962e6a2]::daemon::interactive_prd::tests::generate_revision_incomplete_writer_output_fails_after_exhaustion [INFO] [stdout] at /opt/rustwide/workdir/src/daemon/interactive_prd.rs:3485:9 [INFO] [stdout] 20: 0x5ef63973e857 - ralph[6e23db1b7962e6a2]::daemon::interactive_prd::tests::generate_revision_incomplete_writer_output_fails_after_exhaustion::{closure#0} [INFO] [stdout] at /opt/rustwide/workdir/src/daemon/interactive_prd.rs:3457:75 [INFO] [stdout] 21: 0x5ef6397efa56 - >::call_once [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/core/src/ops/function.rs:250:5 [INFO] [stdout] 22: 0x5ef639a1e11b - core[51d4adbef590f61]::result::Result<(), alloc[18203fec9a0cd4ec]::string::String> as core[51d4adbef590f61]::ops::function::FnOnce<()>>::call_once [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/core/src/ops/function.rs:250:5 [INFO] [stdout] 23: 0x5ef639a1e11b - test[8fe65b9e05bf4c74]::__rust_begin_short_backtrace::, fn() -> core[51d4adbef590f61]::result::Result<(), alloc[18203fec9a0cd4ec]::string::String>> [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/test/src/lib.rs:663:18 [INFO] [stdout] 24: 0x5ef639a2ab0b - test[8fe65b9e05bf4c74]::run_test_in_process::{closure#0} [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/test/src/lib.rs:686:74 [INFO] [stdout] 25: 0x5ef639a2ab0b - as core[51d4adbef590f61]::ops::function::FnOnce<()>>::call_once [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/core/src/panic/unwind_safe.rs:274:9 [INFO] [stdout] 26: 0x5ef639a2ab0b - std[69d51b4813ba037]::panicking::catch_unwind::do_call::, core[51d4adbef590f61]::result::Result<(), alloc[18203fec9a0cd4ec]::string::String>> [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/panicking.rs:581:40 [INFO] [stdout] 27: 0x5ef639a2ab0b - std[69d51b4813ba037]::panicking::catch_unwind::, core[51d4adbef590f61]::panic::unwind_safe::AssertUnwindSafe> [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/panicking.rs:544:19 [INFO] [stdout] 28: 0x5ef639a2ab0b - std[69d51b4813ba037]::panic::catch_unwind::, core[51d4adbef590f61]::result::Result<(), alloc[18203fec9a0cd4ec]::string::String>> [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/panic.rs:359:14 [INFO] [stdout] 29: 0x5ef639a2ab0b - test[8fe65b9e05bf4c74]::run_test_in_process [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/test/src/lib.rs:686:27 [INFO] [stdout] 30: 0x5ef639a2ab0b - test[8fe65b9e05bf4c74]::run_test::{closure#0} [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/test/src/lib.rs:607:43 [INFO] [stdout] 31: 0x5ef639a26224 - test[8fe65b9e05bf4c74]::run_test::{closure#1} [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/test/src/lib.rs:637:41 [INFO] [stdout] 32: 0x5ef639a26224 - std[69d51b4813ba037]::sys::backtrace::__rust_begin_short_backtrace:: [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/sys/backtrace.rs:166:18 [INFO] [stdout] 33: 0x5ef639a2d712 - std[69d51b4813ba037]::thread::lifecycle::spawn_unchecked::::{closure#1}::{closure#0} [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/thread/lifecycle.rs:91:13 [INFO] [stdout] 34: 0x5ef639a2d712 - ::{closure#1}::{closure#0}> as core[51d4adbef590f61]::ops::function::FnOnce<()>>::call_once [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/core/src/panic/unwind_safe.rs:274:9 [INFO] [stdout] 35: 0x5ef639a2d712 - std[69d51b4813ba037]::panicking::catch_unwind::do_call::::{closure#1}::{closure#0}>, ()> [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/panicking.rs:581:40 [INFO] [stdout] 36: 0x5ef639a2d712 - std[69d51b4813ba037]::panicking::catch_unwind::<(), core[51d4adbef590f61]::panic::unwind_safe::AssertUnwindSafe::{closure#1}::{closure#0}>> [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/panicking.rs:544:19 [INFO] [stdout] 37: 0x5ef639a2d712 - std[69d51b4813ba037]::panic::catch_unwind::::{closure#1}::{closure#0}>, ()> [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/panic.rs:359:14 [INFO] [stdout] 38: 0x5ef639a2d712 - std[69d51b4813ba037]::thread::lifecycle::spawn_unchecked::::{closure#1} [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/thread/lifecycle.rs:89:26 [INFO] [stdout] 39: 0x5ef639a2d712 - ::{closure#1} as core[51d4adbef590f61]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0} [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/core/src/ops/function.rs:250:5 [INFO] [stdout] 40: 0x5ef63a16bcaf - + core[51d4adbef590f61]::marker::Send> as core[51d4adbef590f61]::ops::function::FnOnce<()>>::call_once [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/alloc/src/boxed.rs:2240:9 [INFO] [stdout] 41: 0x5ef63a16bcaf - ::new::thread_start [INFO] [stdout] at /rustc/d933cf483edf1605142ac6899ff32536c0ad8b22/library/std/src/sys/thread/unix.rs:118:17 [INFO] [stdout] 42: 0x7b0df49c1aa4 - [INFO] [stdout] 43: 0x7b0df4a4ea64 - clone [INFO] [stdout] 44: 0x0 - [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] failures: [INFO] [stdout] daemon::interactive_prd::tests::generate_revision_incomplete_writer_output_fails_after_exhaustion [INFO] [stdout] [INFO] [stdout] test result: FAILED. 954 passed; 1 failed; 1 ignored; 0 measured; 0 filtered out; finished in 4.63s [INFO] [stdout] [INFO] [stderr] error: test failed, to rerun pass `--lib` [INFO] running `Command { std: "docker" "inspect" "c37a8d8ee01f2559eb45a0265658288a63d2277bb97e19ce070fc4ef882fbbbe", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "c37a8d8ee01f2559eb45a0265658288a63d2277bb97e19ce070fc4ef882fbbbe", kill_on_drop: false }` [INFO] [stdout] c37a8d8ee01f2559eb45a0265658288a63d2277bb97e19ce070fc4ef882fbbbe