[INFO] fetching crate kando-core 1.2.1... [INFO] testing kando-core-1.2.1 against try#dec9417b8611e34e787a3e4c37686b5131f9e5c5 for pr-154210-1 [INFO] extracting crate kando-core 1.2.1 into /workspace/builds/worker-6-tc2/source [INFO] started tweaking crates.io crate kando-core 1.2.1 [INFO] removed 0 missing tests [INFO] finished tweaking crates.io crate kando-core 1.2.1 [INFO] tweaked toml for crates.io crate kando-core 1.2.1 written to /workspace/builds/worker-6-tc2/source/Cargo.toml [INFO] validating manifest of crates.io crate kando-core 1.2.1 on toolchain dec9417b8611e34e787a3e4c37686b5131f9e5c5 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate crates.io crate kando-core 1.2.1 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" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 4bceb075b28a6ebd38f173d384a236a6fb006445e18cdb5cb0ffaf30edd01f44 [INFO] running `Command { std: "docker" "start" "-a" "4bceb075b28a6ebd38f173d384a236a6fb006445e18cdb5cb0ffaf30edd01f44", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "4bceb075b28a6ebd38f173d384a236a6fb006445e18cdb5cb0ffaf30edd01f44", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "4bceb075b28a6ebd38f173d384a236a6fb006445e18cdb5cb0ffaf30edd01f44", kill_on_drop: false }` [INFO] [stdout] 4bceb075b28a6ebd38f173d384a236a6fb006445e18cdb5cb0ffaf30edd01f44 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "build" "--frozen" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 0a2b7b4e97973ec213fb0a6ae6f7e8e006c6d9e1863df0875b50d127f0244ab0 [INFO] running `Command { std: "docker" "start" "-a" "0a2b7b4e97973ec213fb0a6ae6f7e8e006c6d9e1863df0875b50d127f0244ab0", kill_on_drop: false }` [INFO] [stderr] Compiling serde_core v1.0.228 [INFO] [stderr] Compiling toml_writer v1.0.6+spec-1.1.0 [INFO] [stderr] Compiling toml_parser v1.0.9+spec-1.1.0 [INFO] [stderr] Compiling tinyvec v1.10.0 [INFO] [stderr] Compiling syn v2.0.117 [INFO] [stderr] Compiling fuzzy-matcher v0.3.7 [INFO] [stderr] Compiling dirs v6.0.0 [INFO] [stderr] Compiling unicode-normalization v0.1.25 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling toml_datetime v1.0.0+spec-1.1.0 [INFO] [stderr] Compiling serde_spanned v1.0.4 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Compiling toml v1.0.6+spec-1.1.0 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling chrono v0.4.44 [INFO] [stderr] Compiling kando-core v1.2.1 (/opt/rustwide/workdir) [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 15.32s [INFO] running `Command { std: "docker" "inspect" "0a2b7b4e97973ec213fb0a6ae6f7e8e006c6d9e1863df0875b50d127f0244ab0", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "0a2b7b4e97973ec213fb0a6ae6f7e8e006c6d9e1863df0875b50d127f0244ab0", kill_on_drop: false }` [INFO] [stdout] 0a2b7b4e97973ec213fb0a6ae6f7e8e006c6d9e1863df0875b50d127f0244ab0 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] e2be370d105db823dbdeb32f0b3507fadd0d92ee32899fbfe2684898b0c45272 [INFO] running `Command { std: "docker" "start" "-a" "e2be370d105db823dbdeb32f0b3507fadd0d92ee32899fbfe2684898b0c45272", kill_on_drop: false }` [INFO] [stderr] Compiling rustix v1.1.4 [INFO] [stderr] Compiling once_cell v1.21.3 [INFO] [stderr] Compiling getrandom v0.4.2 [INFO] [stderr] Compiling tempfile v3.26.0 [INFO] [stderr] Compiling kando-core v1.2.1 (/opt/rustwide/workdir) [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 10.08s [INFO] running `Command { std: "docker" "inspect" "e2be370d105db823dbdeb32f0b3507fadd0d92ee32899fbfe2684898b0c45272", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "e2be370d105db823dbdeb32f0b3507fadd0d92ee32899fbfe2684898b0c45272", kill_on_drop: false }` [INFO] [stdout] e2be370d105db823dbdeb32f0b3507fadd0d92ee32899fbfe2684898b0c45272 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "test" "--frozen", kill_on_drop: false }` [INFO] [stdout] 96f28e188d57312018b07877f2cf58a741caf2902ad77195fd2485921037ec10 [INFO] running `Command { std: "docker" "start" "-a" "96f28e188d57312018b07877f2cf58a741caf2902ad77195fd2485921037ec10", kill_on_drop: false }` [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 0.11s [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/kando_core-a6e64ecde59f5ad3) [INFO] [stdout] [INFO] [stdout] running 496 tests [INFO] [stdout] test board::age::tests::card_staleness_label_returns_normal_for_fresh_non_new ... ok [INFO] [stdout] test board::age::tests::card_staleness_label_stale_days_zero_new_card ... ok [INFO] [stdout] test board::age::tests::card_staleness_label_stale_days_zero_old_card ... ok [INFO] [stdout] test board::age::tests::card_staleness_label_returns_very_stale ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_future_completed_not_moved ... ok [INFO] [stdout] test board::age::tests::card_staleness_label_returns_stale ... ok [INFO] [stdout] test board::age::tests::format_age_boundary_60_days ... ok [INFO] [stdout] test board::age::tests::format_age_future_date_returns_new ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_moves_card_from_done_to_archive ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_mixed_old_and_young_only_old_moved ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_multiple_done_cards_all_old_all_moved ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_at_exact_threshold_is_moved ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_disabled_when_zero ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_from_col_slug_is_done_slug ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_empty_done_column_returns_empty ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_no_archive_column_returns_empty ... ok [INFO] [stdout] test board::age::tests::card_staleness_label_returns_new_for_card_created_today ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_does_not_update_updated_field ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_no_done_column_returns_empty ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_one_day_short_not_moved ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_only_moves_from_done_not_other_columns ... ok [INFO] [stdout] test board::age::tests::card_staleness_label_utc_day_boundary ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_falls_back_to_updated_when_no_completed ... ok [INFO] [stdout] test board::age::tests::format_age_boundary_14_days ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_uses_completed_over_updated ... ok [INFO] [stdout] test board::age::tests::run_auto_close_closed_card_title_is_correct ... ok [INFO] [stdout] test board::age::tests::run_auto_close_disabled_when_zero ... ok [INFO] [stdout] test board::age::tests::run_auto_close_empty_board_no_panic ... ok [INFO] [stdout] test board::age::tests::run_auto_close_from_col_slug_reflects_source_column ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_preserves_completed_timestamp ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_preserves_started_timestamp ... ok [INFO] [stdout] test board::age::tests::run_auto_archive_returns_correct_id_and_title ... ok [INFO] [stdout] test board::age::tests::run_auto_close_at_exact_boundary_is_moved ... ok [INFO] [stdout] test board::age::tests::run_auto_close_moves_stale_cards ... ok [INFO] [stdout] test board::age::tests::test_format_age ... ok [INFO] [stdout] test board::age::tests::test_should_auto_close ... ok [INFO] [stdout] test board::age::tests::run_auto_close_no_target_column_returns_empty ... ok [INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_basic_due ... ok [INFO] [stdout] test board::age::tests::run_auto_close_skips_fresh_cards ... ok [INFO] [stdout] test board::age::tests::run_auto_close_skips_cards_in_target_column ... ok [INFO] [stdout] test board::age::tests::staleness_disabled_when_zero ... ok [INFO] [stdout] test board::age::tests::staleness_boundary_exact_double ... ok [INFO] [stdout] test board::age::tests::run_auto_close_one_day_short_not_moved ... ok [INFO] [stdout] test board::age::tests::run_auto_close_multiple_stale_across_columns ... ok [INFO] [stdout] test board::age::tests::staleness_boundary_exact_threshold ... ok [INFO] [stdout] test board::age::tests::test_staleness ... ok [INFO] [stdout] test board::age::tests::run_auto_close_multiple_stale_same_column_all_moved ... ok [INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_basic_blocked ... ok [INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_single_delimiter ... ok [INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_spaces_around_equals ... ok [INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_unquoted ... ok [INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_empty_value ... ok [INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_key_prefix_no_false_positive ... ok [INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_missing_key ... ok [INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_no_frontmatter ... ok [INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_body_not_matched ... ok [INFO] [stdout] test board::hooks::tests::env_vars_include_kando_board_dir ... ok [INFO] [stdout] test board::hooks::tests::hook_name_for_action_prefixes_post ... ok [INFO] [stdout] test board::hooks::tests::list_hooks_detects_executable ... ok [INFO] [stdout] test board::hooks::tests::list_hooks_detects_non_executable ... ok [INFO] [stdout] test board::hooks::tests::list_hooks_mixed_states ... ok [INFO] [stdout] test board::hooks::tests::list_hooks_returns_all_events ... ok [INFO] [stdout] test board::hooks::tests::make_executable_idempotent ... ok [INFO] [stdout] test board::hooks::tests::make_executable_nonexistent_file_returns_error ... ok [INFO] [stdout] test board::hooks::tests::make_executable_sets_755 ... ok [INFO] [stdout] test board::hooks::tests::env_vars_include_extras_uppercased ... ok [INFO] [stdout] test board::hooks::tests::fire_hook_multiline_stdout_uses_first_line_only ... ok [INFO] [stdout] test board::hooks::tests::read_card_due_blocked_card_not_found ... ok [INFO] [stdout] test board::hooks::tests::read_card_due_blocked_card_without_due_or_blocked ... ok [INFO] [stdout] test board::hooks::tests::fire_hook_env_includes_card_due_and_blocked ... ok [INFO] [stdout] test board::hooks::tests::read_card_due_blocked_finds_card_in_non_first_column ... ok [INFO] [stdout] test board::hooks::tests::read_card_due_blocked_finds_card ... ok [INFO] [stdout] test board::hooks::tests::read_card_due_blocked_no_columns_dir ... ok [INFO] [stdout] test board::hooks::tests::scaffold_hook_creates_hooks_dir_and_file ... ok [INFO] [stdout] test board::hooks::tests::fire_hook_executable_sends_notification ... ok [INFO] [stdout] test board::hooks::tests::scaffold_hook_file_contains_shebang ... ok [INFO] [stdout] test board::hooks::tests::scaffold_hook_hooks_dir_already_exists ... ok [INFO] [stdout] test board::hooks::tests::fire_hook_failing_script_sends_error ... ok [INFO] [stdout] test board::hooks::tests::scaffold_hook_file_is_executable ... ok [INFO] [stdout] test board::hooks::tests::fire_hook_failure_no_output_says_failed ... ok [INFO] [stdout] test board::hooks::tests::validate_hook_name_accepts_post_auto_close ... ok [INFO] [stdout] test board::hooks::tests::validate_hook_name_accepts_post_col_add ... ok [INFO] [stdout] test board::hooks::tests::scaffold_hook_returns_correct_path ... ok [INFO] [stdout] test board::hooks::tests::validate_hook_name_accepts_all_events ... ok [INFO] [stdout] test board::hooks::tests::validate_hook_name_accepts_post_create ... ok [INFO] [stdout] test board::hooks::tests::validate_hook_name_accepts_post_move ... ok [INFO] [stdout] test board::hooks::tests::validate_hook_name_rejects_case_mismatch ... ok [INFO] [stdout] test board::hooks::tests::validate_hook_name_rejects_empty_string ... ok [INFO] [stdout] test board::hooks::tests::validate_hook_name_rejects_missing_prefix ... ok [INFO] [stdout] test board::hooks::tests::validate_hook_name_rejects_unknown_event ... ok [INFO] [stdout] test board::hooks::tests::validate_hook_name_rejects_whitespace ... ok [INFO] [stdout] test board::hooks::tests::scaffold_hook_overwrites_existing_file ... ok [INFO] [stdout] test board::hooks::tests::validate_hook_name_rejects_wrong_prefix ... ok [INFO] [stdout] test board::metrics::tests::arrival_rate_respects_since_window ... ok [INFO] [stdout] test board::metrics::tests::active_wip_excludes_backlog_and_done ... ok [INFO] [stdout] test board::metrics::tests::aging_cards_flagged_when_exceeding_p85 ... ok [INFO] [stdout] test board::metrics::tests::arrival_rate_counts_all_columns ... ok [INFO] [stdout] test board::metrics::tests::avg_empty_returns_zero ... ok [INFO] [stdout] test board::metrics::tests::avg_multiple_values ... ok [INFO] [stdout] test board::metrics::tests::avg_single_value ... ok [INFO] [stdout] test board::metrics::tests::blocked_pct_calculation ... ok [INFO] [stdout] test board::metrics::tests::board_created_at_used_as_effective_since ... ok [INFO] [stdout] test board::metrics::tests::blocked_zero_when_no_active_wip ... ok [INFO] [stdout] test board::metrics::tests::cards_in_non_done_columns_not_counted ... ok [INFO] [stdout] test board::metrics::tests::cards_without_completed_excluded ... ok [INFO] [stdout] test board::metrics::tests::compute_metrics_kando_dir_none_gives_no_stage_times ... ok [INFO] [stdout] test board::metrics::tests::completed_cards_counted_correctly ... ok [INFO] [stdout] test board::metrics::tests::cycle_time_uses_started ... ok [INFO] [stdout] test board::metrics::tests::empty_board_yields_zero_metrics ... ok [INFO] [stdout] test board::metrics::tests::fill_week_gaps_inserts_missing ... ok [INFO] [stdout] test board::metrics::tests::format_csv_has_headers ... ok [INFO] [stdout] test board::metrics::tests::format_csv_includes_time_metrics ... ok [INFO] [stdout] test board::metrics::tests::format_csv_includes_stage_time ... ok [INFO] [stdout] test board::metrics::tests::format_text_contains_key_sections ... ok [INFO] [stdout] test board::metrics::tests::format_text_includes_stage_time ... ok [INFO] [stdout] test board::metrics::tests::format_text_no_throughput_when_no_completions ... ok [INFO] [stdout] test board::metrics::tests::format_text_omits_stage_time_when_none ... ok [INFO] [stdout] test board::metrics::tests::cycle_time_falls_back_to_created ... ok [INFO] [stdout] test board::metrics::tests::format_week_output ... ok [INFO] [stdout] test board::metrics::tests::lead_and_cycle_differ_when_started_set ... ok [INFO] [stdout] test board::metrics::tests::lead_time_math_correct ... ok [INFO] [stdout] test board::metrics::tests::lead_time_uses_created ... ok [INFO] [stdout] test board::metrics::tests::lookback_filters_old_completions ... ok [INFO] [stdout] test board::metrics::tests::median_empty_returns_zero ... ok [INFO] [stdout] test board::metrics::tests::blocked_count_only_active_columns ... ok [INFO] [stdout] test board::metrics::tests::median_even_number_of_cards ... ok [INFO] [stdout] test board::metrics::tests::median_odd_count ... ok [INFO] [stdout] test board::metrics::tests::median_single_value ... ok [INFO] [stdout] test board::metrics::tests::monday_of_week_is_monday ... ok [INFO] [stdout] test board::metrics::tests::multiple_completions_same_week ... ok [INFO] [stdout] test board::metrics::tests::oldest_card_created_empty_board ... ok [INFO] [stdout] test board::metrics::tests::p85_calculation_correct ... ok [INFO] [stdout] test board::metrics::tests::p85_single_card ... ok [INFO] [stdout] test board::metrics::tests::percentile_0_returns_first ... ok [INFO] [stdout] test board::metrics::tests::percentile_100_returns_last ... ok [INFO] [stdout] test board::metrics::tests::percentile_empty_returns_zero ... ok [INFO] [stdout] test board::metrics::tests::percentile_single_value ... ok [INFO] [stdout] test board::metrics::tests::format_csv_omits_stage_time_when_none ... ok [INFO] [stdout] test board::metrics::tests::no_aging_when_no_time_stats ... ok [INFO] [stdout] test board::metrics::tests::priority_breakdown_counts ... ok [INFO] [stdout] test board::metrics::tests::rename_map_chained_renames ... ok [INFO] [stdout] test board::metrics::tests::rename_map_consolidates_old_and_new_durations ... ok [INFO] [stdout] test board::metrics::tests::rename_map_cycle_a_b_a ... ok [INFO] [stdout] test board::metrics::tests::rename_map_divergent_renames ... ok [INFO] [stdout] test board::hooks::tests::validate_hook_name_rejects_just_prefix ... ok [INFO] [stdout] test board::metrics::tests::rename_map_skips_entries_without_from_name ... ok [INFO] [stdout] test board::metrics::tests::rename_map_simple_rename ... ok [INFO] [stdout] test board::metrics::tests::rename_map_preserves_board_column_ordering ... ok [INFO] [stdout] test board::metrics::tests::stage_times_card_moves_backward ... ok [INFO] [stdout] test board::metrics::tests::stage_times_card_skips_column ... ok [INFO] [stdout] test board::metrics::tests::stage_times_historical_column_appended ... ok [INFO] [stdout] test board::metrics::tests::stage_times_ignores_incomplete_cards ... ok [INFO] [stdout] test board::metrics::tests::stage_times_column_ordering_follows_board ... ok [INFO] [stdout] test board::metrics::tests::stage_times_none_when_no_activity_log ... ok [INFO] [stdout] test board::metrics::tests::rename_map_self_rename_ignored ... ok [INFO] [stdout] test board::metrics::tests::stage_times_multiple_cards_averages ... ok [INFO] [stdout] test board::metrics::tests::stage_times_none_when_no_move_events ... ok [INFO] [stdout] test board::metrics::tests::stage_times_is_active_flags_correct ... ok [INFO] [stdout] test board::metrics::tests::stage_times_single_card_linear_flow ... ok [INFO] [stdout] test board::metrics::tests::stage_times_zero_duration_no_panic ... ok [INFO] [stdout] test board::metrics::tests::throughput_fills_week_gaps ... ok [INFO] [stdout] test board::metrics::tests::throughput_stddev_none_for_single_week ... ok [INFO] [stdout] test board::metrics::tests::wip_counts_match_column_cards ... ok [INFO] [stdout] test board::metrics::tests::stage_times_skips_malformed_log_lines ... ok [INFO] [stdout] test board::metrics::tests::wip_entry_includes_limit ... ok [INFO] [stdout] test board::metrics::tests::wip_over_limit_detection ... ok [INFO] [stdout] test board::metrics::tests::work_item_age_calculates_from_started ... ok [INFO] [stdout] test board::metrics::tests::work_item_age_falls_back_to_created ... ok [INFO] [stdout] test board::storage::tests::append_activity_auto_close_entries_per_card ... ok [INFO] [stdout] test board::storage::tests::append_activity_empty_extras_produces_four_keys ... ok [INFO] [stdout] test board::storage::tests::append_activity_extras_appear_in_output ... ok [INFO] [stdout] test board::storage::tests::append_activity_line_contains_required_fields ... ok [INFO] [stdout] test board::metrics::tests::throughput_stddev_calculation ... ok [INFO] [stdout] test board::storage::tests::append_activity_special_chars_in_title_escaped ... ok [INFO] [stdout] test board::storage::tests::append_activity_creates_log_file ... ok [INFO] [stdout] test board::storage::tests::append_activity_second_call_appends_new_line ... ok [INFO] [stdout] test board::storage::tests::board_context_is_git_sync_false_for_local ... ok [INFO] [stdout] test board::storage::tests::board_context_is_git_sync_true_for_gitsync ... ok [INFO] [stdout] test board::storage::tests::append_activity_timestamp_is_iso8601 ... ok [INFO] [stdout] test board::storage::tests::append_activity_io_error_is_silently_swallowed ... ok [INFO] [stdout] test board::storage::tests::delete_template_invalid_slug_returns_error ... ok [INFO] [stdout] test board::storage::tests::delete_template_nonexistent_is_ok ... ok [INFO] [stdout] test board::storage::tests::delete_template_removes_file ... ok [INFO] [stdout] test board::storage::tests::find_kando_toml_at_start_dir ... ok [INFO] [stdout] test board::storage::tests::column_config_name_not_written_to_config ... ok [INFO] [stdout] test board::storage::tests::find_kando_toml_not_found ... ok [INFO] [stdout] test board::storage::tests::find_kando_toml_walks_up ... ok [INFO] [stdout] test board::storage::tests::broken_git_sync_error_display_is_actionable ... ok [INFO] [stdout] test board::storage::tests::find_kando_toml_is_directory_not_file ... ok [INFO] [stdout] test board::storage::tests::find_kando_toml_prefers_nearest_ancestor ... ok [INFO] [stdout] test board::storage::tests::find_template_by_derived_name_case_insensitive ... ok [INFO] [stdout] test board::storage::tests::find_template_by_slug ... ok [INFO] [stdout] test board::storage::tests::find_template_partial_name_does_not_match ... ok [INFO] [stdout] test board::storage::tests::init_board_at_and_init_board_produce_equivalent_boards ... ok [INFO] [stdout] test board::storage::tests::find_template_not_found ... ok [INFO] [stdout] test board::storage::tests::find_template_slug_takes_precedence_over_derived_name ... ok [INFO] [stdout] test board::storage::tests::init_board_at_board_is_loadable ... ok [INFO] [stdout] test board::storage::tests::init_board_at_creates_default_columns ... ok [INFO] [stdout] test board::storage::tests::init_board_at_creates_kando_dir ... ok [INFO] [stdout] test board::storage::tests::init_board_at_returns_correct_path ... ok [INFO] [stdout] test board::hooks::tests::fire_hook_hooks_dir_exists_but_hook_missing ... ok [INFO] [stdout] test board::storage::tests::init_board_at_double_init_overwrites ... ok [INFO] [stdout] test board::storage::tests::init_board_at_creates_config_toml ... ok [INFO] [stdout] test board::hooks::tests::fire_hook_no_hooks_dir_is_noop ... ok [INFO] [stdout] test board::storage::tests::init_board_at_with_sync_branch ... ok [INFO] [stdout] test board::storage::tests::json_escape_backslash ... ok [INFO] [stdout] test board::storage::tests::json_escape_double_quote ... ok [INFO] [stdout] test board::storage::tests::json_escape_mixed_special_chars ... ok [INFO] [stdout] test board::storage::tests::json_escape_newline_cr_tab ... ok [INFO] [stdout] test board::storage::tests::json_escape_control_char_x01 ... ok [INFO] [stdout] test board::storage::tests::json_escape_non_ascii_unicode_passthrough ... ok [INFO] [stdout] test board::storage::tests::json_escape_empty_string ... ok [INFO] [stdout] test board::storage::tests::json_escape_nul_byte ... ok [INFO] [stdout] test board::storage::tests::json_escape_plain_ascii ... ok [INFO] [stdout] test board::storage::tests::load_local_config_empty_file_uses_serde_default ... ok [INFO] [stdout] test board::storage::tests::init_board_does_not_create_meta_toml ... ok [INFO] [stdout] test board::storage::tests::init_board_at_without_sync_branch ... ok [INFO] [stdout] test board::storage::tests::load_local_config_absent_file_returns_default ... ok [INFO] [stdout] test board::storage::tests::load_local_config_extra_fields_are_ignored ... ok [INFO] [stdout] test board::storage::tests::load_board_column_names_match_slugs ... ok [INFO] [stdout] test board::storage::tests::load_board_ignores_leftover_meta_toml ... ok [INFO] [stdout] test board::storage::tests::load_local_config_nonexistent_kando_dir_returns_default ... ok [INFO] [stdout] test board::storage::tests::load_local_config_legacy_tutorial_shown_on_disk ... ok [INFO] [stdout] test board::storage::tests::load_local_config_legacy_focus_mode_field_is_ignored ... ok [INFO] [stdout] test board::storage::tests::load_local_config_invalid_toml_returns_err ... ok [INFO] [stdout] test board::storage::tests::load_template_with_legacy_name_field_in_frontmatter ... ok [INFO] [stdout] test board::storage::tests::load_templates_empty_dir ... ok [INFO] [stdout] test board::storage::tests::parse_frontmatter_empty_returns_none ... ok [INFO] [stdout] test board::storage::tests::load_templates_no_templates_dir ... ok [INFO] [stdout] test board::storage::tests::load_templates_skips_invalid_frontmatter ... ok [INFO] [stdout] test board::storage::tests::parse_frontmatter_no_opening_delimiter ... ok [INFO] [stdout] test board::storage::tests::parse_frontmatter_minimal_content ... ok [INFO] [stdout] test board::storage::tests::parse_frontmatter_only_delimiters_returns_none ... ok [INFO] [stdout] test board::storage::tests::parse_frontmatter_no_closing_delimiter ... ok [INFO] [stdout] test board::storage::tests::load_templates_sorted_by_slug ... ok [INFO] [stdout] test board::storage::tests::rename_column_dir_new_already_exists_returns_err ... ok [INFO] [stdout] test board::storage::tests::load_templates_skips_non_md_files ... ok [INFO] [stdout] test board::storage::tests::rename_column_dir_happy_path ... ok [INFO] [stdout] test board::storage::tests::rename_column_dir_invalid_slug_rejected_before_io ... ok [INFO] [stdout] test board::storage::tests::rename_column_dir_old_does_not_exist_is_noop ... ok [INFO] [stdout] test board::storage::tests::rename_template_body_with_frontmatter_delimiter_preserved ... ok [INFO] [stdout] test board::storage::tests::rename_template_invalid_old_slug_returns_error ... ok [INFO] [stdout] test board::storage::tests::rename_template_no_templates_dir_returns_error ... ok [INFO] [stdout] test board::storage::tests::rename_template_multi_word_slug ... ok [INFO] [stdout] test board::storage::tests::rename_template_moves_file ... ok [INFO] [stdout] test board::storage::tests::rename_template_old_slug_not_found_returns_error ... ok [INFO] [stdout] test board::storage::tests::rename_template_target_already_exists_returns_error ... ok [INFO] [stdout] test board::storage::tests::resolve_board_broken_git_sync_no_git_repo ... ok [INFO] [stdout] test board::storage::tests::rename_template_preserves_content ... ok [INFO] [stdout] test board::storage::tests::resolve_board_broken_git_sync_from_nested_dir ... ok [INFO] [stdout] test board::storage::tests::resolve_board_empty_kando_toml_uses_default_branch_then_fails ... ok [INFO] [stdout] test board::storage::tests::resolve_board_malformed_kando_toml_returns_toml_error ... ok [INFO] [stdout] test board::storage::tests::resolve_board_no_board_found ... ok [INFO] [stdout] test board::storage::tests::rename_column_dir_same_slug_is_noop ... ok [INFO] [stdout] test board::storage::tests::resolve_board_local_mode ... ok [INFO] [stdout] test board::storage::tests::rename_template_same_slug_is_noop ... ok [INFO] [stdout] test board::storage::tests::resolve_board_prefers_kando_toml_over_kando_dir ... ok [INFO] [stdout] test board::storage::tests::save_and_load_template ... ok [INFO] [stdout] test board::storage::tests::rename_template_invalid_new_slug_returns_error ... ok [INFO] [stdout] test board::storage::tests::resolve_board_local_from_nested_dir ... ok [INFO] [stdout] test board::storage::tests::save_local_config_creates_gitignore_with_entry ... ok [INFO] [stdout] test board::storage::tests::round_trip_column_metadata_preserved ... ok [INFO] [stdout] test board::storage::tests::save_local_config_creates_file ... ok [INFO] [stdout] test board::storage::tests::save_local_config_gitignore_separator_added_when_no_trailing_newline ... ok [INFO] [stdout] test board::storage::tests::save_local_config_gitignore_entry_not_duplicated ... ok [INFO] [stdout] test board::storage::tests::save_local_config_roundtrip ... ok [INFO] [stdout] test board::storage::tests::save_template_invalid_slug_returns_error ... ok [INFO] [stdout] test board::storage::tests::save_board_does_not_create_meta_toml ... ok [INFO] [stdout] test board::storage::tests::save_local_config_gitignore_entry_appended_to_existing_content ... ok [INFO] [stdout] test board::storage::tests::serialize_card_all_fields_roundtrip ... ok [INFO] [stdout] test board::storage::tests::save_template_overwrites_existing ... ok [INFO] [stdout] test board::storage::tests::save_local_config_help_hint_shown_true_roundtrip ... ok [INFO] [stdout] test board::storage::tests::save_template_creates_templates_dir ... ok [INFO] [stdout] test board::storage::tests::serialize_card_blocked_none_omits_field ... ok [INFO] [stdout] test board::storage::tests::serialize_card_body_gets_trailing_newline ... ok [INFO] [stdout] test board::storage::tests::serialize_card_due_date_format_is_yyyy_mm_dd ... ok [INFO] [stdout] test board::storage::tests::serialize_card_empty_body_no_trailing_content ... ok [INFO] [stdout] test board::storage::tests::serialize_card_due_date_roundtrip ... ok [INFO] [stdout] test board::storage::tests::serialize_card_no_due_date_omitted ... ok [INFO] [stdout] test board::storage::tests::save_template_slug_with_leading_hyphen_rejected ... ok [INFO] [stdout] test board::storage::tests::serialize_card_blocked_roundtrip ... ok [INFO] [stdout] test board::storage::tests::serialize_card_with_started_completed_roundtrip ... ok [INFO] [stdout] test board::storage::tests::serialize_template_does_not_contain_name_field ... ok [INFO] [stdout] test board::storage::tests::template_serialize_empty_body ... ok [INFO] [stdout] test board::storage::tests::template_blocked_with_reason_roundtrip ... ok [INFO] [stdout] test board::storage::tests::serialize_card_blocked_with_reason_roundtrip ... ok [INFO] [stdout] test board::storage::tests::save_template_file_does_not_contain_name_field ... ok [INFO] [stdout] test board::storage::tests::template_with_all_default_fields ... ok [INFO] [stdout] test board::storage::tests::template_serialize_roundtrip_minimal ... ok [INFO] [stdout] test board::storage::tests::template_body_with_frontmatter_delimiter_roundtrips ... ok [INFO] [stdout] test board::storage::tests::template_serialize_roundtrip ... ok [INFO] [stdout] test board::storage::tests::test_card_completed_roundtrip ... ok [INFO] [stdout] test board::storage::tests::test_card_roundtrip ... ok [INFO] [stdout] test board::storage::tests::serialize_card_with_assignees_roundtrip ... ok [INFO] [stdout] test board::storage::tests::test_card_without_started_deserializes_as_none ... ok [INFO] [stdout] test board::storage::tests::test_board_created_at_set_on_init ... ok [INFO] [stdout] test board::storage::tests::test_board_created_at_roundtrip ... ok [INFO] [stdout] test board::storage::tests::resolve_board_broken_git_sync_no_remote ... ok [INFO] [stdout] test board::storage::tests::test_init_board_creates_local_toml ... ok [INFO] [stdout] test board::storage::tests::test_init_board_creates_gitignore_with_local_toml ... ok [INFO] [stdout] test board::storage::tests::test_card_started_roundtrip ... ok [INFO] [stdout] test board::storage::tests::test_card_without_completed_deserializes_as_none ... ok [INFO] [stdout] test board::storage::tests::test_init_board_local_toml_has_default_help_hint_shown ... ok [INFO] [stdout] test board::storage::tests::test_parse_frontmatter_crlf ... ok [INFO] [stdout] test board::storage::tests::test_init_and_load_board ... ok [INFO] [stdout] test board::storage::tests::test_load_trash_empty_when_no_trash_dir ... ok [INFO] [stdout] test board::storage::tests::test_parse_frontmatter ... ok [INFO] [stdout] test board::storage::tests::test_load_board_ignores_legacy_tutorial_shown_in_config ... ok [INFO] [stdout] test board::storage::tests::test_parse_frontmatter_no_body ... ok [INFO] [stdout] test board::storage::tests::test_purge_trash_zero_days_is_disabled ... ok [INFO] [stdout] test board::storage::tests::test_restore_card_missing_trash_file ... ok [INFO] [stdout] test board::storage::tests::test_board_created_at_none_for_legacy_config ... ok [INFO] [stdout] test board::storage::tests::test_purge_trash_keeps_entry_with_unparseable_date ... ok [INFO] [stdout] test board::storage::tests::test_find_kando_dir ... ok [INFO] [stdout] test board::storage::tests::test_restore_card_to_different_column ... ok [INFO] [stdout] test board::storage::tests::test_purge_trash_keeps_recent_entries ... ok [INFO] [stdout] test board::storage::tests::test_save_and_load_with_cards ... ok [INFO] [stdout] test board::storage::tests::test_restore_card_moves_file_back ... ok [INFO] [stdout] test board::storage::tests::test_trash_card_moves_file_and_records_meta ... ok [INFO] [stdout] test board::storage::tests::test_purge_trash_removes_old_entries ... ok [INFO] [stdout] test board::storage::tests::test_trash_two_cards_restore_one ... ok [INFO] [stdout] test board::storage::tests::validate_slug_empty_returns_err ... ok [INFO] [stdout] test board::storage::tests::validate_slug_spaces_returns_err ... ok [INFO] [stdout] test board::storage::tests::test_trash_card_missing_source_file ... ok [INFO] [stdout] test board::storage::tests::validate_slug_leading_hyphen_returns_err ... ok [INFO] [stdout] test board::storage::tests::validate_slug_underscore_returns_err ... ok [INFO] [stdout] test board::storage::tests::validate_slug_unicode_uppercase_returns_err ... ok [INFO] [stdout] test board::storage::tests::validate_slug_special_chars_returns_err ... ok [INFO] [stdout] test board::storage::tests::validate_slug_uppercase_returns_err ... ok [INFO] [stdout] test board::storage::tests::validate_slug_unicode_letters_accepted ... ok [INFO] [stdout] test board::storage::tests::validate_slug_valid_simple ... ok [INFO] [stdout] test board::storage::tests::validate_slug_valid_with_digits ... ok [INFO] [stdout] test board::storage::tests::validate_slug_valid_with_hyphens ... ok [INFO] [stdout] test board::sync::tests::test_check_ssh_agent_http_url ... ok [INFO] [stdout] test board::sync::tests::test_check_ssh_agent_https_url ... ok [INFO] [stdout] test board::sync::tests::test_copy_cleans_dst_fully_when_src_empty ... ok [INFO] [stdout] test board::sync::tests::test_copy_creates_dst_if_missing ... ok [INFO] [stdout] test board::sync::tests::test_copy_basic_files ... ok [INFO] [stdout] test board::sync::tests::test_copy_empty_src ... ok [INFO] [stdout] test board::sync::tests::test_djb2_deterministic ... ok [INFO] [stdout] test board::sync::tests::test_djb2_different_inputs ... ok [INFO] [stdout] test board::sync::tests::test_copy_skips_symlinks ... ok [INFO] [stdout] test board::sync::tests::test_copy_nested_dirs ... ok [INFO] [stdout] test board::sync::tests::test_djb2_empty_string ... ok [INFO] [stdout] test board::sync::tests::test_djb2_known_value ... ok [INFO] [stdout] test board::hooks::tests::fire_hook_non_executable_is_skipped ... ok [INFO] [stdout] test board::sync::tests::test_find_git_root_not_found ... ok [INFO] [stdout] test board::sync::tests::test_find_git_root_at_root ... ok [INFO] [stdout] test board::sync::tests::test_shadow_dir_deterministic ... ok [INFO] [stdout] test board::sync::tests::test_shadow_dir_different_urls ... ok [INFO] [stdout] test board::sync::tests::test_copy_removes_stale_files ... ok [INFO] [stdout] test board::sync::tests::test_copy_removes_stale_dirs ... ok [INFO] [stdout] test board::sync::tests::test_copy_overwrites_existing_files ... ok [INFO] [stdout] test board::tests::all_assignees_collects_and_sorts_by_count ... ok [INFO] [stdout] test board::tests::all_tags_collects_and_sorts_by_count ... ok [INFO] [stdout] test board::tests::card_in_backlog_has_no_started ... ok [INFO] [stdout] test board::tests::card_is_visible_assignee_filter_must_match ... ok [INFO] [stdout] test board::tests::card_is_visible_both_tag_and_assignee_must_match ... ok [INFO] [stdout] test board::tests::card_is_visible_multiple_staleness_filters ... ok [INFO] [stdout] test board::sync::tests::test_shadow_dir_uses_kando_subdir ... ok [INFO] [stdout] test board::tests::card_is_visible_no_filters_shows_all ... ok [INFO] [stdout] test board::tests::card_is_visible_overdue_combined_with_tag_filter ... ok [INFO] [stdout] test board::sync::tests::test_find_git_root_nested ... ok [INFO] [stdout] test board::tests::card_is_visible_overdue_filter_card_due_today_is_hidden ... ok [INFO] [stdout] test board::tests::card_is_visible_overdue_filter_hides_card_with_no_due ... ok [INFO] [stdout] test board::tests::card_is_visible_overdue_filter_off_shows_all ... ok [INFO] [stdout] test board::tests::card_is_visible_overdue_filter_shows_overdue_card ... ok [INFO] [stdout] test board::tests::card_is_visible_staleness_filter_no_match ... ok [INFO] [stdout] test board::tests::card_is_visible_staleness_combined_with_tag_filter ... ok [INFO] [stdout] test board::tests::card_is_visible_tag_filter_must_match ... ok [INFO] [stdout] test board::tests::card_is_visible_staleness_filter_matches ... ok [INFO] [stdout] test board::tests::card_is_visible_text_filter_overrides_overdue_filter ... ok [INFO] [stdout] test board::tests::card_is_visible_text_filter_overrides_staleness ... ok [INFO] [stdout] test board::tests::card_is_visible_overdue_filter_hides_non_overdue_card ... ok [INFO] [stdout] test board::tests::card_new_defaults ... ok [INFO] [stdout] test board::tests::card_new_due_is_none ... ok [INFO] [stdout] test board::tests::deserialize_blocked_absent_yields_none ... ok [INFO] [stdout] test board::tests::deserialize_blocked_false_yields_none ... ok [INFO] [stdout] test board::tests::filter_at_prefix_matches_tag ... ok [INFO] [stdout] test board::tests::deserialize_blocked_string_yields_some_reason ... ok [INFO] [stdout] test board::tests::deserialize_blocked_empty_string_yields_some_empty ... ok [INFO] [stdout] test board::tests::deserialize_blocked_true_yields_some_empty ... ok [INFO] [stdout] test board::tests::filter_at_prefix_missing_tag_returns_false ... ok [INFO] [stdout] test board::tests::filter_empty_returns_true ... ok [INFO] [stdout] test board::tests::filter_fuzzy_matches_title ... ok [INFO] [stdout] test board::tests::filter_matches_assignee ... ok [INFO] [stdout] test board::tests::card_is_visible_text_filter_overrides_picker ... ok [INFO] [stdout] test board::tests::filter_multi_term_and_one_misses ... ok [INFO] [stdout] test board::tests::filter_multi_term_and_both_match ... ok [INFO] [stdout] test board::tests::card_touch_updates_timestamp ... ok [INFO] [stdout] test board::tests::filter_negation_includes_non_match ... ok [INFO] [stdout] test board::tests::filter_negation_excludes_match ... ok [INFO] [stdout] test board::tests::filter_no_match_returns_false ... ok [INFO] [stdout] test board::tests::find_card_not_found_returns_none ... ok [INFO] [stdout] test board::tests::generate_slug_basic_name ... ok [INFO] [stdout] test board::tests::generate_slug_leading_special_chars_stripped ... ok [INFO] [stdout] test board::tests::generate_slug_all_non_alphanum_falls_back_to_col ... ok [INFO] [stdout] test board::tests::generate_slug_unicode_name_preserves_characters ... ok [INFO] [stdout] test board::tests::generate_slug_col_uniqueness_when_col_taken ... ok [INFO] [stdout] test board::tests::generate_slug_reserved_archive_avoided ... ok [INFO] [stdout] test board::tests::generate_slug_spaces_become_hyphens ... ok [INFO] [stdout] test board::tests::generate_template_slug_basic_name ... ok [INFO] [stdout] test board::tests::generate_slug_uniqueness_appends_suffix ... ok [INFO] [stdout] test board::tests::generate_template_slug_dedup_appends_suffix ... ok [INFO] [stdout] test board::tests::generate_slug_uniqueness_skips_taken_suffixes ... ok [INFO] [stdout] test board::tests::generate_template_slug_short_alpha_name ... ok [INFO] [stdout] test board::tests::generate_template_slug_special_chars_only_returns_template ... ok [INFO] [stdout] test board::tests::generate_template_slug_unicode_preserves_characters ... ok [INFO] [stdout] test board::tests::generate_template_slug_template_already_exists ... ok [INFO] [stdout] test board::tests::is_blocked_none_returns_false ... ok [INFO] [stdout] test board::tests::is_blocked_some_empty_returns_true ... ok [INFO] [stdout] test board::tests::is_over_wip_limit_no_limit ... ok [INFO] [stdout] test board::tests::is_blocked_some_reason_returns_true ... ok [INFO] [stdout] test board::tests::is_over_wip_limit_under ... ok [INFO] [stdout] test board::tests::is_overdue_far_past_returns_true ... ok [INFO] [stdout] test board::tests::is_over_wip_limit_at_limit ... ok [INFO] [stdout] test board::tests::is_overdue_none_returns_false ... ok [INFO] [stdout] test board::tests::is_overdue_today_returns_false ... ok [INFO] [stdout] test board::tests::is_overdue_tomorrow_returns_false ... ok [INFO] [stdout] test board::tests::is_overdue_yesterday_returns_true ... ok [INFO] [stdout] test board::tests::move_away_from_done_clears_completed ... ok [INFO] [stdout] test board::tests::move_between_non_done_columns_leaves_completed_none ... ok [INFO] [stdout] test board::tests::move_back_to_backlog_preserves_started ... ok [INFO] [stdout] test board::tests::move_card_invalid_index_does_not_panic ... ok [INFO] [stdout] test board::tests::move_to_done_preserves_existing_completed ... ok [INFO] [stdout] test board::tests::move_card_same_column_noop ... ok [INFO] [stdout] test board::tests::move_past_backlog_sets_started ... ok [INFO] [stdout] test board::tests::generate_template_slug_dedup_skips_taken_suffixes ... ok [INFO] [stdout] test board::tests::generate_template_slug_empty_name_returns_template ... ok [INFO] [stdout] test board::tests::move_to_done_sets_completed ... ok [INFO] [stdout] test board::tests::move_to_done_sets_started_if_none ... ok [INFO] [stdout] test board::tests::move_within_active_preserves_started ... ok [INFO] [stdout] test board::tests::next_card_id_increments ... ok [INFO] [stdout] test board::tests::normalize_column_orders_dense_already ... ok [INFO] [stdout] test board::tests::normalize_column_orders_empty_vec_does_not_panic ... ok [INFO] [stdout] test board::tests::normalize_column_orders_reorders_by_order_field ... ok [INFO] [stdout] test board::tests::normalize_column_orders_single_column ... ok [INFO] [stdout] test board::hooks::tests::fire_hook_stderr_used_when_stdout_empty ... ok [INFO] [stdout] test board::tests::normalize_column_orders_sparse_orders ... ok [INFO] [stdout] test board::tests::priority_as_str_all_variants ... ok [INFO] [stdout] test board::tests::priority_display ... ok [INFO] [stdout] test board::tests::priority_from_str_case_insensitive ... ok [INFO] [stdout] test board::tests::priority_sort_key_ordering ... ok [INFO] [stdout] test board::tests::slug_from_name_consecutive_spaces_collapse_to_one_hyphen ... ok [INFO] [stdout] test board::tests::slug_from_name_empty_string_falls_back_to_col ... ok [INFO] [stdout] test board::tests::slug_from_name_does_not_guard_archive_reservation ... ok [INFO] [stdout] test board::tests::slug_from_name_mixed_ascii_unicode_preserves_all ... ok [INFO] [stdout] test board::tests::slug_from_name_leading_trailing_spaces_trimmed ... ok [INFO] [stdout] test board::tests::priority_from_str_unknown_returns_err ... ok [INFO] [stdout] test board::tests::priority_from_str_valid ... ok [INFO] [stdout] test board::tests::find_card_returns_correct_indices ... ok [INFO] [stdout] test board::tests::generate_template_slug_numeric_only ... ok [INFO] [stdout] test board::tests::slug_from_name_leading_special_chars_stripped ... ok [INFO] [stdout] test board::tests::slug_from_name_nfc_normalization_consistency ... ok [INFO] [stdout] test board::tests::slug_from_name_nordic_characters_preserved ... ok [INFO] [stdout] test board::tests::slug_from_name_non_alphanumeric_unicode_falls_back ... ok [INFO] [stdout] test board::tests::slug_from_name_only_special_chars_falls_back_to_col ... ok [INFO] [stdout] test board::tests::slug_from_name_numbers_in_name ... ok [INFO] [stdout] test board::tests::slug_to_name_empty_string ... ok [INFO] [stdout] test board::tests::slug_from_name_unicode_preserved ... ok [INFO] [stdout] test board::tests::slug_from_name_single_word ... ok [INFO] [stdout] test board::tests::slug_to_name_single_word ... ok [INFO] [stdout] test board::tests::slug_to_name_three_words ... ok [INFO] [stdout] test board::tests::slug_to_name_uppercase_passthrough ... ok [INFO] [stdout] test board::tests::slug_to_name_with_digits ... ok [INFO] [stdout] test board::tests::sort_cards_blocked_first ... ok [INFO] [stdout] test board::tests::sort_cards_by_priority ... ok [INFO] [stdout] test board::tests::sort_cards_priority_then_updated ... ok [INFO] [stdout] test board::tests::slug_from_name_unicode_symbols_replaced ... ok [INFO] [stdout] test board::tests::slug_to_name_single_hyphen_does_not_panic ... ok [INFO] [stdout] test board::tests::slug_to_name_multi_word ... ok [INFO] [stdout] test board::hooks::tests::fire_hook_stdout_takes_priority_over_stderr ... ok [INFO] [stdout] test config::tests::kando_toml_default_branch_when_missing ... ok [INFO] [stdout] test config::tests::kando_toml_custom_branch ... ok [INFO] [stdout] test config::tests::kando_toml_ignores_unknown_fields ... ok [INFO] [stdout] test config::tests::kando_toml_malformed_returns_err ... ok [INFO] [stdout] test config::tests::kando_toml_roundtrip ... ok [INFO] [stdout] test config::tests::local_config_both_keys_present_is_rejected ... ok [INFO] [stdout] test config::tests::local_config_default_creates_empty_struct ... ok [INFO] [stdout] test board::tests::slug_from_name_multi_word ... ok [INFO] [stdout] test config::tests::local_config_default_help_hint_shown_is_false ... ok [INFO] [stdout] test config::tests::local_config_empty_string_deserializes ... ok [INFO] [stdout] test config::tests::local_config_help_hint_shown_true_roundtrip ... ok [INFO] [stdout] test config::tests::local_config_ignores_unknown_fields ... ok [INFO] [stdout] test config::tests::local_config_toml_roundtrip ... ok [INFO] [stdout] test board::hooks::tests::fire_hook_success_no_output_says_done ... ok [INFO] [stdout] test config::tests::local_config_serializes_with_new_field_name_not_alias ... ok [INFO] [stdout] test config::tests::kando_toml_serialization_contains_branch ... ok [INFO] [stdout] test config::tests::local_config_missing_help_hint_shown_defaults_to_false ... ok [INFO] [stdout] test board::hooks::tests::fire_hook_without_sender_still_logs ... ok [INFO] [stdout] test config::tests::kando_toml_branch_with_slashes ... ok [INFO] [stdout] test board::hooks::tests::hook_log_written_on_execution ... ok [INFO] [stdout] test board::hooks::tests::open_in_editor_empty_editor_env_returns_io_not_found ... ok [INFO] [stdout] test board::hooks::tests::hook_log_records_failure_exit_code ... ok [INFO] [stdout] test board::hooks::tests::open_in_editor_with_failing_editor_does_not_panic ... ok [INFO] [stdout] test config::tests::local_config_legacy_tutorial_shown_deserializes_as_help_hint_shown ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 496 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.26s [INFO] [stdout] [INFO] [stderr] Running tests/public_api.rs (/opt/rustwide/target/debug/deps/public_api-6760f0811d898f2e) [INFO] [stdout] [INFO] [stdout] running 4 tests [INFO] [stdout] test re_export_board_types_accessible ... ok [INFO] [stdout] test re_export_config_types_accessible ... ok [INFO] [stdout] test submodule_paths_accessible ... ok [INFO] [stdout] test re_export_storage_types_accessible ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Doc-tests kando_core [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] running `Command { std: "docker" "inspect" "96f28e188d57312018b07877f2cf58a741caf2902ad77195fd2485921037ec10", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "96f28e188d57312018b07877f2cf58a741caf2902ad77195fd2485921037ec10", kill_on_drop: false }` [INFO] [stdout] 96f28e188d57312018b07877f2cf58a741caf2902ad77195fd2485921037ec10