[INFO] cloning repository https://github.com/jamesra26/indexlink [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/jamesra26/indexlink" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fjamesra26%2Findexlink", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fjamesra26%2Findexlink'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] 79c56eaeef3a62097854340a98a8e0585ed4a556 [INFO] testing jamesra26/indexlink against 1.99.0-beta.1+cargoflags=--release for beta-release-1.99-2 [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fjamesra26%2Findexlink" "/workspace/builds/worker-7-tc2/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-7-tc2/source'... [INFO] [stderr] done. [INFO] removed /workspace/builds/worker-7-tc2/source/rust-toolchain.toml [INFO] started tweaking git repo https://github.com/jamesra26/indexlink [INFO] finished tweaking git repo https://github.com/jamesra26/indexlink [INFO] tweaked toml for git repo https://github.com/jamesra26/indexlink written to /workspace/builds/worker-7-tc2/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/jamesra26/indexlink on toolchain 1.99.0-beta.1 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.99.0-beta.1" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/jamesra26/indexlink 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.99.0-beta.1" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc2/target:/opt/rustwide/target:rw,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" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:8683fc1fc2eb5c9ac98e0d076ab094b2ffac7f99da555d2b6a2e27f346de2ec7" "sleep" "infinity", kill_on_drop: false }` [INFO] [stdout] d603f2b4e3e32835d73874487d5cafbdf83428590c5c301a457cc18e7dfc619c [INFO] running `Command { std: "docker" "start" "d603f2b4e3e32835d73874487d5cafbdf83428590c5c301a457cc18e7dfc619c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "d603f2b4e3e32835d73874487d5cafbdf83428590c5c301a457cc18e7dfc619c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "d603f2b4e3e32835d73874487d5cafbdf83428590c5c301a457cc18e7dfc619c" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.1" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "d603f2b4e3e32835d73874487d5cafbdf83428590c5c301a457cc18e7dfc619c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-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" "-w" "/opt/rustwide/workdir" "--user" "0:0" "d603f2b4e3e32835d73874487d5cafbdf83428590c5c301a457cc18e7dfc619c" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.1" "build" "--frozen" "--message-format=json" "--release", kill_on_drop: false }` [INFO] [stderr] Compiling libc v0.2.186 [INFO] [stderr] Compiling serde_core v1.0.228 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling shlex v2.0.1 [INFO] [stderr] Compiling syn v2.0.118 [INFO] [stderr] Compiling autocfg v1.5.1 [INFO] [stderr] Compiling bytes v1.12.0 [INFO] [stderr] Compiling stable_deref_trait v1.2.1 [INFO] [stderr] Compiling crossbeam-utils v0.8.21 [INFO] [stderr] Compiling cc v1.2.65 [INFO] [stderr] Compiling serde_json v1.0.150 [INFO] [stderr] Compiling memchr v2.8.2 [INFO] [stderr] Compiling rustls v0.23.40 [INFO] [stderr] Compiling cfg-if v1.0.4 [INFO] [stderr] Compiling futures-sink v0.3.32 [INFO] [stderr] Compiling log v0.4.32 [INFO] [stderr] Compiling futures-io v0.3.32 [INFO] [stderr] Compiling errno v0.3.14 [INFO] [stderr] Compiling socket2 v0.6.4 [INFO] [stderr] Compiling mio v1.2.1 [INFO] [stderr] Compiling signal-hook-registry v1.4.8 [INFO] [stderr] Compiling getrandom v0.2.17 [INFO] [stderr] Compiling ring v0.17.14 [INFO] [stderr] Compiling zerocopy v0.8.52 [INFO] [stderr] Compiling futures-util v0.3.32 [INFO] [stderr] Compiling generic-array v0.14.7 [INFO] [stderr] Compiling typenum v1.20.1 [INFO] [stderr] Compiling zeroize v1.9.0 [INFO] [stderr] Compiling rustls-pki-types v1.14.1 [INFO] [stderr] Compiling num-traits v0.2.19 [INFO] [stderr] Compiling litemap v0.8.2 [INFO] [stderr] Compiling writeable v0.6.3 [INFO] [stderr] Compiling subtle v2.6.1 [INFO] [stderr] Compiling pin-project-lite v0.2.17 [INFO] [stderr] Compiling futures-core v0.3.32 [INFO] [stderr] Compiling utf8_iter v1.0.4 [INFO] [stderr] Compiling icu_normalizer_data v2.2.0 [INFO] [stderr] Compiling icu_properties_data v2.2.0 [INFO] [stderr] Compiling scopeguard v1.2.0 [INFO] [stderr] Compiling lock_api v0.4.14 [INFO] [stderr] Compiling block-buffer v0.10.4 [INFO] [stderr] Compiling crypto-common v0.1.7 [INFO] [stderr] Compiling digest v0.10.7 [INFO] [stderr] Compiling futures-channel v0.3.32 [INFO] [stderr] Compiling http v1.4.2 [INFO] [stderr] Compiling pkg-config v0.3.33 [INFO] [stderr] Compiling vcpkg v0.2.15 [INFO] [stderr] Compiling synstructure v0.13.2 [INFO] [stderr] Compiling libsqlite3-sys v0.30.1 [INFO] [stderr] Compiling http-body v1.0.1 [INFO] [stderr] Compiling webpki-roots v1.0.8 [INFO] [stderr] Compiling parking_lot_core v0.9.12 [INFO] [stderr] Compiling untrusted v0.9.0 [INFO] [stderr] Compiling once_cell v1.21.4 [INFO] [stderr] Compiling equivalent v1.0.2 [INFO] [stderr] Compiling percent-encoding v2.3.2 [INFO] [stderr] Compiling form_urlencoded v1.2.2 [INFO] [stderr] Compiling zmij v1.0.21 [INFO] [stderr] Compiling futures-task v0.3.32 [INFO] [stderr] Compiling allocator-api2 v0.2.21 [INFO] [stderr] Compiling itoa v1.0.18 [INFO] [stderr] Compiling slab v0.4.12 [INFO] [stderr] Compiling foldhash v0.1.5 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling zerofrom-derive v0.1.7 [INFO] [stderr] Compiling yoke-derive v0.8.2 [INFO] [stderr] Compiling zerovec-derive v0.11.3 [INFO] [stderr] Compiling displaydoc v0.2.6 [INFO] [stderr] Compiling tracing-attributes v0.1.31 [INFO] [stderr] Compiling tokio-macros v2.7.0 [INFO] [stderr] Compiling zerofrom v0.1.8 [INFO] [stderr] Compiling yoke v0.8.3 [INFO] [stderr] Compiling zerovec v0.11.6 [INFO] [stderr] Compiling tokio v1.52.3 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling tinystr v0.8.3 [INFO] [stderr] Compiling potential_utf v0.1.5 [INFO] [stderr] Compiling tracing v0.1.44 [INFO] [stderr] Compiling zerotrie v0.2.4 [INFO] [stderr] Compiling icu_locale_core v2.2.0 [INFO] [stderr] Compiling icu_collections v2.2.0 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling icu_provider v2.2.0 [INFO] [stderr] Compiling smallvec v1.15.2 [INFO] [stderr] Compiling rustls-webpki v0.103.13 [INFO] [stderr] Compiling icu_properties v2.2.0 [INFO] [stderr] Compiling icu_normalizer v2.2.0 [INFO] [stderr] Compiling parking_lot v0.12.5 [INFO] [stderr] Compiling async-trait v0.1.89 [INFO] [stderr] Compiling idna_adapter v1.2.2 [INFO] [stderr] Compiling idna v1.1.0 [INFO] [stderr] Compiling hashbrown v0.15.5 [INFO] [stderr] Compiling url v2.5.8 [INFO] [stderr] Compiling tracing-core v0.1.36 [INFO] [stderr] Compiling concurrent-queue v2.5.0 [INFO] [stderr] Compiling tinyvec_macros v0.1.1 [INFO] [stderr] Compiling cpufeatures v0.2.17 [INFO] [stderr] Compiling hashbrown v0.17.1 [INFO] [stderr] Compiling crc-catalog v2.5.0 [INFO] [stderr] Compiling parking v2.2.1 [INFO] [stderr] Compiling event-listener v5.4.1 [INFO] [stderr] Compiling crc v3.4.0 [INFO] [stderr] Compiling indexmap v2.14.0 [INFO] [stderr] Compiling serde_urlencoded v0.7.1 [INFO] [stderr] Compiling sha2 v0.10.9 [INFO] [stderr] Compiling tinyvec v1.11.0 [INFO] [stderr] Compiling webpki-roots v0.26.11 [INFO] [stderr] Compiling tokio-stream v0.1.18 [INFO] [stderr] Compiling hashlink v0.10.0 [INFO] [stderr] Compiling ppv-lite86 v0.2.21 [INFO] [stderr] Compiling futures-intrusive v0.5.0 [INFO] [stderr] Compiling either v1.16.0 [INFO] [stderr] Compiling crossbeam-queue v0.3.12 [INFO] [stderr] Compiling rand_core v0.6.4 [INFO] [stderr] Compiling base64 v0.22.1 [INFO] [stderr] Compiling bitflags v2.13.0 [INFO] [stderr] Compiling rand_chacha v0.3.1 [INFO] [stderr] Compiling hyper v1.10.1 [INFO] [stderr] Compiling atoi v2.0.0 [INFO] [stderr] Compiling unicode-normalization v0.1.25 [INFO] [stderr] Compiling http-body-util v0.1.3 [INFO] [stderr] Compiling hmac v0.12.1 [INFO] [stderr] Compiling spin v0.9.8 [INFO] [stderr] Compiling unicode-properties v0.1.4 [INFO] [stderr] Compiling unicode-bidi v0.3.18 [INFO] [stderr] Compiling getrandom v0.4.3 [INFO] [stderr] Compiling ryu v1.0.23 [INFO] [stderr] Compiling rust_decimal v1.42.1 [INFO] [stderr] Compiling hyper-util v0.1.20 [INFO] [stderr] Compiling sqlx-core v0.8.6 [INFO] [stderr] Compiling stringprep v0.1.5 [INFO] [stderr] Compiling flume v0.11.1 [INFO] [stderr] Compiling hkdf v0.12.4 [INFO] [stderr] Compiling rand v0.8.6 [INFO] [stderr] Compiling tower v0.5.3 [INFO] [stderr] Compiling futures-executor v0.3.32 [INFO] [stderr] Compiling md-5 v0.10.6 [INFO] [stderr] Compiling byteorder v1.5.0 [INFO] [stderr] Compiling dotenvy v0.15.7 [INFO] [stderr] Compiling arrayvec v0.7.7 [INFO] [stderr] Compiling hex v0.4.3 [INFO] [stderr] Compiling home v0.5.12 [INFO] [stderr] Compiling whoami v1.6.1 [INFO] [stderr] Compiling sqlx-postgres v0.8.6 [INFO] [stderr] Compiling tokio-rustls v0.26.4 [INFO] [stderr] Compiling deranged v0.5.8 [INFO] [stderr] Compiling time-core v0.1.9 [INFO] [stderr] Compiling num-conv v0.2.2 [INFO] [stderr] Compiling time v0.3.51 [INFO] [stderr] Compiling hyper-rustls v0.27.9 [INFO] [stderr] Compiling sqlx-sqlite v0.8.6 [INFO] [stderr] Compiling uuid v1.23.3 [INFO] [stderr] Compiling tower-http v0.6.11 [INFO] [stderr] Compiling sqlx-macros-core v0.8.6 [INFO] [stderr] Compiling reqwest v0.12.28 [INFO] [stderr] Compiling chrono v0.4.45 [INFO] [stderr] Compiling quick-xml v0.37.5 [INFO] [stderr] Compiling core-domain v0.1.0 (/opt/rustwide/workdir/crates/core-domain) [INFO] [stderr] Compiling regex-syntax v0.8.11 [INFO] [stderr] Compiling sqlx-macros v0.8.6 [INFO] [stderr] Compiling axum-core v0.4.5 [INFO] [stderr] Compiling regex-automata v0.4.14 [INFO] [stderr] Compiling ai-client v0.1.0 (/opt/rustwide/workdir/crates/ai-client) [INFO] [stderr] Compiling quant-engine v0.1.0 (/opt/rustwide/workdir/crates/quant-engine) [INFO] [stderr] Compiling decision-records v0.1.0 (/opt/rustwide/workdir/crates/decision-records) [INFO] [stderr] Compiling investment-plans v0.1.0 (/opt/rustwide/workdir/crates/investment-plans) [INFO] [stderr] Compiling sha1 v0.10.6 [INFO] [stderr] Compiling serde_path_to_error v0.1.20 [INFO] [stderr] Compiling matchit v0.7.3 [INFO] [stderr] Compiling axum v0.7.9 [INFO] [stderr] Compiling broker v0.1.0 (/opt/rustwide/workdir/crates/broker) [INFO] [stderr] Compiling decision-engine v0.1.0 (/opt/rustwide/workdir/crates/decision-engine) [INFO] [stderr] Compiling matchers v0.2.0 [INFO] [stderr] Compiling tracing-log v0.2.0 [INFO] [stderr] Compiling tracing-subscriber v0.3.23 [INFO] [stderr] Compiling sqlx v0.8.6 [INFO] [stderr] Compiling indexlink-storage v0.1.0 (/opt/rustwide/workdir/crates/storage) [INFO] [stderr] Compiling indexlink-api v0.1.0 (/opt/rustwide/workdir/crates/api) [INFO] [stderr] Compiling indexlink-server v0.1.0 (/opt/rustwide/workdir/apps/server) [INFO] [stderr] Finished `release` profile [optimized] target(s) in 8m 21s [INFO] running `Command { std: "docker" "inspect" "d603f2b4e3e32835d73874487d5cafbdf83428590c5c301a457cc18e7dfc619c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-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" "-w" "/opt/rustwide/workdir" "--user" "0:0" "d603f2b4e3e32835d73874487d5cafbdf83428590c5c301a457cc18e7dfc619c" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.1" "test" "--frozen" "--no-run" "--message-format=json" "--release", kill_on_drop: false }` [INFO] [stderr] Compiling broker v0.1.0 (/opt/rustwide/workdir/crates/broker) [INFO] [stderr] Compiling ai-client v0.1.0 (/opt/rustwide/workdir/crates/ai-client) [INFO] [stderr] Compiling indexlink-storage v0.1.0 (/opt/rustwide/workdir/crates/storage) [INFO] [stderr] Compiling indexlink-api v0.1.0 (/opt/rustwide/workdir/crates/api) [INFO] [stderr] Compiling indexlink-server v0.1.0 (/opt/rustwide/workdir/apps/server) [INFO] [stderr] Compiling quant-engine v0.1.0 (/opt/rustwide/workdir/crates/quant-engine) [INFO] [stderr] Compiling decision-engine v0.1.0 (/opt/rustwide/workdir/crates/decision-engine) [INFO] [stderr] Compiling decision-records v0.1.0 (/opt/rustwide/workdir/crates/decision-records) [INFO] [stderr] Compiling investment-plans v0.1.0 (/opt/rustwide/workdir/crates/investment-plans) [INFO] [stderr] Compiling core-domain v0.1.0 (/opt/rustwide/workdir/crates/core-domain) [INFO] [stderr] Finished `release` profile [optimized] target(s) in 1m 39s [INFO] running `Command { std: "docker" "inspect" "d603f2b4e3e32835d73874487d5cafbdf83428590c5c301a457cc18e7dfc619c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-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" "-w" "/opt/rustwide/workdir" "--user" "0:0" "d603f2b4e3e32835d73874487d5cafbdf83428590c5c301a457cc18e7dfc619c" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.1" "test" "--frozen" "--release", kill_on_drop: false }` [INFO] [stderr] Finished `release` profile [optimized] target(s) in 0.26s [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/release/deps/ai_client-f5977998efe9a6ed) [INFO] [stdout] [INFO] [stdout] running 77 tests [INFO] [stdout] test client::tests::build_request_includes_user_prompt ... ok [INFO] [stdout] test client::tests::chat_url_without_trailing_slash ... ok [INFO] [stdout] test client::tests::client_constructs_without_panic ... ok [INFO] [stdout] test client::tests::extract_json_from_markdown_code_block ... ok [INFO] [stdout] test client::tests::extract_json_no_braces_returns_none ... ok [INFO] [stdout] test client::tests::extract_json_unclosed_brace_returns_none ... ok [INFO] [stdout] test client::tests::extract_json_with_prefix_text ... ok [INFO] [stdout] test client::tests::extract_nested_json ... ok [INFO] [stdout] test client::tests::extract_pure_json ... ok [INFO] [stdout] test client::tests::chat_url_appends_v1_when_missing ... ok [INFO] [stdout] test client::tests::parse_negative_sentiment_json ... ok [INFO] [stdout] test client::tests::parse_sentiment_fails_on_missing_field ... ok [INFO] [stdout] test client::tests::parse_sentiment_fails_on_unparseable_output ... ok [INFO] [stdout] test client::tests::parse_sentiment_from_markdown_wrapped_json ... ok [INFO] [stdout] test client::tests::parse_sentiment_from_pure_json ... ok [INFO] [stdout] test client::tests::parse_sentiment_json_rejects_missing_field ... ok [INFO] [stdout] test client::tests::parse_sentiment_with_explanatory_prefix ... ok [INFO] [stdout] test client::tests::chat_url_does_not_double_v1 ... ok [INFO] [stdout] test client::tests::system_prompt_includes_required_fields ... ok [INFO] [stdout] test client::tests::parse_valid_sentiment_json ... ok [INFO] [stdout] test error::tests::all_error_variants_never_contain_secret_patterns ... ok [INFO] [stdout] test error::tests::empty_response_display_is_safe ... ok [INFO] [stdout] test error::tests::http_status_display_is_safe ... ok [INFO] [stdout] test error::tests::invalid_json_display_is_safe ... ok [INFO] [stdout] test error::tests::timeout_display_is_safe ... ok [INFO] [stdout] test error::tests::unexpected_structure_display_is_safe ... ok [INFO] [stdout] test mock::tests::mock_custom_default ... ok [INFO] [stdout] test mock::tests::mock_negative_strong ... ok [INFO] [stdout] test mock::tests::mock_neutral_on_unmatched ... ok [INFO] [stdout] test mock::tests::mock_negative_weak ... ok [INFO] [stdout] test mock::tests::mock_positive_strong ... ok [INFO] [stdout] test error::tests::parse_failure_display_is_safe ... ok [INFO] [stdout] test mock::tests::mock_strong_signal_overrides_weak ... ok [INFO] [stdout] test mock::tests::mock_positive_weak ... ok [INFO] [stdout] test news::tests::filter_keeps_recent_items ... ok [INFO] [stdout] test mock::tests::mock_implements_provider_trait ... ok [INFO] [stdout] test news::tests::filter_removes_old_items ... ok [INFO] [stdout] test news::tests::filter_mixed_old_and_recent ... ok [INFO] [stdout] test news::tests::parse_empty_feed_returns_empty_vec ... ok [INFO] [stdout] test news::tests::filter_respects_max_items ... ok [INFO] [stdout] test news::tests::parse_multiple_items ... ok [INFO] [stdout] test news::tests::parse_invalid_date_returns_none ... ok [INFO] [stdout] test news::tests::parse_rejects_malformed_xml ... ok [INFO] [stdout] test news::tests::parse_rfc2822_date ... ok [INFO] [stdout] test news::tests::parse_rfc3339_date ... ok [INFO] [stdout] test news::tests::parse_handles_html_in_description ... ok [INFO] [stdout] test news::tests::parse_single_item ... ok [INFO] [stdout] test news::tests::parse_skips_items_without_title_or_date ... ok [INFO] [stdout] test news::tests::pipeline_fetch_and_analyze ... ok [INFO] [stdout] test news::tests::pipeline_negative_sentiment ... ok [INFO] [stdout] test news::tests::prompt_empty_news ... ok [INFO] [stdout] test news::tests::prompt_includes_headlines ... ok [INFO] [stdout] test news::tests::prompt_truncates_long_content ... ok [INFO] [stdout] test news::tests::prompt_includes_all_items ... ok [INFO] [stdout] test news::tests::truncate_at_period ... ok [INFO] [stdout] test news::tests::truncate_short_text_unchanged ... ok [INFO] [stdout] test news::tests::truncate_without_period_falls_back_to_cutoff ... ok [INFO] [stdout] test provider::tests::config_debug_redacts_api_key ... ok [INFO] [stdout] test provider::tests::config_debug_redacts_embedded_url_credentials ... ok [INFO] [stdout] test provider::tests::config_default_values ... ok [INFO] [stdout] test provider::tests::config_display_hides_api_key_and_url_credentials ... ok [INFO] [stdout] test sentiment::tests::sentiment_converts_into_f64 ... ok [INFO] [stdout] test sentiment::tests::sentiment_display_negative ... ok [INFO] [stdout] test sentiment::tests::sentiment_display_positive ... ok [INFO] [stdout] test sentiment::tests::sentiment_error_display ... ok [INFO] [stdout] test sentiment::tests::sentiment_display_neutral ... ok [INFO] [stdout] test sentiment::tests::sentiment_neutral_is_zero ... ok [INFO] [stdout] test sentiment::tests::sentiment_new_clamped_above_range ... ok [INFO] [stdout] test sentiment::tests::sentiment_new_clamped_below_range ... ok [INFO] [stdout] test sentiment::tests::sentiment_new_clamped_infinity_is_clamped ... ok [INFO] [stdout] test sentiment::tests::sentiment_new_clamped_inside_range ... ok [INFO] [stdout] test sentiment::tests::sentiment_new_out_of_range ... ok [INFO] [stdout] test sentiment::tests::sentiment_new_clamped_nan_is_neutral ... ok [INFO] [stdout] test sentiment::tests::sentiment_new_valid_range ... ok [INFO] [stdout] test sentiment::tests::sentiment_ordering ... ok [INFO] [stdout] test sentiment::tests::sentiment_new_rejects_infinity ... ok [INFO] [stdout] test sentiment::tests::sentiment_try_from_reports_failure_reason ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 77 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s [INFO] [stdout] [INFO] [stderr] Running tests/client.rs (/opt/rustwide/target/release/deps/client-462712d2db1bb911) [INFO] [stdout] [INFO] [stdout] running 11 tests [INFO] [stdout] test client_clamps_out_of_range_sentiment ... ok [INFO] [stdout] test client_returns_error_on_auth_failure ... ok [INFO] [stdout] test client_returns_error_on_connection_refused ... ok [INFO] [stdout] test client_analyzes_positive_news ... ok [INFO] [stdout] test client_request_includes_bearer_auth ... ok [INFO] [stdout] test client_returns_error_on_empty_choices ... ok [INFO] [stdout] test client_returns_error_on_http_error ... ok [INFO] [stdout] test client_analyzes_neutral_news ... ok [INFO] [stdout] test client_analyzes_negative_news ... ok [INFO] [stdout] test client_returns_error_on_empty_content ... ok [INFO] [stdout] test client_returns_error_on_invalid_json_response ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s [INFO] [stdout] [INFO] [stderr] Running tests/news.rs (/opt/rustwide/target/release/deps/news-ae324b83af90c47a) [INFO] [stdout] [INFO] [stdout] running 2 tests [INFO] [stdout] test real_cnbc_with_mock ... ignored, 需要网络,手动运行 [INFO] [stdout] test real_cnbc_with_qwen ... ignored, 需要网络和 DASHSCOPE_API_KEY,手动运行 [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running tests/provider.rs (/opt/rustwide/target/release/deps/provider-6e5beaa38bcee5e7) [INFO] [stdout] [INFO] [stdout] running 7 tests [INFO] [stdout] test config_debug_hides_api_key ... ok [INFO] [stdout] test config_default_uses_qwen_dashscope ... ok [INFO] [stdout] test config_display_hides_api_key ... ok [INFO] [stdout] test mock_provider_propagates_error_to_caller ... ok [INFO] [stdout] test mock_provider_returns_neutral ... ok [INFO] [stdout] test mock_provider_returns_negative_sentiment ... ok [INFO] [stdout] test mock_provider_returns_positive_sentiment ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s [INFO] [stdout] [INFO] [stderr] Running tests/sentiment.rs (/opt/rustwide/target/release/deps/sentiment-eb77af5bc623b146) [INFO] [stdout] [INFO] [stdout] running 7 tests [INFO] [stdout] test sentiment_into_f64_roundtrip ... ok [INFO] [stdout] test sentiment_display_format ... ok [INFO] [stdout] test sentiment_new_clamped_is_permissive ... ok [INFO] [stdout] test sentiment_new_validates_strictly ... ok [INFO] [stdout] test sentiment_neutral_is_zero_signal ... ok [INFO] [stdout] test sentiment_neutral_is_zero ... ok [INFO] [stdout] test sentiment_partial_ord ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s [INFO] [stdout] [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/release/deps/broker-feadab879ba74e54) [INFO] [stdout] [INFO] [stdout] running 36 tests [INFO] [stdout] test opend_session::tests::frame_encoding_matches_independent_golden_frame ... ok [INFO] [stdout] test opend_session::tests::frame_reader_rejects_corrupted_golden_frame ... ok [INFO] [stdout] test opend_session::tests::limit_order_payload_preserves_price ... ok [INFO] [stdout] test opend_session::tests::loopback_host_check_uses_ip_semantics ... ok [INFO] [stdout] test opend_session::tests::heartbeat_interval_requires_positive_seconds ... ok [INFO] [stdout] test opend_session::tests::order_ack_requires_selected_paper_account_and_us_market ... ok [INFO] [stdout] test opend_session::tests::paper_account_selection_requires_one_safe_candidate ... ok [INFO] [stdout] test opend_session::tests::session_initializes_and_selects_single_paper_account ... ok [INFO] [stdout] test opend_session::tests::session_maps_opend_rejection_to_safe_broker_error ... ok [INFO] [stdout] test opend_session::tests::session_marks_sent_order_without_response_as_outcome_unknown ... ok [INFO] [stdout] test opend_session::tests::session_rejects_malformed_paper_account ... ok [INFO] [stdout] test opend_session::tests::session_rejects_opend_without_trade_login ... ok [INFO] [stdout] test opend_session::tests::localhost_uses_a_literal_loopback_address ... ok [INFO] [stdout] test opend_session::tests::session_rejects_remote_raw_tcp_host ... ok [INFO] [stdout] test tests::limit_order_requires_positive_limit_price ... ok [INFO] [stdout] test tests::market_order_normalizes_symbol_and_idempotency_key ... ok [INFO] [stdout] test opend_session::tests::session_uses_explicit_paper_account_selection ... ok [INFO] [stdout] test opend_session::tests::session_submits_us_market_order_and_maps_ack ... ok [INFO] [stdout] test tests::mock_broker_accepts_paper_orders ... ok [INFO] [stdout] test tests::mock_broker_deduplicates_repeated_idempotency_key ... ok [INFO] [stdout] test tests::opend_config_debug_redacts_account_id ... ok [INFO] [stdout] test tests::opend_config_rejects_environment_mismatch ... ok [INFO] [stdout] test tests::opend_config_rejects_invalid_connection_fields ... ok [INFO] [stdout] test tests::opend_config_requires_live_gate_for_live_orders ... ok [INFO] [stdout] test tests::opend_paper_broker_propagates_gateway_failure ... ok [INFO] [stdout] test tests::opend_paper_broker_rejects_enabled_live_gate ... ok [INFO] [stdout] test tests::opend_paper_broker_rejects_live_config ... ok [INFO] [stdout] test tests::opend_paper_broker_submits_order_through_gateway ... ok [INFO] [stdout] test tests::opend_paper_broker_rejects_live_order_before_gateway ... ok [INFO] [stdout] test tests::opend_paper_config_normalizes_host_and_disables_live ... ok [INFO] [stdout] test tests::order_request_rejects_invalid_fields ... ok [INFO] [stdout] test tests::mock_broker_rejects_live_orders_by_default ... ok [INFO] [stdout] test opend_session::tests::gateway_rejects_mismatched_account_before_sending_order ... ok [INFO] [stdout] test opend_session::tests::gateway_rejects_live_configuration_before_sending_order ... ok [INFO] [stdout] test opend_session::tests::session_rejects_non_paper_request_before_sending_order ... ok [INFO] [stdout] test opend_session::tests::session_sends_keep_alive_at_server_interval ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.01s [INFO] [stdout] [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/release/deps/core_domain-85e1d1c8a5e9f6dd) [INFO] [stdout] [INFO] [stdout] running 13 tests [INFO] [stdout] test tests::multiplier_clamp ... ok [INFO] [stdout] test tests::multiplier_display ... ok [INFO] [stdout] test tests::multiplier_to_action_boundaries ... ok [INFO] [stdout] test tests::multiplier_to_action ... ok [INFO] [stdout] test tests::percentile_converts_into_f64 ... ok [INFO] [stdout] test tests::percentile_error_display ... ok [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/release/deps/decision_engine-e73b72e4ba3d214f) [INFO] [stdout] test tests::percentile_display ... ok [INFO] [stdout] test tests::percentile_out_of_range ... ok [INFO] [stdout] test tests::percentile_try_from_reports_failure_reason ... ok [INFO] [stdout] test tests::percentile_valid_range ... ok [INFO] [stdout] test tests::multiplier_to_action_rejects_negative_internal_value - should panic ... ok [INFO] [stdout] test tests::percentile_invert ... ok [INFO] [stdout] test tests::multiplier_to_action_rejects_invalid_internal_value - should panic ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 13 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 10 tests [INFO] [stdout] test tests::decision_weights_require_sum_of_one ... ok [INFO] [stdout] test tests::trend_regime_triggers_tactical_delay ... ok [INFO] [stdout] test tests::default_config_uses_70_20_10_and_90_10_0_fallback ... ok [INFO] [stdout] test tests::expensive_negative_inputs_underweight ... ok [INFO] [stdout] test tests::unavailable_sentiment_uses_neutral_value_for_custom_fallback_weights ... ok [INFO] [stdout] test tests::cheap_positive_neutral_timing_overweights ... ok [INFO] [stdout] test tests::unavailable_sentiment_uses_fallback_weights ... ok [INFO] [stdout] test tests::extreme_low_score_can_skip_execution ... ok [INFO] [stdout] test tests::multiplier_mapping_is_continuous_around_skip_boundary ... ok [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/release/deps/decision_records-bbacbd628c53c7ab) [INFO] [stdout] test tests::neutral_inputs_produce_standard_action ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 10 tests [INFO] [stdout] test tests::list_query_rejects_unbounded_limits ... ok [INFO] [stdout] test tests::normalize_symbol_rejects_invalid_boundaries ... ok [INFO] [stdout] test tests::normalize_summary_rejects_invalid_boundaries ... ok [INFO] [stdout] test tests::service_creates_lists_and_gets_records ... ok [INFO] [stdout] test tests::service_rejects_all_null_snapshot_boundaries ... ok [INFO] [stdout] test tests::service_maps_repository_not_found ... ok [INFO] [stdout] test tests::service_rejects_invalid_create_input_before_repository ... ok [INFO] [stdout] test tests::service_normalizes_create_input_before_repository ... ok [INFO] [stdout] test tests::service_supports_bounded_list_queries ... ok [INFO] [stdout] test tests::normalize_currency_rejects_invalid_boundaries ... ok [INFO] [stdout] [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/release/deps/indexlink_api-fbf80f4527b9d3ae) [INFO] [stdout] test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 9 tests [INFO] [stdout] test error::tests::broker_rejection_maps_to_bad_request ... ok [INFO] [stdout] test error::tests::service_unavailable_response_uses_safe_json_contract ... ok [INFO] [stdout] test state::tests::custom_backend_debug_hides_checker_fields ... ok [INFO] [stdout] test state::tests::sqlite_backend_debug_and_error_hide_pool_details ... ok [INFO] [stdout] test state::tests::readiness_error_display_preserves_internal_diagnostic_for_logs ... ok [INFO] [stdout] test error::tests::envelope_omits_absent_request_id ... ok [INFO] [stdout] test error::tests::broker_outcome_unknown_uses_non_retryable_conflict_contract ... ok [INFO] [stdout] test error::tests::envelope_serializes_present_request_id ... ok [INFO] [stderr] Running tests/decision_preview.rs (/opt/rustwide/target/release/deps/decision_preview-d1e6825fcab21c3a) [INFO] [stdout] test state::tests::with_broker_replaces_default_mock_broker ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 4 tests [INFO] [stdout] test decision_preview_maps_bad_input_to_safe_bad_request ... ok [INFO] [stdout] test decision_preview_waiting_does_not_submit_order ... ok [INFO] [stdout] test decision_preview_tactical_delay_does_not_submit_order ... ok [INFO] [stdout] test decision_preview_submits_mock_paper_order_when_due ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running tests/decision_records.rs (/opt/rustwide/target/release/deps/decision_records-a639f7b3f3bb65ca) [INFO] [stdout] [INFO] [stdout] running 3 tests [INFO] [stdout] test list_history_returns_bounded_newest_records_for_existing_plan ... ok [INFO] [stdout] test get_history_returns_one_record_by_id ... ok [INFO] [stdout] test history_routes_map_invalid_and_unavailable_paths_to_safe_errors ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running tests/health.rs (/opt/rustwide/target/release/deps/health-737b13b3df5ed0d6) [INFO] [stdout] [INFO] [stdout] running 8 tests [INFO] [stdout] test configured_cors_origin_is_returned_for_preflight_request ... ok [INFO] [stdout] test health_does_not_call_failing_readiness_dependency ... ok [INFO] [stdout] test health_returns_ok_with_expected_json ... ok [INFO] [stdout] test same_origin_router_does_not_grant_cross_origin_access ... ok [INFO] [stdout] test health_reports_version_supplied_by_application_state ... ok [INFO] [stdout] test ready_hides_internal_error_when_database_is_unavailable ... ok [INFO] [stdout] test unconfigured_cors_origin_is_not_reflected ... ok [INFO] [stderr] Running tests/investment_plans.rs (/opt/rustwide/target/release/deps/investment_plans-5b2a3c3a68897c9d) [INFO] [stdout] test ready_returns_ok_when_database_is_available ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 7 tests [INFO] [stdout] test preview_execution_omits_bucket_split_when_waiting ... ok [INFO] [stdout] test preview_execution_maps_bad_input_to_safe_bad_request ... ok [INFO] [stdout] test invalid_create_json_returns_safe_bad_request ... ok [INFO] [stdout] test preview_execution_returns_bucket_split_when_due ... ok [INFO] [stdout] test update_plan_merges_fields_and_maps_bad_input ... ok [INFO] [stdout] test create_plan_returns_normalized_plan_json ... ok [INFO] [stdout] test list_get_and_bad_id_routes_use_service ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running tests/market_sentiment.rs (/opt/rustwide/target/release/deps/market_sentiment-be7f6c5316e19689) [INFO] [stdout] [INFO] [stdout] running 3 tests [INFO] [stdout] test preview_provider_error_uses_safe_unavailable_response ... ok [INFO] [stdout] test preview_returns_sentiment_from_injected_provider ... ok [INFO] [stdout] test preview_without_configured_provider_is_unavailable ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 27 tests [INFO] [stdout] test config::tests::invalid_connect_timeout_is_rejected ... ok [INFO] [stdout] test config::tests::configuration_errors_do_not_expose_database_url ... ok [INFO] [stdout] test config::tests::invalid_cors_header_value_is_rejected ... ok [INFO] [stdout] test config::tests::invalid_host_is_rejected ... ok [INFO] [stdout] test config::tests::invalid_max_connections_is_rejected ... ok [INFO] [stdout] test config::tests::invalid_port_is_rejected_with_variable_name ... ok [INFO] [stdout] test config::tests::invalid_qwen_temperature_is_rejected ... ok [INFO] [stdout] test config::tests::minimal_configuration_uses_documented_defaults ... ok [INFO] [stdout] test config::tests::multiple_cors_origins_are_trimmed ... ok [INFO] [stdout] test config::tests::non_sqlite_database_url_is_rejected ... ok [INFO] [stdout] test config::tests::opend_configuration_is_optional_and_paper_only ... ok [INFO] [stdout] test config::tests::opend_configuration_normalizes_loopback_literals ... ok [INFO] [stdout] test config::tests::qwen_configuration_accepts_explicit_runtime_values ... ok [INFO] [stdout] test config::tests::qwen_configuration_is_optional_and_uses_safe_defaults ... ok [INFO] [stdout] test config::tests::unsafe_opend_configuration_is_rejected ... ok [INFO] [stderr] Running unittests src/main.rs (/opt/rustwide/target/release/deps/indexlink_server-fb077468f6f1e306) [INFO] [stdout] test config::tests::zero_connect_timeout_is_rejected ... ok [INFO] [stdout] test config::tests::custom_network_and_pool_values_are_parsed ... ok [INFO] [stdout] test config::tests::zero_max_connections_is_rejected ... ok [INFO] [stdout] test config::tests::empty_cors_entries_are_filtered ... ok [INFO] [stdout] test tests::real_opend_paper_order_smoke ... ignored, requires an explicitly confirmed local OpenD paper order [INFO] [stdout] test config::tests::blank_database_url_is_rejected ... ok [INFO] [stdout] test tests::build_api_state_leaves_market_sentiment_unconfigured_without_qwen ... ok [INFO] [stdout] test tests::build_api_state_returns_session_error_when_opend_factory_fails ... ok [INFO] [stdout] test config::tests::blank_qwen_key_is_rejected_without_echoing_the_value ... ok [INFO] [stdout] test config::tests::single_cors_origin_is_parsed ... ok [INFO] [stdout] test tests::build_api_state_injects_qwen_market_sentiment_when_configured ... ok [INFO] [stdout] test tests::build_api_state_uses_configured_broker_factory ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 26 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.01s [INFO] [stdout] [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/release/deps/indexlink_storage-2ccd2fa5bdc27354) [INFO] [stdout] [INFO] [stdout] running 30 tests [INFO] [stdout] test decision_records::tests::maps_sqlx_errors_to_safe_repository_errors ... ok [INFO] [stdout] test decision_records::tests::query_strings_are_static_and_bounded ... ok [INFO] [stdout] test investment_plans::tests::maps_sqlx_errors_to_safe_repository_errors ... ok [INFO] [stdout] test investment_plans::tests::validates_final_update_amount_relationship ... ok [INFO] [stdout] test sqlite::tests::connect_rejects_zero_max_connections ... ok [INFO] [stdout] test decision_records::tests::rejects_invalid_database_uuid_snapshot ... ok [INFO] [stdout] test decision_records::tests::rejects_invalid_database_json_snapshot ... ok [INFO] [stdout] test sqlite_decision_records::tests::maps_storage_failures_to_safe_repository_errors ... ok [INFO] [stdout] test decision_records::tests::maps_execution_status_roundtrip ... ok [INFO] [stdout] test sqlite_decision_records::tests::query_strings_are_static_and_bounded ... ok [INFO] [stdout] test decision_records::tests::rejects_invalid_database_timestamp_snapshot ... ok [INFO] [stdout] test sqlite_investment_plans::tests::amount_codec_enforces_sqlite_representation ... ok [INFO] [stdout] test sqlite_investment_plans::tests::maps_storage_failures_to_safe_repository_errors ... ok [INFO] [stdout] test sqlite::tests::schema_enforces_amount_timestamp_and_snapshot_invariants ... ok [INFO] [stdout] test sqlite_investment_plans::tests::query_strings_are_static_and_sqlite_compatible ... ok [INFO] [stdout] test sqlite::tests::migration_creates_mvp_schema_in_memory ... ok [INFO] [stdout] test sqlite_decision_records::tests::nonexistent_plan_is_not_persisted ... ok [INFO] [stdout] test tests::connect_rejects_invalid_url_without_exposing_input ... ok [INFO] [stdout] test tests::ping_maps_closed_pool_to_safe_ping_error ... ok [INFO] [stdout] test sqlite_decision_records::tests::rejects_unrepresentable_amounts_and_reports_missing_records ... ok [INFO] [stdout] test sqlite_decision_records::tests::list_query_applies_limit_with_stable_database_order ... ok [INFO] [stdout] test tests::rejects_zero_timeout_without_contacting_database ... ok [INFO] [stdout] test tests::storage_error_display_is_stable_and_safe ... ok [INFO] [stdout] test sqlite_investment_plans::tests::creates_lists_and_gets_plans ... ok [INFO] [stdout] test sqlite_investment_plans::tests::toggles_activity_and_rejects_unrepresentable_amounts ... ok [INFO] [stdout] test sqlite_investment_plans::tests::update_preserves_atomic_amount_validation ... ok [INFO] [stdout] test sqlite_decision_records::tests::creates_lists_and_gets_decision_records ... ok [INFO] [stdout] test sqlite_investment_plans::tests::updates_advance_timestamp_even_when_clock_does_not ... ok [INFO] [stdout] test tests::pool_returns_lazy_pool_without_contacting_database ... ok [INFO] [stdout] test tests::rejects_zero_max_connections_without_contacting_database ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 30 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s [INFO] [stdout] [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/release/deps/investment_plans-377be094b593cc4e) [INFO] [stdout] [INFO] [stdout] running 31 tests [INFO] [stdout] test tests::create_plan_normalizes_text_fields ... ok [INFO] [stdout] test tests::create_plan_rejects_invalid_amount_relationship ... ok [INFO] [stdout] test tests::bucket_allocation_ratio_serializes_as_json_string ... ok [INFO] [stdout] test tests::create_plan_rejects_invalid_schedule_day_and_currency ... ok [INFO] [stdout] test tests::create_plan_rejects_non_ascii_symbol ... ok [INFO] [stdout] test tests::bucket_split_preview_serializes_amounts_as_json_strings ... ok [INFO] [stdout] test tests::decimal_deserializes_from_json_string_without_float ... ok [INFO] [stdout] test tests::decimal_fields_remain_json_strings_on_create_input ... ok [INFO] [stdout] test tests::decimal_rejects_json_number_at_api_boundary ... ok [INFO] [stdout] test tests::decimal_serializes_to_json_string_without_float ... ok [INFO] [stdout] test tests::service_maps_repository_errors_to_safe_application_errors ... ok [INFO] [stdout] test tests::preview_execution_input_rejects_invalid_day ... ok [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/release/deps/quant_engine-e5dce969e54eb8e9) [INFO] [stdout] test tests::execution_preview_never_exceeds_single_execution_cap ... ok [INFO] [stdout] test tests::service_omits_bucket_split_when_execution_is_not_due ... ok [INFO] [stdout] test tests::service_lists_and_gets_plans_through_repository ... ok [INFO] [stdout] test tests::service_normalizes_create_input_before_persisting ... ok [INFO] [stdout] test tests::service_previews_waiting_and_inactive_execution ... ok [INFO] [stdout] test tests::service_previews_due_execution_without_bucket_logic ... ok [INFO] [stdout] test tests::service_previews_due_execution_with_bucket_split ... ok [INFO] [stdout] test tests::bucket_allocation_ratio_accepts_only_closed_unit_interval ... ok [INFO] [stdout] test tests::service_rejects_invalid_create_before_repository ... ok [INFO] [stdout] test tests::service_sets_active_state ... ok [INFO] [stdout] test tests::service_rejects_update_that_breaks_final_amount_limit ... ok [INFO] [stdout] test tests::two_bucket_contribution_split_returns_amount_by_bucket ... ok [INFO] [stdout] test tests::two_bucket_contribution_split_serializes_amounts_as_json_strings ... ok [INFO] [stdout] test tests::two_bucket_config_requires_ratios_to_sum_to_one ... ok [INFO] [stdout] test tests::two_bucket_contribution_split_preserves_total_amount ... ok [INFO] [stdout] test tests::update_plan_normalizes_name_and_validates_amounts ... ok [INFO] [stdout] test tests::two_bucket_contribution_split_rejects_non_positive_amount ... ok [INFO] [stdout] test tests::service_updates_plan_fields ... ok [INFO] [stdout] test tests::update_plan_rejects_empty_patch ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 31 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running tests/fundamental.rs (/opt/rustwide/target/release/deps/fundamental-61f5cf06812a2856) [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] [stdout] [INFO] [stdout] running 20 tests [INFO] [stdout] test audit_fields_reflect_raw_percentiles ... ok [INFO] [stdout] test cape_weight_full_uses_only_cape ... ok [INFO] [stdout] test cape_weight_zero_uses_only_inverted_erp ... ok [INFO] [stdout] test default_config_matches_readme_contract ... ok [INFO] [stdout] test fundamental_expensive_market ... ok [INFO] [stdout] test fundamental_neutral_market ... ok [INFO] [stdout] test infinite_current_returns_invalid_input ... ok [INFO] [stdout] test propagates_insufficient_history_for_circuit_breaker ... ok [INFO] [stdout] test propagates_invalid_input_on_nan_current ... ok [INFO] [stdout] test rejects_zero_min_history_len_at_construction ... ok [INFO] [stdout] test unequal_lengths_below_min_propagate_insufficient_for_short_series ... ok [INFO] [stdout] test unequal_history_lengths_are_accepted ... ok [INFO] [stdout] test rate_repricing_low_erp_pushes_score_expensive_despite_neutral_cape ... ok [INFO] [stdout] test weight_converts_into_raw_f64 ... ok [INFO] [stdout] test rejects_cape_weight_above_one_at_construction ... ok [INFO] [stdout] test weight_display_uses_percent_format_for_audit_logs ... ok [INFO] [stdout] test rejects_cape_weight_below_zero_at_construction ... ok [INFO] [stdout] test weight_try_from_accepts_valid_raw_value ... ok [INFO] [stdout] test erp_percentile_audit_field_is_not_inverted ... ok [INFO] [stdout] test fundamental_cheap_market ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stderr] Running tests/percentile.rs (/opt/rustwide/target/release/deps/percentile-4a25a7020a4f7837) [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 25 tests [INFO] [stdout] test ew_percentile_config_from_half_life_maps_to_alpha ... ok [INFO] [stdout] test ew_percentile_config_rejects_invalid_alpha_and_min_len ... ok [INFO] [stdout] test ew_percentile_config_rejects_invalid_half_life ... ok [INFO] [stdout] test all_nan_history_returns_insufficient ... ok [INFO] [stdout] test exact_min_len_boundary_succeeds ... ok [INFO] [stdout] test insufficient_history_reports_indicator_and_required ... ok [INFO] [stdout] test duplicate_values_use_less_than_or_equal ... ok [INFO] [stdout] test insufficient_history_returns_error ... ok [INFO] [stdout] test nan_current_returns_error ... ok [INFO] [stdout] test nan_in_history_is_filtered ... ok [INFO] [stdout] test percentile_of_above_all_history ... ok [INFO] [stdout] test negative_infinity_current_returns_error ... ok [INFO] [stdout] test percentile_of_at_maximum ... ok [INFO] [stdout] test percentile_of_below_all_history ... ok [INFO] [stdout] test percentile_of_median ... ok [INFO] [stdout] test percentile_of_at_minimum ... ok [INFO] [stdout] test weighted_percentile_returns_insufficient_when_all_valid_weights_underflow ... ok [INFO] [stdout] test weighted_percentile_skips_nan_without_compressing_lag ... ok [INFO] [stdout] test weighted_percentile_propagates_invalid_current_and_insufficient_history ... ok [INFO] [stdout] test quant_error_display_is_descriptive ... ok [INFO] [stdout] test positive_infinity_current_returns_error ... ok [INFO] [stdout] test weighted_percentile_weights_recent_samples_more ... ok [INFO] [stdout] test zero_min_len_returns_error_before_empty_history_division ... ok [INFO] [stdout] test weighted_percentile_softens_oldest_sample_drop ... ok [INFO] [stdout] test weighted_percentile_is_monotonic_in_current_value ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 25 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running tests/trend.rs (/opt/rustwide/target/release/deps/trend-ee0e4600dde16964) [INFO] [stdout] [INFO] [stdout] running 52 tests [INFO] [stdout] test config::accepts_weight_sum_exactly_one ... ok [INFO] [stdout] test config::accepts_weight_sum_within_tolerance ... ok [INFO] [stdout] test config::default_half_life_matches_design ... ok [INFO] [stdout] test config::default_percentile_config_matches_fundamental ... ok [INFO] [stdout] test config::default_thresholds_match_design_constants ... ok [INFO] [stdout] test config::rejects_individual_weight_above_one ... ok [INFO] [stdout] test config::default_weights_match_design_constants ... ok [INFO] [stdout] test config::rejects_individual_weight_below_zero ... ok [INFO] [stdout] test config::rejects_invalid_falling_knife_threshold ... ok [INFO] [stdout] test config::rejects_invalid_overheated_threshold ... ok [INFO] [stdout] test config::default_config_min_len_matches_design ... ok [INFO] [stdout] test config::rejects_negative_threshold ... ok [INFO] [stdout] test config::rejects_nan_overheated_threshold ... ok [INFO] [stdout] test config::rejects_weight_sum_beyond_tolerance ... ok [INFO] [stdout] test config::rejects_weight_sum_not_equal_to_one ... ok [INFO] [stdout] test direction::evaluate_trend_or_stub_returns_real_signal_after_implementation ... ok [INFO] [stdout] test config::rejects_zero_min_history_len ... ok [INFO] [stdout] test direction::evaluate_trend_returns_real_neutral_signal ... ok [INFO] [stdout] test config::rejects_nan_weight ... ok [INFO] [stdout] test direction::neutral_weighted_history_is_near_half_under_trend_config ... ok [INFO] [stdout] test direction::stub_regime_is_neutral ... ok [INFO] [stdout] test direction::stub_still_returns_neutral_score_for_transition_period ... ok [INFO] [stdout] test direction::trend_falling_knife_market_score_is_high ... ok [INFO] [stdout] test direction::trend_neutral_market_score_is_near_half ... ok [INFO] [stdout] test direction::trend_score_clamps_tiny_weight_sum_drift_at_upper_bound ... ok [INFO] [stdout] test direction::trend_overheated_market_score_is_low ... ok [INFO] [stdout] test errors::propagates_insufficient_history_for_rsi ... ok [INFO] [stdout] test errors::propagates_insufficient_history_for_ma_distance ... ok [INFO] [stdout] test errors::propagates_invalid_current_value_for_nan_ma ... ok [INFO] [stdout] test errors::propagates_insufficient_history_for_vix ... ok [INFO] [stdout] test errors::propagates_invalid_current_value_for_nan_rsi ... ok [INFO] [stdout] test errors::propagates_invalid_current_value_for_nan_vix ... ok [INFO] [stdout] test errors::propagates_invalid_current_value_for_infinite_inputs ... ok [INFO] [stdout] test errors::unequal_history_lengths_each_evaluated_independently ... ok [INFO] [stdout] test indicators::audit_fields_falling_knife_scenario ... ok [INFO] [stdout] test indicators::audit_fields_reflect_raw_unreversed_percentiles ... ok [INFO] [stdout] test indicators::high_vix_with_neutral_ma_rsi_pushes_score_above_neutral ... ok [INFO] [stdout] test indicators::ma_only_high_distance_produces_low_score ... ok [INFO] [stdout] test indicators::ma_only_score_equals_one_minus_ma_percentile ... ok [INFO] [stdout] test indicators::rsi_only_high_rsi_produces_low_score ... ok [INFO] [stdout] test indicators::rsi_only_score_equals_one_minus_rsi_percentile ... ok [INFO] [stdout] test indicators::score_is_distinct_from_raw_audit_fields_when_reversed ... ok [INFO] [stdout] test indicators::vix_only_high_vix_produces_high_score ... ok [INFO] [stdout] test regime::regime_is_falling_knife_when_vix_above_threshold ... ok [INFO] [stdout] test indicators::vix_only_score_equals_vix_percentile ... ok [INFO] [stdout] test regime::regime_is_neutral_when_all_indicators_are_moderate ... ok [INFO] [stdout] test regime::regime_is_neutral_when_rsi_equals_overheated_threshold ... ok [INFO] [stdout] test regime::regime_is_neutral_when_ma_equals_overheated_threshold ... ok [INFO] [stdout] test regime::regime_is_neutral_when_vix_equals_falling_knife_threshold ... ok [INFO] [stdout] test regime::regime_is_overheated_when_ma_above_threshold ... ok [INFO] [stderr] Doc-tests ai_client [INFO] [stdout] test regime::regime_is_overheated_when_rsi_above_threshold ... ok [INFO] [stdout] test regime::regime_falling_knife_takes_precedence_over_overheated ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 52 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 4 tests [INFO] [stdout] test crates/ai-client/src/news.rs - news (line 6) - compile ... ok [INFO] [stdout] test crates/ai-client/src/client.rs - client::QwenClient (line 88) - compile ... ok [INFO] [stdout] test crates/ai-client/src/lib.rs - (line 21) - compile ... ok [INFO] [stderr] Doc-tests broker [INFO] [stdout] test crates/ai-client/src/mock.rs - mock::MockAiProvider (line 25) ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.38s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Doc-tests core_domain [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Doc-tests decision_engine [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Doc-tests decision_records [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Doc-tests indexlink_api [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Doc-tests indexlink_storage [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Doc-tests investment_plans [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Doc-tests quant_engine [INFO] [stdout] [INFO] [stdout] running 1 test [INFO] [stdout] test crates/quant-engine/src/percentile.rs - percentile::percentile_of (line 18) ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.38s [INFO] [stdout] [INFO] running `Command { std: "docker" "inspect" "d603f2b4e3e32835d73874487d5cafbdf83428590c5c301a457cc18e7dfc619c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "d603f2b4e3e32835d73874487d5cafbdf83428590c5c301a457cc18e7dfc619c", kill_on_drop: false }` [INFO] [stdout] d603f2b4e3e32835d73874487d5cafbdf83428590c5c301a457cc18e7dfc619c