[INFO] fetching crate oximedia-analytics 0.1.5...
[INFO] testing oximedia-analytics-0.1.5 against beta-2026-04-21 for beta-1.96-2
[INFO] extracting crate oximedia-analytics 0.1.5 into /workspace/builds/worker-2-tc2/source
[INFO] started tweaking crates.io crate oximedia-analytics 0.1.5
[INFO] finished tweaking crates.io crate oximedia-analytics 0.1.5
[INFO] tweaked toml for crates.io crate oximedia-analytics 0.1.5 written to /workspace/builds/worker-2-tc2/source/Cargo.toml
[INFO] validating manifest of crates.io crate oximedia-analytics 0.1.5 on toolchain beta-2026-04-21
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+beta-2026-04-21" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate crates.io crate oximedia-analytics 0.1.5 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" "+beta-2026-04-21" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+beta-2026-04-21" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] df8a6317f3c98af5aa282f694610b7cff7b1e14c9272d611db536321a6b51f99
[INFO] running `Command { std: "docker" "start" "-a" "df8a6317f3c98af5aa282f694610b7cff7b1e14c9272d611db536321a6b51f99", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "df8a6317f3c98af5aa282f694610b7cff7b1e14c9272d611db536321a6b51f99", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "df8a6317f3c98af5aa282f694610b7cff7b1e14c9272d611db536321a6b51f99", kill_on_drop: false }`
[INFO] [stdout] df8a6317f3c98af5aa282f694610b7cff7b1e14c9272d611db536321a6b51f99
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=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" "+beta-2026-04-21" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] beaffa6c36b07f9e558fb93cabb1aff866e231a625b8c57208fa547bb72039e7
[INFO] running `Command { std: "docker" "start" "-a" "beaffa6c36b07f9e558fb93cabb1aff866e231a625b8c57208fa547bb72039e7", kill_on_drop: false }`
[INFO] [stderr]    Compiling libc v0.2.185
[INFO] [stderr]    Compiling serde_core v1.0.228
[INFO] [stderr]    Compiling syn v2.0.117
[INFO] [stderr]    Compiling getrandom v0.4.2
[INFO] [stderr]    Compiling thiserror-impl v2.0.18
[INFO] [stderr]    Compiling uuid v1.23.1
[INFO] [stderr]    Compiling thiserror v2.0.18
[INFO] [stderr]    Compiling oximedia-analytics v0.1.5 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 11.60s
[INFO] running `Command { std: "docker" "inspect" "beaffa6c36b07f9e558fb93cabb1aff866e231a625b8c57208fa547bb72039e7", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "beaffa6c36b07f9e558fb93cabb1aff866e231a625b8c57208fa547bb72039e7", kill_on_drop: false }`
[INFO] [stdout] beaffa6c36b07f9e558fb93cabb1aff866e231a625b8c57208fa547bb72039e7
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=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" "+beta-2026-04-21" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 42b24202891a9a51b19e481aae16f5cefa795c27a72cdde716aeb87f37dc86b9
[INFO] running `Command { std: "docker" "start" "-a" "42b24202891a9a51b19e481aae16f5cefa795c27a72cdde716aeb87f37dc86b9", kill_on_drop: false }`
[INFO] [stderr]    Compiling oximedia-analytics v0.1.5 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 6.44s
[INFO] running `Command { std: "docker" "inspect" "42b24202891a9a51b19e481aae16f5cefa795c27a72cdde716aeb87f37dc86b9", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "42b24202891a9a51b19e481aae16f5cefa795c27a72cdde716aeb87f37dc86b9", kill_on_drop: false }`
[INFO] [stdout] 42b24202891a9a51b19e481aae16f5cefa795c27a72cdde716aeb87f37dc86b9
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=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" "+beta-2026-04-21" "test" "--frozen", kill_on_drop: false }`
[INFO] [stdout] c9671c28b21cc51d41a12eff3f663345a085b8eb65348aa33e7f57d5e1707811
[INFO] running `Command { std: "docker" "start" "-a" "c9671c28b21cc51d41a12eff3f663345a085b8eb65348aa33e7f57d5e1707811", kill_on_drop: false }`
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.06s
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/oximedia_analytics-e43765ffeb507633)
[INFO] [stdout] 
[INFO] [stdout] running 327 tests
[INFO] [stdout] test ab_testing::tests::alpha_to_critical_z_values ... ok
[INFO] [stdout] test ab_testing::tests::assign_variant_different_users_may_differ ... ok
[INFO] [stdout] test ab_testing::tests::assign_variant_deterministic_same_user ... ok
[INFO] [stdout] test ab_testing::tests::assign_variant_no_variants_returns_error ... ok
[INFO] [stdout] test ab_testing::tests::assign_variant_single_variant ... ok
[INFO] [stdout] test ab_testing::tests::assign_variant_weighted_distribution ... ok
[INFO] [stdout] test ab_testing::tests::assign_variant_zero_weight_returns_error ... ok
[INFO] [stdout] test ab_testing::tests::average_watch_duration_basic ... ok
[INFO] [stdout] test ab_testing::tests::bayesian_winner_missing_variant_returns_error ... ok
[INFO] [stdout] test ab_testing::tests::bayesian_winner_zero_impressions_returns_error ... ok
[INFO] [stdout] test ab_testing::tests::click_through_rate_basic ... ok
[INFO] [stdout] test ab_testing::tests::click_through_rate_zero_impressions ... ok
[INFO] [stdout] test ab_testing::tests::completion_rate_basic ... ok
[INFO] [stdout] test ab_testing::tests::conversion_rate_basic ... ok
[INFO] [stdout] test ab_testing::tests::is_significant_alpha_01 ... ok
[INFO] [stdout] test ab_testing::tests::winning_variant_by_ctr ... ok
[INFO] [stdout] test ab_testing::tests::experiment_results_record_methods ... ok
[INFO] [stdout] test ab_testing::tests::is_significant_alpha_05 ... ok
[INFO] [stdout] test ab_testing::tests::winning_variant_no_impressions_returns_none ... ok
[INFO] [stdout] test ab_testing::tests::winning_variant_by_completion ... ok
[INFO] [stdout] test ab_testing::tests::z_test_no_difference ... ok
[INFO] [stdout] test ab_testing::tests::z_test_large_difference_significant ... ok
[INFO] [stdout] test ab_testing::tests::z_test_zero_sample_returns_zero ... ok
[INFO] [stdout] test anomaly::tests::constant_window_no_anomaly ... ok
[INFO] [stdout] test anomaly::tests::first_observation_none ... ok
[INFO] [stdout] test anomaly::tests::mean_tracks_window ... ok
[INFO] [stdout] test anomaly::tests::negative_outlier_detected ... ok
[INFO] [stdout] test anomaly::tests::normal_values_not_flagged ... ok
[INFO] [stdout] test anomaly::tests::outlier_detected ... ok
[INFO] [stdout] test anomaly::tests::reset_clears_state ... ok
[INFO] [stdout] test anomaly::tests::valid_threshold_required ... ok
[INFO] [stdout] test anomaly::tests::window_less_than_two_errors ... ok
[INFO] [stdout] test attribution::tests::attribution_empty_segments_error ... ok
[INFO] [stdout] test ab_testing::tests::winning_variant_with_alpha_01 ... ok
[INFO] [stdout] test attribution::tests::attribution_empty_sessions_error ... ok
[INFO] [stdout] test ab_testing::tests::winning_variant_with_alpha_no_impressions ... ok
[INFO] [stdout] test ab_testing::tests::winning_variant_with_alpha_same_result_as_default ... ok
[INFO] [stdout] test attribution::tests::position_weighted_second_half_gets_more_credit ... ok
[INFO] [stdout] test attribution::tests::attribution_zero_duration_error ... ok
[INFO] [stdout] test attribution::tests::uniform_equal_segments_equal_credit ... ok
[INFO] [stdout] test attribution::tests::normalised_credit_sums_to_one ... ok
[INFO] [stdout] test bandit::tests::arm_empirical_mean_correct ... ok
[INFO] [stdout] test bandit::tests::arm_empirical_mean_zero_pulls ... ok
[INFO] [stdout] test bandit::tests::arm_rankings_sorted_descending ... ok
[INFO] [stdout] test bandit::tests::bandit_new_single_arm ... ok
[INFO] [stdout] test bandit::tests::epsilon_greedy_always_exploits_at_zero_epsilon ... ok
[INFO] [stdout] test bandit::tests::epsilon_greedy_converges_to_best_arm ... ok
[INFO] [stdout] test bandit::tests::epsilon_greedy_explores_at_full_epsilon ... ok
[INFO] [stdout] test bandit::tests::regret_never_negative ... ok
[INFO] [stdout] test bandit::tests::regret_tracker_accumulates_correctly ... ok
[INFO] [stdout] test bandit::tests::regret_tracker_no_steps ... ok
[INFO] [stdout] test bandit::tests::arm_new_has_jeffreys_prior ... ok
[INFO] [stdout] test bandit::tests::arm_record_outcome_updates_stats ... ok
[INFO] [stdout] test bandit::tests::bandit_new_empty_arms_returns_error ... ok
[INFO] [stdout] test ab_testing::tests::bayesian_winner_conversion_metric ... ok
[INFO] [stdout] test bandit::tests::thompson_sampling_converges_to_best_arm ... ok
[INFO] [stdout] test bandit::tests::thompson_sampling_returns_valid_arm_index ... ok
[INFO] [stdout] test cohort::cohort_analyzer_tests::retention_curve_day1_partial_retention ... ok
[INFO] [stdout] test cohort::cohort_analyzer_tests::retention_curve_events_before_cohort_date_ignored ... ok
[INFO] [stdout] test cohort::cohort_analyzer_tests::retention_curve_empty_events_returns_zeros ... ok
[INFO] [stdout] test cohort::cohort_analyzer_tests::retention_curve_gradual_decay ... ok
[INFO] [stdout] test cohort::cohort_analyzer_tests::retention_curve_empty_users_returns_zeros ... ok
[INFO] [stdout] test cohort::cohort_analyzer_tests::retention_curve_non_cohort_events_ignored ... ok
[INFO] [stdout] test cohort::cohort_analyzer_tests::retention_curve_length_equals_periods_plus_one ... ok
[INFO] [stdout] test cohort::cohort_analyzer_tests::retention_curve_multi_period_full_retention ... ok
[INFO] [stdout] test cohort::cohort_analyzer_tests::retention_curve_period0_full_retention ... ok
[INFO] [stdout] test cohort::cohort_analyzer_tests::retention_curve_user_active_multiple_times_same_day_counted_once ... ok
[INFO] [stdout] test cohort::cohort_analyzer_tests::retention_curve_zero_retention_after_day0 ... ok
[INFO] [stdout] test cohort::tests::cohort_first_period_viewer_is_in_earliest_cohort ... ok
[INFO] [stdout] test cohort::tests::cohort_average_retention_weighted ... ok
[INFO] [stdout] test cohort::tests::cohort_single_cohort_period0_full_retention ... ok
[INFO] [stdout] test cohort::tests::cohort_two_cohorts ... ok
[INFO] [stdout] test cohort::tests::cohort_matrix_cells_cover_all_periods ... ok
[INFO] [stdout] test cohort::tests::cohort_empty_events_returns_error ... ok
[INFO] [stdout] test cohort::tests::cohort_viewer_counted_once_per_period ... ok
[INFO] [stdout] test cohort::tests::period_offset_same_period_is_zero ... ok
[INFO] [stdout] test cohort::tests::truncate_ms_day_epoch_start ... ok
[INFO] [stdout] test cohort::tests::truncate_ms_month_different_months ... ok
[INFO] [stdout] test cohort::tests::period_offset_next_day_is_one ... ok
[INFO] [stdout] test cohort::tests::truncate_ms_day_mid_day ... ok
[INFO] [stdout] test cohort::tests::truncate_ms_month_same_month ... ok
[INFO] [stdout] test cohort::tests::truncate_ms_week_epoch_is_thursday ... ok
[INFO] [stdout] test cohort::tests::truncate_ms_week_stable_within_week ... ok
[INFO] [stdout] test ctr::tests::bulk_impression_and_click_recording ... ok
[INFO] [stdout] test ctr::tests::click_without_impression_allowed ... ok
[INFO] [stdout] test cohort::tests::period_offset_event_before_cohort_clamps_to_zero ... ok
[INFO] [stdout] test ctr::tests::ctr_computed_correctly ... ok
[INFO] [stdout] test ctr::tests::ranked_ci_bounds_populated ... ok
[INFO] [stdout] test ctr::tests::item_count_and_reset ... ok
[INFO] [stdout] test ctr::tests::ctr_unknown_item_errors ... ok
[INFO] [stdout] test ctr::tests::record_impression_and_click ... ok
[INFO] [stdout] test ctr::tests::stats_unknown_item_returns_none ... ok
[INFO] [stdout] test ctr::tests::ranked_orders_by_ctr_descending ... ok
[INFO] [stdout] test ab_testing::tests::bayesian_winner_b_clearly_beats_a ... ok
[INFO] [stdout] test ctr::tests::wilson_interval_bounds_in_range ... ok
[INFO] [stdout] test cohort::tests::period_offset_next_week_is_one ... ok
[INFO] [stdout] test ab_testing::tests::bayesian_winner_equal_variants_around_50pct ... ok
[INFO] [stdout] test ctr::tests::ctr_zero_when_no_impressions ... ok
[INFO] [stdout] test ctr::tests::wilson_interval_empty_item ... ok
[INFO] [stdout] test engagement::tests::ema_empty_series_returns_none ... ok
[INFO] [stdout] test ctr::tests::wilson_interval_symmetry_at_50_percent ... ok
[INFO] [stdout] test ctr::tests::winner_errors_when_min_impressions_not_met ... ok
[INFO] [stdout] test ctr::tests::winner_selects_best_item ... ok
[INFO] [stdout] test engagement::tests::ema_alpha_one_equals_original_series ... ok
[INFO] [stdout] test engagement::tests::ema_from_span_produces_valid_alpha ... ok
[INFO] [stdout] test engagement::tests::ema_seeded_with_first_observation ... ok
[INFO] [stdout] test engagement::tests::ema_from_span_zero_returns_none ... ok
[INFO] [stdout] test engagement::tests::ema_trend_direction_flat_for_constant_series ... ok
[INFO] [stdout] test engagement::tests::ema_result_alpha_stored_correctly ... ok
[INFO] [stdout] test engagement::tests::ema_trend_slope_positive_for_growing_series ... ok
[INFO] [stdout] test engagement::tests::ema_smooths_noisy_signal ... ok
[INFO] [stdout] test engagement::tests::engagement_components_watch_time_capped ... ok
[INFO] [stdout] test engagement::tests::engagement_full_watch_high_score ... ok
[INFO] [stdout] test engagement::tests::engagement_empty_sessions ... ok
[INFO] [stdout] test engagement::tests::ema_trend_direction_declining ... ok
[INFO] [stdout] test engagement::tests::engagement_forward_seek_penalty ... ok
[INFO] [stdout] test engagement::tests::engagement_rewatch_detected ... ok
[INFO] [stdout] test engagement::tests::engagement_social_score_placeholder ... ok
[INFO] [stdout] test engagement::tests::engagement_trend_slope_method ... ok
[INFO] [stdout] test engagement::tests::engagement_weights_default_sum_to_one ... ok
[INFO] [stdout] test engagement::tests::engagement_content_id_from_first_session ... ok
[INFO] [stdout] test engagement::tests::engagement_zero_duration ... ok
[INFO] [stdout] test engagement::tests::ranker_empty_input ... ok
[INFO] [stdout] test engagement::tests::engagement_partial_watch_lower_score ... ok
[INFO] [stdout] test engagement::tests::ranker_sorted_descending ... ok
[INFO] [stdout] test engagement::tests::slope_flat ... ok
[INFO] [stdout] test engagement::tests::slope_perfectly_increasing ... ok
[INFO] [stdout] test engagement::tests::slope_single_point_returns_zero ... ok
[INFO] [stdout] test engagement::tests::ranker_single_item ... ok
[INFO] [stdout] test engagement::tests::slope_perfectly_decreasing ... ok
[INFO] [stdout] test event_buffer::tests::drain_empty_returns_empty_vec ... ok
[INFO] [stdout] test engagement::tests::slope_two_points ... ok
[INFO] [stdout] test event_buffer::tests::drain_clears_buffer ... ok
[INFO] [stdout] test event_buffer::tests::multiple_drain_cycles ... ok
[INFO] [stdout] test event_buffer::tests::capacity_reported_correctly ... ok
[INFO] [stdout] test event_buffer::tests::push_and_drain ... ok
[INFO] [stdout] test event_buffer::tests::push_beyond_capacity_errors ... ok
[INFO] [stdout] test event_buffer::tests::zero_capacity_errors ... ok
[INFO] [stdout] test fingerprint::tests::different_lang_different_hash ... ok
[INFO] [stdout] test fingerprint::tests::different_ip_different_hash ... ok
[INFO] [stdout] test fingerprint::tests::field_order_matters ... ok
[INFO] [stdout] test fingerprint::tests::different_ua_different_hash ... ok
[INFO] [stdout] test fingerprint::tests::empty_fields_return_non_zero ... ok
[INFO] [stdout] test fingerprint::tests::hash_is_non_zero_for_typical_input ... ok
[INFO] [stdout] test funnel::tests::churn_insufficient_data_returns_error ... ok
[INFO] [stdout] test funnel::tests::churn_high_risk_strong_decline ... ok
[INFO] [stdout] test fingerprint::tests::same_inputs_same_hash ... ok
[INFO] [stdout] test fingerprint::tests::hash_distribution_sanity ... ok
[INFO] [stdout] test funnel::tests::funnel_analyzer_conversion_rates_sum_correctly ... ok
[INFO] [stdout] test engagement::tests::ema_with_invalid_alpha_returns_none ... ok
[INFO] [stdout] test funnel::tests::funnel_analyzer_empty_sessions ... ok
[INFO] [stdout] test funnel::tests::churn_low_risk_growing_engagement ... ok
[INFO] [stdout] test funnel::tests::churn_low_engagement_always_high_risk ... ok
[INFO] [stdout] test funnel::tests::funnel_all_viewers_reach_all_milestones ... ok
[INFO] [stdout] test funnel::tests::funnel_analyzer_empty_steps_returns_empty_report ... ok
[INFO] [stdout] test funnel::tests::funnel_analyzer_full_conversion_two_steps ... ok
[INFO] [stdout] test funnel::tests::funnel_analyzer_partial_conversion ... ok
[INFO] [stdout] test funnel::tests::funnel_analyzer_irrelevant_events_ignored ... ok
[INFO] [stdout] test funnel::tests::funnel_analyzer_multiple_users_independent ... ok
[INFO] [stdout] test funnel::tests::funnel_analyzer_three_step_funnel ... ok
[INFO] [stdout] test funnel::tests::funnel_analyzer_time_window_exceeded_resets ... ok
[INFO] [stdout] test funnel::tests::funnel_dropout_midway ... ok
[INFO] [stdout] test funnel::tests::funnel_analyzer_overall_completion_rate ... ok
[INFO] [stdout] test funnel::tests::funnel_analyzer_no_step0_users_conversion_rate_is_zero ... ok
[INFO] [stdout] test funnel::tests::funnel_empty_milestones_returns_error ... ok
[INFO] [stdout] test funnel::tests::funnel_empty_sessions_returns_error ... ok
[INFO] [stdout] test funnel::tests::loyalty_churned_viewer ... ok
[INFO] [stdout] test funnel::tests::loyalty_perfect_viewer ... ok
[INFO] [stdout] test geo_device::tests::breakdown_by_device_type ... ok
[INFO] [stdout] test geo_device::tests::build_report_empty_analyzer ... ok
[INFO] [stdout] test geo_device::tests::breakdown_cross_tab ... ok
[INFO] [stdout] test geo_device::tests::compare_device_periods_absent_region_returns_none ... ok
[INFO] [stdout] test funnel::tests::loyalty_empty_sessions ... ok
[INFO] [stdout] test geo_device::tests::build_report_totals_correct ... ok
[INFO] [stdout] test funnel::tests::loyalty_mismatched_lengths_error ... ok
[INFO] [stdout] test geo_device::tests::compare_region_periods_sessions_grow ... ok
[INFO] [stdout] test geo_device::tests::device_type_labels_are_stable ... ok
[INFO] [stdout] test geo_device::tests::dominant_device_by_viewers ... ok
[INFO] [stdout] test geo_device::tests::compare_region_periods_watch_time_grows ... ok
[INFO] [stdout] test geo_device::tests::dominant_region_by_sessions ... ok
[INFO] [stdout] test geo_device::tests::device_share_correct ... ok
[INFO] [stdout] test geo_device::tests::empty_analyzer_top_region_errors ... ok
[INFO] [stdout] test funnel::tests::funnel_analyzer_single_step_single_user ... ok
[INFO] [stdout] test funnel::tests::funnel_analyzer_step0_first_conversion_rate_always_one ... ok
[INFO] [stdout] test geo_device::tests::multiple_regions_counted_separately ... ok
[INFO] [stdout] test geo_device::tests::ingest_timestamped_populates_analyzer ... ok
[INFO] [stdout] test geo_device::tests::period_delta_relative_change_computed ... ok
[INFO] [stdout] test geo_device::tests::ingest_batch ... ok
[INFO] [stdout] test geo_device::tests::empty_analyzer_has_zero_sessions ... ok
[INFO] [stdout] test geo_device::tests::period_delta_zero_baseline_gives_nan_relative ... ok
[INFO] [stdout] test geo_device::tests::empty_analyzer_top_device_errors ... ok
[INFO] [stdout] test heatmap::tests::clear_resets_counts ... ok
[INFO] [stdout] test geo_device::tests::region_share_sums_to_one ... ok
[INFO] [stdout] test heatmap::tests::cols_rows_computed_correctly ... ok
[INFO] [stdout] test geo_device::tests::single_record_breakdown_by_region ... ok
[INFO] [stdout] test heatmap::tests::density_relative_to_max_cell ... ok
[INFO] [stdout] test geo_device::tests::top_region_by_watch_time ... ok
[INFO] [stdout] test heatmap::tests::new_rejects_zero_width ... ok
[INFO] [stdout] test heatmap::tests::new_rejects_zero_height ... ok
[INFO] [stdout] test heatmap::tests::empty_heatmap_density_is_zero ... ok
[INFO] [stdout] test heatmap::tests::new_rejects_zero_cell_size ... ok
[INFO] [stdout] test geo_device::tests::region_labels_are_stable ... ok
[INFO] [stdout] test geo_device::tests::top_device_by_sessions ... ok
[INFO] [stdout] test geo_device::tests::unique_viewers_deduplicated ... ok
[INFO] [stdout] test heatmap::tests::out_of_bounds_point_ignored ... ok
[INFO] [stdout] test heatmap::tests::out_of_range_cell_returns_zero ... ok
[INFO] [stdout] test multivariate::tests::all_cells_enumerates_all_combinations ... ok
[INFO] [stdout] test multivariate::tests::cell_count_is_product_of_levels ... ok
[INFO] [stdout] test multivariate::tests::assign_cell_is_deterministic ... ok
[INFO] [stdout] test multivariate::tests::experiment_requires_at_least_two_factors ... ok
[INFO] [stdout] test heatmap::tests::single_point_max_density ... ok
[INFO] [stdout] test percentile::tests::compute_percentiles_batch ... ok
[INFO] [stdout] test multivariate::tests::record_impression_and_conversion ... ok
[INFO] [stdout] test percentile::tests::empty_slice_errors ... ok
[INFO] [stdout] test percentile::tests::from_unsorted_produces_correct_result ... ok
[INFO] [stdout] test percentile::tests::len_and_is_empty ... ok
[INFO] [stdout] test percentile::tests::n_above_100_errors ... ok
[INFO] [stdout] test percentile::tests::p100_is_max ... ok
[INFO] [stdout] test percentile::tests::p50_median_five_elements ... ok
[INFO] [stdout] test percentile::tests::single_element ... ok
[INFO] [stdout] test percentile::tests::p95_ten_elements ... ok
[INFO] [stdout] test quantile::tests::percentiles_empty_returns_error ... ok
[INFO] [stdout] test quantile::tests::percentiles_basic ... ok
[INFO] [stdout] test quantile::tests::tdigest_invalid_quantile ... ok
[INFO] [stdout] test quantile::tests::percentiles_out_of_range_error ... ok
[INFO] [stdout] test quantile::tests::tdigest_merge_produces_consistent_quantiles ... ok
[INFO] [stdout] test quantile::tests::tdigest_min_max_exact ... ok
[INFO] [stdout] test multivariate::tests::main_effect_sign_makes_sense ... ok
[INFO] [stdout] test quantile::tests::tdigest_single_value ... ok
[INFO] [stdout] test quantile::tests::tdigest_uniform_distribution_p50 ... ok
[INFO] [stdout] test realtime::tests::aggregator_new_invalid_params ... ok
[INFO] [stdout] test realtime::tests::aggregator_new_valid ... ok
[INFO] [stdout] test quantile::tests::tdigest_empty_returns_error ... ok
[INFO] [stdout] test realtime::tests::bitrate_stats_basic ... ok
[INFO] [stdout] test realtime::tests::bitrate_stats_empty_window ... ok
[INFO] [stdout] test realtime::tests::buffer_events_counted ... ok
[INFO] [stdout] test realtime::tests::concurrent_viewers_does_not_go_negative ... ok
[INFO] [stdout] test realtime::tests::concurrent_viewers_join_leave ... ok
[INFO] [stdout] test realtime::tests::peak_concurrent_tracked_per_bucket ... ok
[INFO] [stdout] test realtime::tests::window_evicts_old_buckets ... ok
[INFO] [stdout] test recommendation::tests::cosine_identical_vectors_returns_one ... ok
[INFO] [stdout] test recommendation::tests::euclidean_same_point_returns_zero ... ok
[INFO] [stdout] test recommendation::tests::feature_normaliser_maps_to_unit_interval ... ok
[INFO] [stdout] test recommendation::tests::pearson_identical_vectors_returns_one_or_nan_handled ... ok
[INFO] [stdout] test recommendation::tests::recommender_error_on_unknown_query_id ... ok
[INFO] [stdout] test recommendation::tests::recommender_excludes_query_item ... ok
[INFO] [stdout] test quantile::tests::tdigest_uniform_distribution_p95 ... ok
[INFO] [stdout] test recommendation::tests::recommender_index_size_matches_input ... ok
[INFO] [stdout] test recommendation::tests::recommender_returns_at_most_top_n ... ok
[INFO] [stdout] test retention::tests::average_view_duration_empty_curve ... ok
[INFO] [stdout] test retention::tests::average_view_duration_full_retention ... ok
[INFO] [stdout] test retention::tests::average_view_duration_linear_decay ... ok
[INFO] [stdout] test retention::tests::benchmark_constants_values ... ok
[INFO] [stdout] test retention::tests::compare_to_benchmark_below_benchmark ... ok
[INFO] [stdout] test retention::tests::compare_to_benchmark_empty_curve ... ok
[INFO] [stdout] test retention::tests::compare_to_benchmark_perfect_match ... ok
[INFO] [stdout] test retention::tests::compute_retention_basic ... ok
[INFO] [stdout] test retention::tests::compute_retention_completed_views ... ok
[INFO] [stdout] test retention::tests::compute_retention_empty_sessions ... ok
[INFO] [stdout] test retention::tests::compute_retention_incremental_empty_sessions ... ok
[INFO] [stdout] test retention::tests::compute_retention_single_bucket ... ok
[INFO] [stdout] test retention::tests::content_segment_duration_ms ... ok
[INFO] [stdout] test retention::tests::content_segment_duration_ms_saturates_on_underflow ... ok
[INFO] [stdout] test retention::tests::drop_off_points_detects_large_drop ... ok
[INFO] [stdout] test retention::tests::drop_off_points_no_drop ... ok
[INFO] [stdout] test retention::tests::incremental_state_add_sessions_incrementally ... ok
[INFO] [stdout] test retention::tests::incremental_state_matches_batch_compute ... ok
[INFO] [stdout] test retention::tests::incremental_state_new_invalid_returns_none ... ok
[INFO] [stdout] test retention::tests::re_watch_segments_detected ... ok
[INFO] [stdout] test retention::tests::re_watch_segments_none ... ok
[INFO] [stdout] test retention::tests::retention_curve_total_starts_matches_sessions ... ok
[INFO] [stdout] test recommendation::tests::similar_content_ranks_higher_than_dissimilar ... ok
[INFO] [stdout] test quantile::tests::tdigest_centroid_count_bounded ... ok
[INFO] [stdout] test quantile::tests::tdigest_large_dataset_p99 ... ok
[INFO] [stdout] test retention::tests::segment_retention_empty_sessions ... ok
[INFO] [stdout] test retention::tests::segment_retention_all_viewers_watch_all_segments ... ok
[INFO] [stdout] test segment_retention::tests::analyze_segment_retention_empty_segments ... ok
[INFO] [stdout] test retention::tests::segment_retention_partial_viewers ... ok
[INFO] [stdout] test retention::tests::segment_retention_empty_segments ... ok
[INFO] [stdout] test segment_retention::tests::analyze_segment_retention_empty_views ... ok
[INFO] [stdout] test segment_retention::tests::analyze_segment_retention_full_retention ... ok
[INFO] [stdout] test segment_retention::tests::drop_off_points_empty_when_single_segment ... ok
[INFO] [stdout] test segment_retention::tests::drop_off_points_no_drops_when_threshold_high ... ok
[INFO] [stdout] test session::tests::analyze_session_basic ... ok
[INFO] [stdout] test segment_retention::tests::analyze_segment_retention_partial ... ok
[INFO] [stdout] test segment_retention::tests::segment_duration_sec ... ok
[INFO] [stdout] test segment_retention::tests::drop_off_points_detects_large_drop ... ok
[INFO] [stdout] test session::tests::analyze_session_no_end_event ... ok
[INFO] [stdout] test session::tests::build_map_no_events_returns_all_false ... ok
[INFO] [stdout] test session::tests::analyze_session_zero_duration ... ok
[INFO] [stdout] test session::tests::build_map_play_then_end ... ok
[INFO] [stdout] test session::tests::build_map_seek_forward ... ok
[INFO] [stdout] test session::tests::build_map_play_pause_play_end ... ok
[INFO] [stdout] test session::tests::heatmap_empty_sessions ... ok
[INFO] [stdout] test session::tests::heatmap_bucket_positions_correct ... ok
[INFO] [stdout] test session::tests::heatmap_zero_bucket_ms_returns_empty ... ok
[INFO] [stdout] test session::tests::playback_map_coverage_full ... ok
[INFO] [stdout] test session::tests::playback_map_coverage_half ... ok
[INFO] [stdout] test session::tests::playback_map_empty_range_is_noop ... ok
[INFO] [stdout] test session::tests::playback_map_coverage_zero_duration ... ok
[INFO] [stdout] test session::tests::playback_map_mark_range_clamps_to_capacity ... ok
[INFO] [stdout] test session::tests::playback_map_mark_range_basic ... ok
[INFO] [stdout] test session::tests::reservoir_caps_at_capacity ... ok
[INFO] [stdout] test session::tests::reservoir_empty_input_empty_points ... ok
[INFO] [stdout] test session::tests::reservoir_full_watch_all_max_intensity ... ok
[INFO] [stdout] test session::tests::reservoir_deterministic_with_same_seed ... ok
[INFO] [stdout] test session::tests::reservoir_none_on_zero_bucket ... ok
[INFO] [stdout] test session::tests::reservoir_fewer_sessions_keeps_all ... ok
[INFO] [stdout] test session::tests::reservoir_none_on_zero_duration ... ok
[INFO] [stdout] test session::tests::reservoir_none_on_zero_capacity ... ok
[INFO] [stdout] test session::tests::viewer_session_new ... ok
[INFO] [stdout] test weighted_retention::tests::all_zero_weight_sessions_returns_error ... ok
[INFO] [stdout] test weighted_retention::tests::area_under_curve_full_retention ... ok
[INFO] [stdout] test session::tests::reservoir_partial_watch_intensity_gradient ... ok
[INFO] [stdout] test session::tests::viewer_session_push_event ... ok
[INFO] [stdout] test weighted_retention::tests::demographic_breakdown_produces_per_group_curves ... ok
[INFO] [stdout] test weighted_retention::tests::drop_off_points_detected ... ok
[INFO] [stdout] test weighted_retention::tests::higher_weight_dominates_retention ... ok
[INFO] [stdout] test weighted_retention::tests::resolution_reduces_number_of_points ... ok
[INFO] [stdout] test weighted_retention::tests::uniform_weight_matches_unweighted_intuition ... ok
[INFO] [stdout] test weighted_retention::tests::weighted_avg_watch_time_plausible ... ok
[INFO] [stdout] test weighted_retention::tests::zero_content_duration_returns_error ... ok
[INFO] [stdout] test weighted_retention::tests::zero_weight_sessions_filtered_by_default ... ok
[INFO] [stdout] test multivariate::tests::assign_cell_covers_all_cells_with_enough_users ... ok
[INFO] [stdout] test multivariate::tests::cell_label_produces_readable_string ... ok
[INFO] [stdout] test session::tests::heatmap_single_session_full_watch ... ok
[INFO] [stdout] test multivariate::tests::winning_cell_selected_by_conversion_rate ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 327 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests oximedia_analytics
[INFO] [stdout] 
[INFO] [stdout] running 6 tests
[INFO] [stdout] test src/multivariate.rs - multivariate (line 23) ... ok
[INFO] [stdout] test src/geo_device.rs - geo_device (line 9) ... ok
[INFO] [stdout] test src/event_buffer.rs - event_buffer::EventBuffer (line 49) ... ok
[INFO] [stdout] test src/quantile.rs - quantile::TDigest (line 41) ... ok
[INFO] [stdout] test src/fingerprint.rs - fingerprint::SessionFingerprint::hash (line 47) ... ok
[INFO] [stdout] test src/ctr.rs - ctr (line 19) ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.62s
[INFO] [stdout] 
[INFO] running `Command { std: "docker" "inspect" "c9671c28b21cc51d41a12eff3f663345a085b8eb65348aa33e7f57d5e1707811", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "c9671c28b21cc51d41a12eff3f663345a085b8eb65348aa33e7f57d5e1707811", kill_on_drop: false }`
[INFO] [stdout] c9671c28b21cc51d41a12eff3f663345a085b8eb65348aa33e7f57d5e1707811
