[INFO] fetching crate anki-llm 2.0.8... [INFO] testing anki-llm-2.0.8 against 1.95.0 for beta-1.96-1 [INFO] extracting crate anki-llm 2.0.8 into /workspace/builds/worker-2-tc1/source [INFO] started tweaking crates.io crate anki-llm 2.0.8 [INFO] removed 0 missing tests [INFO] finished tweaking crates.io crate anki-llm 2.0.8 [INFO] tweaked toml for crates.io crate anki-llm 2.0.8 written to /workspace/builds/worker-2-tc1/source/Cargo.toml [INFO] validating manifest of crates.io crate anki-llm 2.0.8 on toolchain 1.95.0 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.95.0" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate crates.io crate anki-llm 2.0.8 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" "+1.95.0" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded utf8-zero v0.8.1 [INFO] [stderr] Downloaded float-cmp v0.10.0 [INFO] [stderr] Downloaded normalize-line-endings v0.3.0 [INFO] [stderr] Downloaded ureq-proto v0.6.0 [INFO] [stderr] Downloaded ureq v3.3.0 [INFO] [stderr] Downloaded zune-jpeg v0.5.15 [INFO] [stderr] Downloaded jsonrepair v0.1.0 [INFO] [stderr] Downloaded pulldown-cmark v0.12.2 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-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" "+1.95.0" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 5640c8e1796931ee79776d7b1eafe000e478a86e05a9dd47a6c18101100e5101 [INFO] running `Command { std: "docker" "start" "-a" "5640c8e1796931ee79776d7b1eafe000e478a86e05a9dd47a6c18101100e5101", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "5640c8e1796931ee79776d7b1eafe000e478a86e05a9dd47a6c18101100e5101", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "5640c8e1796931ee79776d7b1eafe000e478a86e05a9dd47a6c18101100e5101", kill_on_drop: false }` [INFO] [stdout] 5640c8e1796931ee79776d7b1eafe000e478a86e05a9dd47a6c18101100e5101 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-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=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-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" "+1.95.0" "build" "--frozen" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 34b7be6271cd35b3ac872b5e481e6a1b2656144fe7d16dbd52aa5299dfcad5cd [INFO] running `Command { std: "docker" "start" "-a" "34b7be6271cd35b3ac872b5e481e6a1b2656144fe7d16dbd52aa5299dfcad5cd", kill_on_drop: false }` [INFO] [stderr] Compiling proc-macro2 v1.0.103 [INFO] [stderr] Compiling unicode-ident v1.0.22 [INFO] [stderr] Compiling quote v1.0.42 [INFO] [stderr] Compiling smallvec v1.15.1 [INFO] [stderr] Compiling bitflags v2.10.0 [INFO] [stderr] Compiling siphasher v1.0.2 [INFO] [stderr] Compiling rand_core v0.6.4 [INFO] [stderr] Compiling unicode-segmentation v1.13.2 [INFO] [stderr] Compiling allocator-api2 v0.2.21 [INFO] [stderr] Compiling foldhash v0.2.0 [INFO] [stderr] Compiling rustix v1.1.2 [INFO] [stderr] Compiling linux-raw-sys v0.11.0 [INFO] [stderr] Compiling cc v1.2.59 [INFO] [stderr] Compiling simd-adler32 v0.3.9 [INFO] [stderr] Compiling new_debug_unreachable v1.0.6 [INFO] [stderr] Compiling itertools v0.14.0 [INFO] [stderr] Compiling castaway v0.2.4 [INFO] [stderr] Compiling mio v0.8.11 [INFO] [stderr] Compiling rand v0.8.5 [INFO] [stderr] Compiling phf_shared v0.11.3 [INFO] [stderr] Compiling parking_lot_core v0.9.12 [INFO] [stderr] Compiling indoc v2.0.7 [INFO] [stderr] Compiling instability v0.3.12 [INFO] [stderr] Compiling deranged v0.5.8 [INFO] [stderr] Compiling compact_str v0.9.0 [INFO] [stderr] Compiling miniz_oxide v0.8.9 [INFO] [stderr] Compiling parking_lot v0.12.5 [INFO] [stderr] Compiling hashbrown v0.16.1 [INFO] [stderr] Compiling aho-corasick v1.1.4 [INFO] [stderr] Compiling num_threads v0.1.7 [INFO] [stderr] Compiling time-core v0.1.8 [INFO] [stderr] Compiling precomputed-hash v0.1.1 [INFO] [stderr] Compiling mac v0.1.1 [INFO] [stderr] Compiling num-conv v0.2.1 [INFO] [stderr] Compiling lru v0.16.3 [INFO] [stderr] Compiling futf v0.1.5 [INFO] [stderr] Compiling convert_case v0.10.0 [INFO] [stderr] Compiling getrandom v0.2.17 [INFO] [stderr] Compiling utf-8 v0.7.6 [INFO] [stderr] Compiling crossbeam-utils v0.8.21 [INFO] [stderr] Compiling httparse v1.10.1 [INFO] [stderr] Compiling phf_generator v0.11.3 [INFO] [stderr] Compiling signal-hook-mio v0.2.5 [INFO] [stderr] Compiling tendril v0.4.3 [INFO] [stderr] Compiling phf_codegen v0.11.3 [INFO] [stderr] Compiling time v0.3.47 [INFO] [stderr] Compiling flate2 v1.1.9 [INFO] [stderr] Compiling nix v0.31.2 [INFO] [stderr] Compiling regex-automata v0.4.14 [INFO] [stderr] Compiling line-clipping v0.3.5 [INFO] [stderr] Compiling fdeflate v0.3.7 [INFO] [stderr] Compiling dtoa v1.0.11 [INFO] [stderr] Compiling pxfm v0.1.28 [INFO] [stderr] Compiling rustls v0.23.37 [INFO] [stderr] Compiling dtoa-short v0.3.5 [INFO] [stderr] Compiling http v1.4.0 [INFO] [stderr] Compiling syn v2.0.111 [INFO] [stderr] Compiling string_cache_codegen v0.5.4 [INFO] [stderr] Compiling form_urlencoded v1.2.2 [INFO] [stderr] Compiling jsonrepair v0.1.0 [INFO] [stderr] Compiling png v0.18.1 [INFO] [stderr] Compiling x11rb-protocol v0.13.2 [INFO] [stderr] Compiling bytemuck v1.25.0 [INFO] [stderr] Compiling byteorder-lite v0.1.0 [INFO] [stderr] Compiling web_atoms v0.1.3 [INFO] [stderr] Compiling unicode-truncate v2.0.1 [INFO] [stderr] Compiling pulldown-cmark v0.12.2 [INFO] [stderr] Compiling crossterm v0.25.0 [INFO] [stderr] Compiling ureq-proto v0.6.0 [INFO] [stderr] Compiling ring v0.17.14 [INFO] [stderr] Compiling crossbeam-channel v0.5.15 [INFO] [stderr] Compiling clap_builder v4.5.53 [INFO] [stderr] Compiling getrandom v0.3.4 [INFO] [stderr] Compiling fuzzy-matcher v0.3.7 [INFO] [stderr] Compiling webpki-roots v1.0.6 [INFO] [stderr] Compiling newline-converter v0.3.0 [INFO] [stderr] Compiling indexmap v2.13.1 [INFO] [stderr] Compiling console v0.15.11 [INFO] [stderr] Compiling getopts v0.2.24 [INFO] [stderr] Compiling pulldown-cmark-escape v0.11.0 [INFO] [stderr] Compiling unicode-width v0.1.14 [INFO] [stderr] Compiling unicase v2.9.0 [INFO] [stderr] Compiling maplit v1.0.2 [INFO] [stderr] Compiling utf8-zero v0.8.1 [INFO] [stderr] Compiling unsafe-libyaml v0.2.11 [INFO] [stderr] Compiling inquire v0.7.5 [INFO] [stderr] Compiling ctrlc v3.5.2 [INFO] [stderr] Compiling indicatif v0.17.11 [INFO] [stderr] Compiling home v0.5.12 [INFO] [stderr] Compiling moxcms v0.8.1 [INFO] [stderr] Compiling gethostname v1.1.0 [INFO] [stderr] Compiling tempfile v3.23.0 [INFO] [stderr] Compiling matchers v0.2.0 [INFO] [stderr] Compiling regex v1.12.3 [INFO] [stderr] Compiling x11rb v0.13.2 [INFO] [stderr] Compiling rustls-webpki v0.103.10 [INFO] [stderr] Compiling synstructure v0.13.2 [INFO] [stderr] Compiling darling_core v0.23.0 [INFO] [stderr] Compiling zerofrom-derive v0.1.6 [INFO] [stderr] Compiling yoke-derive v0.8.1 [INFO] [stderr] Compiling zerovec-derive v0.11.2 [INFO] [stderr] Compiling displaydoc v0.2.5 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling thiserror-impl v2.0.17 [INFO] [stderr] Compiling strum_macros v0.27.2 [INFO] [stderr] Compiling phf_macros v0.11.3 [INFO] [stderr] Compiling derive_more-impl v2.1.1 [INFO] [stderr] Compiling tracing-attributes v0.1.31 [INFO] [stderr] Compiling cssparser-macros v0.6.1 [INFO] [stderr] Compiling match_token v0.35.0 [INFO] [stderr] Compiling clap_derive v4.5.49 [INFO] [stderr] Compiling phf v0.11.3 [INFO] [stderr] Compiling cssparser v0.35.0 [INFO] [stderr] Compiling image v0.25.10 [INFO] [stderr] Compiling derive_more v2.1.1 [INFO] [stderr] Compiling crossterm v0.29.0 [INFO] [stderr] Compiling zerofrom v0.1.7 [INFO] [stderr] Compiling clap v4.5.53 [INFO] [stderr] Compiling yoke v0.8.1 [INFO] [stderr] Compiling tracing v0.1.44 [INFO] [stderr] Compiling zerovec v0.11.5 [INFO] [stderr] Compiling zerotrie v0.2.3 [INFO] [stderr] Compiling thiserror v2.0.17 [INFO] [stderr] Compiling kasuari v0.4.12 [INFO] [stderr] Compiling darling_macro v0.23.0 [INFO] [stderr] Compiling tracing-subscriber v0.3.23 [INFO] [stderr] Compiling strum v0.27.2 [INFO] [stderr] Compiling tinystr v0.8.2 [INFO] [stderr] Compiling potential_utf v0.1.4 [INFO] [stderr] Compiling darling v0.23.0 [INFO] [stderr] Compiling icu_collections v2.1.1 [INFO] [stderr] Compiling icu_locale_core v2.1.1 [INFO] [stderr] Compiling ratatui-core v0.1.0 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling icu_provider v2.1.1 [INFO] [stderr] Compiling arboard v3.6.1 [INFO] [stderr] Compiling tracing-appender v0.2.4 [INFO] [stderr] Compiling icu_normalizer v2.1.1 [INFO] [stderr] Compiling icu_properties v2.1.2 [INFO] [stderr] Compiling string_cache v0.8.9 [INFO] [stderr] Compiling ureq v3.3.0 [INFO] [stderr] Compiling serde_yaml v0.9.34+deprecated [INFO] [stderr] Compiling ratatui-widgets v0.3.0 [INFO] [stderr] Compiling markup5ever v0.35.0 [INFO] [stderr] Compiling ratatui-crossterm v0.1.0 [INFO] [stderr] Compiling html5ever v0.35.0 [INFO] [stderr] Compiling idna_adapter v1.2.1 [INFO] [stderr] Compiling idna v1.1.0 [INFO] [stderr] Compiling ratatui-macros v0.7.0 [INFO] [stderr] Compiling ratatui v0.30.0 [INFO] [stderr] Compiling url v2.5.8 [INFO] [stderr] Compiling ammonia v4.1.2 [INFO] [stderr] Compiling anki-llm v2.0.8 (/opt/rustwide/workdir) [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 30s [INFO] running `Command { std: "docker" "inspect" "34b7be6271cd35b3ac872b5e481e6a1b2656144fe7d16dbd52aa5299dfcad5cd", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "34b7be6271cd35b3ac872b5e481e6a1b2656144fe7d16dbd52aa5299dfcad5cd", kill_on_drop: false }` [INFO] [stdout] 34b7be6271cd35b3ac872b5e481e6a1b2656144fe7d16dbd52aa5299dfcad5cd [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-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=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-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" "+1.95.0" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 0f55f32a6451c2a1a33f7c63258ebddd76b4d3e3c5001aa0212ca79603bf2aae [INFO] running `Command { std: "docker" "start" "-a" "0f55f32a6451c2a1a33f7c63258ebddd76b4d3e3c5001aa0212ca79603bf2aae", kill_on_drop: false }` [INFO] [stderr] Compiling futures-core v0.3.32 [INFO] [stderr] Compiling slab v0.4.12 [INFO] [stderr] Compiling predicates-core v1.0.10 [INFO] [stderr] Compiling float-cmp v0.10.0 [INFO] [stderr] Compiling termtree v0.5.1 [INFO] [stderr] Compiling sdd v3.0.10 [INFO] [stderr] Compiling assert_cmd v2.2.0 [INFO] [stderr] Compiling difflib v0.4.0 [INFO] [stderr] Compiling normalize-line-endings v0.3.0 [INFO] [stderr] Compiling bstr v1.12.1 [INFO] [stderr] Compiling serial_test_derive v3.4.0 [INFO] [stderr] Compiling wait-timeout v0.2.1 [INFO] [stderr] Compiling futures-util v0.3.32 [INFO] [stderr] Compiling predicates-tree v1.0.13 [INFO] [stderr] Compiling scc v2.4.0 [INFO] [stderr] Compiling predicates v3.1.4 [INFO] [stderr] Compiling futures-executor v0.3.32 [INFO] [stderr] Compiling serial_test v3.4.0 [INFO] [stderr] Compiling anki-llm v2.0.8 (/opt/rustwide/workdir) [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 17.94s [INFO] running `Command { std: "docker" "inspect" "0f55f32a6451c2a1a33f7c63258ebddd76b4d3e3c5001aa0212ca79603bf2aae", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "0f55f32a6451c2a1a33f7c63258ebddd76b4d3e3c5001aa0212ca79603bf2aae", kill_on_drop: false }` [INFO] [stdout] 0f55f32a6451c2a1a33f7c63258ebddd76b4d3e3c5001aa0212ca79603bf2aae [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-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=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-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" "+1.95.0" "test" "--frozen", kill_on_drop: false }` [INFO] [stdout] be3fa826a356da02fa678a24d414e22c81dbd95af28feca14829dfbbc8b69a72 [INFO] running `Command { std: "docker" "start" "-a" "be3fa826a356da02fa678a24d414e22c81dbd95af28feca14829dfbbc8b69a72", kill_on_drop: false }` [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 0.29s [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/anki_llm-f0b880a69634b566) [INFO] [stdout] [INFO] [stdout] running 316 tests [INFO] [stdout] test anki::client::tests::anki_quote_simple ... ok [INFO] [stdout] test anki::client::tests::anki_quote_with_backslash ... ok [INFO] [stdout] test anki::client::tests::anki_quote_with_double_quotes ... ok [INFO] [stdout] test audio::player::tests::detect_player_is_optional ... ok [INFO] [stdout] test batch::controller::tests::_suppress_unused_warnings ... ok [INFO] [stdout] test batch::deck_mode::tests::build_update_action_allows_real_id_field ... ok [INFO] [stdout] test batch::deck_mode::tests::build_update_action_basic ... ok [INFO] [stdout] test audio::player::tests::binary_exists_handles_missing_path_var ... ok [INFO] [stdout] test batch::engine::tests::abort_callback_stops_processing ... ok [INFO] [stdout] test batch::engine::tests::all_rows_fail ... ok [INFO] [stdout] test batch::deck_mode::tests::build_update_action_skips_internal_fields ... ok [INFO] [stdout] test batch::engine::tests::cancel_stops_processing ... ok [INFO] [stdout] test batch::file_mode::tests::failure_rows_are_stored ... ok [INFO] [stdout] test batch::file_mode::tests::existing_rows_are_preserved ... ok [INFO] [stdout] test batch::engine::tests::all_rows_succeed ... ok [INFO] [stdout] test batch::error::tests::processing_is_retryable ... ok [INFO] [stdout] test batch::file_mode::tests::flush_threshold_triggers_write ... ok [INFO] [stdout] test batch::engine::tests::no_usage_means_zero_tokens ... ok [INFO] [stdout] test batch::file_mode::tests::flush_writes_rows_in_input_order ... ok [INFO] [stdout] test batch::controller::tests::empty_input_still_finalizes ... ok [INFO] [stdout] test batch::controller::tests::plain_path_terminates_and_calls_finalization ... ok [INFO] [stdout] test config::store::tests::read_missing_file_returns_defaults ... ok [INFO] [stdout] test batch::engine::tests::failure_row_has_error_field ... ok [INFO] [stdout] test batch::report::tests::usage_stats_add_and_total ... ok [INFO] [stdout] test batch::file_mode::tests::rows_without_id_are_skipped ... ok [INFO] [stdout] test data::csv_io::tests::empty_input_returns_empty_vec ... ok [INFO] [stdout] test data::csv_io::tests::parse_simple_csv ... ok [INFO] [stdout] test batch::engine::tests::on_row_done_callback_is_called ... ok [INFO] [stdout] test batch::engine::tests::fatal_error_skips_retries ... ok [INFO] [stdout] test config::store::tests::state_round_trip ... ok [INFO] [stdout] test config::store::tests::write_and_read_round_trip ... ok [INFO] [stdout] test config::store::tests::backward_compat_with_old_json ... ok [INFO] [stdout] test config::store::tests::get_set_keys ... ok [INFO] [stdout] test batch::error::tests::fatal_is_not_retryable ... ok [INFO] [stdout] test data::csv_io::tests::serialize_empty_returns_empty_string ... ok [INFO] [stdout] test data::io::tests::file_format_csv ... ok [INFO] [stdout] test data::io::tests::file_format_no_extension ... ok [INFO] [stdout] test data::io::tests::file_format_unsupported ... ok [INFO] [stdout] test data::io::tests::file_format_uppercase ... ok [INFO] [stdout] test data::io::tests::file_format_yaml ... ok [INFO] [stdout] test data::io::tests::atomic_write_and_read_back ... ok [INFO] [stdout] test data::io::tests::file_format_yml ... ok [INFO] [stdout] test data::csv_io::tests::serialize_quotes_all_fields ... ok [INFO] [stdout] test data::io::tests::load_existing_output_builds_map ... ok [INFO] [stdout] test data::io::tests::load_existing_output_nonexistent ... ok [INFO] [stdout] test data::rows::tests::note_id_from_string ... ok [INFO] [stdout] test data::rows::tests::note_id_missing ... ok [INFO] [stdout] test data::rows::tests::require_note_id_error_lists_fields ... ok [INFO] [stdout] test data::csv_io::tests::round_trip ... ok [INFO] [stdout] test data::io::tests::load_existing_output_corrupt_file_errors ... ok [INFO] [stdout] test data::yaml_io::tests::parse_non_array_returns_error ... ok [INFO] [stdout] test data::yaml_io::tests::numeric_values_preserved ... ok [INFO] [stdout] test data::rows::tests::note_id_from_number ... ok [INFO] [stdout] test data::rows::tests::note_id_fallback_to_id ... ok [INFO] [stdout] test data::yaml_io::tests::round_trip_preserves_order_and_values ... ok [INFO] [stdout] test data::yaml_io::tests::parse_simple_yaml ... ok [INFO] [stdout] test audio::player::tests::spawn_failure_surfaces_player_event ... ok [INFO] [stdout] test generate::anki_import::tests::finalize_skips_when_target_field_already_populated ... ok [INFO] [stdout] test generate::cards::tests::escape_special_chars ... ok [INFO] [stdout] test generate::cards::tests::map_fields ... ok [INFO] [stdout] test generate::init::prompt::tests::generate_generic_prompt_body_test ... ok [INFO] [stdout] test generate::cards::tests::build_validated_card_populates_duplicate_fields_and_model ... ok [INFO] [stdout] test generate::init::util::tests::is_auto_generated_field_sound ... ok [INFO] [stdout] test generate::init::util::tests::resolve_duplicate_keys_no_collision_with_preexisting_numbered ... ok [INFO] [stdout] test generate::init::util::tests::resolve_duplicate_keys_no_duplicates ... ok [INFO] [stdout] test generate::init::util::tests::is_auto_generated_field_image ... ok [INFO] [stdout] test generate::init::util::tests::suggest_key_common_fields ... ok [INFO] [stdout] test generate::init::util::tests::suggest_key_unknown_fields ... ok [INFO] [stdout] test generate::process::tests::build_check_schema ... ok [INFO] [stdout] test generate::process::tests::build_transform_schema ... ok [INFO] [stdout] test generate::process::tests::emit_diff_empty_old ... ok [INFO] [stdout] test generate::process::tests::emit_diff_multiline ... ok [INFO] [stdout] test generate::process::tests::emit_diff_single_line ... ok [INFO] [stdout] test generate::process::tests::parse_check_flag ... ok [INFO] [stdout] test generate::process::tests::parse_check_invalid_json_errors ... ok [INFO] [stdout] test generate::process::tests::parse_check_pass ... ok [INFO] [stdout] test generate::process::tests::parse_check_reject ... ok [INFO] [stdout] test generate::anki_import::tests::finalize_cache_hit_when_already_previewed ... ok [INFO] [stdout] test generate::anki_import::tests::finalize_happy_path_uploads_all_cards_and_rewrites_target_fields ... ok [INFO] [stdout] test generate::process::tests::parse_transform_missing_field_errors ... ok [INFO] [stdout] test generate::process::tests::parse_transform_multi_writes ... ok [INFO] [stdout] test generate::sanitize::tests::array_to_list ... ok [INFO] [stdout] test generate::process::tests::parse_transform_single_target ... ok [INFO] [stdout] test generate::sanitize::tests::sanitize_fields_mixed ... ok [INFO] [stdout] test generate::sanitize::tests::sanitize_strips_script ... ok [INFO] [stdout] test generate::anki_import::tests::finalize_aborts_on_mid_run_upload_failure_with_partial_state ... ok [INFO] [stdout] test generate::sanitize::tests::sanitize_markdown_bold ... ok [INFO] [stdout] test generate::anki_import::tests::finalize_deduplicates_uploads_for_identical_cards ... ok [INFO] [stdout] test generate::init::util::tests::resolve_duplicate_keys_with_duplicates ... ok [INFO] [stdout] test generate::tui::tests::edited_yaml_first_field_lookup_is_order_independent ... ok [INFO] [stdout] test llm::extract::tests::extracts_content ... ok [INFO] [stdout] test llm::parse_json::tests::merge_adds_new_field ... ok [INFO] [stdout] test llm::parse_json::tests::merge_ambiguous_source_keys_error ... ok [INFO] [stdout] test generate::tui::tests::any_synthesizing_guard_fires_even_when_focus_moves ... ok [INFO] [stdout] test llm::parse_json::tests::merge_ambiguous_target_keys_error ... ok [INFO] [stdout] test llm::extract::tests::returns_raw_when_not_required ... ok [INFO] [stdout] test llm::parse_json::tests::merge_case_insensitive_update ... ok [INFO] [stdout] test llm::extract::tests::trims_whitespace ... ok [INFO] [stdout] test llm::parse_json::tests::parse_array_returns_none ... ok [INFO] [stdout] test data::slug::tests::simple_name ... ok [INFO] [stdout] test data::slug::tests::sub_deck ... ok [INFO] [stdout] test data::slug::tests::already_clean ... ok [INFO] [stdout] test data::slug::tests::all_special_chars_fallback ... ok [INFO] [stdout] test llm::parse_json::tests::parse_empty_string_returns_none ... ok [INFO] [stdout] test generate::anki_import::tests::finalize_stale_after_edit_resynthesizes ... ok [INFO] [stdout] test llm::parse_json::tests::parse_fenced_block ... ok [INFO] [stdout] test llm::parse_json::tests::parse_json_array ... ok [INFO] [stdout] test data::slug::tests::special_chars ... ok [INFO] [stdout] test llm::parse_json::tests::parse_json_array_from_fenced ... ok [INFO] [stdout] test llm::parse_json::tests::parse_json_array_non_array_returns_none ... ok [INFO] [stdout] test llm::parse_json::tests::parse_json_array_non_objects_returns_none ... ok [INFO] [stdout] test llm::parse_json::tests::parse_plain_text_returns_none ... ok [INFO] [stdout] test llm::parse_json::tests::parse_single_object_from_fenced_singleton_array ... ok [INFO] [stdout] test llm::parse_json::tests::parse_raw_object ... ok [INFO] [stdout] test llm::parse_json::tests::parse_single_object_from_singleton_array ... ok [INFO] [stdout] test llm::parse_json::tests::parse_single_object_rejects_multi_element_array ... ok [INFO] [stdout] test llm::parse_json::tests::parse_single_object_rejects_non_object_array_item ... ok [INFO] [stdout] test llm::parse_json::tests::parse_single_object_top_level ... ok [INFO] [stdout] test llm::parse_json::tests::repair_fenced_block_with_trailing_comma ... ok [INFO] [stdout] test llm::parse_json::tests::repair_trailing_comma_object ... ok [INFO] [stdout] test llm::parse_json::tests::repair_truncated_object ... ok [INFO] [stdout] test llm::parse_json::tests::repair_unquoted_keys ... ok [INFO] [stdout] test llm::pricing::tests::all_supported_models_have_pricing ... ok [INFO] [stdout] test llm::pricing::tests::calculate_cost_known_model ... ok [INFO] [stdout] test llm::pricing::tests::format_cost_display_string ... ok [INFO] [stdout] test llm::pricing::tests::format_cost_small ... ok [INFO] [stdout] test llm::pricing::tests::format_cost_zero ... ok [INFO] [stdout] test llm::provider::tests::gemini_model_uses_gemini ... ok [INFO] [stdout] test llm::pricing::tests::calculate_cost_unknown_model ... ok [INFO] [stdout] test llm::provider::tests::omit_temperature_gpt5 ... ok [INFO] [stdout] test llm::provider::tests::preserve_temperature_non_gpt5 ... ok [INFO] [stdout] test llm::provider::tests::unknown_prefix_defaults_to_openai ... ok [INFO] [stdout] test llm::retry::tests::fatal_error_stops_immediately ... ok [INFO] [stdout] test llm::provider::tests::gpt_model_uses_openai ... ok [INFO] [stdout] test llm::retry::tests::succeeds_on_first_try ... ok [INFO] [stdout] test llm::runtime::tests::accepts_unknown_model_with_custom_endpoint ... ok [INFO] [stdout] test llm::runtime::tests::cli_api_key_takes_precedence ... ok [INFO] [stdout] test llm::runtime::tests::accepts_temperature_boundary_values ... ok [INFO] [stdout] test llm::runtime::tests::custom_endpoint_does_not_require_api_key ... ok [INFO] [stdout] test llm::runtime::tests::default_batch_size ... ok [INFO] [stdout] test llm::runtime::tests::dry_run_skips_api_key ... ok [INFO] [stdout] test llm::runtime::tests::gpt5_omits_temperature ... ok [INFO] [stdout] test llm::runtime::tests::non_gpt5_preserves_temperature ... ok [INFO] [stdout] test llm::runtime::tests::rejects_temperature_out_of_range ... ok [INFO] [stdout] test snapshot::store::tests::days_to_ymd_epoch ... ok [INFO] [stdout] test snapshot::store::tests::days_to_ymd_known_date ... ok [INFO] [stdout] test snapshot::store::tests::legacy_snapshot_with_string_deck_loads ... ok [INFO] [stdout] test snapshot::store::tests::query_mode_snapshot_source_display ... ok [INFO] [stdout] test template::fill::tests::ambiguous_keys ... ok [INFO] [stdout] test snapshot::store::tests::save_and_load_snapshot ... ok [INFO] [stdout] test template::fill::tests::no_placeholders ... ok [INFO] [stdout] test template::fill::tests::missing_placeholder ... ok [INFO] [stdout] test snapshot::store::tests::run_id_is_sortable ... ok [INFO] [stdout] test template::fill::tests::number_value ... ok [INFO] [stdout] test template::fill::tests::multiple_same_placeholder ... ok [INFO] [stdout] test template::fill::tests::null_value ... ok [INFO] [stdout] test snapshot::store::tests::snapshot_round_trip ... ok [INFO] [stdout] test template::frontmatter::tests::missing_frontmatter_markers ... ok [INFO] [stdout] test template::frontmatter::tests::parse_tts_block_with_field_source ... ok [INFO] [stdout] test template::frontmatter::tests::legacy_quality_check_rejected ... ok [INFO] [stdout] test template::frontmatter::tests::empty_field_map ... ok [INFO] [stdout] test template::frontmatter::tests::legacy_post_process_rejected ... ok [INFO] [stdout] test template::frontmatter::tests::parse_tts_block_with_template_source ... ok [INFO] [stdout] test template::frontmatter::tests::parse_valid_frontmatter ... ok [INFO] [stdout] test template::frontmatter::tests::tts_absent_is_fine ... ok [INFO] [stdout] test template::fill::tests::case_insensitive ... ok [INFO] [stdout] test template::frontmatter::tests::tts_azure_rejects_model ... ok [INFO] [stdout] test template::frontmatter::tests::tts_azure_requires_region ... ok [INFO] [stdout] test template::frontmatter::tests::tts_azure_rejects_speed ... ok [INFO] [stdout] test template::frontmatter::tests::tts_openai_rejects_region ... ok [INFO] [stdout] test template::frontmatter::tests::tts_azure_with_region_parses ... ok [INFO] [stdout] test template::frontmatter::tests::parse_processing_config ... ok [INFO] [stdout] test template::frontmatter::tests::tts_source_both_field_and_template_rejected ... ok [INFO] [stdout] test template::frontmatter::tests::processing_transform_requires_target_or_writes ... ok [INFO] [stdout] test template::frontmatter::tests::tts_source_field_must_be_in_field_map ... ok [INFO] [stdout] test template::frontmatter::tests::tts_speed_must_be_positive ... ok [INFO] [stdout] test template::frontmatter::tests::processing_field_must_be_in_field_map ... ok [INFO] [stdout] test template::frontmatter::tests::tts_template_placeholder_must_be_in_field_map ... ok [INFO] [stdout] test tts::cache::tests::different_payload_different_key ... ok [INFO] [stdout] test template::frontmatter::tests::tts_without_voice_rejected ... ok [INFO] [stdout] test tts::cache::tests::different_text_format_different_key ... ok [INFO] [stdout] test tts::cache::tests::different_voice_different_key ... ok [INFO] [stdout] test tts::cache::tests::filename_has_format_extension ... ok [INFO] [stdout] test template::frontmatter::tests::tts_unknown_provider_rejected ... ok [INFO] [stdout] test tts::cache::tests::same_request_same_key ... ok [INFO] [stdout] test tts::cache::tests::store_and_load_roundtrip ... ok [INFO] [stdout] test tts::ir::tests::canonical_distinguishes_different_readings ... ok [INFO] [stdout] test tts::ir::tests::canonical_distinguishes_pron_from_text ... ok [INFO] [stdout] test tts::ir::tests::canonical_is_stable_across_equivalent_inputs ... ok [INFO] [stdout] test tts::ir::tests::compat_ideograph_in_cluster ... ok [INFO] [stdout] test tts::cache::tests::zero_byte_file_is_miss ... ok [INFO] [stdout] test tts::ir::tests::deck_prompt_correct_example ... ok [INFO] [stdout] test tts::ir::tests::deck_prompt_incorrect_style_handled_natively ... ok [INFO] [stdout] test tts::ir::tests::empty_input ... ok [INFO] [stdout] test tts::ir::tests::empty_reading_rejected ... ok [INFO] [stdout] test tts::ir::tests::first_sample_exact_spans ... ok [INFO] [stdout] test tts::ir::tests::honorific_prefix_is_text ... ok [INFO] [stdout] test tts::ir::tests::iteration_mark_inside_cluster ... ok [INFO] [stdout] test tts::ir::tests::katakana_reading ... ok [INFO] [stdout] test tts::ir::tests::legacy_hypertts_spaced_input ... ok [INFO] [stdout] test tts::ir::tests::long_vowel_mark_in_reading ... ok [INFO] [stdout] test tts::ir::tests::mid_word_annotation_is_han_cluster_only ... ok [INFO] [stdout] test tts::ir::tests::non_kana_reading_rejected ... ok [INFO] [stdout] test tts::ir::tests::orphan_annotation_rejected ... ok [INFO] [stdout] test tts::ir::tests::plain_text_no_annotations ... ok [INFO] [stdout] test tts::ir::tests::orphan_annotation_after_kana_rejected ... ok [INFO] [stdout] test tts::ir::tests::real_deck_samples_parse_successfully ... ok [INFO] [stdout] test tts::ir::tests::simple_single_annotation ... ok [INFO] [stdout] test tts::ir::tests::small_ke_inside_cluster ... ok [INFO] [stdout] test tts::ir::tests::stray_closing_bracket_stays_text ... ok [INFO] [stdout] test tts::ir::tests::unclosed_bracket_is_error ... ok [INFO] [stdout] test tts::media::tests::detects_sound_tag ... ok [INFO] [stdout] test tts::media::tests::format_sound_tag_wraps ... ok [INFO] [stdout] test tts::process_row::tests::legacy_mode_passes_row_through ... ok [INFO] [stdout] test tts::process_row::tests::prompt_mode_handles_missing_anki_field_gracefully ... ok [INFO] [stdout] test tts::process_row::tests::prompt_mode_projects_field_map_keys_only ... ok [INFO] [stdout] test tts::process_row::tests::prompt_mode_template_expansion_no_ambiguity_collision ... ok [INFO] [stdout] test tts::ir::tests::small_ka_inside_cluster ... ok [INFO] [stdout] test tts::provider::amazon::tests::error_mapping_status_codes ... ok [INFO] [stdout] test tts::provider::amazon::tests::format_amz_dates_epoch ... ok [INFO] [stdout] test tts::provider::amazon::tests::format_amz_dates_known_values ... ok [INFO] [stdout] test tts::provider::amazon::tests::format_amz_dates_leap_day ... ok [INFO] [stdout] test tts::provider::amazon::tests::hmac_sha256_known_vector ... ok [INFO] [stdout] test tts::provider::amazon::tests::host_and_endpoint_formatting ... ok [INFO] [stdout] test tts::provider::amazon::tests::id_and_text_format ... ok [INFO] [stdout] test tts::provider::amazon::tests::signing_key_derivation_matches_aws_reference ... ok [INFO] [stdout] test tts::provider::amazon::tests::sigv4_with_session_token_signs_that_header ... ok [INFO] [stdout] test tts::provider::amazon::tests::sigv4_matches_aws_reference ... ok [INFO] [stdout] test tts::provider::azure::tests::endpoint_for_region ... ok [INFO] [stdout] test tts::provider::azure::tests::endpoint_identity_omits_path ... ok [INFO] [stdout] test tts::provider::azure::tests::id_and_text_format ... ok [INFO] [stdout] test tts::provider::google::tests::derives_language_code_from_voice ... ok [INFO] [stdout] test tts::provider::google::tests::endpoint_identity_is_global ... ok [INFO] [stdout] test tts::provider::google::tests::error_mapping_status_codes ... ok [INFO] [stdout] test tts::provider::google::tests::id_and_text_format ... ok [INFO] [stdout] test tts::provider::google::tests::rejects_voice_without_enough_segments ... ok [INFO] [stdout] test tts::render::tests::plain_text_empty ... ok [INFO] [stdout] test tts::render::tests::plain_text_handles_mid_word_split ... ok [INFO] [stdout] test tts::render::tests::plain_text_preserves_whitespace_verbatim ... ok [INFO] [stdout] test tts::render::tests::plain_text_reading_replaces_surface ... ok [INFO] [stdout] test tts::render::tests::ssml_empty_body ... ok [INFO] [stdout] test tts::render::tests::ssml_mid_word_split_sample ... ok [INFO] [stdout] test tts::render::tests::ssml_real_sample_exact_output ... ok [INFO] [stdout] test tts::render::tests::ssml_single_pronunciation ... ok [INFO] [stdout] test tts::render::tests::ssml_xml_escapes_surface_and_reading_attrs ... ok [INFO] [stdout] test tts::render::tests::ssml_xml_escapes_text_span ... ok [INFO] [stdout] test tts::provider::azure::tests::error_mapping_status_codes ... ok [INFO] [stdout] test tts::render::tests::ssml_xml_escapes_voice_attribute ... ok [INFO] [stdout] test tts::service::tests::eval_row_projection_omits_unmapped_keys ... ok [INFO] [stdout] test tts::service::tests::ensure_cached_hits_cache_on_second_call ... ok [INFO] [stdout] test tts::service::tests::prepare_errors_on_empty_normalized_text ... ok [INFO] [stdout] test tts::service::tests::prepare_from_row_plain_text_flow ... ok [INFO] [stdout] test tts::service::tests::prepare_from_row_ssml_flow ... ok [INFO] [stdout] test tts::service::tests::prepare_is_deterministic ... ok [INFO] [stdout] test tts::service::tests::session_tts_bundle_caches_successful_build ... ok [INFO] [stdout] test tts::service::tests::session_tts_new_does_not_resolve_credentials ... ok [INFO] [stdout] test tts::service::tests::session_tts_bundle_errors_on_bad_spec_and_retries ... ok [INFO] [stdout] test llm::extract::tests::errors_when_required_and_missing ... ok [INFO] [stdout] test llm::parse_json::tests::parse_fenced_block_no_newlines ... ok [INFO] [stdout] test template::frontmatter::tests::processing_check_rejects_target ... ok [INFO] [stdout] test tts::spec::tests::azure_resolves_with_cli_flags ... ok [INFO] [stdout] test tts::spec::tests::azure_missing_key_errors ... ok [INFO] [stdout] test tts::spec::tests::resolves_defaults ... ok [INFO] [stdout] test tts::template::tests::field_source_missing_is_empty ... ok [INFO] [stdout] test tts::spec::tests::template_source_becomes_inline ... ok [INFO] [stdout] test tts::template::tests::field_source_reads_value ... ok [INFO] [stdout] test tts::spec::tests::unknown_format_errors ... ok [INFO] [stdout] test tts::spec::tests::yaml_provider_overrides_default ... ok [INFO] [stdout] test tts::template::tests::file_source_fills_placeholders ... ok [INFO] [stdout] test tts::text::tests::collapses_whitespace ... ok [INFO] [stdout] test tts::text::tests::decodes_entities ... ok [INFO] [stdout] test tts::text::tests::empty_input ... ok [INFO] [stdout] test tts::text::tests::combined ... ok [INFO] [stdout] test tts::text::tests::plain_text_unchanged ... ok [INFO] [stdout] test tts::text::tests::strips_sound_tags ... ok [INFO] [stdout] test tts::text::tests::strips_html_tags ... ok [INFO] [stdout] test tts::text::tests::strips_cloze ... ok [INFO] [stdout] test tts::cache::tests::different_endpoint_different_key ... ok [INFO] [stdout] test tts::voices::catalog::tests::providerid_roundtrip ... ok [INFO] [stdout] test tts::cache::tests::different_provider_different_key ... ok [INFO] [stdout] test template::frontmatter::tests::tts_without_target_rejected ... ok [INFO] [stdout] test tts::voices::sample::tests::chinese_variants_share_sample ... ok [INFO] [stdout] test tts::template::tests::inline_source_fills_placeholders ... ok [INFO] [stdout] test tts::voices::sample::tests::unknown_language_falls_back_to_english ... ok [INFO] [stdout] test tts::voices::yaml::tests::amazon_scaffold_includes_model_when_set ... ok [INFO] [stdout] test tts::voices::catalog::tests::snapshot_parses_and_has_all_providers ... ok [INFO] [stdout] test tts::voices::yaml::tests::azure_scaffold_uses_override_region ... ok [INFO] [stdout] test tts::voices::yaml::tests::openai_scaffold_has_no_region ... ok [INFO] [stdout] test tui::line_input::tests::basic_typing ... ok [INFO] [stdout] test tui::line_input::tests::delete_next_char ... ok [INFO] [stdout] test tui::line_input::tests::delete_prev_char_unicode ... ok [INFO] [stdout] test tui::line_input::tests::delete_prev_word ... ok [INFO] [stdout] test tui::line_input::tests::insert_str_at_cursor ... ok [INFO] [stdout] test tui::line_input::tests::paste ... ok [INFO] [stdout] test tui::line_input::tests::paste_normalizes_newlines ... ok [INFO] [stdout] test tui::line_input::tests::visual_cursor_wide_chars ... ok [INFO] [stdout] test tts::voices::catalog::tests::filter_by_language_narrows_to_ja ... ok [INFO] [stdout] test workspace::discovery::tests::discovers_md_files_with_frontmatter ... ok [INFO] [stdout] test tts::voices::catalog::tests::text_search_matches_voice_id_and_name ... ok [INFO] [stdout] test workspace::discovery::tests::empty_dir_returns_empty ... ok [INFO] [stdout] test tts::voices::catalog::tests::build_facets_collects_sorted_values ... ok [INFO] [stdout] test workspace::discovery::tests::falls_back_to_filename_when_no_title ... ok [INFO] [stdout] test workspace::discovery::tests::skips_malformed_frontmatter ... ok [INFO] [stdout] test template::fill::tests::basic_fill ... ok [INFO] [stdout] test template::frontmatter::tests::tts_source_neither_rejected ... ok [INFO] [stdout] test workspace::discovery::tests::skips_process_prompts_without_deck_note_type ... ok [INFO] [stdout] test tts::voices::sample::tests::known_languages_have_native_samples ... ok [INFO] [stdout] test tts::spec::tests::openai_without_key_errors ... ok [INFO] [stdout] test tts::voices::yaml::tests::azure_scaffold_has_region_placeholder_when_missing ... ok [INFO] [stdout] test tts::voices::catalog::tests::filter_by_provider_narrows_to_azure ... ok [INFO] [stdout] test audio::player::tests::play_then_shutdown_reaps_child ... ok [INFO] [stdout] test audio::player::tests::different_card_replaces_active_child ... ok [INFO] [stdout] test audio::player::tests::same_card_replay_toggles_stop ... ok [INFO] [stdout] test batch::engine::tests::retry_succeeds_on_second_attempt ... ok [INFO] [stdout] test llm::retry::tests::retries_until_success ... ok [INFO] [stdout] test llm::retry::tests::exhausts_retries ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 316 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.07s [INFO] [stdout] [INFO] [stderr] Running unittests src/main.rs (/opt/rustwide/target/debug/deps/anki_llm-89cb97bd98da51e8) [INFO] [stdout] [INFO] [stdout] running 23 tests [INFO] [stdout] test batch::controller::tests::_suppress_unused_warnings ... ok [INFO] [stdout] test batch::deck_mode::tests::build_update_action_allows_real_id_field ... ok [INFO] [stdout] test batch::deck_mode::tests::build_update_action_basic ... ok [INFO] [stdout] test batch::deck_mode::tests::build_update_action_skips_internal_fields ... ok [INFO] [stdout] test batch::engine::tests::all_rows_succeed ... ok [INFO] [stdout] test batch::engine::tests::no_usage_means_zero_tokens ... ok [INFO] [stdout] test batch::engine::tests::failure_row_has_error_field ... ok [INFO] [stdout] test batch::controller::tests::empty_input_still_finalizes ... ok [INFO] [stdout] test batch::engine::tests::cancel_stops_processing ... ok [INFO] [stdout] test batch::error::tests::fatal_is_not_retryable ... ok [INFO] [stdout] test batch::error::tests::processing_is_retryable ... ok [INFO] [stdout] test batch::engine::tests::on_row_done_callback_is_called ... ok [INFO] [stdout] test batch::engine::tests::fatal_error_skips_retries ... ok [INFO] [stdout] test batch::file_mode::tests::failure_rows_are_stored ... ok [INFO] [stdout] test batch::file_mode::tests::existing_rows_are_preserved ... ok [INFO] [stdout] test batch::file_mode::tests::flush_threshold_triggers_write ... ok [INFO] [stdout] test batch::file_mode::tests::flush_writes_rows_in_input_order ... ok [INFO] [stdout] test batch::file_mode::tests::rows_without_id_are_skipped ... ok [INFO] [stdout] test batch::report::tests::usage_stats_add_and_total ... ok [INFO] [stdout] test batch::engine::tests::abort_callback_stops_processing ... ok [INFO] [stdout] test batch::engine::tests::all_rows_fail ... ok [INFO] [stdout] test batch::controller::tests::plain_path_terminates_and_calls_finalization ... ok [INFO] [stdout] test batch::engine::tests::retry_succeeds_on_second_attempt ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 23 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.01s [INFO] [stdout] [INFO] [stderr] Running tests/anki_integration.rs (/opt/rustwide/target/debug/deps/anki_integration-a24ea3dae4e0ce19) [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running tests/cli_test.rs (/opt/rustwide/target/debug/deps/cli_test-dc14791ba00bc7a4) [INFO] [stdout] [INFO] [stdout] running 13 tests [INFO] [stdout] test prints_help_with_all_subcommands ... ok [INFO] [stdout] test process_deck_requires_field_or_json ... ok [INFO] [stdout] test process_deck_json_mode_with_note_type ... ok [INFO] [stdout] test process_deck_field_mode ... ok [INFO] [stdout] test prints_version ... ok [INFO] [stdout] test query_docs_prints_documentation ... ok [INFO] [stdout] test process_file_requires_field_or_json ... ok [INFO] [stdout] test process_file_dry_run_shows_sample_prompt ... ok [INFO] [stdout] test config_path_prints_path ... ok [INFO] [stdout] test config_set_and_get_round_trip ... ok [INFO] [stdout] test config_list_empty_when_no_file ... ok [INFO] [stdout] test query_invalid_json_fails ... ok [INFO] [stdout] test process_file_rejects_missing_id ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.16s [INFO] [stdout] [INFO] [stderr] Doc-tests anki_llm [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" "be3fa826a356da02fa678a24d414e22c81dbd95af28feca14829dfbbc8b69a72", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "be3fa826a356da02fa678a24d414e22c81dbd95af28feca14829dfbbc8b69a72", kill_on_drop: false }` [INFO] [stdout] be3fa826a356da02fa678a24d414e22c81dbd95af28feca14829dfbbc8b69a72