[INFO] cloning repository https://github.com/krfl/kando
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/krfl/kando" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fkrfl%2Fkando", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fkrfl%2Fkando'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 92cc56d4d52d8eaabbf40f85e45ee42afd71b30f
[INFO] testing krfl/kando against master#ec6f9a5b4413f74386267ef8efc93712c2ce6db6 for pr-155739-1
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fkrfl%2Fkando" "/workspace/builds/worker-6-tc1/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-6-tc1/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/krfl/kando
[INFO] finished tweaking git repo https://github.com/krfl/kando
[INFO] tweaked toml for git repo https://github.com/krfl/kando written to /workspace/builds/worker-6-tc1/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/krfl/kando on toolchain ec6f9a5b4413f74386267ef8efc93712c2ce6db6
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+ec6f9a5b4413f74386267ef8efc93712c2ce6db6" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/krfl/kando 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" "+ec6f9a5b4413f74386267ef8efc93712c2ce6db6" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Updating crates.io index
[INFO] [stderr]  Downloading crates ...
[INFO] [stderr]   Downloaded vtparse v0.6.2
[INFO] [stderr]   Downloaded time-core v0.1.7
[INFO] [stderr]   Downloaded instability v0.3.10
[INFO] [stderr]   Downloaded wezterm-dynamic v0.2.1
[INFO] [stderr]   Downloaded line-clipping v0.3.5
[INFO] [stderr]   Downloaded wezterm-color-types v0.3.0
[INFO] [stderr]   Downloaded wezterm-blob-leases v0.1.1
[INFO] [stderr]   Downloaded filedescriptor v0.8.3
[INFO] [stderr]   Downloaded csscolorparser v0.6.2
[INFO] [stderr]   Downloaded memmem v0.1.1
[INFO] [stderr]   Downloaded lru v0.16.3
[INFO] [stderr]   Downloaded kasuari v0.4.11
[INFO] [stderr]   Downloaded ratatui-termwiz v0.1.0
[INFO] [stderr]   Downloaded ratatui-crossterm v0.1.0
[INFO] [stderr]   Downloaded ratatui-macros v0.7.0
[INFO] [stderr]   Downloaded indoc v2.0.7
[INFO] [stderr]   Downloaded ratatui-widgets v0.3.0
[INFO] [stderr]   Downloaded wezterm-dynamic-derive v0.1.1
[INFO] [stderr]   Downloaded libredox v0.1.14
[INFO] [stderr]   Downloaded indenter v0.3.4
[INFO] [stderr]   Downloaded wezterm-input-types v0.1.0
[INFO] [stderr]   Downloaded terminfo v0.9.0
[INFO] [stderr]   Downloaded owo-colors v4.3.0
[INFO] [stderr]   Downloaded toml v1.0.6+spec-1.1.0
[INFO] [stderr]   Downloaded unicode-truncate v2.0.1
[INFO] [stderr]   Downloaded convert_case v0.10.0
[INFO] [stderr]   Downloaded fuzzy-matcher v0.3.7
[INFO] [stderr]   Downloaded color-spantrace v0.3.0
[INFO] [stderr]   Downloaded euclid v0.22.13
[INFO] [stderr]   Downloaded compact_str v0.9.0
[INFO] [stderr]   Downloaded finl_unicode v1.4.0
[INFO] [stderr]   Downloaded ratatui v0.30.0
[INFO] [stderr]   Downloaded fancy-regex v0.11.0
[INFO] [stderr]   Downloaded wezterm-bidi v0.2.3
[INFO] [stderr]   Downloaded crossterm v0.29.0
[INFO] [stderr]   Downloaded ratatui-core v0.1.0
[INFO] [stderr]   Downloaded time v0.3.45
[INFO] [stderr]   Downloaded termwiz v0.23.3
[INFO] [stderr]   Downloaded color-eyre v0.6.5
[INFO] [stderr]   Downloaded deltae v0.3.2
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-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:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+ec6f9a5b4413f74386267ef8efc93712c2ce6db6" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] c694083b96e76298018f115198b3d0abd31214aeb4f47fe6bcf034339d6ba549
[INFO] running `Command { std: "docker" "start" "-a" "c694083b96e76298018f115198b3d0abd31214aeb4f47fe6bcf034339d6ba549", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "c694083b96e76298018f115198b3d0abd31214aeb4f47fe6bcf034339d6ba549", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "c694083b96e76298018f115198b3d0abd31214aeb4f47fe6bcf034339d6ba549", kill_on_drop: false }`
[INFO] [stdout] c694083b96e76298018f115198b3d0abd31214aeb4f47fe6bcf034339d6ba549
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-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:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+ec6f9a5b4413f74386267ef8efc93712c2ce6db6" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 1753258c76da15c345343530114b382b186f5460f233f9d3e85b64eb3a8e6fe4
[INFO] running `Command { std: "docker" "start" "-a" "1753258c76da15c345343530114b382b186f5460f233f9d3e85b64eb3a8e6fe4", kill_on_drop: false }`
[INFO] [stderr]    Compiling foldhash v0.2.0
[INFO] [stderr]    Compiling fnv v1.0.7
[INFO] [stderr]    Compiling itertools v0.14.0
[INFO] [stderr]    Compiling instability v0.3.10
[INFO] [stderr]    Compiling indoc v2.0.7
[INFO] [stderr]    Compiling unicode-width v0.2.0
[INFO] [stderr]    Compiling tracing-core v0.1.36
[INFO] [stderr]    Compiling convert_case v0.10.0
[INFO] [stderr]    Compiling syn v2.0.117
[INFO] [stderr]    Compiling castaway v0.2.4
[INFO] [stderr]    Compiling rustix v1.1.4
[INFO] [stderr]    Compiling smallvec v1.15.1
[INFO] [stderr]    Compiling num-traits v0.2.19
[INFO] [stderr]    Compiling mio v1.1.1
[INFO] [stderr]    Compiling time-core v0.1.7
[INFO] [stderr]    Compiling owo-colors v4.3.0
[INFO] [stderr]    Compiling compact_str v0.9.0
[INFO] [stderr]    Compiling object v0.37.3
[INFO] [stderr]    Compiling litrs v1.0.0
[INFO] [stderr]    Compiling hashbrown v0.16.1
[INFO] [stderr]    Compiling time v0.3.45
[INFO] [stderr]    Compiling line-clipping v0.3.5
[INFO] [stderr]    Compiling parking_lot_core v0.9.12
[INFO] [stderr]    Compiling winnow v0.7.15
[INFO] [stderr]    Compiling gimli v0.32.3
[INFO] [stderr]    Compiling signal-hook-mio v0.2.5
[INFO] [stderr]    Compiling eyre v0.6.12
[INFO] [stderr]    Compiling parking_lot v0.12.5
[INFO] [stderr]    Compiling option-ext v0.2.0
[INFO] [stderr]    Compiling color-spantrace v0.3.0
[INFO] [stderr]    Compiling dirs-sys v0.5.0
[INFO] [stderr]    Compiling miniz_oxide v0.8.9
[INFO] [stderr]    Compiling tinyvec v1.10.0
[INFO] [stderr]    Compiling tracing v0.1.44
[INFO] [stderr]    Compiling tracing-subscriber v0.3.22
[INFO] [stderr]    Compiling document-features v0.2.12
[INFO] [stderr]    Compiling toml_datetime v1.0.0+spec-1.1.0
[INFO] [stderr]    Compiling serde_spanned v1.0.4
[INFO] [stderr]    Compiling lru v0.16.3
[INFO] [stderr]    Compiling indenter v0.3.4
[INFO] [stderr]    Compiling toml_writer v1.0.6+spec-1.1.0
[INFO] [stderr]    Compiling rustc-demangle v0.1.27
[INFO] [stderr]    Compiling clap_builder v4.5.60
[INFO] [stderr]    Compiling serde_json v1.0.149
[INFO] [stderr]    Compiling unicode-normalization v0.1.25
[INFO] [stderr]    Compiling dirs v6.0.0
[INFO] [stderr]    Compiling fuzzy-matcher v0.3.7
[INFO] [stderr]    Compiling tracing-error v0.2.1
[INFO] [stderr]    Compiling unicode-truncate v2.0.1
[INFO] [stderr]    Compiling toml_parser v1.0.9+spec-1.1.0
[INFO] [stderr]    Compiling toml v1.0.6+spec-1.1.0
[INFO] [stderr]    Compiling addr2line v0.25.1
[INFO] [stderr]    Compiling darling_core v0.20.11
[INFO] [stderr]    Compiling backtrace v0.3.76
[INFO] [stderr]    Compiling thiserror-impl v2.0.18
[INFO] [stderr]    Compiling strum_macros v0.27.2
[INFO] [stderr]    Compiling derive_more-impl v2.1.1
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling clap_derive v4.5.55
[INFO] [stderr]    Compiling color-eyre v0.6.5
[INFO] [stderr]    Compiling derive_more v2.1.1
[INFO] [stderr]    Compiling crossterm v0.29.0
[INFO] [stderr]    Compiling thiserror v2.0.18
[INFO] [stderr]    Compiling kasuari v0.4.11
[INFO] [stderr]    Compiling strum v0.27.2
[INFO] [stderr]    Compiling ratatui-core v0.1.0
[INFO] [stderr]    Compiling clap v4.5.60
[INFO] [stderr]    Compiling darling_macro v0.20.11
[INFO] [stderr]    Compiling darling v0.20.11
[INFO] [stderr]    Compiling ratatui-widgets v0.3.0
[INFO] [stderr]    Compiling ratatui-crossterm v0.1.0
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling chrono v0.4.44
[INFO] [stderr]    Compiling ratatui-macros v0.7.0
[INFO] [stderr]    Compiling ratatui v0.30.0
[INFO] [stderr]    Compiling kando-core v1.2.1 (/opt/rustwide/workdir/kando-core)
[INFO] [stderr]    Compiling kando-tui v1.2.1 (/opt/rustwide/workdir/kando-tui)
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 50.45s
[INFO] running `Command { std: "docker" "inspect" "1753258c76da15c345343530114b382b186f5460f233f9d3e85b64eb3a8e6fe4", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "1753258c76da15c345343530114b382b186f5460f233f9d3e85b64eb3a8e6fe4", kill_on_drop: false }`
[INFO] [stdout] 1753258c76da15c345343530114b382b186f5460f233f9d3e85b64eb3a8e6fe4
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-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:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+ec6f9a5b4413f74386267ef8efc93712c2ce6db6" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 88594a6442afcc95d60a4b64c6bb7e1f4959f97477fcb7ba9f33fc21e68e25b4
[INFO] running `Command { std: "docker" "start" "-a" "88594a6442afcc95d60a4b64c6bb7e1f4959f97477fcb7ba9f33fc21e68e25b4", kill_on_drop: false }`
[INFO] [stderr]    Compiling rustix v1.1.4
[INFO] [stderr]    Compiling tempfile v3.26.0
[INFO] [stderr]    Compiling crossterm v0.29.0
[INFO] [stderr]    Compiling kando-core v1.2.1 (/opt/rustwide/workdir/kando-core)
[INFO] [stderr]    Compiling ratatui-crossterm v0.1.0
[INFO] [stderr]    Compiling ratatui v0.30.0
[INFO] [stderr]    Compiling kando-tui v1.2.1 (/opt/rustwide/workdir/kando-tui)
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 18.01s
[INFO] running `Command { std: "docker" "inspect" "88594a6442afcc95d60a4b64c6bb7e1f4959f97477fcb7ba9f33fc21e68e25b4", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "88594a6442afcc95d60a4b64c6bb7e1f4959f97477fcb7ba9f33fc21e68e25b4", kill_on_drop: false }`
[INFO] [stdout] 88594a6442afcc95d60a4b64c6bb7e1f4959f97477fcb7ba9f33fc21e68e25b4
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-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:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+ec6f9a5b4413f74386267ef8efc93712c2ce6db6" "test" "--frozen", kill_on_drop: false }`
[INFO] [stdout] 296acbdf2e14c9b1817a8545719007478bf12dba2146aef653652055e0dd6574
[INFO] running `Command { std: "docker" "start" "-a" "296acbdf2e14c9b1817a8545719007478bf12dba2146aef653652055e0dd6574", kill_on_drop: false }`
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.31s
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/kando_core-10f3adff2206fc5c)
[INFO] [stdout] 
[INFO] [stdout] running 496 tests
[INFO] [stdout] test board::age::tests::card_staleness_label_returns_new_for_card_created_today ... ok
[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_utc_day_boundary ... ok
[INFO] [stdout] test board::age::tests::format_age_boundary_14_days ... ok
[INFO] [stdout] test board::age::tests::format_age_future_date_returns_new ... 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_empty_done_column_returns_empty ... ok
[INFO] [stdout] test board::age::tests::run_auto_archive_disabled_when_zero ... ok
[INFO] [stdout] test board::age::tests::run_auto_archive_falls_back_to_updated_when_no_completed ... 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_from_col_slug_is_done_slug ... 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_one_day_short_not_moved ... ok
[INFO] [stdout] test board::age::tests::run_auto_archive_preserves_completed_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_archive_preserves_started_timestamp ... ok
[INFO] [stdout] test board::age::tests::run_auto_archive_only_moves_from_done_not_other_columns ... ok
[INFO] [stdout] test board::age::tests::run_auto_archive_future_completed_not_moved ... ok
[INFO] [stdout] test board::age::tests::run_auto_close_empty_board_no_panic ... ok
[INFO] [stdout] test board::age::tests::card_staleness_label_stale_days_zero_old_card ... 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_archive_column_returns_empty ... ok
[INFO] [stdout] test board::age::tests::card_staleness_label_returns_very_stale ... ok
[INFO] [stdout] test board::age::tests::run_auto_archive_no_done_column_returns_empty ... ok
[INFO] [stdout] test board::age::tests::format_age_boundary_60_days ... ok
[INFO] [stdout] test board::age::tests::card_staleness_label_returns_stale ... 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_at_exact_boundary_is_moved ... ok
[INFO] [stdout] test board::age::tests::run_auto_close_closed_card_title_is_correct ... ok
[INFO] [stdout] test board::age::tests::run_auto_archive_uses_completed_over_updated ... ok
[INFO] [stdout] test board::age::tests::staleness_boundary_exact_double ... ok
[INFO] [stdout] test board::age::tests::run_auto_close_multiple_stale_across_columns ... ok
[INFO] [stdout] test board::age::tests::run_auto_close_skips_cards_in_target_column ... ok
[INFO] [stdout] test board::age::tests::run_auto_close_no_target_column_returns_empty ... ok
[INFO] [stdout] test board::age::tests::run_auto_close_disabled_when_zero ... ok
[INFO] [stdout] test board::age::tests::staleness_disabled_when_zero ... 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::staleness_boundary_exact_threshold ... ok
[INFO] [stdout] test board::age::tests::test_staleness ... ok
[INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_basic_blocked ... ok
[INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_no_frontmatter ... 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_spaces_around_equals ... ok
[INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_body_not_matched ... ok
[INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_unquoted ... ok
[INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_single_delimiter ... ok
[INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_empty_value ... ok
[INFO] [stdout] test board::hooks::tests::extract_frontmatter_value_missing_key ... 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_from_col_slug_reflects_source_column ... ok
[INFO] [stdout] test board::age::tests::run_auto_close_multiple_stale_same_column_all_moved ... ok
[INFO] [stdout] test board::age::tests::run_auto_close_moves_stale_cards ... ok
[INFO] [stdout] test board::age::tests::run_auto_archive_multiple_done_cards_all_old_all_moved ... 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::env_vars_include_extras_uppercased ... ok
[INFO] [stdout] test board::hooks::tests::make_executable_sets_755 ... 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_card_not_found ... 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_finds_card ... 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_no_hooks_dir_is_noop ... 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_no_columns_dir ... ok
[INFO] [stdout] test board::hooks::tests::scaffold_hook_creates_hooks_dir_and_file ... ok
[INFO] [stdout] test board::hooks::tests::scaffold_hook_file_contains_shebang ... ok
[INFO] [stdout] test board::hooks::tests::scaffold_hook_file_is_executable ... 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_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_hooks_dir_already_exists ... ok
[INFO] [stdout] test board::hooks::tests::scaffold_hook_overwrites_existing_file ... 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_just_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::validate_hook_name_rejects_wrong_prefix ... ok
[INFO] [stdout] test board::metrics::tests::arrival_rate_counts_all_columns ... ok
[INFO] [stdout] test board::metrics::tests::aging_cards_flagged_when_exceeding_p85 ... ok
[INFO] [stdout] test board::metrics::tests::active_wip_excludes_backlog_and_done ... ok
[INFO] [stdout] test board::metrics::tests::arrival_rate_respects_since_window ... 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_count_only_active_columns ... ok
[INFO] [stdout] test board::metrics::tests::blocked_pct_calculation ... ok
[INFO] [stdout] test board::metrics::tests::blocked_zero_when_no_active_wip ... ok
[INFO] [stdout] test board::metrics::tests::board_created_at_used_as_effective_since ... 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::completed_cards_counted_correctly ... ok
[INFO] [stdout] test board::metrics::tests::cycle_time_falls_back_to_created ... ok
[INFO] [stdout] test board::metrics::tests::compute_metrics_kando_dir_none_gives_no_stage_times ... 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::format_csv_includes_stage_time ... 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_omits_stage_time_when_none ... ok
[INFO] [stdout] test board::metrics::tests::format_text_contains_key_sections ... ok
[INFO] [stdout] test board::metrics::tests::format_text_no_throughput_when_no_completions ... ok
[INFO] [stdout] test board::metrics::tests::format_text_includes_stage_time ... ok
[INFO] [stdout] test board::metrics::tests::format_week_output ... ok
[INFO] [stdout] test board::metrics::tests::format_text_omits_stage_time_when_none ... 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::median_even_number_of_cards ... ok
[INFO] [stdout] test board::metrics::tests::median_odd_count ... ok
[INFO] [stdout] test board::metrics::tests::monday_of_week_is_monday ... ok
[INFO] [stdout] test board::metrics::tests::median_single_value ... ok
[INFO] [stdout] test board::metrics::tests::multiple_completions_same_week ... ok
[INFO] [stdout] test board::metrics::tests::no_aging_when_no_time_stats ... 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::priority_breakdown_counts ... ok
[INFO] [stdout] test board::metrics::tests::rename_map_chained_renames ... ok
[INFO] [stdout] test board::metrics::tests::rename_map_cycle_a_b_a ... ok
[INFO] [stdout] test board::metrics::tests::rename_map_consolidates_old_and_new_durations ... ok
[INFO] [stdout] test board::metrics::tests::rename_map_divergent_renames ... ok
[INFO] [stdout] test board::metrics::tests::rename_map_preserves_board_column_ordering ... ok
[INFO] [stdout] test board::metrics::tests::rename_map_self_rename_ignored ... ok
[INFO] [stdout] test board::metrics::tests::rename_map_simple_rename ... ok
[INFO] [stdout] test board::metrics::tests::rename_map_skips_entries_without_from_name ... 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_is_active_flags_correct ... ok
[INFO] [stdout] test board::metrics::tests::stage_times_multiple_cards_averages ... ok
[INFO] [stdout] test board::hooks::tests::fire_hook_hooks_dir_exists_but_hook_missing ... ok
[INFO] [stdout] test board::metrics::tests::stage_times_none_when_no_activity_log ... ok
[INFO] [stdout] test board::metrics::tests::stage_times_none_when_no_move_events ... ok
[INFO] [stdout] test board::metrics::tests::stage_times_column_ordering_follows_board ... ok
[INFO] [stdout] test board::metrics::tests::stage_times_skips_malformed_log_lines ... 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_calculation ... ok
[INFO] [stdout] test board::metrics::tests::throughput_stddev_none_for_single_week ... ok
[INFO] [stdout] test board::metrics::tests::stage_times_single_card_linear_flow ... ok
[INFO] [stdout] test board::metrics::tests::wip_entry_includes_limit ... ok
[INFO] [stdout] test board::metrics::tests::work_item_age_calculates_from_started ... ok
[INFO] [stdout] test board::metrics::tests::wip_over_limit_detection ... ok
[INFO] [stdout] test board::metrics::tests::work_item_age_falls_back_to_created ... ok
[INFO] [stdout] test board::storage::tests::append_activity_creates_log_file ... 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::metrics::tests::wip_counts_match_column_cards ... ok
[INFO] [stdout] test board::storage::tests::append_activity_second_call_appends_new_line ... ok
[INFO] [stdout] test board::storage::tests::append_activity_io_error_is_silently_swallowed ... ok
[INFO] [stdout] test board::storage::tests::append_activity_auto_close_entries_per_card ... 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_line_contains_required_fields ... ok
[INFO] [stdout] test board::storage::tests::broken_git_sync_error_display_is_actionable ... ok
[INFO] [stdout] test board::storage::tests::delete_template_invalid_slug_returns_error ... ok
[INFO] [stdout] test board::storage::tests::append_activity_special_chars_in_title_escaped ... ok
[INFO] [stdout] test board::storage::tests::append_activity_timestamp_is_iso8601 ... ok
[INFO] [stdout] test board::storage::tests::find_kando_toml_at_start_dir ... ok
[INFO] [stdout] test board::storage::tests::delete_template_nonexistent_is_ok ... ok
[INFO] [stdout] test board::storage::tests::column_config_name_not_written_to_config ... ok
[INFO] [stdout] test board::storage::tests::find_kando_toml_is_directory_not_file ... 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::delete_template_removes_file ... ok
[INFO] [stdout] test board::storage::tests::find_template_by_derived_name_case_insensitive ... ok
[INFO] [stdout] test board::storage::tests::find_template_not_found ... ok
[INFO] [stdout] test board::storage::tests::find_template_by_slug ... ok
[INFO] [stdout] test board::storage::tests::find_kando_toml_prefers_nearest_ancestor ... ok
[INFO] [stdout] test board::storage::tests::find_template_partial_name_does_not_match ... ok
[INFO] [stdout] test board::storage::tests::init_board_at_board_is_loadable ... ok
[INFO] [stdout] test board::storage::tests::init_board_at_creates_config_toml ... ok
[INFO] [stdout] test board::storage::tests::init_board_at_and_init_board_produce_equivalent_boards ... 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::storage::tests::find_template_slug_takes_precedence_over_derived_name ... ok
[INFO] [stdout] test board::storage::tests::init_board_at_double_init_overwrites ... ok
[INFO] [stdout] test board::storage::tests::json_escape_backslash ... ok
[INFO] [stdout] test board::storage::tests::init_board_at_without_sync_branch ... ok
[INFO] [stdout] test board::storage::tests::init_board_at_with_sync_branch ... ok
[INFO] [stdout] test board::storage::tests::init_board_does_not_create_meta_toml ... ok
[INFO] [stdout] test board::storage::tests::json_escape_control_char_x01 ... ok
[INFO] [stdout] test board::storage::tests::json_escape_empty_string ... ok
[INFO] [stdout] test board::storage::tests::json_escape_mixed_special_chars ... ok
[INFO] [stdout] test board::storage::tests::json_escape_non_ascii_unicode_passthrough ... ok
[INFO] [stdout] test board::storage::tests::json_escape_newline_cr_tab ... ok
[INFO] [stdout] test board::storage::tests::json_escape_double_quote ... 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_board_column_names_match_slugs ... ok
[INFO] [stdout] test board::storage::tests::load_local_config_empty_file_uses_serde_default ... ok
[INFO] [stdout] test board::storage::tests::load_local_config_absent_file_returns_default ... ok
[INFO] [stdout] test board::storage::tests::load_board_ignores_leftover_meta_toml ... ok
[INFO] [stdout] test board::storage::tests::load_local_config_extra_fields_are_ignored ... ok
[INFO] [stdout] test board::storage::tests::load_local_config_nonexistent_kando_dir_returns_default ... ok
[INFO] [stdout] test board::storage::tests::load_template_with_legacy_name_field_in_frontmatter ... 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_legacy_tutorial_shown_on_disk ... ok
[INFO] [stdout] test board::storage::tests::load_templates_empty_dir ... ok
[INFO] [stdout] test board::storage::tests::load_templates_no_templates_dir ... ok
[INFO] [stdout] test board::storage::tests::load_local_config_invalid_toml_returns_err ... ok
[INFO] [stdout] test board::storage::tests::load_templates_skips_non_md_files ... ok
[INFO] [stdout] test board::storage::tests::parse_frontmatter_empty_returns_none ... ok
[INFO] [stdout] test board::storage::tests::parse_frontmatter_minimal_content ... ok
[INFO] [stdout] test board::storage::tests::parse_frontmatter_no_closing_delimiter ... ok
[INFO] [stdout] test board::storage::tests::parse_frontmatter_no_opening_delimiter ... ok
[INFO] [stdout] test board::storage::tests::parse_frontmatter_only_delimiters_returns_none ... ok
[INFO] [stdout] test board::storage::tests::load_templates_sorted_by_slug ... ok
[INFO] [stdout] test board::storage::tests::rename_column_dir_happy_path ... ok
[INFO] [stdout] test board::storage::tests::rename_column_dir_old_does_not_exist_is_noop ... ok
[INFO] [stdout] test board::storage::tests::load_templates_skips_invalid_frontmatter ... ok
[INFO] [stdout] test board::storage::tests::rename_column_dir_same_slug_is_noop ... ok
[INFO] [stdout] test board::storage::tests::rename_column_dir_invalid_slug_rejected_before_io ... ok
[INFO] [stdout] test board::storage::tests::rename_template_invalid_new_slug_returns_error ... ok
[INFO] [stdout] test board::storage::tests::rename_column_dir_new_already_exists_returns_err ... ok
[INFO] [stdout] test board::storage::tests::rename_template_moves_file ... ok
[INFO] [stdout] test board::storage::tests::rename_template_multi_word_slug ... ok
[INFO] [stdout] test board::storage::tests::rename_template_body_with_frontmatter_delimiter_preserved ... ok
[INFO] [stdout] test board::storage::tests::rename_template_no_templates_dir_returns_error ... ok
[INFO] [stdout] test board::storage::tests::rename_template_old_slug_not_found_returns_error ... ok
[INFO] [stdout] test board::storage::tests::rename_template_invalid_old_slug_returns_error ... ok
[INFO] [stdout] test board::storage::tests::rename_template_preserves_content ... ok
[INFO] [stdout] test board::storage::tests::resolve_board_broken_git_sync_no_git_repo ... ok
[INFO] [stdout] test board::storage::tests::resolve_board_broken_git_sync_from_nested_dir ... ok
[INFO] [stdout] test board::storage::tests::rename_template_same_slug_is_noop ... ok
[INFO] [stdout] test board::storage::tests::rename_template_target_already_exists_returns_error ... 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::resolve_board_local_from_nested_dir ... ok
[INFO] [stdout] test board::storage::tests::round_trip_column_metadata_preserved ... 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::save_local_config_creates_file ... ok
[INFO] [stdout] test board::storage::tests::resolve_board_local_mode ... ok
[INFO] [stdout] test board::storage::tests::save_board_does_not_create_meta_toml ... ok
[INFO] [stdout] test board::storage::tests::save_local_config_creates_gitignore_with_entry ... ok
[INFO] [stdout] test board::storage::tests::save_local_config_gitignore_entry_appended_to_existing_content ... 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_help_hint_shown_true_roundtrip ... ok
[INFO] [stdout] test board::storage::tests::save_local_config_gitignore_entry_not_duplicated ... ok
[INFO] [stdout] test board::storage::tests::save_template_creates_templates_dir ... 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::hooks::tests::fire_hook_non_executable_is_skipped ... ok
[INFO] [stdout] test board::storage::tests::save_template_slug_with_leading_hyphen_rejected ... ok
[INFO] [stdout] test board::storage::tests::save_template_overwrites_existing ... ok
[INFO] [stdout] test board::storage::tests::save_template_file_does_not_contain_name_field ... ok
[INFO] [stdout] test board::storage::tests::serialize_card_all_fields_roundtrip ... ok
[INFO] [stdout] test board::storage::tests::serialize_card_blocked_none_omits_field ... ok
[INFO] [stdout] test board::storage::tests::serialize_card_blocked_roundtrip ... ok
[INFO] [stdout] test board::storage::tests::serialize_card_body_gets_trailing_newline ... ok
[INFO] [stdout] test board::storage::tests::serialize_card_empty_body_no_trailing_content ... ok
[INFO] [stdout] test board::storage::tests::serialize_card_no_due_date_omitted ... ok
[INFO] [stdout] test board::storage::tests::serialize_card_with_assignees_roundtrip ... ok
[INFO] [stdout] test board::storage::tests::serialize_card_blocked_with_reason_roundtrip ... ok
[INFO] [stdout] test board::storage::tests::serialize_template_does_not_contain_name_field ... ok
[INFO] [stdout] test board::storage::tests::serialize_card_with_started_completed_roundtrip ... 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_due_date_roundtrip ... ok
[INFO] [stdout] test board::storage::tests::template_blocked_with_reason_roundtrip ... ok
[INFO] [stdout] test board::storage::tests::template_body_with_frontmatter_delimiter_roundtrips ... ok
[INFO] [stdout] test board::hooks::tests::fire_hook_failing_script_sends_error ... ok
[INFO] [stdout] test board::storage::tests::template_serialize_empty_body ... ok
[INFO] [stdout] test board::storage::tests::template_serialize_roundtrip_minimal ... ok
[INFO] [stdout] test board::storage::tests::template_with_all_default_fields ... ok
[INFO] [stdout] test board::storage::tests::template_serialize_roundtrip ... ok
[INFO] [stdout] test board::hooks::tests::fire_hook_executable_sends_notification ... ok
[INFO] [stdout] test board::hooks::tests::fire_hook_failure_no_output_says_failed ... ok
[INFO] [stdout] test board::storage::tests::test_card_completed_roundtrip ... ok
[INFO] [stdout] test board::hooks::tests::fire_hook_stderr_used_when_stdout_empty ... ok
[INFO] [stdout] test board::storage::tests::test_board_created_at_roundtrip ... ok
[INFO] [stdout] test board::storage::tests::test_board_created_at_none_for_legacy_config ... ok
[INFO] [stdout] test board::storage::tests::test_card_without_completed_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_card_roundtrip ... ok
[INFO] [stdout] test board::storage::tests::test_card_started_roundtrip ... ok
[INFO] [stdout] test board::hooks::tests::fire_hook_without_sender_still_logs ... ok
[INFO] [stdout] test board::storage::tests::resolve_board_broken_git_sync_no_remote ... ok
[INFO] [stdout] test board::hooks::tests::hook_log_records_failure_exit_code ... ok
[INFO] [stdout] test board::storage::tests::test_card_without_started_deserializes_as_none ... ok
[INFO] [stdout] test board::storage::tests::test_init_board_creates_gitignore_with_local_toml ... ok
[INFO] [stdout] test board::storage::tests::test_find_kando_dir ... ok
[INFO] [stdout] test board::storage::tests::test_init_and_load_board ... ok
[INFO] [stdout] test board::storage::tests::test_parse_frontmatter ... ok
[INFO] [stdout] test board::storage::tests::test_parse_frontmatter_crlf ... ok
[INFO] [stdout] test board::storage::tests::test_parse_frontmatter_no_body ... ok
[INFO] [stdout] test board::storage::tests::test_load_board_ignores_legacy_tutorial_shown_in_config ... 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_restore_card_missing_trash_file ... ok
[INFO] [stdout] test board::storage::tests::test_trash_card_missing_source_file ... ok
[INFO] [stdout] test board::storage::tests::test_restore_card_moves_file_back ... ok
[INFO] [stdout] test board::storage::tests::validate_slug_empty_returns_err ... ok
[INFO] [stdout] test board::storage::tests::validate_slug_leading_hyphen_returns_err ... ok
[INFO] [stdout] test board::storage::tests::validate_slug_spaces_returns_err ... ok
[INFO] [stdout] test board::storage::tests::test_init_board_creates_local_toml ... ok
[INFO] [stdout] test board::storage::tests::test_purge_trash_keeps_recent_entries ... 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_zero_days_is_disabled ... ok
[INFO] [stdout] test board::storage::tests::validate_slug_underscore_returns_err ... ok
[INFO] [stdout] test board::storage::tests::validate_slug_unicode_letters_accepted ... ok
[INFO] [stdout] test board::storage::tests::validate_slug_unicode_uppercase_returns_err ... ok
[INFO] [stdout] test board::storage::tests::validate_slug_uppercase_returns_err ... ok
[INFO] [stdout] test board::storage::tests::validate_slug_valid_with_hyphens ... ok
[INFO] [stdout] test board::storage::tests::test_purge_trash_removes_old_entries ... ok
[INFO] [stdout] test board::storage::tests::test_load_trash_empty_when_no_trash_dir ... ok
[INFO] [stdout] test board::hooks::tests::fire_hook_success_no_output_says_done ... 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::storage::tests::validate_slug_valid_with_digits ... ok
[INFO] [stdout] test board::storage::tests::test_purge_trash_keeps_entry_with_unparseable_date ... ok
[INFO] [stdout] test board::sync::tests::test_copy_empty_src ... ok
[INFO] [stdout] test board::sync::tests::test_copy_basic_files ... ok
[INFO] [stdout] test board::sync::tests::test_copy_creates_dst_if_missing ... ok
[INFO] [stdout] test board::storage::tests::test_restore_card_to_different_column ... ok
[INFO] [stdout] test board::sync::tests::test_copy_cleans_dst_fully_when_src_empty ... ok
[INFO] [stdout] test board::sync::tests::test_copy_nested_dirs ... ok
[INFO] [stdout] test board::storage::tests::test_save_and_load_with_cards ... ok
[INFO] [stdout] test board::sync::tests::test_djb2_different_inputs ... ok
[INFO] [stdout] test board::sync::tests::test_djb2_known_value ... ok
[INFO] [stdout] test board::sync::tests::test_djb2_deterministic ... ok
[INFO] [stdout] test board::hooks::tests::fire_hook_stdout_takes_priority_over_stderr ... 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_djb2_empty_string ... ok
[INFO] [stdout] test board::storage::tests::test_trash_two_cards_restore_one ... ok
[INFO] [stdout] test board::sync::tests::test_copy_skips_symlinks ... ok
[INFO] [stdout] test board::sync::tests::test_find_git_root_nested ... ok
[INFO] [stdout] test board::sync::tests::test_copy_removes_stale_files ... ok
[INFO] [stdout] test board::sync::tests::test_find_git_root_not_found ... ok
[INFO] [stdout] test board::sync::tests::test_copy_removes_stale_dirs ... ok
[INFO] [stdout] test board::storage::tests::validate_slug_special_chars_returns_err ... ok
[INFO] [stdout] test board::storage::tests::validate_slug_valid_simple ... 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::sync::tests::test_shadow_dir_uses_kando_subdir ... 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::sync::tests::test_find_git_root_at_root ... 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::tests::card_is_visible_no_filters_shows_all ... ok
[INFO] [stdout] test board::hooks::tests::open_in_editor_with_failing_editor_does_not_panic ... 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_card_due_today_is_hidden ... ok
[INFO] [stdout] test board::tests::card_is_visible_overdue_filter_hides_non_overdue_card ... 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_combined_with_tag_filter ... ok
[INFO] [stdout] test board::tests::card_is_visible_staleness_filter_no_match ... ok
[INFO] [stdout] test board::tests::card_is_visible_overdue_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_text_filter_overrides_overdue_filter ... ok
[INFO] [stdout] test board::tests::card_is_visible_text_filter_overrides_picker ... ok
[INFO] [stdout] test board::tests::card_is_visible_text_filter_overrides_staleness ... 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_string_yields_some_reason ... ok
[INFO] [stdout] test board::tests::deserialize_blocked_empty_string_yields_some_empty ... ok
[INFO] [stdout] test board::tests::filter_negation_includes_non_match ... 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::filter_at_prefix_missing_tag_returns_false ... ok
[INFO] [stdout] test board::tests::filter_matches_assignee ... ok
[INFO] [stdout] test board::tests::deserialize_blocked_true_yields_some_empty ... ok
[INFO] [stdout] test board::tests::generate_slug_col_uniqueness_when_col_taken ... ok
[INFO] [stdout] test board::tests::generate_slug_leading_special_chars_stripped ... ok
[INFO] [stdout] test board::tests::filter_no_match_returns_false ... ok
[INFO] [stdout] test board::tests::generate_slug_reserved_archive_avoided ... ok
[INFO] [stdout] test board::tests::filter_negation_excludes_match ... ok
[INFO] [stdout] test board::tests::card_touch_updates_timestamp ... ok
[INFO] [stdout] test board::tests::generate_slug_spaces_become_hyphens ... ok
[INFO] [stdout] test board::tests::find_card_not_found_returns_none ... ok
[INFO] [stdout] test board::tests::generate_slug_uniqueness_appends_suffix ... ok
[INFO] [stdout] test board::sync::tests::test_copy_overwrites_existing_files ... ok
[INFO] [stdout] test board::tests::generate_slug_unicode_name_preserves_characters ... ok
[INFO] [stdout] test board::tests::filter_multi_term_and_both_match ... ok
[INFO] [stdout] test board::tests::find_card_returns_correct_indices ... ok
[INFO] [stdout] test board::tests::filter_multi_term_and_one_misses ... ok
[INFO] [stdout] test board::tests::generate_slug_all_non_alphanum_falls_back_to_col ... ok
[INFO] [stdout] test board::tests::generate_slug_basic_name ... ok
[INFO] [stdout] test board::tests::card_is_visible_staleness_filter_matches ... 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::generate_template_slug_basic_name ... ok
[INFO] [stdout] test board::tests::generate_slug_uniqueness_skips_taken_suffixes ... ok
[INFO] [stdout] test board::tests::generate_template_slug_dedup_appends_suffix ... ok
[INFO] [stdout] test board::tests::generate_template_slug_empty_name_returns_template ... ok
[INFO] [stdout] test board::tests::generate_template_slug_numeric_only ... ok
[INFO] [stdout] test board::tests::generate_template_slug_short_alpha_name ... ok
[INFO] [stdout] test board::tests::generate_template_slug_dedup_skips_taken_suffixes ... ok
[INFO] [stdout] test board::tests::generate_template_slug_template_already_exists ... ok
[INFO] [stdout] test board::tests::is_blocked_some_reason_returns_true ... ok
[INFO] [stdout] test board::tests::generate_template_slug_unicode_preserves_characters ... ok
[INFO] [stdout] test board::tests::is_over_wip_limit_under ... ok
[INFO] [stdout] test board::tests::is_over_wip_limit_at_limit ... ok
[INFO] [stdout] test board::tests::is_overdue_today_returns_false ... ok
[INFO] [stdout] test board::tests::generate_template_slug_special_chars_only_returns_template ... 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_overdue_far_past_returns_true ... ok
[INFO] [stdout] test board::tests::is_overdue_tomorrow_returns_false ... ok
[INFO] [stdout] test board::tests::is_overdue_none_returns_false ... ok
[INFO] [stdout] test board::tests::is_overdue_yesterday_returns_true ... ok
[INFO] [stdout] test board::tests::move_to_done_preserves_existing_completed ... ok
[INFO] [stdout] test board::tests::move_away_from_done_clears_completed ... ok
[INFO] [stdout] test board::tests::move_to_done_sets_started_if_none ... ok
[INFO] [stdout] test board::tests::move_to_done_sets_completed ... 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_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_dense_already ... ok
[INFO] [stdout] test board::tests::move_back_to_backlog_preserves_started ... ok
[INFO] [stdout] test board::tests::move_between_non_done_columns_leaves_completed_none ... ok
[INFO] [stdout] test board::tests::move_card_invalid_index_does_not_panic ... ok
[INFO] [stdout] test board::tests::move_card_same_column_noop ... 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::move_past_backlog_sets_started ... ok
[INFO] [stdout] test board::tests::priority_display ... ok
[INFO] [stdout] test board::tests::normalize_column_orders_single_column ... ok
[INFO] [stdout] test board::tests::priority_from_str_unknown_returns_err ... ok
[INFO] [stdout] test board::tests::priority_from_str_case_insensitive ... ok
[INFO] [stdout] test board::tests::slug_from_name_empty_string_falls_back_to_col ... ok
[INFO] [stdout] test board::tests::slug_from_name_consecutive_spaces_collapse_to_one_hyphen ... ok
[INFO] [stdout] test board::tests::slug_from_name_leading_special_chars_stripped ... ok
[INFO] [stdout] test board::tests::slug_from_name_multi_word ... ok
[INFO] [stdout] test board::tests::priority_sort_key_ordering ... ok
[INFO] [stdout] test board::tests::slug_from_name_nfc_normalization_consistency ... ok
[INFO] [stdout] test board::tests::slug_from_name_non_alphanumeric_unicode_falls_back ... ok
[INFO] [stdout] test board::tests::slug_from_name_numbers_in_name ... ok
[INFO] [stdout] test board::tests::slug_from_name_leading_trailing_spaces_trimmed ... ok
[INFO] [stdout] test board::tests::slug_from_name_does_not_guard_archive_reservation ... ok
[INFO] [stdout] test board::tests::priority_from_str_valid ... ok
[INFO] [stdout] test board::tests::slug_from_name_mixed_ascii_unicode_preserves_all ... ok
[INFO] [stdout] test board::tests::slug_from_name_unicode_preserved ... ok
[INFO] [stdout] test board::tests::slug_from_name_nordic_characters_preserved ... 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_unicode_symbols_replaced ... ok
[INFO] [stdout] test board::tests::slug_from_name_single_word ... ok
[INFO] [stdout] test board::tests::slug_to_name_with_digits ... ok
[INFO] [stdout] test board::tests::slug_to_name_empty_string ... ok
[INFO] [stdout] test board::tests::slug_to_name_multi_word ... ok
[INFO] [stdout] test board::tests::sort_cards_by_priority ... ok
[INFO] [stdout] test board::tests::sort_cards_blocked_first ... ok
[INFO] [stdout] test config::tests::kando_toml_custom_branch ... ok
[INFO] [stdout] test board::tests::slug_to_name_single_hyphen_does_not_panic ... 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 config::tests::kando_toml_default_branch_when_missing ... ok
[INFO] [stdout] test config::tests::kando_toml_ignores_unknown_fields ... ok
[INFO] [stdout] test board::tests::slug_to_name_uppercase_passthrough ... ok
[INFO] [stdout] test board::tests::sort_cards_priority_then_updated ... ok
[INFO] [stdout] test config::tests::kando_toml_malformed_returns_err ... ok
[INFO] [stdout] test config::tests::kando_toml_branch_with_slashes ... ok
[INFO] [stdout] test config::tests::kando_toml_serialization_contains_branch ... ok
[INFO] [stdout] test config::tests::local_config_legacy_tutorial_shown_deserializes_as_help_hint_shown ... ok
[INFO] [stdout] test config::tests::local_config_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 config::tests::kando_toml_roundtrip ... ok
[INFO] [stdout] test config::tests::local_config_default_help_hint_shown_is_false ... ok
[INFO] [stdout] test config::tests::local_config_help_hint_shown_true_roundtrip ... ok
[INFO] [stdout] test config::tests::local_config_missing_help_hint_shown_defaults_to_false ... ok
[INFO] [stdout] test config::tests::local_config_ignores_unknown_fields ... ok
[INFO] [stdout] test config::tests::local_config_serializes_with_new_field_name_not_alias ... ok
[INFO] [stdout] test board::tests::is_over_wip_limit_no_limit ... ok
[INFO] [stdout] test config::tests::local_config_empty_string_deserializes ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 496 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.35s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]      Running tests/public_api.rs (/opt/rustwide/target/debug/deps/public_api-5f2996af1306f3ca)
[INFO] [stdout] running 4 tests
[INFO] [stdout] test re_export_board_types_accessible ... ok
[INFO] [stdout] test submodule_paths_accessible ... ok
[INFO] [stdout] test re_export_storage_types_accessible ... ok
[INFO] [stderr]      Running unittests src/main.rs (/opt/rustwide/target/debug/deps/kando-d75c87c81ad5217b)
[INFO] [stdout] test re_export_config_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] [stdout] 
[INFO] [stdout] running 838 tests
[INFO] [stdout] test app::tests::assign_letters_empty_board ... ok
[INFO] [stdout] test app::tests::archive_card_already_in_archive ... ok
[INFO] [stdout] test app::tests::assign_letters_hidden_columns_excluded ... ok
[INFO] [stdout] test app::tests::assign_letters_archive_always_gets_a ... ok
[INFO] [stdout] test app::tests::assign_letters_hidden_archive_always_included ... ok
[INFO] [stdout] test app::tests::assign_letters_hidden_columns_included_when_show_hidden ... ok
[INFO] [stdout] test app::tests::archive_card_empty_column ... ok
[INFO] [stdout] test app::tests::assign_letters_no_duplicate_letters ... ok
[INFO] [stdout] test app::tests::assign_letters_reserves_g_and_e ... ok
[INFO] [stdout] test app::tests::assign_letters_single_column ... ok
[INFO] [stdout] test app::tests::assign_letters_name_character_fallback ... ok
[INFO] [stdout] test app::tests::clamp_selection_empty_column ... ok
[INFO] [stdout] test app::tests::clamp_selection_filtered_no_filter_delegates ... ok
[INFO] [stdout] test app::tests::clamp_selection_filtered_snaps_to_visible ... ok
[INFO] [stdout] test app::tests::clear_filters_clears_all ... ok
[INFO] [stdout] test app::tests::col_move_left_at_leftmost_errors ... ok
[INFO] [stdout] test app::tests::col_add_before_enters_input_mode ... ok
[INFO] [stdout] test app::tests::col_move_right_at_rightmost_errors ... ok
[INFO] [stdout] test app::tests::col_remove_with_cards_blocked ... ok
[INFO] [stdout] test app::tests::archive_card_moves_to_archive_column ... ok
[INFO] [stdout] test app::tests::archive_card_no_archive_column ... ok
[INFO] [stdout] test app::tests::clamp_selection_filtered_no_visible_cards ... ok
[INFO] [stdout] test app::tests::col_remove_archive_blocked ... ok
[INFO] [stdout] test app::tests::clamp_selection_out_of_bounds ... ok
[INFO] [stdout] test app::tests::blocker_reason_input_empty_sets_blocked_no_reason ... ok
[INFO] [stdout] test app::tests::clamp_selection_within_bounds_unchanged ... ok
[INFO] [stdout] test app::tests::column_w_maps_to_col_set_wip ... ok
[INFO] [stdout] test app::tests::col_remove_confirm_removes_column ... ok
[INFO] [stdout] test app::tests::col_rename_selected_enters_input_mode ... ok
[INFO] [stdout] test app::tests::col_rename_confirm_changes_name ... ok
[INFO] [stdout] test app::tests::col_add_confirm_creates_column ... ok
[INFO] [stdout] test app::tests::col_move_to_position_same_notifies ... ok
[INFO] [stdout] test app::tests::col_remove_last_column_blocked ... ok
[INFO] [stdout] test app::tests::blocker_reason_input_confirm_sets_reason ... ok
[INFO] [stdout] test app::tests::col_rename_empty_name_errors ... ok
[INFO] [stdout] test app::tests::completion_hint_empty_stale_candidates_gives_none_selected ... ok
[INFO] [stdout] test app::tests::completion_hint_candidates_sorted_alphabetically ... ok
[INFO] [stdout] test app::tests::completion_hint_empty_token_shows_all_remaining ... ok
[INFO] [stdout] test app::tests::completion_hint_excludes_already_entered ... ok
[INFO] [stdout] test app::tests::blocker_reason_input_applies_to_selected_card ... ok
[INFO] [stdout] test app::tests::completion_hint_none_in_normal_mode ... ok
[INFO] [stdout] test app::tests::completion_hint_returns_matching_candidates ... ok
[INFO] [stdout] test app::tests::completion_hint_title_is_assignees_for_edit_assignees ... ok
[INFO] [stdout] test app::tests::completion_hint_selected_none_when_cycled_candidate_no_longer_matches ... ok
[INFO] [stdout] test app::tests::completion_hint_works_for_assignees ... ok
[INFO] [stdout] test app::tests::completion_hint_stale_index_oob_gives_none_selected ... ok
[INFO] [stdout] test app::tests::completion_hint_title_is_tags_for_edit_tags ... ok
[INFO] [stdout] test app::tests::completion_hint_none_for_non_tag_target ... ok
[INFO] [stdout] test app::tests::completion_hint_all_values_entered_returns_none ... ok
[INFO] [stdout] test app::tests::current_csv_token_after_comma_with_space ... ok
[INFO] [stdout] test app::tests::current_csv_token_empty ... ok
[INFO] [stdout] test app::tests::completion_hint_none_when_no_tags_on_board ... ok
[INFO] [stdout] test app::tests::completion_hint_selected_tracks_cycling_candidate ... ok
[INFO] [stdout] test app::tests::current_csv_token_multiple_commas ... ok
[INFO] [stdout] test app::tests::completion_hint_none_when_no_prefix_match ... ok
[INFO] [stdout] test app::tests::current_csv_token_single_word ... ok
[INFO] [stdout] test app::tests::current_csv_token_trailing_comma ... ok
[INFO] [stdout] test app::tests::cycle_completion_excludes_already_entered ... ok
[INFO] [stdout] test app::tests::cycle_completion_noop_when_all_candidates_entered ... ok
[INFO] [stdout] test app::tests::cycle_completion_noop_when_board_has_no_tags ... ok
[INFO] [stdout] test app::tests::cycle_completion_forward_and_wrap ... ok
[INFO] [stdout] test app::tests::cycle_completion_multi_token_replaces_only_last_segment ... ok
[INFO] [stdout] test app::tests::cycle_completion_backward_wraps ... ok
[INFO] [stdout] test app::tests::entered_values_empty ... ok
[INFO] [stdout] test app::tests::detail_next_card_at_last_card_notifies_last_card ... ok
[INFO] [stdout] test app::tests::detail_prev_card_navigates_when_not_at_first ... ok
[INFO] [stdout] test app::tests::edit_tags_action_ghost_text_none_when_buffer_empty ... ok
[INFO] [stdout] test app::tests::edit_assignees_action_populates_completion_hint_immediately ... ok
[INFO] [stdout] test app::tests::entered_values_multiple_lowercased ... ok
[INFO] [stdout] test app::tests::edit_tags_no_tags_on_board_completion_hint_is_none ... ok
[INFO] [stdout] test app::tests::edit_assignees_action_ghost_text_none_when_buffer_empty ... ok
[INFO] [stdout] test app::tests::detail_prev_card_at_first_visible_with_filter_notifies ... ok
[INFO] [stdout] test app::tests::detail_next_card_at_last_visible_with_filter_notifies ... ok
[INFO] [stdout] test app::tests::entered_values_single_token_returns_empty ... ok
[INFO] [stdout] test app::tests::edit_assignees_no_assignees_on_board_completion_hint_is_none ... ok
[INFO] [stdout] test app::tests::detail_next_card_navigates_when_not_at_last ... ok
[INFO] [stdout] test app::tests::cycle_completion_noop_for_non_tag_target ... ok
[INFO] [stdout] test app::tests::detail_prev_card_at_first_card_notifies_first_card ... ok
[INFO] [stdout] test app::tests::entered_values_trailing_comma ... ok
[INFO] [stdout] test app::tests::filtered_candidates_excludes_already_entered ... ok
[INFO] [stdout] test app::tests::filtered_candidates_no_match ... ok
[INFO] [stdout] test app::tests::filtered_candidates_prefix_match_case_insensitive ... ok
[INFO] [stdout] test app::tests::edit_tags_action_populates_completion_hint_immediately ... ok
[INFO] [stdout] test app::tests::ghost_text_none_for_empty_token ... ok
[INFO] [stdout] test app::tests::ghost_text_none_during_active_completion ... ok
[INFO] [stdout] test app::tests::ghost_text_none_when_cursor_not_at_end ... ok
[INFO] [stdout] test app::tests::filter_guard_does_not_block_detail_nav_selected_not_in_visible_set ... ok
[INFO] [stdout] test app::tests::filter_guard_notifies_no_visible_card_selected ... ok
[INFO] [stdout] test app::tests::ghost_text_none_when_board_has_no_tags ... ok
[INFO] [stdout] test app::tests::ghost_text_none_for_non_tag_target ... ok
[INFO] [stdout] test app::tests::ghost_text_works_for_assignees ... ok
[INFO] [stdout] test app::tests::filter_guard_does_not_block_new_card ... ok
[INFO] [stdout] test app::tests::ghost_text_shows_suffix ... ok
[INFO] [stdout] test app::tests::filter_guard_passes_when_selected_card_is_visible ... ok
[INFO] [stdout] test app::tests::goto_resets_mode_to_normal ... ok
[INFO] [stdout] test app::tests::has_active_filter_assignees_only ... ok
[INFO] [stdout] test app::tests::col_set_wip_opens_input ... ok
[INFO] [stdout] test app::tests::has_active_filter_none ... ok
[INFO] [stdout] test app::tests::has_active_filter_tags_only ... ok
[INFO] [stdout] test app::tests::hint_archive ... ok
[INFO] [stdout] test app::tests::hint_col_move_forward ... ok
[INFO] [stdout] test app::tests::has_active_filter_text_only ... ok
[INFO] [stdout] test app::tests::hint_col_move_backward ... ok
[INFO] [stdout] test app::tests::handle_col_hide_focus_unchanged_when_show_hidden_true ... ok
[INFO] [stdout] test app::tests::handle_col_hide_mode_resets_to_normal ... ok
[INFO] [stdout] test app::tests::handle_col_hide_marks_column_hidden ... ok
[INFO] [stdout] test app::tests::has_active_filter_staleness_only ... ok
[INFO] [stdout] test app::tests::hint_col_remove ... ok
[INFO] [stdout] test app::tests::hint_col_set_hidden_false ... ok
[INFO] [stdout] test app::tests::hint_col_set_hidden_true ... ok
[INFO] [stdout] test app::tests::hint_pipe_command_short ... ok
[INFO] [stdout] test app::tests::hint_set_assignees ... ok
[INFO] [stdout] test app::tests::hint_pipe_command_truncates_at_20_chars ... ok
[INFO] [stdout] test app::tests::hint_set_blocked_true ... ok
[INFO] [stdout] test app::tests::hint_set_due_date_some ... ok
[INFO] [stdout] test app::tests::hint_set_blocked_false ... ok
[INFO] [stdout] test app::tests::hint_move_to_column ... ok
[INFO] [stdout] test app::tests::hint_set_due_date_none ... ok
[INFO] [stdout] test app::tests::hint_move_forward ... ok
[INFO] [stdout] test app::tests::hint_set_priority_all_variants ... ok
[INFO] [stdout] test app::tests::hint_set_tags ... ok
[INFO] [stdout] test app::tests::hint_set_tags_empty ... ok
[INFO] [stdout] test app::tests::hint_set_wip_limit_none ... ok
[INFO] [stdout] test app::tests::hint_set_wip_limit_some ... ok
[INFO] [stdout] test app::tests::hint_sort_column ... ok
[INFO] [stdout] test app::tests::is_column_level_false ... ok
[INFO] [stdout] test app::tests::is_column_level_true ... ok
[INFO] [stdout] test app::tests::jump_to_column_by_letter_clamps_selection ... ok
[INFO] [stdout] test app::tests::hint_delete_card ... ok
[INFO] [stdout] test app::tests::hint_move_backward ... ok
[INFO] [stdout] test app::tests::jump_to_column_by_letter_unknown_letter_is_noop ... ok
[INFO] [stdout] test app::tests::handle_col_hide_last_visible_column_blocked ... ok
[INFO] [stdout] test app::tests::jump_to_first_card_global_no_cards_notifies ... ok
[INFO] [stdout] test app::tests::jump_to_first_card_global_skips_hidden_columns ... ok
[INFO] [stdout] test app::tests::jump_to_first_card_no_visible_cards_notifies ... ok
[INFO] [stdout] test app::tests::jump_to_last_card_no_visible_cards_notifies ... ok
[INFO] [stdout] test app::tests::jump_to_last_column_skips_hidden ... ok
[INFO] [stdout] test app::tests::jump_to_visible_card_forward ... ok
[INFO] [stdout] test app::tests::jump_to_last_card_global_skips_hidden_columns ... ok
[INFO] [stdout] test app::tests::jump_to_first_column_skips_hidden ... ok
[INFO] [stdout] test app::tests::jump_to_visible_card_backward ... ok
[INFO] [stdout] test app::tests::jump_to_visible_card_skips_hidden_columns ... ok
[INFO] [stdout] test app::tests::jump_to_last_card_global_no_cards_notifies ... ok
[INFO] [stdout] test app::tests::handle_col_hide_activity_logged ... ok
[INFO] [stdout] test app::tests::jump_to_visible_card_wraps_forward ... ok
[INFO] [stdout] test app::tests::next_visible_column_all_hidden_returns_none ... ok
[INFO] [stdout] test app::tests::move_card_forward_at_last_column_notifies_last_column ... ok
[INFO] [stdout] test app::tests::handle_col_hide_two_visible_allows_hide ... ok
[INFO] [stdout] test app::tests::handle_col_hide_focus_moves_to_first_visible_when_hidden_not_shown ... ok
[INFO] [stdout] test app::tests::handle_col_hide_board_persisted ... ok
[INFO] [stdout] test app::tests::move_card_backward_at_first_column_notifies_first_column ... ok
[INFO] [stdout] test app::tests::move_card_from_empty_column_notifies_no_cards_to_move ... ok
[INFO] [stdout] test app::tests::jump_to_visible_card_no_matches ... ok
[INFO] [stdout] test app::tests::next_visible_column_at_edge_returns_none ... ok
[INFO] [stdout] test app::tests::move_card_from_empty_last_column_notifies_last_column ... ok
[INFO] [stdout] test app::tests::next_visible_column_backward ... ok
[INFO] [stdout] test app::tests::next_visible_column_forward ... ok
[INFO] [stdout] test app::tests::next_visible_column_shows_hidden_when_flag_set ... ok
[INFO] [stdout] test app::tests::next_visible_column_skips_hidden ... ok
[INFO] [stdout] test app::tests::normal_n_maps_to_find_next ... ok
[INFO] [stdout] test app::tests::normal_s_maps_to_start_sort ... ok
[INFO] [stdout] test app::tests::cycle_completion_works_for_assignees ... ok
[INFO] [stdout] test app::tests::normal_shift_n_maps_to_find_prev ... ok
[INFO] [stdout] test app::tests::notify_clears_notification_is_hook_flag ... ok
[INFO] [stdout] test app::tests::notify_error_clears_notification_is_hook_flag ... ok
[INFO] [stdout] test app::tests::notify_error_sets_error_level ... ok
[INFO] [stdout] test app::tests::notify_sets_info_level ... ok
[INFO] [stdout] test app::tests::pipe_card_no_card_selected ... ok
[INFO] [stdout] test app::tests::pipe_card_enters_input_mode ... ok
[INFO] [stdout] test app::tests::pipe_card_does_not_clear_undo_state ... ok
[INFO] [stdout] test app::tests::pipe_command_empty_input_does_nothing ... ok
[INFO] [stdout] test app::tests::record_col_remove ... ok
[INFO] [stdout] test app::tests::pipe_command_nonzero_exit_empty_stderr ... ok
[INFO] [stdout] test app::tests::record_col_set_hidden ... ok
[INFO] [stdout] test app::tests::record_edit_assignees ... ok
[INFO] [stdout] test app::tests::record_archive_card ... ok
[INFO] [stdout] test app::tests::record_col_set_hidden_to_false ... ok
[INFO] [stdout] test app::tests::pipe_command_empty_stdout_shows_pipe_complete ... ok
[INFO] [stdout] test app::tests::record_set_due_date ... ok
[INFO] [stdout] test app::tests::record_move_to_column ... ok
[INFO] [stdout] test app::tests::record_move_card_prev_column ... ok
[INFO] [stdout] test app::tests::pipe_command_nonzero_exit_shows_stderr ... ok
[INFO] [stdout] test app::tests::record_pipe_command ... ok
[INFO] [stdout] test app::tests::pipe_command_returns_no_sync_message ... ok
[INFO] [stdout] test app::tests::record_set_priority ... ok
[INFO] [stdout] test app::tests::record_set_wip_limit_zero_clears ... ok
[INFO] [stdout] test app::tests::pipe_command_receives_card_contents_on_stdin ... ok
[INFO] [stdout] test app::tests::pipe_command_skips_empty_lines ... ok
[INFO] [stdout] test app::tests::record_toggle_blocker_block_opens_input ... ok
[INFO] [stdout] test app::tests::record_sort_column ... ok
[INFO] [stdout] test app::tests::pipe_command_success_shows_stdout_first_line ... ok
[INFO] [stdout] test app::tests::repeat_block_card_with_reason ... ok
[INFO] [stdout] test app::tests::repeat_clear_due_date ... ok
[INFO] [stdout] test app::tests::record_pipe_command_not_on_failure ... ok
[INFO] [stdout] test app::tests::repeat_col_move_backward ... ok
[INFO] [stdout] test app::tests::pipe_command_card_not_found ... ok
[INFO] [stdout] test app::tests::repeat_archive ... ok
[INFO] [stdout] test app::tests::repeat_col_move_forward_already_rightmost ... ok
[INFO] [stdout] test app::tests::repeat_archive_no_archive_column ... ok
[INFO] [stdout] test app::tests::repeat_archive_already_in_archive ... ok
[INFO] [stdout] test app::tests::repeat_block_already_blocked ... ok
[INFO] [stdout] test app::tests::record_toggle_blocker_unblock ... ok
[INFO] [stdout] test app::tests::repeat_col_move_forward ... ok
[INFO] [stdout] test app::tests::record_delete_card ... ok
[INFO] [stdout] test app::tests::repeat_block_card ... ok
[INFO] [stdout] test app::tests::record_set_wip_limit ... ok
[INFO] [stdout] test app::tests::repeat_col_remove_only_column ... ok
[INFO] [stdout] test app::tests::repeat_col_remove_enters_confirm ... ok
[INFO] [stdout] test app::tests::repeat_col_remove_has_cards ... ok
[INFO] [stdout] test app::tests::record_edit_tags ... ok
[INFO] [stdout] test app::tests::record_move_card_next_column ... ok
[INFO] [stdout] test app::tests::repeat_delete_card_no_card ... ok
[INFO] [stdout] test app::tests::repeat_does_not_update_last_repeatable ... ok
[INFO] [stdout] test app::tests::repeat_col_set_hidden_true ... ok
[INFO] [stdout] test app::tests::repeat_move_to_column_already_there ... ok
[INFO] [stdout] test app::tests::repeat_column_level_no_column ... ok
[INFO] [stdout] test app::tests::repeat_column_level_skips_card_guard ... ok
[INFO] [stdout] test app::tests::repeat_delete_card_enters_confirm ... ok
[INFO] [stdout] test app::tests::repeat_col_remove_archive_blocked ... ok
[INFO] [stdout] test app::tests::repeat_col_set_hidden_already_hidden ... ok
[INFO] [stdout] test app::tests::repeat_move_card_backward ... ok
[INFO] [stdout] test app::tests::repeat_move_to_column ... ok
[INFO] [stdout] test app::tests::repeat_nothing_to_repeat ... ok
[INFO] [stdout] test app::tests::pipe_command_sets_env_vars ... ok
[INFO] [stdout] test app::tests::repeat_col_move_backward_already_leftmost ... ok
[INFO] [stdout] test app::tests::repeat_no_card_selected ... ok
[INFO] [stdout] test app::tests::repeat_move_to_column_missing ... ok
[INFO] [stdout] test app::tests::repeat_set_priority ... ok
[INFO] [stdout] test app::tests::repeat_set_wip_limit_none ... ok
[INFO] [stdout] test app::tests::repeat_set_wip_limit_some ... ok
[INFO] [stdout] test app::tests::repeat_col_set_hidden_false ... ok
[INFO] [stdout] test app::tests::repeat_pipe_command_no_card ... ok
[INFO] [stdout] test app::tests::repeat_col_set_hidden_already_visible ... ok
[INFO] [stdout] test app::tests::repeat_unblock_card ... ok
[INFO] [stdout] test app::tests::repeat_set_tags ... ok
[INFO] [stdout] test app::tests::repeat_set_due_date ... ok
[INFO] [stdout] test app::tests::repeat_set_assignees ... ok
[INFO] [stdout] test app::tests::repeat_with_active_filter_no_visible_card ... ok
[INFO] [stdout] test app::tests::repeat_sort_column_by_priority ... ok
[INFO] [stdout] test app::tests::repeat_sort_column_by_title ... ok
[INFO] [stdout] test app::tests::repeat_unblock_already_unblocked ... ok
[INFO] [stdout] test app::tests::repeat_sort_column_unknown_key ... ok
[INFO] [stdout] test app::tests::repeat_pipe_command_on_card ... ok
[INFO] [stdout] test app::tests::repeat_preserves_undo_on_noop ... ok
[INFO] [stdout] test app::tests::repeat_sort_column_empty ... ok
[INFO] [stdout] test app::tests::risk_level_normal_variants ... ok
[INFO] [stdout] test app::tests::selected_card_metadata_no_card ... ok
[INFO] [stdout] test app::tests::selected_card_metadata_with_card ... ok
[INFO] [stdout] test app::tests::space_x_maps_to_archive_card ... ok
[INFO] [stdout] test app::tests::start_sort_opens_picker ... ok
[INFO] [stdout] test app::tests::test_close_metrics_panel ... ok
[INFO] [stdout] test app::tests::risk_level_low_variants ... ok
[INFO] [stdout] test app::tests::test_cycle_prev_wraps_to_prev_column ... ok
[INFO] [stdout] test app::tests::test_cycle_next_wraps_to_next_column ... ok
[INFO] [stdout] test app::tests::test_close_panel ... ok
[INFO] [stdout] test app::tests::selected_card_ref_invalid_card ... ok
[INFO] [stdout] test app::tests::selected_card_ref_invalid_column ... ok
[INFO] [stdout] test app::tests::selected_card_ref_valid ... ok
[INFO] [stdout] test app::tests::test_close_help_panel ... ok
[INFO] [stdout] test app::tests::sort_by_title ... ok
[INFO] [stdout] test app::tests::test_delete_card_confirm ... ok
[INFO] [stdout] test app::tests::risk_level_high_variants ... ok
[INFO] [stdout] test app::tests::test_deny_returns_to_normal ... ok
[INFO] [stdout] test app::tests::test_filter_confirm_empty_clears ... ok
[INFO] [stdout] test app::tests::sort_empty_column_no_panic ... ok
[INFO] [stdout] test app::tests::test_detail_scroll ... ok
[INFO] [stdout] test app::tests::repeat_move_card_forward ... ok
[INFO] [stdout] test app::tests::test_focus_next_column ... ok
[INFO] [stdout] test app::tests::test_focus_prev_column ... ok
[INFO] [stdout] test app::tests::test_filter_confirm_sets_active_filter ... ok
[INFO] [stdout] test app::tests::test_focus_skips_hidden_columns ... ok
[INFO] [stdout] test app::tests::test_delete_card_enters_confirm_mode ... ok
[INFO] [stdout] test app::tests::test_edit_tags_confirm ... ok
[INFO] [stdout] test app::tests::test_delete_populates_last_delete ... ok
[INFO] [stdout] test app::tests::test_delete_card_file_goes_to_trash ... ok
[INFO] [stdout] test app::tests::test_input_backspace ... ok
[INFO] [stdout] test app::tests::test_input_cancel_clears_filter ... ok
[INFO] [stdout] test app::tests::test_input_char_in_input_mode ... ok
[INFO] [stdout] test app::tests::test_input_cancel_picker_keeps_tag_filters ... ok
[INFO] [stdout] test app::tests::test_input_cursor_movement ... ok
[INFO] [stdout] test app::tests::test_jump_to_column_by_letter_auto_shows_hidden_archive ... ok
[INFO] [stdout] test app::tests::test_jump_to_column_by_letter ... ok
[INFO] [stdout] test app::tests::test_help_scroll ... ok
[INFO] [stdout] test app::tests::test_jump_to_first_card_global ... ok
[INFO] [stdout] test app::tests::test_input_char_in_filter_syncs ... ok
[INFO] [stdout] test app::tests::test_jump_to_first_last_card ... ok
[INFO] [stdout] test app::tests::test_jump_to_last_card_global ... ok
[INFO] [stdout] test app::tests::test_jump_to_first_column ... ok
[INFO] [stdout] test app::tests::test_select_in_picker_mode ... ok
[INFO] [stdout] test app::tests::test_jump_to_last_column ... ok
[INFO] [stdout] test app::tests::test_metrics_scroll ... ok
[INFO] [stdout] test app::tests::test_select_next_prev_card ... ok
[INFO] [stdout] test app::tests::test_new_card_enters_input_mode ... ok
[INFO] [stdout] test app::tests::test_open_card_detail ... ok
[INFO] [stdout] test app::tests::test_new_card_confirm ... ok
[INFO] [stdout] test app::tests::test_show_help_defaults_to_keybindings_page ... ok
[INFO] [stdout] test app::tests::test_start_filter ... ok
[INFO] [stdout] test app::tests::test_start_tag_filter_no_tags ... ok
[INFO] [stdout] test app::tests::test_start_tag_filter_with_tags ... ok
[INFO] [stdout] test app::tests::test_tag_filter_toggle ... ok
[INFO] [stdout] test app::tests::test_navigation_clears_minor_mode ... ok
[INFO] [stdout] test app::tests::test_new_card_confirm_empty_title ... ok
[INFO] [stdout] test app::tests::test_move_card_sets_completed_integration ... ok
[INFO] [stdout] test app::tests::test_toggle_help_page_switches_and_resets_scroll ... ok
[INFO] [stdout] test app::tests::test_toggle_hidden_columns ... ok
[INFO] [stdout] test app::tests::test_toggle_hidden_refocuses_if_on_hidden ... ok
[INFO] [stdout] test app::tests::textbuffer_delete_word_trailing_spaces ... ok
[INFO] [stdout] test app::tests::textbuffer_emoji_backspace ... ok
[INFO] [stdout] test app::tests::textbuffer_emoji_operations ... ok
[INFO] [stdout] test app::tests::textbuffer_empty_cursor_at_zero ... ok
[INFO] [stdout] test app::tests::test_toggle_help_page_noop_outside_help ... ok
[INFO] [stdout] test app::tests::textbuffer_delete_word_single_word ... ok
[INFO] [stdout] test app::tests::textbuffer_backspace_in_middle ... ok
[INFO] [stdout] test app::tests::textbuffer_backspace_at_start_does_nothing ... ok
[INFO] [stdout] test app::tests::textbuffer_delete_word_removes_last_word ... ok
[INFO] [stdout] test app::tests::textbuffer_home_end_with_unicode ... ok
[INFO] [stdout] test app::tests::textbuffer_insert_at_end ... ok
[INFO] [stdout] test app::tests::textbuffer_insert_at_start ... ok
[INFO] [stdout] test app::tests::textbuffer_home_end ... ok
[INFO] [stdout] test app::tests::textbuffer_move_left_at_start_stays ... ok
[INFO] [stdout] test app::tests::textbuffer_move_left_right ... ok
[INFO] [stdout] test app::tests::textbuffer_new_cursor_at_end ... ok
[INFO] [stdout] test app::tests::test_undo_nothing_to_undo ... ok
[INFO] [stdout] test app::tests::textbuffer_unicode_insert ... ok
[INFO] [stdout] test app::tests::textbuffer_move_right_at_end_stays ... ok
[INFO] [stdout] test app::tests::textbuffer_unicode_insert_middle ... ok
[INFO] [stdout] test app::tests::tick_notification_clears_hook_flag ... ok
[INFO] [stdout] test app::tests::textbuffer_unicode_backspace ... ok
[INFO] [stdout] test app::tests::tick_notification_preserves_hook_flag_when_unexpired ... ok
[INFO] [stdout] test app::tests::tick_notification_keeps_unexpired ... ok
[INFO] [stdout] test app::tests::typing_after_tab_cycle_resets_completion ... ok
[INFO] [stdout] test app::tests::visible_card_indices_tag_filter ... ok
[INFO] [stdout] test app::tests::visible_card_indices_no_filter ... ok
[INFO] [stdout] test app::tests::visible_card_indices_text_filter ... ok
[INFO] [stdout] test app::tests::textbuffer_insert_in_middle ... ok
[INFO] [stdout] test app::tests::test_wip_limit_confirm ... ok
[INFO] [stdout] test app::tests::tick_notification_clears_expired ... ok
[INFO] [stdout] test input::keymap::tests::column_a_enters_add_prefilled ... ok
[INFO] [stdout] test input::keymap::tests::column_d_enters_remove_prefilled ... ok
[INFO] [stdout] test input::keymap::tests::column_esc_cancels ... ok
[INFO] [stdout] test input::keymap::tests::column_h_hides_focused_column ... ok
[INFO] [stdout] test input::keymap::tests::column_r_enters_rename_prefilled ... ok
[INFO] [stdout] test input::keymap::tests::confirm_n_denies ... ok
[INFO] [stdout] test input::keymap::tests::detail_b_is_noop ... ok
[INFO] [stdout] test input::keymap::tests::column_s_toggles_hidden_columns ... ok
[INFO] [stdout] test input::keymap::tests::confirm_y_confirms ... ok
[INFO] [stdout] test input::keymap::tests::detail_down_arrow_scrolls_down ... ok
[INFO] [stdout] test input::keymap::tests::detail_e_edits_external ... ok
[INFO] [stdout] test input::keymap::tests::detail_j_k_scrolls ... ok
[INFO] [stdout] test input::keymap::tests::detail_esc_closes ... ok
[INFO] [stdout] test input::keymap::tests::detail_pipe_maps_to_pipe_card ... ok
[INFO] [stdout] test input::keymap::tests::detail_p_is_noop ... ok
[INFO] [stdout] test input::keymap::tests::detail_q_closes ... ok
[INFO] [stdout] test app::tests::textbuffer_backspace_at_end ... ok
[INFO] [stdout] test input::keymap::tests::detail_t_is_noop ... ok
[INFO] [stdout] test input::keymap::tests::dot_is_noop_in_goto_mode ... ok
[INFO] [stdout] test input::keymap::tests::detail_up_arrow_scrolls_up ... ok
[INFO] [stdout] test input::keymap::tests::dot_is_noop_in_space_mode ... ok
[INFO] [stdout] test input::keymap::tests::filter_bindings_contains_overdue ... ok
[INFO] [stdout] test input::keymap::tests::filter_menu_d_starts_overdue_filter ... ok
[INFO] [stdout] test input::keymap::tests::filter_menu_s_starts_staleness_filter ... ok
[INFO] [stdout] test input::keymap::tests::filter_menu_t_starts_tag_filter ... ok
[INFO] [stdout] test input::keymap::tests::goto_c_enters_goto_column ... ok
[INFO] [stdout] test input::keymap::tests::dot_is_noop_in_column_mode ... ok
[INFO] [stdout] test input::keymap::tests::detail_tab_navigates_cards ... ok
[INFO] [stdout] test app::tests::test_undo_restores_card ... ok
[INFO] [stdout] test app::tests::wip_limit_invalid_input ... ok
[INFO] [stdout] test app::tests::test_undo_restores_to_original_column ... ok
[INFO] [stdout] test app::tests::test_toggle_blocker_blocked_unblocks ... ok
[INFO] [stdout] test app::tests::wip_limit_clear_with_zero ... ok
[INFO] [stdout] test app::tests::test_toggle_blocker_unblocked_opens_input ... ok
[INFO] [stdout] test input::keymap::tests::detail_bindings_contains_pipe ... ok
[INFO] [stdout] test input::keymap::tests::goto_column_letter_dispatches ... ok
[INFO] [stdout] test input::keymap::tests::goto_column_uppercase_is_noop ... ok
[INFO] [stdout] test input::keymap::tests::goto_column_digit_is_noop ... ok
[INFO] [stdout] test input::keymap::tests::goto_e_jumps_last ... ok
[INFO] [stdout] test app::tests::wip_limit_set_valid ... ok
[INFO] [stdout] test input::keymap::tests::goto_column_e_jumps_last_column ... ok
[INFO] [stdout] test input::keymap::tests::goto_column_esc_cancels ... ok
[INFO] [stdout] test input::keymap::tests::goto_column_g_jumps_first_column ... ok
[INFO] [stdout] test app::tests::test_undo_focuses_restored_card ... ok
[INFO] [stdout] test input::keymap::tests::filter_menu_a_starts_assignee_filter ... ok
[INFO] [stdout] test input::keymap::tests::goto_esc_cancels ... ok
[INFO] [stdout] test input::keymap::tests::goto_g_jumps_first ... ok
[INFO] [stdout] test input::keymap::tests::goto_shift_e_jumps_last_global ... ok
[INFO] [stdout] test input::keymap::tests::help_groups_all_have_at_least_one_binding ... ok
[INFO] [stdout] test input::keymap::tests::help_groups_contains_template ... ok
[INFO] [stdout] test input::keymap::tests::help_mode_down_arrow_scrolls_down ... ok
[INFO] [stdout] test input::keymap::tests::help_mode_esc_closes ... ok
[INFO] [stdout] test input::keymap::tests::help_mode_j_scrolls_down ... ok
[INFO] [stdout] test input::keymap::tests::help_mode_k_scrolls_up ... ok
[INFO] [stdout] test input::keymap::tests::help_mode_q_closes ... ok
[INFO] [stdout] test input::keymap::tests::help_mode_other_key_is_noop ... ok
[INFO] [stdout] test input::keymap::tests::help_mode_question_mark_toggles_page ... ok
[INFO] [stdout] test input::keymap::tests::help_mode_tab_toggles_page ... ok
[INFO] [stdout] test input::keymap::tests::help_mode_up_arrow_scrolls_up ... ok
[INFO] [stdout] test input::keymap::tests::input_backspace_deletes ... ok
[INFO] [stdout] test input::keymap::tests::input_char_inserts ... ok
[INFO] [stdout] test input::keymap::tests::input_ctrl_a_homes ... ok
[INFO] [stdout] test input::keymap::tests::input_ctrl_w_deletes_word ... ok
[INFO] [stdout] test input::keymap::tests::input_esc_cancels ... ok
[INFO] [stdout] test input::keymap::tests::input_enter_confirms ... ok
[INFO] [stdout] test input::keymap::tests::input_left_right_moves ... ok
[INFO] [stdout] test input::keymap::tests::metrics_mode_down_arrow_scrolls_down ... ok
[INFO] [stdout] test input::keymap::tests::input_ctrl_e_ends ... ok
[INFO] [stdout] test input::keymap::tests::metrics_mode_q_closes ... ok
[INFO] [stdout] test input::keymap::tests::metrics_mode_esc_closes ... ok
[INFO] [stdout] test input::keymap::tests::metrics_mode_j_scrolls_down ... ok
[INFO] [stdout] test input::keymap::tests::metrics_mode_up_arrow_scrolls_up ... ok
[INFO] [stdout] test input::keymap::tests::mode_bindings_goto_column_returns_bindings ... ok
[INFO] [stdout] test input::keymap::tests::metrics_mode_other_key_is_noop ... ok
[INFO] [stdout] test input::keymap::tests::normal_bindings_contains_dot ... ok
[INFO] [stdout] test input::keymap::tests::normal_bindings_contains_pipe ... ok
[INFO] [stdout] test input::keymap::tests::mode_bindings_normal_returns_empty ... ok
[INFO] [stdout] test input::keymap::tests::metrics_mode_k_scrolls_up ... ok
[INFO] [stdout] test input::keymap::tests::normal_bindings_contains_template_mode ... ok
[INFO] [stdout] test input::keymap::tests::normal_ctrl_c_quits_not_column_mode ... ok
[INFO] [stdout] test input::keymap::tests::normal_c_enters_column_mode ... ok
[INFO] [stdout] test input::keymap::tests::mode_bindings_space_returns_bindings ... ok
[INFO] [stdout] test input::keymap::tests::normal_bindings_contains_question_mark ... ok
[INFO] [stdout] test input::keymap::tests::mode_bindings_column_returns_bindings ... ok
[INFO] [stdout] test input::keymap::tests::mode_bindings_goto_returns_bindings ... ok
[INFO] [stdout] test input::keymap::tests::normal_dot_maps_to_repeat_last ... ok
[INFO] [stdout] test input::keymap::tests::mode_bindings_template_returns_bindings ... ok
[INFO] [stdout] test input::keymap::tests::normal_enter_opens_detail ... ok
[INFO] [stdout] test input::keymap::tests::normal_k_selects_prev ... ok
[INFO] [stdout] test input::keymap::tests::normal_j_selects_next ... ok
[INFO] [stdout] test input::keymap::tests::normal_l_moves_right ... ok
[INFO] [stdout] test input::keymap::tests::normal_q_quits ... ok
[INFO] [stdout] test input::keymap::tests::normal_question_mark_shows_help ... ok
[INFO] [stdout] test input::keymap::tests::normal_pipe_maps_to_pipe_card ... ok
[INFO] [stdout] test input::keymap::tests::normal_r_maps_to_reload_board ... ok
[INFO] [stdout] test input::keymap::tests::normal_shift_h_l_moves_card ... ok
[INFO] [stdout] test input::keymap::tests::normal_g_enters_goto ... ok
[INFO] [stdout] test input::keymap::tests::normal_h_moves_left ... ok
[INFO] [stdout] test input::keymap::tests::normal_slash_starts_filter ... ok
[INFO] [stdout] test input::keymap::tests::goto_unmapped_key_is_noop ... ok
[INFO] [stdout] test input::keymap::tests::goto_shift_g_jumps_first_global ... ok
[INFO] [stdout] test input::keymap::tests::normal_m_maps_to_show_metrics ... ok
[INFO] [stdout] test input::keymap::tests::normal_space_enters_space_mode ... ok
[INFO] [stdout] test input::keymap::tests::normal_t_enters_template_mode ... ok
[INFO] [stdout] test input::keymap::tests::normal_u_undoes ... ok
[INFO] [stdout] test input::keymap::tests::normal_unmapped_key_is_noop ... ok
[INFO] [stdout] test input::keymap::tests::picker_enter_confirms ... ok
[INFO] [stdout] test input::keymap::tests::space_bindings_contains_due_date ... ok
[INFO] [stdout] test input::keymap::tests::space_e_edit_external ... ok
[INFO] [stdout] test input::keymap::tests::space_d_delete_card ... ok
[INFO] [stdout] test input::keymap::tests::space_b_toggle_blocker ... ok
[INFO] [stdout] test input::keymap::tests::picker_j_k_navigates ... ok
[INFO] [stdout] test input::keymap::tests::space_p_pick_priority ... ok
[INFO] [stdout] test input::keymap::tests::space_m_move_to_column ... ok
[INFO] [stdout] test input::keymap::tests::space_shift_d_sets_due_date ... ok
[INFO] [stdout] test input::keymap::tests::template_bindings_rename_description ... ok
[INFO] [stdout] test input::keymap::tests::template_e_maps_to_template_edit ... ok
[INFO] [stdout] test input::keymap::tests::template_d_maps_to_template_delete ... ok
[INFO] [stdout] test input::keymap::tests::template_esc_is_noop ... ok
[INFO] [stdout] test input::keymap::tests::template_bindings_contains_expected_keys ... ok
[INFO] [stdout] test input::keymap::tests::template_n_maps_to_template_new ... ok
[INFO] [stdout] test input::keymap::tests::template_r_maps_to_template_rename ... ok
[INFO] [stdout] test input::keymap::tests::space_n_new_card ... ok
[INFO] [stdout] test tests::card_entry_due_date_none_omitted_from_json ... ok
[INFO] [stdout] test tests::card_entry_empty_collections_serialize_as_empty_arrays ... ok
[INFO] [stdout] test tests::card_entry_from_card_maps_all_fields ... ok
[INFO] [stdout] test tests::card_entry_serializes_to_valid_json ... ok
[INFO] [stdout] test tests::card_entry_from_card_started_completed_present ... ok
[INFO] [stdout] test tests::card_full_empty_body_serializes_as_empty_string ... ok
[INFO] [stdout] test tests::card_full_serializes_with_body_and_flattened_entry ... ok
[INFO] [stdout] test tests::card_entry_due_date_present_serializes ... ok
[INFO] [stdout] test input::keymap::tests::template_unmapped_key_is_noop ... ok
[INFO] [stdout] test tests::classify_time_exactly_thirty_days_ago ... ok
[INFO] [stdout] test tests::classify_time_sixty_days_ago ... ok
[INFO] [stdout] test tests::classify_time_three_days_ago ... ok
[INFO] [stdout] test tests::classify_time_two_days_ago ... ok
[INFO] [stdout] test tests::classify_time_yesterday ... ok
[INFO] [stdout] test tests::classify_time_eight_days_ago ... ok
[INFO] [stdout] test tests::classify_time_future_timestamp_is_today ... ok
[INFO] [stdout] test tests::classify_time_exactly_seven_days_ago ... ok
[INFO] [stdout] test tests::classify_time_thirty_one_days_ago ... ok
[INFO] [stdout] test tests::classify_time_today ... ok
[INFO] [stdout] test tests::classify_time_twenty_days_ago ... ok
[INFO] [stdout] test tests::bubble_up_days_alias_deserializes_as_stale_days ... ok
[INFO] [stdout] test tests::cmd_add_with_column_backlog_no_started ... ok
[INFO] [stdout] test tests::cmd_add_with_column_by_slug ... ok
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "JSON card",
[INFO] [stdout]   "column": "Backlog"
[INFO] [stdout] }
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "JSON card",
[INFO] [stdout]   "column": "Backlog"
[INFO] [stdout] }
[INFO] [stdout] id,title,completed,days_ago
[INFO] [stdout] 1,Archived task,2026-05-15,0
[INFO] [stdout] test tests::cmd_add_with_column_invalid_returns_error ... ok
[INFO] [stdout] test tests::cmd_add_with_column_case_insensitive_name ... ok
[INFO] [stdout] test tests::cmd_add_with_column_none_defaults_to_first ... ok
[INFO] [stdout] test tests::cmd_add_with_due_date_sets_field ... ok
[INFO] [stdout] test tests::cmd_add_with_nonexistent_template_returns_err ... ok
[INFO] [stdout] test tests::cmd_add_with_invalid_due_date_returns_error ... ok
[INFO] [stdout] test tests::cmd_add_without_due_date_field_is_none ... ok
[INFO] [stdout] test tests::cmd_add_with_column_done_sets_started_and_completed ... ok
[INFO] [stdout] test tests::cmd_add_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_add_with_column_sets_started ... ok
[INFO] [stdout] test tests::cmd_add_with_template_applies_fields ... ok
[INFO] [stdout] test tests::cmd_add_with_template_due_override ... ok
[INFO] [stdout] test tests::cmd_add_json_card_actually_created ... ok
[INFO] [stdout] test tests::cmd_add_with_template_cli_priority_overrides ... ok
[INFO] [stdout] test tests::cmd_add_with_template_cli_tags_merge ... ok
[INFO] [stdout] test tests::cmd_archive_list_csv_returns_ok ... ok
[INFO] [stdout] []
[INFO] [stdout] Archive (1 cards):
[INFO] [stdout]   1       Archived task                             completed 2026-05-15  (0 days ago)
[INFO] [stdout] Archive (1 cards):
[INFO] [stdout]   1       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA…  completed 2026-05-15  (0 days ago)
[INFO] [stdout] test tests::cmd_archive_list_no_kando_dir_returns_err ... ok
[INFO] [stdout] test tests::cmd_archive_no_action_defaults_to_list ... ok
[INFO] [stdout] test tests::cmd_archive_list_empty_archive_returns_ok ... ok
[INFO] [stdout] test tests::cmd_archive_restore_no_kando_dir_returns_err ... ok[
[INFO] [stdout]   {
[INFO] [stdout]     "id": "1",
[INFO] [stdout]     "title": "Archived task",
[INFO] [stdout]     "column": "Archive",
[INFO] [stdout]     "column_slug": "archive",
[INFO] [stdout]     "priority": "normal",
[INFO] [stdout]     "tags": [],
[INFO] [stdout]     "assignees": [],
[INFO] [stdout]     "created": "2026-05-15T02:49:51+00:00",
[INFO] [stdout]     "updated": "2026-05-15T02:49:51+00:00"
[INFO] [stdout]   }
[INFO] [stdout] ]
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "Archived task",
[INFO] [stdout]   "column": "Backlog"
[INFO] [stdout] }
[INFO] [stdout] 
[INFO] [stdout] Archive (1 cards):
[INFO] [stdout]   1       Archived task                             completed 2026-04-15  (30 days ago)
[INFO] [stdout] test tests::cmd_archive_list_falls_back_to_updated_returns_ok ... ok
[INFO] [stdout] test tests::cmd_archive_list_long_title_does_not_panic ... ok
[INFO] [stdout] test tests::cmd_archive_restore_preserves_completed_timestamp ... ok
[INFO] [stdout] test tests::cmd_archive_restore_invalid_column_returns_err ... ok
[INFO] [stdout] test tests::cmd_archive_list_json_with_cards_returns_ok ... ok
[INFO] [stdout] test tests::cmd_archive_restore_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_archive_list_uses_completed_date_returns_ok ... ok
[INFO] [stdout]   1       Plain title                               completed 2026-05-15  (0 days ago)
[INFO] [stdout]   1       Archived task                             completed 2026-05-15  (0 days ago)
[INFO] [stdout] id,title,completed,days_ago
[INFO] [stdout] 1,Archived task,2026-05-15,0
[INFO] [stdout] [
[INFO] [stdout]   {
[INFO] [stdout]     "id": "1",
[INFO] [stdout]     "title": "Archived task",
[INFO] [stdout]     "column": "Archive",
[INFO] [stdout]     "column_slug": "archive",
[INFO] [stdout]     "priority": "normal",
[INFO] [stdout]     "tags": [],
[INFO] [stdout]     "assignees": [],
[INFO] [stdout]     "created": "2026-05-15T02:49:51+00:00",
[INFO] [stdout]     "updated": "2026-05-15T02:49:51+00:00"
[INFO] [stdout]   }
[INFO] [stdout] ]
[INFO] [stdout]   1       Archived task                             completed 2026-05-15  (0 days ago)
[INFO] [stdout] test tests::cmd_archive_search_body_match_returns_ok ... ok
[INFO] [stdout] test tests::cmd_archive_restore_appends_activity_log ... ok
[INFO] [stdout] test tests::cmd_archive_list_json_empty_returns_ok ... ok
[INFO] [stdout] test tests::cmd_archive_restore_card_not_in_archive_returns_err ... ok
[INFO] [stdout] test tests::cmd_archive_restore_preserves_started_timestamp ... ok
[INFO] [stdout] test tests::cmd_archive_search_empty_query_empty_archive_returns_ok ... ok
[INFO] [stdout] test tests::cmd_archive_search_case_insensitive_returns_ok ... ok
[INFO] [stdout] test tests::cmd_archive_search_csv_returns_ok ... ok
[INFO] [stdout] Archive (1 cards):
[INFO] [stdout]   1       Archived task                             completed 2026-05-15  (0 days ago)
[INFO] [stdout] []
[INFO] [stdout] test tests::cmd_archive_search_empty_query_returns_ok ... ok
[INFO] [stdout] test tests::cmd_archive_search_json_match_returns_ok ... ok
[INFO] [stdout] test tests::cmd_col_add_after_invalid_column_returns_err ... ok
[INFO] [stdout] test tests::cmd_archive_restore_saves_board ... ok
[INFO] [stdout] test tests::cmd_archive_restore_to_custom_column_moves_card ... ok
[INFO] [stdout] test tests::cmd_archive_search_no_match_returns_ok ... ok
[INFO] [stdout] test tests::cmd_col_add_appends_activity_log ... ok
[INFO] [stdout] test tests::cmd_col_add_creates_column_dir_on_disk ... ok
[INFO] [stdout] test tests::cmd_archive_search_no_kando_dir_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_add_no_kando_dir_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_add_empty_name_returns_err ... ok
[INFO] [stdout] test tests::cmd_archive_restore_to_archive_column_returns_err ... ok
[INFO] [stdout]   1       Archived task                             completed 2026-05-15  (0 days ago)
[INFO] [stdout] {
[INFO] [stdout]   "name": "Review",
[INFO] [stdout]   "slug": "review"
[INFO] [stdout] }
[INFO] [stdout] {
[INFO] [stdout]   "name": "Backlog",
[INFO] [stdout]   "slug": "backlog",
[INFO] [stdout]   "hidden": true
[INFO] [stdout] }
[INFO] [stdout] position,name,slug,cards,wip_limit,hidden
[INFO] [stdout] 1,Backlog,backlog,0,,false
[INFO] [stdout] 2,In Progress,in-progress,0,3,false
[INFO] [stdout] 3,Done,done,0,,false
[INFO] [stdout] 4,Archive,archive,0,,true
[INFO] [stdout] test tests::cmd_archive_search_json_no_match_returns_ok ... ok
[INFO] [stdout] test tests::cmd_archive_list_with_cards_returns_ok ... ok
[INFO] [stdout] test tests::cmd_archive_search_title_match_returns_ok ... ok
[INFO] [stdout] test tests::cmd_col_add_orders_normalized_after_insert ... ok
[INFO] [stdout] test tests::cmd_col_add_after_named_column ... ok
[INFO] [stdout] test tests::cmd_col_add_saves_board_persistently ... ok
[INFO] [stdout] test tests::cmd_col_cli_no_action_defaults_to_list ... ok
[INFO] [stdout] test tests::cmd_col_add_archive_name_gets_different_slug ... ok
[INFO] [stdout] test tests::cmd_col_add_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_col_add_inserted_before_hidden_column ... ok
[INFO] [stdout] test tests::cmd_col_add_happy_path_column_created ... ok
[INFO] [stdout] test tests::cmd_col_list_csv_returns_ok ... ok
[INFO] [stdout] [
[INFO] [stdout]   {
[INFO] [stdout]     "position": 1,
[INFO] [stdout]     "name": "Backlog",
[INFO] [stdout]     "slug": "backlog",
[INFO] [stdout]     "cards": 0,
[INFO] [stdout]     "hidden": false
[INFO] [stdout]   },
[INFO] [stdout]   {
[INFO] [stdout]     "position": 2,
[INFO] [stdout]     "name": "In Progress",
[INFO] [stdout]     "slug": "in-progress",
[INFO] [stdout]     "cards": 0,
[INFO] [stdout]     "wip_limit": 3,
[INFO] [stdout]     "hidden": false
[INFO] [stdout]   },
[INFO] [stdout]   {
[INFO] [stdout]     "position": 3,
[INFO] [stdout]     "name": "Done",
[INFO] [stdout]     "slug": "done",
[INFO] [stdout]     "cards": 0,
[INFO] [stdout]     "hidden": false
[INFO] [stdout]   },
[INFO] [stdout]   {
[INFO] [stdout]     "position": 4,
[INFO] [stdout]     "name": "Archive",
[INFO] [stdout]     "slug": "archive",
[INFO] [stdout]     "cards": 0,
[INFO] [stdout]     "hidden": true
[INFO] [stdout]   }
[INFO] [stdout] ]
[INFO] [stdout] test tests::cmd_archive_restore_to_done_moves_card ... ok
[INFO] [stdout] test tests::cmd_col_add_slug_generated_from_name ... ok
[INFO] [stdout] {
[INFO] [stdout]   "name": "Backlog",
[INFO] [stdout]   "slug": "backlog",
[INFO] [stdout]   "position": 2
[INFO] [stdout] }
[INFO] [stdout] test tests::cmd_col_list_no_kando_dir_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_move_no_kando_dir_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_hide_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_col_move_numeric_position_0_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_move_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_col_move_nonexistent_column_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_move_invalid_string_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_move_numeric_position_exceeds_len_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_move_right_already_rightmost_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_move_cards_preserved_after_reorder ... ok
[INFO] [stdout] test tests::cmd_col_list_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_col_list_returns_ok_with_board ... ok
[INFO] [stdout] test tests::cmd_col_move_same_position_is_noop ... ok
[INFO] [stdout] test tests::cmd_col_move_appends_activity_log ... ok
[INFO] [stdout] test tests::cmd_col_move_last_happy_path ... ok
[INFO] [stdout] test tests::cmd_col_move_left_happy_path ... ok
[INFO] [stdout] test tests::cmd_col_move_orders_assigned_by_vec_position ... ok
[INFO] [stdout] test tests::cmd_col_add_duplicate_name_gets_unique_slug ... ok
[INFO] [stdout] test tests::cmd_col_move_left_already_leftmost_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_move_right_happy_path ... ok
[INFO] [stdout] test tests::cmd_col_move_first_happy_path ... ok
[INFO] [stdout] test tests::cmd_col_move_numeric_position_valid ... ok
[INFO] [stdout] test tests::cmd_col_remove_nonempty_without_move_to_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_rename_appends_activity_log ... ok
[INFO] [stdout] test tests::cmd_col_rename_empty_new_name_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_remove_no_kando_dir_returns_err ... ok
[INFO] [stdout] {
[INFO] [stdout]   "old_name": "Backlog",
[INFO] [stdout]   "new_name": "Todo",
[INFO] [stdout]   "old_slug": "backlog",
[INFO] [stdout]   "new_slug": "todo"
[INFO] [stdout] }
[INFO] [stdout] test tests::cmd_col_remove_nonexistent_column_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_rename_no_kando_dir_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_remove_move_to_same_column_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_rename_duplicate_slug_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_remove_appends_activity_log ... ok
[INFO] [stdout] test tests::cmd_col_remove_empty_column_succeeds ... ok
[INFO] [stdout] test tests::cmd_col_remove_archive_reserved_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_rename_name_derived_from_slug ... ok
[INFO] [stdout] test tests::cmd_col_remove_move_to_invalid_column_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_move_saves_board_persistently ... ok
[INFO] [stdout] test tests::cmd_col_remove_last_column_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_rename_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_col_remove_orders_normalized_after_remove ... ok
[INFO] [stdout] test tests::cmd_col_rename_nonexistent_column_returns_err ... ok
[INFO] [stdout] test tests::cmd_col_rename_happy_path_name_updated ... ok
[INFO] [stdout] test tests::cmd_col_remove_empty_column_dir_deleted ... ok
[INFO] [stdout] test tests::cmd_col_remove_with_move_to_drains_cards ... ok
[INFO] [stdout] test tests::cmd_config_archive_after_days_default_is_zero ... ok
[INFO] [stdout] test tests::cmd_col_rename_same_name_as_self_is_allowed ... ok
[INFO] [stdout] test tests::cmd_config_auto_close_target_invalid_column_returns_err ... ok
[INFO] [stdout] test tests::cmd_config_archive_after_days_persists_value ... ok
[INFO] [stdout] test tests::cmd_config_archive_after_days_no_kando_dir_returns_err ... ok
[INFO] [stdout] {
[INFO] [stdout]   "name": "Test",
[INFO] [stdout]   "nerd_font": false,
[INFO] [stdout]   "policies": {
[INFO] [stdout]     "auto_close_days": 30,
[INFO] [stdout]     "auto_close_target": "archive",
[INFO] [stdout]     "stale_days": 7,
[INFO] [stdout]     "trash_purge_days": 30,
[INFO] [stdout]     "archive_after_days": 0
[INFO] [stdout]   },
[INFO] [stdout]   "wip_limits": {
[INFO] [stdout]     "in-progress": 3
[INFO] [stdout]   }
[INFO] [stdout] }
[INFO] [stdout] test tests::cmd_config_archive_after_days_zero_disables ... ok
[INFO] [stdout] test tests::cmd_config_show_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_config_show_returns_ok ... ok
[INFO] [stdout] test tests::cmd_col_rename_slug_changes ... ok
[INFO] [stdout] test tests::cmd_config_nerd_font_on_persists ... ok
[INFO] [stdout] test tests::cmd_config_stale_days_persists ... ok
[INFO] [stdout] test tests::cmd_col_rename_saves_board_persistently ... ok
[INFO] [stdout] {
[INFO] [stdout]   "name": "Backlog",
[INFO] [stdout]   "slug": "backlog",
[INFO] [stdout]   "hidden": false
[INFO] [stdout] }
[INFO] [stdout] [
[INFO] [stdout]   {
[INFO] [stdout]     "name": "board_exists",
[INFO] [stdout]     "passed": false,
[INFO] [stdout]     "message": "Board not found",
[INFO] [stdout]     "hint": "Run: kando init"
[INFO] [stdout]   }
[INFO] [stdout] ]
[INFO] [stdout] [
[INFO] [stdout]   {
[INFO] [stdout]     "name": "board_exists",
[INFO] [stdout]     "passed": true,
[INFO] [stdout]     "message": "Board found at /tmp/.tmpSO6qlP/.kando"
[INFO] [stdout]   },
[INFO] [stdout]   {
[INFO] [stdout]     "name": "board_config",
[INFO] [stdout]     "passed": true,
[INFO] [stdout]     "message": "Board config valid (name: \"Test\")"
[INFO] [stdout]   },
[INFO] [stdout]   {
[INFO] [stdout]     "name": "columns",
[INFO] [stdout]     "passed": true,
[INFO] [stdout]     "message": "4 columns OK"
[INFO] [stdout]   },
[INFO] [stdout]   {
[INFO] [stdout]     "name": "cards",
[INFO] [stdout]     "passed": true,
[INFO] [stdout]     "message": "0 cards loaded"
[INFO] [stdout]   },
[INFO] [stdout]   {
[INFO] [stdout]     "name": "sync",
[INFO] [stdout]     "passed": true,
[INFO] [stdout]     "message": "Not configured",
[INFO] [stdout]     "hint": "Run kando init --git to enable"
[INFO] [stdout]   }
[INFO] [stdout] ]
[INFO] [stdout] test tests::cmd_col_show_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_config_auto_close_target_valid_column_persists ... ok
[INFO] [stdout] test tests::cmd_delete_activity_log_written ... ok
[INFO] [stdout] test tests::cmd_config_trash_purge_days_persists ... ok
[INFO] [stdout] test tests::cmd_config_auto_close_days_persists ... ok
[INFO] [stdout] test tests::cmd_delete_card_not_found_returns_err ... ok
[INFO] [stdout] test tests::cmd_config_archive_after_days_overwrite_works ... ok
[INFO] [stdout] test tests::cmd_doctor_json_no_board_returns_nonzero ... ok
[INFO] [stdout] test tests::cmd_config_nerd_font_off_persists ... ok
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "Test card",
[INFO] [stdout]   "from": "Backlog"
[INFO] [stdout] }
[INFO] [stdout] test tests::cmd_delete_card_moved_to_trash_not_deleted ... ok
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "Test card",
[INFO] [stdout]   "from": "Backlog"
[INFO] [stdout] }
[INFO] [stdout] test tests::cmd_doctor_json_healthy_board_returns_zero ... ok
[INFO] [stdout] test tests::cmd_delete_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_delete_json_card_not_found_returns_err ... ok
[INFO] [stdout] test tests::cmd_edit_card_not_found_returns_err ... ok
[INFO] [stdout] test tests::cmd_delete_happy_path_card_removed_from_board ... ok
[INFO] [stdout] test tests::cmd_delete_json_card_actually_removed ... ok
[INFO] [stdout] test tests::cmd_edit_blocked_sets_flag ... ok
[INFO] [stdout] test tests::cmd_edit_due_counts_as_has_flags ... ok
[INFO] [stdout] test tests::cmd_doctor_human_healthy_board_returns_zero ... ok
[INFO] [stdout] test tests::cmd_edit_due_date_clear_removes_field ... ok
[INFO] [stdout] test tests::cmd_edit_json_no_flags_bails ... ok
[INFO] [stdout] test tests::cmd_edit_priority_change ... ok
[INFO] [stdout] id,column,age,priority,title,tags,assignees,blocked,due
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "Test card"
[INFO] [stdout] }
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "New Title"
[INFO] [stdout] }
[INFO] [stdout] test tests::cmd_edit_due_date_sets_field ... ok
[INFO] [stdout] test tests::cmd_edit_tag_add_normalizes_to_lowercase ... ok
[INFO] [stdout] test tests::cmd_list_csv_empty_board_returns_ok ... ok
[INFO] [stdout] test tests::cmd_edit_title_change ... ok
[INFO] [stdout] test tests::cmd_edit_tag_remove_normalizes_to_lowercase ... ok
[INFO] [stdout] [
[INFO] [stdout]   {
[INFO] [stdout]     "id": "1",
[INFO] [stdout]     "title": "Test card",
[INFO] [stdout]     "column": "Backlog",
[INFO] [stdout]     "column_slug": "backlog",
[INFO] [stdout]     "priority": "normal",
[INFO] [stdout]     "tags": [
[INFO] [stdout]       "bug"
[INFO] [stdout]     ],
[INFO] [stdout]     "assignees": [
[INFO] [stdout]       "alice"
[INFO] [stdout]     ],
[INFO] [stdout]     "created": "2026-05-15T02:49:51+00:00",
[INFO] [stdout]     "updated": "2026-05-15T02:49:51+00:00"
[INFO] [stdout]   }
[INFO] [stdout] ]
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "Test card"
[INFO] [stdout] }
[INFO] [stdout] []
[INFO] [stdout] id,column,age,priority,title,tags,assignees,blocked,due
[INFO] [stdout] 1,Backlog,new,normal,Test card,bug,alice,false,
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "Test card"
[INFO] [stdout] }
[INFO] [stdout] test tests::cmd_edit_due_date_invalid_returns_error ... ok
[INFO] [stdout] test tests::cmd_list_json_column_filter_returns_ok ... ok
[INFO] [stdout] [
[INFO] [stdout]   {
[INFO] [stdout]     "id": "1",
[INFO] [stdout]     "title": "Test card",
[INFO] [stdout]     "column": "Backlog",
[INFO] [stdout]     "column_slug": "backlog",
[INFO] [stdout]     "priority": "normal",
[INFO] [stdout]     "tags": [
[INFO] [stdout]       "bug"
[INFO] [stdout]     ],
[INFO] [stdout]     "assignees": [
[INFO] [stdout]       "alice"
[INFO] [stdout]     ],
[INFO] [stdout]     "created": "2026-05-15T02:49:51+00:00",
[INFO] [stdout]     "updated": "2026-05-15T02:49:51+00:00"
[INFO] [stdout]   }
[INFO] [stdout] ]
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "New Title"
[INFO] [stdout] }
[INFO] [stdout] test tests::cmd_edit_json_tag_add_returns_ok ... ok
[INFO] [stdout] [
[INFO] [stdout]   {
[INFO] [stdout]     "id": "1",
[INFO] [stdout]     "title": "Test card",
[INFO] [stdout]     "column": "Backlog",
[INFO] [stdout]     "column_slug": "backlog",
[INFO] [stdout]     "priority": "normal",
[INFO] [stdout]     "tags": [
[INFO] [stdout]       "bug"
[INFO] [stdout]     ],
[INFO] [stdout]     "assignees": [
[INFO] [stdout]       "alice"
[INFO] [stdout]     ],
[INFO] [stdout]     "created": "2026-05-15T02:49:51+00:00",
[INFO] [stdout]     "updated": "2026-05-15T02:49:51+00:00"
[INFO] [stdout]   }
[INFO] [stdout] ]
[INFO] [stdout] test tests::cmd_list_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_edit_remove_nonexistent_tag_succeeds ... ok
[INFO] [stdout] test tests::cmd_edit_json_blocked_returns_ok ... ok
[INFO] [stdout] test tests::cmd_edit_json_priority_returns_ok ... ok
[INFO] [stdout] test tests::cmd_log_human_invalid_ts_entries_skipped ... ok
[INFO] [stdout] test tests::cmd_list_json_tag_filter_returns_ok ... ok
[INFO] [stdout] test tests::cmd_edit_json_title_returns_ok ... ok
[INFO] [stdout] test tests::cmd_log_empty_activity_log_returns_ok ... ok
[INFO] [stdout] test tests::cmd_list_csv_returns_ok ... ok
[INFO] [stdout] test tests::cmd_edit_add_existing_tag_is_idempotent ... ok
[INFO] [stdout] test tests::cmd_edit_unblocked_clears_flag ... ok
[INFO] [stdout] []
[INFO] [stdout] test tests::cmd_log_json_no_activity_log_returns_empty_array ... ok
[INFO] [stdout] {"action":"create","id":"1","title":"Test","ts":"2025-06-01T10:00:00Z"}
[INFO] [stdout] test tests::cmd_log_stream_mode_returns_ok ... ok
[INFO] [stdout] test tests::cmd_log_stream_no_activity_log_returns_ok ... ok
[INFO] [stdout] not json
[INFO] [stdout] {also bad}
[INFO] [stdout] test tests::cmd_log_stream_with_malformed_lines_passes_through ... ok
[INFO] [stdout] test tests::cmd_edit_json_title_actually_changed ... ok
[INFO] [stdout] []
[INFO] [stdout] Older
[INFO] [stdout]   2025-06-01 10:00  Created "Test" in Backlog
[INFO] [stdout] test tests::cmd_log_json_empty_file_returns_empty_array ... ok
[INFO] [stdout] test tests::cmd_log_human_mode_returns_ok ... ok
[INFO] [stdout] {"action":"create","id":"1","title":"Test","ts":"2025-06-01T10:00:00Z"}
[INFO] [stdout] test tests::cmd_log_stream_takes_precedence_over_json ... ok
[INFO] [stdout] test tests::cmd_log_unreadable_file_returns_err ... ok
[INFO] [stdout] {
[INFO] [stdout]   "wip_per_column": [
[INFO] [stdout]     {
[INFO] [stdout]       "name": "Backlog",
[INFO] [stdout]       "count": 0,
[INFO] [stdout]       "wip_limit": null,
[INFO] [stdout]       "is_active": false
[INFO] [stdout]     },
[INFO] [stdout]     {
[INFO] [stdout]       "name": "In Progress",
[INFO] [stdout]       "count": 0,
[INFO] [stdout]       "wip_limit": 3,
[INFO] [stdout]       "is_active": true
[INFO] [stdout]     },
[INFO] [stdout]     {
[INFO] [stdout]       "name": "Done",
[INFO] [stdout]       "count": 0,
[INFO] [stdout]       "wip_limit": null,
[INFO] [stdout]       "is_active": false
[INFO] [stdout]     },
[INFO] [stdout]     {
[INFO] [stdout]       "name": "Archive",
[INFO] [stdout]       "count": 0,
[INFO] [stdout]       "wip_limit": null,
[INFO] [stdout]       "is_active": false
[INFO] [stdout]     }
[INFO] [stdout]   ],
[INFO] [stdout]   "active_wip_total": 0,
[INFO] [stdout]   "blocked_count": 0,
[INFO] [stdout]   "blocked_pct": 0.0,
[INFO] [stdout]   "throughput_per_week": [],
[INFO] [stdout]   "throughput_stddev": null,
[INFO] [stdout]   "arrival_per_week": [],
[INFO] [stdout]   "time_stats": null,
[INFO] [stdout]   "priority_breakdown": [],
[INFO] [stdout]   "total_completed": 0,
[INFO] [stdout]   "since": "2026-04-17T02:49:51.560458768Z",
[INFO] [stdout]   "work_item_age": null,
[INFO] [stdout]   "stage_times": null
[INFO] [stdout] }
[INFO] [stdout] [
[INFO] [stdout]   {
[INFO] [stdout]     "action": "create",
[INFO] [stdout]     "id": "1",
[INFO] [stdout]     "title": "Test",
[INFO] [stdout]     "ts": "2025-06-01T10:00:00Z"
[INFO] [stdout]   }
[INFO] [stdout] ]
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "",
[INFO] [stdout]   "from": "Backlog",
[INFO] [stdout]   "to": "In Progress"
[INFO] [stdout] }
[INFO] [stdout] test tests::cmd_metrics_csv_returns_ok ... ok
[INFO] [stdout] test tests::cmd_edit_blocked_and_unblocked_both_true_unblocked_wins ... ok
[INFO] [stdout] test tests::cmd_metrics_json_with_weeks_returns_ok ... ok
[INFO] [stdout] test tests::cmd_log_json_mode_returns_ok ... ok
[INFO] [stdout] test tests::cmd_log_valid_jsonl_returns_ok ... ok
[INFO] [stdout] test tests::cmd_list_overdue_filter_excludes_non_overdue ... ok
[INFO] [stdout] test tests::cmd_move_json_card_actually_moved ... ok
[INFO] [stdout] Older
[INFO] [stdout]   2025-06-01 10:00  Created "Test" in 
[INFO] [stdout] test tests::cmd_log_nested_cwd_finds_kando_in_ancestor ... ok[
[INFO] [stdout]   {
[INFO] [stdout]     "action": "create",
[INFO] [stdout]     "id": "1",
[INFO] [stdout]     "title": "Test",
[INFO] [stdout]     "ts": "2025-06-01T10:00:00Z"
[INFO] [stdout]   }
[INFO] [stdout] ]
[INFO] [stdout] 
[INFO] [stdout] test tests::cmd_log_no_activity_log_returns_ok ... ok
[INFO] [stdout] test tests::cmd_log_no_trailing_newline_returns_ok ... ok
[INFO] [stdout] test tests::cmd_log_malformed_lines_skipped ... ok
[INFO] [stdout] test tests::cmd_log_non_utf8_content_returns_err ... ok
[INFO] [stdout] test tests::cmd_show_card_not_found_returns_err ... ok
[INFO] [stdout] ---
[INFO] [stdout] id = "1"
[INFO] [stdout] title = "In Progress card"
[INFO] [stdout] created = "2026-05-15T02:49:51Z"
[INFO] [stdout] updated = "2026-05-15T02:49:51Z"
[INFO] [stdout] priority = "normal"
[INFO] [stdout] tags = []
[INFO] [stdout] ---
[INFO] [stdout] 
[INFO] [stdout] <!-- add body content here -->
[INFO] [stdout] test tests::cmd_log_stream_empty_file_returns_ok ... ok
[INFO] [stdout] test tests::cmd_show_no_kando_dir_returns_err ... ok
[INFO] [stdout] test tests::cmd_move_json_card_not_found_returns_err ... ok
[INFO] [stdout] test tests::cmd_show_json_card_not_found_returns_err ... ok
[INFO] [stdout] ---
[INFO] [stdout] id = "1"
[INFO] [stdout] title = "Unicode card"
[INFO] [stdout] created = "2026-05-15T02:49:51Z"
[INFO] [stdout] updated = "2026-05-15T02:49:51Z"
[INFO] [stdout] priority = "normal"
[INFO] [stdout] tags = []
[INFO] [stdout] ---
[INFO] [stdout] 
[INFO] [stdout] Line 1
[INFO] [stdout] Line 2
[INFO] [stdout] Emoji: 🚀🦀
[INFO] [stdout] CJK: 日本語
[INFO] [stdout] Arabic: مرحبا
[INFO] [stdout] ---
[INFO] [stdout] id = "1"
[INFO] [stdout] title = "My pipe card"
[INFO] [stdout] created = "2026-05-15T02:49:51Z"
[INFO] [stdout] updated = "2026-05-15T02:49:51Z"
[INFO] [stdout] priority = "normal"
[INFO] [stdout] tags = []
[INFO] [stdout] ---
[INFO] [stdout] 
[INFO] [stdout] Some description for piping.
[INFO] [stdout] test tests::cmd_show_card_with_unicode_and_multiline_body ... ok
[INFO] [stdout] test tests::cmd_show_card_in_non_first_column ... ok
[INFO] [stdout] tag,count
[INFO] [stdout] ---
[INFO] [stdout] id = "1"
[INFO] [stdout] title = "No body"
[INFO] [stdout] created = "2026-05-15T02:49:51Z"
[INFO] [stdout] updated = "2026-05-15T02:49:51Z"
[INFO] [stdout] priority = "normal"
[INFO] [stdout] tags = []
[INFO] [stdout] ---
[INFO] [stdout] 
[INFO] [stdout] <!-- add body content here -->
[INFO] [stdout] test tests::cmd_tags_csv_empty_board_returns_ok ... ok
[INFO] [stdout] tag,count
[INFO] [stdout] bug,1
[INFO] [stdout] test tests::cmd_log_no_kando_dir_returns_err ... ok
[INFO] [stdout] ---
[INFO] [stdout] id = "10"
[INFO] [stdout] title = "Card ten"
[INFO] [stdout] created = "2026-05-15T02:49:51Z"
[INFO] [stdout] updated = "2026-05-15T02:49:51Z"
[INFO] [stdout] priority = "normal"
[INFO] [stdout] tags = []
[INFO] [stdout] ---
[INFO] [stdout] 
[INFO] [stdout] <!-- add body content here -->
[INFO] [stdout] test tests::cmd_list_json_with_card_returns_ok ... ok
[INFO] [stdout] test tests::cmd_show_card_with_empty_body ... ok
[INFO] [stdout] test tests::cmd_show_file_missing_from_disk ... ok
[INFO] [stdout] {
[INFO] [stdout]   "wip_per_column": [
[INFO] [stdout]     {
[INFO] [stdout]       "name": "Backlog",
[INFO] [stdout]       "count": 0,
[INFO] [stdout]       "wip_limit": null,
[INFO] [stdout]       "is_active": false
[INFO] [stdout]     },
[INFO] [stdout]     {
[INFO] [stdout]       "name": "In Progress",
[INFO] [stdout]       "count": 0,
[INFO] [stdout]       "wip_limit": 3,
[INFO] [stdout]       "is_active": true
[INFO] [stdout]     },
[INFO] [stdout]     {
[INFO] [stdout]       "name": "Done",
[INFO] [stdout]       "count": 0,
[INFO] [stdout]       "wip_limit": null,
[INFO] [stdout]       "is_active": false
[INFO] [stdout]     },
[INFO] [stdout]     {
[INFO] [stdout]       "name": "Archive",
[INFO] [stdout]       "count": 0,
[INFO] [stdout]       "wip_limit": null,
[INFO] [stdout]       "is_active": false
[INFO] [stdout]     }
[INFO] [stdout]   ],
[INFO] [stdout]   "active_wip_total": 0,
[INFO] [stdout]   "blocked_count": 0,
[INFO] [stdout]   "blocked_pct": 0.0,
[INFO] [stdout]   "throughput_per_week": [],
[INFO] [stdout]   "throughput_stddev": null,
[INFO] [stdout]   "arrival_per_week": [],
[INFO] [stdout]   "time_stats": null,
[INFO] [stdout]   "priority_breakdown": [],
[INFO] [stdout]   "total_completed": 0,
[INFO] [stdout]   "since": "2026-05-15T02:49:51Z",
[INFO] [stdout]   "work_item_age": null,
[INFO] [stdout]   "stage_times": null
[INFO] [stdout] }
[INFO] [stdout] []
[INFO] [stdout] []
[INFO] [stdout] test tests::cmd_template_list_empty_returns_ok ... ok
[INFO] [stdout] [
[INFO] [stdout]   {
[INFO] [stdout]     "slug": "bug-report",
[INFO] [stdout]     "name": "Bug Report",
[INFO] [stdout]     "priority": "normal",
[INFO] [stdout]     "tags": [],
[INFO] [stdout]     "assignees": []
[INFO] [stdout]   }
[INFO] [stdout] ]
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "",
[INFO] [stdout]   "from": "Backlog",
[INFO] [stdout]   "to": "In Progress"
[INFO] [stdout] }
[INFO] [stdout] [
[INFO] [stdout]   {
[INFO] [stdout]     "tag": "bug",
[INFO] [stdout]     "count": 1
[INFO] [stdout]   }
[INFO] [stdout] ]
[INFO] [stdout] test tests::cmd_template_list_json_empty_returns_ok ... ok
[INFO] [stdout] test tests::cmd_show_prints_card_file_contents ... ok
[INFO] [stdout] test tests::cmd_metrics_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_tags_csv_returns_ok ... ok
[INFO] [stdout] test tests::cmd_move_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_template_edit_nonexistent_returns_err ... ok
[INFO] [stdout] test tests::cmd_tags_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_tags_json_with_tags_returns_ok ... ok
[INFO] [stdout] test tests::cmd_show_disambiguates_prefix_matches ... ok
[INFO] [stdout] slug,name,priority,tags,assignees,blocked,due_offset_days
[INFO] [stdout] id,title,from_column,deleted
[INFO] [stdout] test tests::cmd_move_json_column_not_found_returns_err ... ok
[INFO] [stdout] test tests::cmd_trash_csv_empty_returns_ok ... ok
[INFO] [stdout] test tests::column_entry_skips_wip_limit_when_none ... ok
[INFO] [stdout] test tests::config_json_serializes_correctly ... ok
[INFO] [stdout] {
[INFO] [stdout]   "name": "Bug",
[INFO] [stdout]   "slug": "bug"
[INFO] [stdout] }
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "Test card",
[INFO] [stdout]   "column": "Backlog",
[INFO] [stdout]   "column_slug": "backlog",
[INFO] [stdout]   "priority": "normal",
[INFO] [stdout]   "tags": [
[INFO] [stdout]     "bug"
[INFO] [stdout]   ],
[INFO] [stdout]   "assignees": [
[INFO] [stdout]     "alice"
[INFO] [stdout]   ],
[INFO] [stdout]   "created": "2026-05-15T02:49:51+00:00",
[INFO] [stdout]   "updated": "2026-05-15T02:49:51+00:00",
[INFO] [stdout]   "body": "<!-- add body content here -->"
[INFO] [stdout] }
[INFO] [stdout] {
[INFO] [stdout]   "purged": 0
[INFO] [stdout] }
[INFO] [stdout] {
[INFO] [stdout]   "configured": false
[INFO] [stdout] }
[INFO] [stdout] []
[INFO] [stdout] test tests::doctor_check_serializes_with_hint ... ok
[INFO] [stdout] test tests::cmd_template_remove_nonexistent_returns_err ... ok
[INFO] [stdout] test tests::cmd_template_remove_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_template_list_with_templates_returns_ok ... ok
[INFO] [stdout] test tests::cmd_template_list_json_with_templates_returns_ok ... ok
[INFO] [stdout] test tests::cmd_show_json_returns_ok ... ok
[INFO] [stdout] test tests::cmd_template_list_csv_empty_returns_ok ... ok
[INFO] [stdout] test tests::cmd_trash_purge_json_empty_returns_ok ... ok
[INFO] [stdout] test tests::cmd_sync_status_json_returns_ok ... ok
[INFO] [stdout] test tests::column_entry_serializes_correctly ... ok
[INFO] [stdout] test tests::cmd_show_card_id_with_leading_trailing_whitespace_returns_err ... ok
[INFO] [stdout] test tests::cmd_trash_list_json_empty_returns_ok ... ok
[INFO] [stdout] test tests::doctor_check_skips_hint_when_none ... ok
[INFO] [stdout] test tests::format_follow_line_invalid_json_returns_raw ... ok
[INFO] [stdout] test tests::format_follow_line_invalid_ts_omits_time ... ok
[INFO] [stdout] test tests::format_follow_line_missing_ts_omits_time ... ok
[INFO] [stdout] test tests::format_log_entry_archive ... ok
[INFO] [stdout] test tests::format_log_entry_auto_close ... ok
[INFO] [stdout] test tests::format_log_entry_assignees ... ok
[INFO] [stdout] test tests::format_log_entry_blocker_missing_blocked_field ... ok
[INFO] [stdout] test tests::format_log_entry_blocker_blocked ... ok
[INFO] [stdout] test tests::format_log_entry_col_add ... ok
[INFO] [stdout] test tests::format_log_entry_col_hide ... ok
[INFO] [stdout] test tests::format_log_entry_col_move ... ok
[INFO] [stdout] test tests::format_log_entry_delete ... ok
[INFO] [stdout] [
[INFO] [stdout]   {
[INFO] [stdout]     "id": "1",
[INFO] [stdout]     "deleted": "2026-05-15T02:49:51Z",
[INFO] [stdout]     "from_column": "backlog",
[INFO] [stdout]     "title": "Test card"
[INFO] [stdout]   }
[INFO] [stdout] ]
[INFO] [stdout] test tests::format_log_entry_blocker_unblocked ... ok
[INFO] [stdout] test tests::format_log_entry_edit ... ok
[INFO] [stdout] test tests::format_log_entry_col_rename_legacy ... ok
[INFO] [stdout] test tests::format_log_entry_missing_action ... ok
[INFO] [stdout] test tests::format_log_entry_create ... ok
[INFO] [stdout] test tests::format_log_entry_col_show ... ok
[INFO] [stdout] test tests::format_log_entry_col_rename ... ok
[INFO] [stdout] test tests::format_follow_line_valid_json ... ok
[INFO] [stdout] id,title,from_column,deleted
[INFO] [stdout] 1,Test card,backlog,2026-05-15T02:49:51Z
[INFO] [stdout] {
[INFO] [stdout]   "id": "1",
[INFO] [stdout]   "title": "Test card",
[INFO] [stdout]   "column": "Backlog"
[INFO] [stdout] }
[INFO] [stdout] test tests::format_log_entry_col_remove ... ok
[INFO] [stdout] test tests::cmd_trash_list_json_with_entries_returns_ok ... ok
[INFO] [stdout] test tests::format_time_in_bucket_older_shows_full_date ... ok
[INFO] [stdout] test tests::format_time_in_bucket_last_week_shows_day_hhmm ... ok
[INFO] [stdout] test tests::format_log_entry_missing_title ... ok
[INFO] [stdout] test tests::format_log_entry_unknown_action ... ok
[INFO] [stdout] test tests::format_log_entry_priority ... ok
[INFO] [stdout] test tests::format_log_entry_move ... ok
[INFO] [stdout] test tests::format_time_in_bucket_last_month_shows_mon_dd_hhmm ... ok
[INFO] [stdout] test tests::format_log_entry_restore ... ok
[INFO] [stdout] test tests::format_log_entry_tags ... ok
[INFO] [stdout] test tests::cmd_template_remove_existing_returns_ok ... ok
[INFO] [stdout] test tests::format_log_entry_unarchive ... ok
[INFO] [stdout] test tests::cmd_trash_csv_returns_ok ... ok
[INFO] [stdout] test tests::cmd_trash_restore_json_returns_ok ... ok
[INFO] [stdout] test tests::format_time_in_bucket_today_shows_hhmm ... ok
[INFO] [stdout] test tests::format_time_in_bucket_yesterday_shows_hhmm ... ok
[INFO] [stdout] test tests::mutation_result_skips_none_fields ... ok
[INFO] [stdout] test tests::sync_status_json_not_configured_skips_optional ... ok
[INFO] [stdout] test tests::write_csv_row_escapes_carriage_return ... ok
[INFO] [stdout] test tests::write_csv_row_escapes_newlines ... ok
[INFO] [stdout] test tests::write_csv_row_escapes_quotes ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_blocked_beats_overdue_with_stale ... ok
[INFO] [stdout] test tests::write_csv_row_escapes_commas ... ok
[INFO] [stdout] test tests::tag_entry_serializes_correctly ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_focused_stale_is_stale_color ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_focused_very_stale_is_very_stale_color ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_new_card_is_green ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_overdue_beats_staleness ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_focused_fresh_is_card_border ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_stale_always_shows_semantic_color ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_overdue_beats_new_card ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_unfocused_stale_returns_stale_color ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_very_stale_always_shows_semantic_color ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_unfocused_very_stale_returns_very_stale_color ... ok
[INFO] [stdout] test ui::board_view::tests::fit_icons_after_left_drop_remaining_order_preserved ... ok
[INFO] [stdout] test ui::board_view::tests::fit_icons_all_fit_returns_all ... ok
[INFO] [stdout] test tests::resolve_col_cli_not_found_returns_err_with_hint ... ok
[INFO] [stdout] test tests::resolve_col_cli_name_case_insensitive ... ok
[INFO] [stdout] test tests::write_csv_row_plain_fields ... ok
[INFO] [stdout] test tests::resolve_col_cli_exact_slug_match ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_staleness_beats_new_card ... ok
[INFO] [stdout] test tests::mutation_result_includes_from_to_when_set ... ok
[INFO] [stdout] test ui::board_view::tests::is_new_card_created_yesterday_is_false ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_blocked_wins_over_all ... ok
[INFO] [stdout] test tests::resolve_col_cli_partial_slug_no_match ... ok
[INFO] [stdout] test ui::board_view::tests::border_color_unfocused_fresh_returns_dim ... ok
[INFO] [stdout] test ui::board_view::tests::fit_icons_clears_all_when_nothing_fits ... ok
[INFO] [stdout] test ui::board_view::tests::total_icon_width_empty_is_zero ... ok
[INFO] [stdout] test ui::board_view::tests::is_new_card_one_second_across_midnight_is_false ... ok
[INFO] [stdout] test ui::board_view::tests::fit_icons_exact_boundary_no_drop ... ok
[INFO] [stdout] test ui::board_view::tests::is_new_card_created_today_is_true ... ok
[INFO] [stdout] test ui::board_view::tests::fit_icons_drops_stale_and_priority_blocker_survives ... ok
[INFO] [stdout] test ui::board_view::tests::fit_icons_drops_stale_when_only_blocker_fits ... ok
[INFO] [stdout] test ui::board_view::tests::fit_icons_empty_input_returns_empty ... ok
[INFO] [stdout] test ui::board_view::tests::fit_icons_one_over_boundary_drops_leftmost ... ok
[INFO] [stdout] test ui::board_view::tests::fit_icons_preserves_input_order ... ok
[INFO] [stdout] test ui::board_view::tests::fit_icons_urgent_dropped_blocker_survives ... ok
[INFO] [stdout] test ui::board_view::tests::is_new_card_same_day_start_and_end ... ok
[INFO] [stdout] test ui::board_view::tests::fit_icons_urgent_exact_fit ... ok
[INFO] [stdout] test ui::board_view::tests::total_icon_width_three_icons_two_separators ... ok
[INFO] [stdout] test ui::board_view::tests::total_icon_width_two_icons_one_separator ... ok
[INFO] [stdout] test ui::status_bar::tests::cursor_at_end_shows_reversed_space ... ok
[INFO] [stdout] test ui::status_bar::tests::cursor_in_middle_reverses_char ... ok
[INFO] [stdout] test ui::status_bar::tests::empty_input_shows_reversed_space ... ok
[INFO] [stdout] test ui::status_bar::tests::left_zone_normal_mode_no_filters ... ok
[INFO] [stdout] test ui::status_bar::tests::left_zone_shows_active_text_filter ... ok
[INFO] [stdout] test ui::status_bar::tests::left_zone_multiple_filters_together ... ok
[INFO] [stdout] test ui::status_bar::tests::left_zone_shows_tag_filters ... ok
[INFO] [stdout] test ui::status_bar::tests::left_zone_shows_staleness_filters ... ok
[INFO] [stdout] test ui::status_bar::tests::right_zone_no_repeat_hint_when_none ... ok
[INFO] [stdout] test ui::status_bar::tests::right_zone_repeat_hint_col_remove_text ... ok
[INFO] [stdout] test ui::status_bar::tests::left_zone_shows_assignee_filters ... ok
[INFO] [stdout] test ui::status_bar::tests::left_zone_template_mode_shows_badge ... ok
[INFO] [stdout] test ui::status_bar::tests::right_zone_repeat_hint_high_risk_bold_yellow ... ok
[INFO] [stdout] test ui::status_bar::tests::right_zone_repeat_hint_with_sync_icon_span_order ... ok
[INFO] [stdout] test ui::status_bar::tests::right_zone_no_sync_has_two_spans ... ok
[INFO] [stdout] test ui::board_view::tests::total_icon_width_one_icon_no_separator ... ok
[INFO] [stdout] test ui::status_bar::tests::right_zone_sync_online_shows_icon ... ok
[INFO] [stdout] test ui::status_bar::tests::right_zone_repeat_hint_delete_text ... ok
[INFO] [stdout] test ui::status_bar::tests::right_zone_repeat_hint_ends_with_double_space ... ok
[INFO] [stdout] test ui::tests::centered_rect_basic ... ok
[INFO] [stdout] test ui::tests::centered_rect_capped_at_area ... ok
[INFO] [stdout] test ui::tests::centered_rect_min_height_enforced ... ok
[INFO] [stdout] test ui::tests::centered_rect_min_width_enforced ... ok
[INFO] [stdout] test ui::tests::centered_rect_zero_area ... ok
[INFO] [stdout] test ui::tests::centered_rect_with_offset ... ok
[INFO] [stdout] test ui::tests::overlay_rect_enforces_minimums ... ok
[INFO] [stdout] test ui::theme::tests::bubble_up_levels_are_distinct_colors ... ok
[INFO] [stdout] test ui::status_bar::tests::cursor_at_start_reverses_first_char ... ok
[INFO] [stdout] test ui::status_bar::tests::right_zone_repeat_hint_normal_risk_fg ... ok
[INFO] [stdout] test ui::status_bar::tests::right_zone_sync_offline_shows_icon ... ok
[INFO] [stdout] test ui::status_bar::tests::right_zone_shows_board_name ... ok
[INFO] [stdout] test ui::status_bar::tests::right_zone_shows_repeat_hint ... ok
[INFO] [stdout] test ui::board_view::tests::total_icon_width_two_char_icon_counts_correctly ... ok
[INFO] [stdout] test ui::theme::tests::bubble_up_colors_escalate_without_matching_blocker ... ok
[INFO] [stdout] test ui::tests::overlay_rect_returns_expected_size ... ok
[INFO] [stdout] test ui::theme::tests::column_focused_border_is_reset ... ok
[INFO] [stdout] test ui::theme::tests::dim_style_uses_dim_color ... ok
[INFO] [stdout] test ui::theme::tests::all_icon_fields_are_non_empty ... ok
[INFO] [stdout] test ui::theme::tests::icons_nerd_font_when_enabled ... ok
[INFO] [stdout] test ui::theme::tests::new_card_title_is_green ... ok
[INFO] [stdout] test ui::theme::tests::icons_default_is_ascii ... ok
[INFO] [stdout] test ui::theme::tests::priority_color_all_variants ... ok
[INFO] [stderr]    Doc-tests kando_core
[INFO] [stdout] test ui::theme::tests::column_border_is_dimmed ... ok
[INFO] [stdout] test ui::theme::tests::tag_color_empty_string_no_panic ... ok
[INFO] [stdout] test ui::theme::tests::semantic_content_colors_are_never_dim ... ok
[INFO] [stdout] test ui::theme::tests::tag_color_different_tags_may_differ ... ok
[INFO] [stdout] test ui::theme::tests::nerd_icons_are_all_distinct ... ok
[INFO] [stdout] test ui::theme::tests::priority_returns_some_for_non_normal ... ok
[INFO] [stdout] test ui::theme::tests::status_style_uses_fg_color ... ok
[INFO] [stdout] test ui::theme::tests::sync_offline_ascii_icon_is_exclamation ... ok
[INFO] [stdout] test ui::theme::tests::sync_offline_nerd_icon_is_broken_chain ... ok
[INFO] [stdout] test ui::theme::tests::tag_color_deterministic ... ok
[INFO] [stdout] test ui::status_bar::tests::right_zone_repeat_hint_low_risk_fg ... ok
[INFO] [stdout] test ui::theme::tests::very_stale_nerd_icon_is_warning_triangle ... ok
[INFO] [stdout] test ui::theme::tests::tag_color_never_returns_dim ... ok
[INFO] [stdout] test ui::theme::tests::priority_returns_none_for_normal ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 838 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.59s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] running `Command { std: "docker" "inspect" "296acbdf2e14c9b1817a8545719007478bf12dba2146aef653652055e0dd6574", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "296acbdf2e14c9b1817a8545719007478bf12dba2146aef653652055e0dd6574", kill_on_drop: false }`
[INFO] [stdout] 296acbdf2e14c9b1817a8545719007478bf12dba2146aef653652055e0dd6574
