[INFO] fetching crate room-daemon 3.6.1... [INFO] testing room-daemon-3.6.1 against try#dec9417b8611e34e787a3e4c37686b5131f9e5c5 for pr-154210-2 [INFO] extracting crate room-daemon 3.6.1 into /workspace/builds/worker-4-tc2/source [INFO] started tweaking crates.io crate room-daemon 3.6.1 [INFO] finished tweaking crates.io crate room-daemon 3.6.1 [INFO] tweaked toml for crates.io crate room-daemon 3.6.1 written to /workspace/builds/worker-4-tc2/source/Cargo.toml [INFO] validating manifest of crates.io crate room-daemon 3.6.1 on toolchain dec9417b8611e34e787a3e4c37686b5131f9e5c5 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate crates.io crate room-daemon 3.6.1 already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 3c20d995348e9d2bc06af06bc66e91ad743aa8d8157bbf60676adf468bf41842 [INFO] running `Command { std: "docker" "start" "-a" "3c20d995348e9d2bc06af06bc66e91ad743aa8d8157bbf60676adf468bf41842", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "3c20d995348e9d2bc06af06bc66e91ad743aa8d8157bbf60676adf468bf41842", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "3c20d995348e9d2bc06af06bc66e91ad743aa8d8157bbf60676adf468bf41842", kill_on_drop: false }` [INFO] [stdout] 3c20d995348e9d2bc06af06bc66e91ad743aa8d8157bbf60676adf468bf41842 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "build" "--frozen" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 4bf8914cd6125732497b8b03e52a8a2a29e7d9ed6e1f32742df6e693b91d807b [INFO] running `Command { std: "docker" "start" "-a" "4bf8914cd6125732497b8b03e52a8a2a29e7d9ed6e1f32742df6e693b91d807b", kill_on_drop: false }` [INFO] [stderr] Compiling zerocopy v0.8.42 [INFO] [stderr] Compiling getrandom v0.3.4 [INFO] [stderr] Compiling http v1.4.0 [INFO] [stderr] Compiling parking_lot_core v0.9.12 [INFO] [stderr] Compiling num-traits v0.2.19 [INFO] [stderr] Compiling futures-sink v0.3.32 [INFO] [stderr] Compiling tokio-macros v2.6.1 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling futures-macro v0.3.31 [INFO] [stderr] Compiling tracing v0.1.44 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Compiling sha1 v0.10.6 [INFO] [stderr] Compiling anyhow v1.0.102 [INFO] [stderr] Compiling futures-channel v0.3.32 [INFO] [stderr] Compiling sync_wrapper v1.0.2 [INFO] [stderr] Compiling utf-8 v0.7.6 [INFO] [stderr] Compiling uuid v1.22.0 [INFO] [stderr] Compiling serde_path_to_error v0.1.20 [INFO] [stderr] Compiling parking_lot v0.12.5 [INFO] [stderr] Compiling libloading v0.8.9 [INFO] [stderr] Compiling rand_core v0.9.5 [INFO] [stderr] Compiling tokio v1.50.0 [INFO] [stderr] Compiling http-body v1.0.1 [INFO] [stderr] Compiling futures-util v0.3.31 [INFO] [stderr] Compiling http-body-util v0.1.3 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling axum-core v0.5.6 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling chrono v0.4.44 [INFO] [stderr] Compiling serde_urlencoded v0.7.1 [INFO] [stderr] Compiling room-protocol v3.6.1 [INFO] [stderr] Compiling ppv-lite86 v0.2.21 [INFO] [stderr] Compiling room-plugin-taskboard v3.6.1 [INFO] [stderr] Compiling hyper v1.8.1 [INFO] [stderr] Compiling tower v0.5.3 [INFO] [stderr] Compiling rand_chacha v0.9.0 [INFO] [stderr] Compiling rand v0.9.2 [INFO] [stderr] Compiling tungstenite v0.28.0 [INFO] [stderr] Compiling hyper-util v0.1.20 [INFO] [stderr] Compiling tokio-tungstenite v0.28.0 [INFO] [stderr] Compiling axum v0.8.8 [INFO] [stderr] Compiling room-daemon v3.6.1 (/opt/rustwide/workdir) [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 30.16s [INFO] running `Command { std: "docker" "inspect" "4bf8914cd6125732497b8b03e52a8a2a29e7d9ed6e1f32742df6e693b91d807b", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "4bf8914cd6125732497b8b03e52a8a2a29e7d9ed6e1f32742df6e693b91d807b", kill_on_drop: false }` [INFO] [stdout] 4bf8914cd6125732497b8b03e52a8a2a29e7d9ed6e1f32742df6e693b91d807b [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 16f9114990425345e5bcc34e2df29ef70be2fc015d799da9f748f5245668b4d4 [INFO] running `Command { std: "docker" "start" "-a" "16f9114990425345e5bcc34e2df29ef70be2fc015d799da9f748f5245668b4d4", kill_on_drop: false }` [INFO] [stderr] Compiling tokio v1.50.0 [INFO] [stderr] Compiling rustix v1.1.4 [INFO] [stderr] Compiling bitflags v2.11.0 [INFO] [stderr] Compiling linux-raw-sys v0.12.1 [INFO] [stderr] Compiling tempfile v3.27.0 [INFO] [stderr] Compiling hyper v1.8.1 [INFO] [stderr] Compiling tokio-tungstenite v0.28.0 [INFO] [stderr] Compiling tower v0.5.3 [INFO] [stderr] Compiling hyper-util v0.1.20 [INFO] [stderr] Compiling axum v0.8.8 [INFO] [stderr] Compiling room-daemon v3.6.1 (/opt/rustwide/workdir) [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 35.03s [INFO] running `Command { std: "docker" "inspect" "16f9114990425345e5bcc34e2df29ef70be2fc015d799da9f748f5245668b4d4", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "16f9114990425345e5bcc34e2df29ef70be2fc015d799da9f748f5245668b4d4", kill_on_drop: false }` [INFO] [stdout] 16f9114990425345e5bcc34e2df29ef70be2fc015d799da9f748f5245668b4d4 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "test" "--frozen", kill_on_drop: false }` [INFO] [stdout] 6ec5b209c02b8f148367bba3300e092cf915219a0bfe15416e1f03c35ee4a6ab [INFO] running `Command { std: "docker" "start" "-a" "6ec5b209c02b8f148367bba3300e092cf915219a0bfe15416e1f03c35ee4a6ab", kill_on_drop: false }` [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 0.20s [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/room_daemon-14ea39dfba3ab02f) [INFO] [stdout] [INFO] [stdout] running 549 tests [INFO] [stdout] test broker::admin::tests::handle_admin_cmd_non_host_gets_permission_denied ... ok [INFO] [stdout] test broker::admin::tests::kick_with_empty_arg_is_noop ... ok [INFO] [stdout] test broker::admin::tests::kick_removes_target_from_status_map ... ok [INFO] [stdout] test broker::admin::tests::kick_at_prefix_strips_and_invalidates ... ok [INFO] [stdout] test broker::admin::tests::kick_persists_token_map_to_disk ... ok [INFO] [stdout] test broker::admin::tests::handle_admin_cmd_kick_invalidates_token ... ok [INFO] [stdout] test broker::admin::tests::kicked_token_rejected_after_simulated_restart ... ok [INFO] [stdout] test broker::admin::tests::handle_admin_cmd_reauth_removes_token_and_sentinel ... ok [INFO] [stdout] test broker::admin::tests::clear_tokens_persists_empty_map_to_disk ... ok [INFO] [stdout] test broker::admin::tests::reauth_at_prefix_strips_and_clears ... ok [INFO] [stdout] test broker::admin::tests::kick_broadcasts_notice_with_target ... ok [INFO] [stdout] test broker::admin::tests::kick_without_at_prefix_still_works ... ok [INFO] [stdout] test broker::admin::tests::clear_tokens_broadcasts_notice_with_issuer ... ok [INFO] [stdout] test broker::auth::tests::handle_oneshot_join_denied_does_not_set_subscription ... ok [INFO] [stdout] test broker::auth::tests::issue_token_kicked_user_is_blocked_by_sentinel ... ok [INFO] [stdout] test broker::auth::tests::handle_oneshot_join_sets_full_subscription ... ok [INFO] [stdout] test broker::auth::tests::issue_token_different_usernames_get_distinct_tokens ... ok [INFO] [stdout] test broker::auth::tests::issue_token_new_user_returns_non_empty_uuid ... ok [INFO] [stdout] test broker::auth::tests::handle_oneshot_join_with_registry_denied_does_not_set_subscription ... ok [INFO] [stdout] test broker::auth::tests::issue_token_persists_to_disk ... ok [INFO] [stdout] test broker::auth::tests::join_no_config_always_allowed ... ok [INFO] [stdout] test broker::auth::tests::join_private_room_creator_always_allowed ... ok [INFO] [stdout] test broker::auth::tests::issue_token_same_username_twice_returns_err ... ok [INFO] [stdout] test broker::auth::tests::join_dm_room_only_participants ... ok [INFO] [stdout] test broker::auth::tests::issue_token_accumulates_on_disk ... ok [INFO] [stdout] test broker::auth::tests::join_dm_creator_not_special ... ok [INFO] [stdout] test broker::auth::tests::handle_oneshot_join_with_registry_sets_full_subscription ... ok [INFO] [stdout] test broker::auth::tests::join_private_room_denied_without_invite ... ok [INFO] [stdout] test broker::auth::tests::join_public_room_always_allowed ... ok [INFO] [stdout] test broker::auth::tests::join_unlisted_room_requires_invite ... ok [INFO] [stdout] test broker::auth::tests::persisted_tokens_survive_new_token_map ... ok [INFO] [stdout] test broker::admin::tests::handle_admin_cmd_clear_tokens_empties_the_map ... ok [INFO] [stdout] test broker::auth::tests::registry_issue_token_persists_to_users_json ... ok [INFO] [stdout] test broker::auth::tests::registry_issue_token_creates_user_and_token ... ok [INFO] [stdout] test broker::auth::tests::send_dm_room_host_denied ... ok [INFO] [stdout] test broker::auth::tests::send_private_room_any_member_allowed ... ok [INFO] [stdout] test broker::auth::tests::send_dm_room_non_participant_denied ... ok [INFO] [stdout] test broker::auth::tests::send_public_room_always_allowed ... ok [INFO] [stdout] test broker::auth::tests::validate_token_after_kick_original_uuid_is_invalidated ... ok [INFO] [stdout] test broker::auth::tests::send_dm_room_participants_allowed ... ok [INFO] [stdout] test broker::auth::tests::validate_token_kicked_sentinel_key_rejected ... ok [INFO] [stdout] test broker::auth::tests::send_no_config_always_allowed ... ok [INFO] [stdout] test broker::auth::tests::validate_token_unknown_returns_none ... ok [INFO] [stdout] test broker::auth::tests::validate_token_after_reauth_returns_none ... ok [INFO] [stdout] test broker::auth::tests::registry_idempotent_rejoin_after_token_revoke ... ok [INFO] [stdout] test broker::auth::tests::registry_issue_token_username_taken_returns_err ... ok [INFO] [stdout] test broker::auth::tests::registry_token_seeded_into_token_map_on_startup ... ok [INFO] [stdout] test broker::commands::tests::tests::cross_room_tests::extract_room_flag_preserves_order ... ok [INFO] [stdout] test broker::commands::tests::tests::cross_room_nonexistent_room_returns_error ... ok [INFO] [stdout] test broker::commands::tests::tests::cross_room_tests::extract_room_flag_absent ... ok [INFO] [stdout] test broker::commands::tests::tests::cross_room_tests::extract_room_flag_no_value ... ok [INFO] [stdout] test broker::commands::tests::tests::cross_room_tests::extract_room_flag_present_at_start ... ok [INFO] [stdout] test broker::commands::tests::tests::cross_room_tests::extract_room_flag_present_in_middle ... ok [INFO] [stdout] test broker::commands::tests::tests::cross_room_without_resolver_returns_error ... ok [INFO] [stdout] test broker::admin::tests::reauth_persists_token_map_to_disk ... ok [INFO] [stdout] test broker::commands::tests::tests::help_builtin_shows_param_info ... ok [INFO] [stdout] test broker::commands::tests::tests::help_no_args_lists_all_commands ... ok [INFO] [stdout] test broker::commands::tests::tests::help_queue_shows_subcommands ... ok [INFO] [stdout] test broker::commands::tests::tests::help_specific_plugin_command ... ok [INFO] [stdout] test broker::auth::tests::validate_token_valid_returns_username ... ok [INFO] [stdout] test broker::commands::tests::tests::cross_room_resolves_and_dispatches_to_target ... ok [INFO] [stdout] test broker::commands::tests::tests::dispatch_plugin_times_out_slow_plugin ... ok [INFO] [stdout] test broker::commands::tests::tests::help_unknown_command ... ok [INFO] [stdout] test broker::commands::tests::tests::dispatch_plugin_normal_execution_unaffected ... ok [INFO] [stdout] test broker::commands::tests::tests::help_taskboard_unknown_subcommand ... ok [INFO] [stdout] test broker::commands::tests::tests::help_who_ignores_extra_arg_no_subcommands ... ok [INFO] [stdout] test broker::commands::tests::tests::info_no_args_shows_room_info ... ok [INFO] [stdout] test broker::commands::tests::tests::load_event_filter_map_corrupt_file_returns_empty ... ok [INFO] [stdout] test broker::commands::tests::tests::info_with_username_shows_user_info ... ok [INFO] [stdout] test broker::commands::tests::tests::load_event_filter_map_missing_file_returns_empty ... ok [INFO] [stdout] test broker::commands::tests::tests::load_subscription_map_missing_file_returns_empty ... ok [INFO] [stdout] test broker::admin::tests::handle_admin_cmd_clear_removes_prior_history ... ok [INFO] [stdout] test broker::commands::tests::tests::plugin_broadcast_returns_handled_with_reply ... ok [INFO] [stdout] test broker::commands::tests::tests::load_subscription_map_corrupt_file_returns_empty ... ok [INFO] [stdout] test broker::admin::tests::unknown_admin_command_returns_none ... ok [INFO] [stdout] test broker::commands::tests::tests::info_strips_at_prefix ... ok [INFO] [stdout] test broker::admin::tests::reauth_with_empty_arg_is_noop ... ok [INFO] [stdout] test broker::commands::tests::tests::plugin_reply_returns_reply_not_handled_with_reply ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_admin_when_no_host_set_gets_permission_denied ... ok [INFO] [stdout] test broker::admin::tests::kick_revokes_token_from_registry_in_daemon_mode ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_dm_message_is_passthrough ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_info_returns_reply ... ok [INFO] [stdout] test broker::commands::tests::tests::help_reply_comes_from_broker_not_plugin ... ok [INFO] [stdout] test broker::commands::tests::tests::help_taskboard_shows_subcommands_list ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_admin_as_non_host_gets_permission_denied_reply ... ok [INFO] [stdout] test broker::commands::tests::tests::help_taskboard_plan_shows_subcommand_detail ... ok [INFO] [stdout] test broker::admin::tests::handle_admin_cmd_exit_sends_shutdown ... ok [INFO] [stdout] test broker::commands::tests::tests::help_strips_leading_slash_from_arg ... ok [INFO] [stdout] test broker::commands::tests::tests::help_specific_builtin_command ... ok [INFO] [stdout] test broker::commands::tests::tests::room_info_no_config ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_exit_as_host_returns_shutdown ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_info_with_user_returns_reply ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_kick_missing_user_gets_validation_error ... ok [INFO] [stdout] test broker::commands::tests::tests::room_info_with_config ... ok [INFO] [stdout] test broker::commands::tests::tests::room_info_includes_host ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_room_info_alias_returns_reply ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_reply_missing_params_gets_validation_error ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_kick_as_host_returns_handled_and_invalidates_token ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_reauth_missing_user_gets_validation_error ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_kick_with_valid_params_passes_validation ... ok [INFO] [stdout] test broker::admin::tests::reauth_revokes_token_from_registry_in_daemon_mode ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_who_verbose_short_flag ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_who_no_params_passes_validation ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_who_empty_room_says_no_users_online ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_who_shows_status_alongside_name ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_who_sanitizes_commas_in_status ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_regular_message_is_passthrough ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_who_with_online_user_in_reply ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_who_verbose_empty_room ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_nonbuiltin_command_skips_validation ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_set_status_empty_params_clears_status ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_who_verbose_shows_last_message_time ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_who_verbose_shows_per_user_lines ... ok [INFO] [stdout] test broker::commands::tests::tests::save_and_load_subscription_map_round_trip ... ok [INFO] [stdout] test broker::commands::tests::tests::save_and_load_event_filter_map_round_trip ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_set_status_multi_word_joins_all_params ... ok [INFO] [stdout] test broker::commands::tests::tests::route_command_set_status_returns_handled_with_reply_and_updates_map ... ok [INFO] [stdout] test broker::commands::tests::tests::set_subscription_alias_dm_guard_applies ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_dm_room_non_participant_rejected ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_events_invalid_type_returns_error ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_events_default_is_all ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_events_none ... ok [INFO] [stdout] test broker::commands::tests::tests::set_subscription_alias_mentions_only ... ok [INFO] [stdout] test broker::commands::tests::tests::set_subscription_alias_works ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_accumulates_on_disk ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_broadcasts_system_message ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_private_room_non_invited_rejected ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_default_tier_is_full ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_events_all ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_events_csv ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_survives_simulated_restart ... ok [INFO] [stdout] test broker::commands::tests::tests::unsubscribe_broadcasts_system_message ... ok [INFO] [stdout] test broker::commands::tests::tests::unsubscribe_sets_tier_to_unsubscribed ... ok [INFO] [stdout] test broker::commands::tests::tests::subscriptions_lists_all_sorted ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_events_broadcasts_system_message ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_overwrites_previous_tier ... ok [INFO] [stdout] test broker::commands::tests::tests::subscriptions_empty ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_overwrite_persists_latest_tier ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_persists_to_disk ... ok [INFO] [stdout] test broker::commands::tests::tests::user_info_non_host_omits_host_flag ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_choice_optional_missing_is_ok ... ok [INFO] [stdout] test broker::commands::tests::tests::user_info_shows_host_flag ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_choice_invalid_value ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_invalid_tier_returns_error ... ok [INFO] [stdout] test broker::commands::tests::tests::user_info_offline_user ... ok [INFO] [stdout] test broker::commands::tests::tests::user_info_online_no_status ... ok [INFO] [stdout] test broker::commands::tests::tests::unsubscribe_without_prior_subscription ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_public_room_always_allowed ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_dm_room_participant_allowed ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_explicit_mentions_only ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_choice_valid_value ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_multiple_params ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_number_below_min ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_empty_schema_always_passes ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_number_not_a_number ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_number_above_max ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_optional_param_missing_is_ok ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_number_valid ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_username_always_passes ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_required_param_present ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_text_always_passes ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_events_overwrites_previous ... ok [INFO] [stdout] test broker::commands::tests::tests::unsubscribe_persists_to_disk ... ok [INFO] [stdout] test broker::commands::tests::tests::validation_tests::validate_required_param_missing ... ok [INFO] [stdout] test broker::daemon::tests::backslash_rejected ... ok [INFO] [stdout] test broker::daemon::tests::build_initial_subscriptions_dm_populates ... ok [INFO] [stdout] test broker::daemon::tests::build_initial_subscriptions_public_empty ... ok [INFO] [stdout] test broker::daemon::tests::config_chat_path_format ... ok [INFO] [stdout] test broker::daemon::tests::config_default_socket_path ... ok [INFO] [stdout] test broker::commands::tests::tests::subscribe_events_persists_to_disk ... ok [INFO] [stdout] test broker::daemon::tests::create_duplicate_room_fails ... ok [INFO] [stdout] test broker::daemon::tests::connection_count_increments_and_decrements ... ok [INFO] [stdout] test broker::daemon::tests::connection_count_starts_at_zero ... ok [INFO] [stdout] test broker::daemon::tests::create_room_with_config_duplicate_fails ... ok [INFO] [stdout] test broker::daemon::tests::daemon_room_resolver_finds_existing_room ... ok [INFO] [stdout] test broker::daemon::tests::custom_grace_period_preserved ... ok [INFO] [stdout] test broker::daemon::tests::create_room_with_config_rejects_invalid_id ... ok [INFO] [stdout] test broker::commands::tests::tests::who_all_standalone_falls_back_to_room_users ... ok [INFO] [stdout] test broker::daemon::tests::created_rooms_have_resolver_attached ... ok [INFO] [stdout] test broker::daemon::tests::default_grace_period_is_30 ... ok [INFO] [stdout] test broker::daemon::tests::create_room_rejects_invalid_id ... ok [INFO] [stdout] test broker::daemon::tests::destroy_nonexistent_room_fails ... ok [INFO] [stdout] test broker::daemon::tests::create_room_initializes_plugins ... ok [INFO] [stdout] test broker::daemon::tests::create_room_with_dm_config ... ok [INFO] [stdout] test broker::daemon::tests::dm_room_id_deterministic_and_lookup_works ... ok [INFO] [stdout] test broker::daemon::tests::cross_room_resolver_resolves_sibling_room ... ok [INFO] [stdout] test broker::daemon::tests::daemon_room_resolver_returns_none_for_unknown ... ok [INFO] [stdout] test broker::daemon::tests::dm_auto_subscribe_uses_full_tier ... ok [INFO] [stdout] test broker::daemon::tests::destroy_room_signals_shutdown ... ok [INFO] [stdout] test broker::commands::tests::tests::who_all_with_registry_returns_all_registered_users ... ok [INFO] [stdout] test broker::daemon::tests::destroy_room_removes_it ... ok [INFO] [stdout] test broker::daemon::tests::create_room_succeeds ... ok [INFO] [stdout] test broker::daemon::tests::get_room_config_returns_config_when_present ... ok [INFO] [stdout] test broker::daemon::tests::get_room_config_returns_none_for_unconfigured ... ok [INFO] [stdout] test broker::daemon::tests::dot_dot_traversal_rejected ... ok [INFO] [stdout] test broker::daemon::tests::empty_room_id_rejected ... ok [INFO] [stdout] test broker::daemon::tests::is_pid_alive_false_for_missing_file ... ok [INFO] [stdout] test broker::daemon::tests::dm_room_auto_subscribes_both_participants ... ok [INFO] [stdout] test broker::daemon::tests::migrate_legacy_tmpdir_tokens_skips_non_token_files ... ok [INFO] [stdout] test broker::daemon::tests::migrate_legacy_tmpdir_tokens_skips_malformed_json ... ok [INFO] [stdout] test broker::daemon::tests::list_rooms_empty_initially ... ok [INFO] [stdout] test broker::daemon::tests::migrate_legacy_tmpdir_tokens_imports_token ... ok [INFO] [stdout] test broker::daemon::tests::has_room_returns_true_for_created ... ok [INFO] [stdout] test broker::daemon::tests::grace_period_cancelled_by_new_connection ... ok [INFO] [stdout] test broker::daemon::tests::null_byte_rejected ... ok [INFO] [stdout] test broker::daemon::tests::other_unsafe_chars_rejected ... ok [INFO] [stdout] test broker::daemon::tests::migrate_legacy_tmpdir_tokens_idempotent ... ok [INFO] [stdout] test broker::daemon::tests::public_room_starts_with_no_subscriptions ... ok [INFO] [stdout] test broker::daemon::tests::list_rooms_returns_all ... ok [INFO] [stdout] test broker::daemon::tests::room_id_too_long_rejected ... ok [INFO] [stdout] test broker::daemon::tests::is_pid_alive_true_for_current_process ... ok [INFO] [stdout] test broker::daemon::tests::slash_rejected ... ok [INFO] [stdout] test broker::daemon::tests::single_dot_rejected ... ok [INFO] [stdout] test broker::daemon::tests::whitespace_rejected ... ok [INFO] [stdout] test broker::daemon::tests::remove_pid_file_deletes_file ... ok [INFO] [stdout] test broker::daemon::tests::valid_room_ids ... ok [INFO] [stdout] test broker::daemon::tests::write_pid_file_creates_file_with_current_pid ... ok [INFO] [stdout] test broker::daemon::tests::unconfigured_room_starts_with_no_subscriptions ... ok [INFO] [stdout] test broker::handshake::tests::client_send_empty_username ... ok [INFO] [stdout] test broker::handshake::tests::client_interactive_empty_string ... ok [INFO] [stdout] test broker::fanout::tests::dm_host_sees_all_dms ... ok [INFO] [stdout] test broker::daemon::tests::remove_pid_file_noop_when_missing ... ok [INFO] [stdout] test broker::handshake::tests::client_interactive_plain_username ... ok [INFO] [stdout] test broker::handshake::tests::client_join_prefix ... ok [INFO] [stdout] test broker::fanout::tests::dm_offline_recipient_still_persists ... ok [INFO] [stdout] test broker::fanout::tests::dm_delivers_only_to_sender_recipient_and_host ... ok [INFO] [stdout] test broker::handshake::tests::daemon_global_join ... ok [INFO] [stdout] test broker::fanout::tests::broadcast_empty_clients_still_persists ... ok [INFO] [stdout] test broker::fanout::tests::broadcast_delivers_to_all_clients ... ok [INFO] [stdout] test broker::handshake::tests::client_send_prefix ... ok [INFO] [stdout] test broker::handshake::tests::client_session_empty_token ... ok [INFO] [stdout] test broker::fanout::tests::broadcast_increments_seq_counter ... ok [INFO] [stdout] test broker::handshake::tests::client_session_prefix ... ok [INFO] [stdout] test broker::handshake::tests::client_token_prefix ... ok [INFO] [stdout] test broker::handshake::tests::daemon_create_prefix ... ok [INFO] [stdout] test broker::handshake::tests::daemon_destroy_prefix ... ok [INFO] [stdout] test broker::handshake::tests::daemon_global_join_empty_username_is_unknown ... ok [INFO] [stdout] test broker::handshake::tests::daemon_room_empty_room_id_is_unknown ... ok [INFO] [stdout] test broker::handshake::tests::daemon_room_empty_rest ... ok [INFO] [stdout] test broker::handshake::tests::daemon_room_id_with_hyphens ... ok [INFO] [stdout] test broker::handshake::tests::daemon_room_token ... ok [INFO] [stdout] test broker::handshake::tests::daemon_room_interactive ... ok [INFO] [stdout] test broker::handshake::tests::daemon_unknown_plain_username ... ok [INFO] [stdout] test broker::handshake::tests::daemon_unknown_token_without_room ... ok [INFO] [stdout] test broker::service::tests::route_and_dispatch_dm_in_dm_room_non_participant_denied ... ok [INFO] [stdout] test broker::handshake::tests::daemon_room_send ... ok [INFO] [stdout] test broker::handshake::tests::daemon_room_join ... ok [INFO] [stdout] test broker::service::tests::check_join_public_room_allows_anyone ... ok [INFO] [stdout] test broker::persistence::tests::save_load_event_filter_map_non_taskboard_types ... ok [INFO] [stdout] test broker::service::tests::issue_and_validate_token_round_trip ... ok [INFO] [stdout] test broker::service::tests::issue_token_duplicate_username_fails ... ok [INFO] [stdout] test broker::service::tests::issue_token_sets_full_subscription ... ok [INFO] [stdout] test broker::service::tests::status_count_initially_zero ... ok [INFO] [stdout] test broker::session::tests::auto_subscribe_skips_already_subscribed_full ... ok [INFO] [stdout] test broker::service::tests::route_and_dispatch_dm_in_public_room_sends ... ok [INFO] [stdout] test broker::session::tests::auto_subscribe_skips_already_subscribed_mentions_only ... ok [INFO] [stdout] test broker::session::tests::auto_subscribe_skips_unregistered_users ... ok [INFO] [stdout] test broker::session::tests::auto_subscribe_upgrades_unsubscribed_to_mentions_only ... ok [INFO] [stdout] test broker::session::tests::auto_subscribe_handles_multiple_mentions ... ok [INFO] [stdout] test broker::session::tests::auto_subscribe_registers_mentions_only_for_unsubscribed ... ok [INFO] [stdout] test broker::session::tests::auto_subscribe_no_op_for_message_without_mentions ... ok [INFO] [stdout] test broker::session::tests::process_oneshot_send_rejects_bad_parse ... ok [INFO] [stdout] test broker::session::tests::process_inbound_message_routes_plain_text ... ok [INFO] [stdout] test broker::service::tests::room_id_returns_correct_id ... ok [INFO] [stdout] test broker::service::tests::load_history_empty_file ... ok [INFO] [stdout] test broker::service::tests::host_name_initially_none ... ok [INFO] [stdout] test broker::service::tests::route_and_dispatch_command_returns_reply ... ok [INFO] [stdout] test broker::service::tests::validate_token_unknown_returns_none ... ok [INFO] [stdout] test broker::session::tests::auto_subscribe_persists_to_disk ... ok [INFO] [stdout] test broker::state::tests::event_filter_noop_without_attach ... ok [INFO] [stdout] test broker::service::tests::route_and_dispatch_regular_message_sends ... ok [INFO] [stdout] test broker::session::tests::session_teardown_removes_status_and_broadcasts_leave ... ok [INFO] [stdout] test broker::state::tests::new_creates_state_with_correct_room_id ... ok [INFO] [stdout] test broker::state::tests::new_registers_builtin_plugins ... ok [INFO] [stdout] test broker::session::tests::session_setup_does_not_overwrite_existing_host ... ok [INFO] [stdout] test broker::state::tests::event_filter_entries_empty_without_attach ... ok [INFO] [stdout] test broker::session::tests::auto_subscribe_broadcasts_notice ... ok [INFO] [stdout] test broker::state::tests::event_filter_snapshot_clones_map ... ok [INFO] [stdout] test broker::state::tests::new_starts_with_empty_collections ... ok [INFO] [stdout] test broker::state::tests::event_filter_path_none_without_attach ... ok [INFO] [stdout] test broker::state::tests::set_event_filter_inserts_entry ... ok [INFO] [stdout] test broker::state::tests::event_filter_path_some_after_attach ... ok [INFO] [stdout] test broker::state::tests::new_uses_provided_token_map ... ok [INFO] [stdout] test broker::state::tests::remove_status_deletes_entry ... ok [INFO] [stdout] test broker::session::tests::subscribe_mentioned_returns_newly_subscribed_before_broadcast ... ok [INFO] [stdout] test broker::state::tests::event_filter_entries_sorted ... ok [INFO] [stdout] test broker::session::tests::process_oneshot_send_returns_echo ... ok [INFO] [stdout] test broker::session::tests::session_setup_registers_host ... ok [INFO] [stdout] test broker::tests::read_line_limited_appends_to_existing_buffer ... ok [INFO] [stdout] test broker::state::tests::set_status_inserts_entry ... ok [INFO] [stdout] test broker::state::tests::subscription_entries_sorted ... ok [INFO] [stdout] test broker::state::tests::set_subscription_and_count ... ok [INFO] [stdout] test broker::state::tests::status_entries_returns_sorted ... ok [INFO] [stdout] test broker::tests::read_line_limited_embedded_null_bytes ... ok [INFO] [stdout] test broker::tests::read_line_limited_exact_limit_no_newline_accepted ... ok [INFO] [stdout] test broker::state::tests::subscription_snapshot_clones_map ... ok [INFO] [stdout] test broker::tests::read_line_limited_crlf_line_ending ... ok [INFO] [stdout] test broker::tests::read_line_limited_accepts_line_at_exact_limit ... ok [INFO] [stdout] test broker::tests::read_line_limited_reads_line_without_trailing_newline ... ok [INFO] [stdout] test broker::tests::read_line_limited_long_line_with_newline_at_boundary ... ok [INFO] [stdout] test broker::state::tests::set_event_filter_overwrites ... ok [INFO] [stdout] test broker::state::tests::set_status_empty_string_clears_display ... ok [INFO] [stdout] test broker::tests::read_line_limited_reads_multiple_lines ... ok [INFO] [stdout] test broker::tests::read_line_limited_reads_normal_line ... ok [INFO] [stdout] test broker::tests::read_line_limited_returns_zero_on_eof ... ok [INFO] [stdout] test broker::ws::rest::tests::build_query_filter_defaults_for_empty_params ... ok [INFO] [stdout] test broker::ws::rest::tests::apply_query_filter_dm_hidden_from_non_participant ... ok [INFO] [stdout] test broker::ws::rest::tests::apply_query_filter_respects_limit ... ok [INFO] [stdout] test broker::token_store::tests::load_token_map_missing_file_returns_empty ... ok [INFO] [stdout] test broker::ws::rest::tests::build_query_filter_invalid_regex_returns_err ... ok [INFO] [stdout] test broker::ws::rest::tests::apply_query_filter_empty_history_returns_empty ... ok [INFO] [stdout] test broker::token_store::tests::save_and_load_round_trip ... ok [INFO] [stdout] test broker::ws::rest::tests::dispatch_to_response_handled_returns_200 ... ok [INFO] [stdout] test broker::token_store::tests::load_token_map_corrupt_file_returns_empty ... ok [INFO] [stdout] test broker::ws::rest::tests::extract_bearer_token_wrong_scheme ... ok [INFO] [stdout] test broker::ws::rest::tests::extract_bearer_token_valid_header ... ok [INFO] [stdout] test broker::ws::rest::tests::dispatch_to_response_send_denied_returns_403 ... ok [INFO] [stdout] test broker::ws::rest::tests::extract_bearer_token_empty_value_after_bearer ... ok [INFO] [stdout] test broker::ws::rest::tests::require_auth_missing_header_returns_unauthorized ... ok [INFO] [stdout] test broker::ws::rest::tests::require_auth_invalid_token_returns_unauthorized ... ok [INFO] [stdout] test broker::ws::rest::tests::build_query_filter_maps_all_params ... ok [INFO] [stdout] test broker::daemon::tests::daemon_exits_on_shutdown_signal ... ok [INFO] [stdout] test broker::tests::read_line_limited_just_over_limit_no_newline_rejected ... ok [INFO] [stdout] test broker::ws::rest::tests::extract_bearer_token_missing_header ... ok [INFO] [stdout] test broker::ws::rest::tests::dispatch_to_response_error_returns_500 ... ok [INFO] [stdout] test broker::tests::read_line_limited_rejects_oversized_line ... ok [INFO] [stdout] test broker::tests::read_line_limited_rejects_invalid_utf8 ... ok [INFO] [stdout] test broker::ws::rest::tests::require_auth_valid_token_returns_username ... ok [INFO] [stdout] test broker::ws::tests::daemon_ws_state_get_room_not_found ... ok [INFO] [stdout] test broker::ws::tests::daemon_ws_state_get_room_found ... ok [INFO] [stdout] test broker::ws::tests::ws_invalid_token_returns_error ... ok [INFO] [stdout] test broker::ws::tests::ws_close_frame_during_handshake ... ok [INFO] [stdout] test broker::commands::tests::tests::dispatch_plugin_catches_panic ... ok [INFO] [stdout] test broker::commands::tests::tests::dispatch_plugin_catches_panic_with_string_message ... ok [INFO] [stdout] test broker::ws::tests::ws_join_handshake_returns_token ... ok [INFO] [stdout] test history::tests::max_seq_nonexistent_file_returns_zero ... ok [INFO] [stdout] test history::tests::load_nonexistent_returns_empty ... ok [INFO] [stdout] test paths::tests::broker_subscriptions_path_contains_room_id ... ok [INFO] [stdout] test paths::tests::broker_tokens_path_contains_room_id ... ok [INFO] [stdout] test paths::tests::broker_event_filters_path_contains_room_id ... ok [INFO] [stdout] test history::tests::max_seq_empty_file_returns_zero ... ok [INFO] [stdout] test paths::tests::cursor_path_is_per_room_and_user ... ok [INFO] [stdout] test paths::tests::create_dir_0700_is_idempotent ... ok [INFO] [stdout] test paths::tests::effective_socket_path_default_without_env ... ok [INFO] [stdout] test paths::tests::effective_socket_path_explicit_overrides_env ... ok [INFO] [stdout] test history::tests::append_then_load_round_trips_all_variants ... ok [INFO] [stdout] test broker::ws::tests::ws_session_invalid_token_returns_error ... ok [INFO] [stdout] test paths::tests::effective_socket_path_uses_env_var ... ok [INFO] [stdout] test paths::tests::create_dir_0700_sets_correct_permissions ... ok [INFO] [stdout] test broker::ws::tests::ws_join_private_room_denied ... ok [INFO] [stdout] test history::tests::append_is_incremental_not_overwriting ... ok [INFO] [stdout] test paths::tests::ensure_room_dirs_creates_state_and_data ... ok [INFO] [stdout] test paths::tests::legacy_token_dir_returns_valid_path ... ok [INFO] [stdout] test paths::tests::room_data_dir_under_room_home ... ok [INFO] [stdout] test history::tests::load_preserves_message_order ... ok [INFO] [stdout] test history::tests::load_empty_file_returns_empty ... ok [INFO] [stdout] test plugin::loader::tests::is_shared_lib_recognizes_dylib ... ok [INFO] [stdout] test history::tests::load_skips_malformed_lines_and_returns_valid_ones ... ok [INFO] [stdout] test paths::tests::room_home_ends_with_dot_room ... ok [INFO] [stdout] test plugin::loader::tests::is_shared_lib_recognizes_so ... ok [INFO] [stdout] test plugin::loader::tests::is_shared_lib_rejects_no_extension ... ok [INFO] [stdout] test plugin::loader::tests::is_shared_lib_rejects_other_extensions ... ok [INFO] [stdout] test plugin::loader::tests::load_error_display_messages ... ok [INFO] [stdout] test paths::tests::room_plugins_dir_under_room_home ... ok [INFO] [stdout] test plugin::loader::tests::load_plugin_nonexistent_path_returns_error ... ok [INFO] [stdout] test history::tests::max_seq_returns_highest_seq ... ok [INFO] [stdout] test paths::tests::room_state_dir_under_room_home ... ok [INFO] [stdout] test paths::tests::room_runtime_dir_returns_absolute_path ... ok [INFO] [stdout] test paths::tests::token_path_is_per_room_and_user ... ok [INFO] [stdout] test plugin::bridge::tests::history_reader_filters_dms ... ok [INFO] [stdout] test plugin::loader::tests::scan_plugin_dir_nonexistent_returns_empty ... ok [INFO] [stdout] test plugin::bridge::tests::history_reader_since ... ok [INFO] [stdout] test plugin::bridge::tests::history_reader_tail_and_count ... ok [INFO] [stdout] test history::tests::append_creates_file_if_not_present ... ok [INFO] [stdout] test history::tests::max_seq_messages_without_seq_returns_zero ... ok [INFO] [stdout] test plugin::loader::tests::protocol_satisfies_exact_match ... ok [INFO] [stdout] test plugin::loader::tests::protocol_satisfies_running_newer ... ok [INFO] [stdout] test plugin::loader::tests::protocol_satisfies_running_older_fails ... ok [INFO] [stdout] test plugin::loader::tests::protocol_satisfies_unparseable_is_permissive ... ok [INFO] [stdout] test plugin::loader::tests::protocol_satisfies_zero_always_passes ... ok [INFO] [stdout] test plugin::loader::tests::scan_plugin_dir_empty_dir_returns_empty ... ok [INFO] [stdout] test plugin::queue::tests::add_without_description_returns_error ... ok [INFO] [stdout] test plugin::loader::tests::scan_plugin_dir_skips_non_library_files ... ok [INFO] [stdout] test plugin::queue::tests::queue_path_from_chat_replaces_extension ... ok [INFO] [stdout] test plugin::queue::tests::load_queue_nonexistent_file_returns_empty ... ok [INFO] [stdout] test plugin::queue::tests::list_empty_queue ... ok [INFO] [stdout] test plugin::queue::tests::add_appends_to_queue_and_persists ... ok [INFO] [stdout] test plugin::queue::tests::pop_fifo_order ... ok [INFO] [stdout] test plugin::queue::tests::pop_empty_queue_returns_error ... ok [INFO] [stdout] test plugin::queue::tests::queue_survives_reload ... ok [INFO] [stdout] test plugin::queue::tests::remove_invalid_index ... ok [INFO] [stdout] test plugin::queue::tests::plugin_name_is_queue ... ok [INFO] [stdout] test plugin::queue::tests::remove_out_of_range ... ok [INFO] [stdout] test plugin::queue::tests::remove_zero_index ... ok [INFO] [stdout] test plugin::schema::tests::builtin_command_infos_covers_all_expected_commands ... ok [INFO] [stdout] test plugin::schema::tests::all_known_commands_includes_builtins_and_plugins ... ok [INFO] [stdout] test plugin::schema::tests::builtin_command_infos_dm_has_username_param ... ok [INFO] [stdout] test plugin::schema::tests::builtin_command_infos_who_has_verbose_flag ... ok [INFO] [stdout] test plugin::queue::tests::remove_by_index ... ok [INFO] [stdout] test plugin::stats::tests::build_summary_empty ... ok [INFO] [stdout] test plugin::stats::tests::build_summary_single_user ... ok [INFO] [stdout] test plugin::tests::all_builtin_schemas_have_valid_fields ... ok [INFO] [stdout] test plugin::tests::default_commands_returns_empty_vec ... ok [INFO] [stdout] test plugin::schema::tests::builtin_command_infos_kick_has_username_param ... ok [INFO] [stdout] test plugin::tests::completions_for_number_param_returns_empty ... ok [INFO] [stdout] test plugin::tests::default_lifecycle_hooks_are_noop ... ok [INFO] [stdout] test plugin::tests::duplicate_plugin_names_with_different_commands_succeed ... ok [INFO] [stdout] test plugin::tests::failed_register_does_not_pollute_registry ... ok [INFO] [stdout] test plugin::tests::failed_version_check_does_not_pollute_registry ... ok [INFO] [stdout] test plugin::tests::register_rejects_future_api_version ... ok [INFO] [stdout] test plugin::queue::tests::unknown_action_returns_error ... ok [INFO] [stdout] test plugin::tests::minimal_plugin_can_be_registered_without_commands ... ok [INFO] [stdout] test plugin::tests::register_rejects_incompatible_min_protocol ... ok [INFO] [stdout] test plugin::stats::tests::build_summary_counts_only_chat_messages ... ok [INFO] [stdout] test plugin::tests::register_version_check_runs_before_command_check ... ok [INFO] [stdout] test plugin::queue::tests::rewrite_replaces_file_contents ... ok [INFO] [stdout] test plugin::tests::registry_notify_join_empty_registry_is_noop ... ok [INFO] [stdout] test plugin::tests::registry_completions_for_non_choice_returns_empty ... ok [INFO] [stdout] test plugin::tests::registry_notify_join_calls_all_plugins ... ok [INFO] [stdout] test plugin::tests::registry_register_and_resolve ... ok [INFO] [stdout] test plugin::tests::registry_notify_message_empty_registry_is_noop ... ok [INFO] [stdout] test plugin::tests::registry_rejects_all_reserved_commands ... ok [INFO] [stdout] test plugin::schema::tests::all_known_commands_no_duplicates ... ok [INFO] [stdout] test plugin::tests::register_accepts_compatible_versioned_plugin ... ok [INFO] [stdout] test plugin::tests::registry_rejects_duplicate_command ... ok [INFO] [stdout] test plugin::tests::registry_rejects_reserved_command ... ok [INFO] [stdout] test broker::ws::tests::ws_oneshot_send_empty_body_closes ... ok [INFO] [stdout] test plugin::tests::semver_satisfies_equal_versions ... ok [INFO] [stdout] test plugin::tests::semver_satisfies_running_newer_major ... ok [INFO] [stdout] test plugin::queue::tests::plugin_registers_queue_command ... ok [INFO] [stdout] test plugin::tests::semver_satisfies_malformed_treated_as_zero ... ok [INFO] [stdout] test plugin::tests::registry_all_commands_lists_everything ... ok [INFO] [stdout] test plugin::tests::registry_completions_for_returns_choice_values ... ok [INFO] [stdout] test plugin::tests::registry_notify_message_calls_all_plugins ... ok [INFO] [stdout] test plugin::queue::tests::list_shows_indexed_items ... ok [INFO] [stdout] test plugin::queue::tests::pop_removes_first_item ... ok [INFO] [stdout] test plugin::queue::tests::append_and_load_round_trips ... ok [INFO] [stdout] test plugin::queue::tests::load_skips_malformed_lines ... ok [INFO] [stdout] test plugin::tests::semver_satisfies_running_newer_minor ... ok [INFO] [stdout] test plugin::tests::semver_satisfies_running_newer_patch ... ok [INFO] [stdout] test plugin::tests::semver_satisfies_running_older_fails ... ok [INFO] [stdout] test plugin::tests::semver_satisfies_zero_required_always_passes ... ok [INFO] [stdout] test plugin::tests::semver_satisfies_running_older_major_fails ... ok [INFO] [stdout] test query::tests::after_seq_passes_strictly_greater ... ok [INFO] [stdout] test query::tests::after_seq_rejects_lesser ... ok [INFO] [stdout] test query::tests::after_seq_rejects_equal ... ok [INFO] [stdout] test query::tests::after_seq_rejects_msg_with_no_seq ... ok [INFO] [stdout] test query::tests::after_seq_skips_constraint_for_different_room ... ok [INFO] [stdout] test query::tests::after_ts_passes_strictly_after ... ok [INFO] [stdout] test query::tests::after_ts_rejects_before ... ok [INFO] [stdout] test query::tests::before_seq_passes_strictly_lesser ... ok [INFO] [stdout] test query::tests::after_ts_rejects_equal ... ok [INFO] [stdout] test query::tests::before_seq_rejects_equal ... ok [INFO] [stdout] test query::tests::combined_content_and_mention ... ok [INFO] [stdout] test query::tests::combined_room_and_user_filter ... ok [INFO] [stdout] test query::tests::before_seq_skips_for_different_room ... ok [INFO] [stdout] test query::tests::before_ts_passes_strictly_before ... ok [INFO] [stdout] test query::tests::combined_seq_range ... ok [INFO] [stdout] test query::tests::combined_timestamp_range_and_user ... ok [INFO] [stdout] test query::tests::before_ts_rejects_equal ... ok [INFO] [stdout] test query::tests::content_regex_rejects_no_content ... ok [INFO] [stdout] test query::tests::content_search_is_case_sensitive ... ok [INFO] [stdout] test query::tests::content_search_passes_when_contained ... ok [INFO] [stdout] test query::tests::content_search_rejects_join_no_content ... ok [INFO] [stdout] test query::tests::content_search_rejects_when_absent ... ok [INFO] [stdout] test query::tests::default_filter_passes_dm ... ok [INFO] [stdout] test query::tests::default_filter_passes_join ... ok [INFO] [stdout] test query::tests::default_filter_passes_message ... ok [INFO] [stdout] test query::tests::has_narrowing_filter_empty_is_false ... ok [INFO] [stdout] test query::tests::future_after_ts_rejects_all_historical ... ok [INFO] [stdout] test query::tests::has_narrowing_filter_limit_is_true ... ok [INFO] [stdout] test plugin::stats::tests::stats_plugin_broadcasts_summary ... ok [INFO] [stdout] test query::tests::content_regex_rejects_non_matching ... ok [INFO] [stdout] test query::tests::content_regex_invalid_pattern_rejected_at_compile_time ... ok [INFO] [stdout] test plugin::queue::tests::new_plugin_loads_existing_queue ... ok [INFO] [stdout] test query::tests::has_narrowing_filter_new_or_wait_is_true ... ok [INFO] [stdout] test query::tests::has_narrowing_filter_content_regex_is_true ... ok [INFO] [stdout] test query::tests::has_narrowing_filter_content_search_is_true ... ok [INFO] [stdout] test query::tests::has_narrowing_filter_public_only_alone_is_false ... ok [INFO] [stdout] test query::tests::has_narrowing_filter_rooms_is_true ... ok [INFO] [stdout] test query::tests::has_narrowing_filter_target_id_is_true ... ok [INFO] [stdout] test query::tests::inverted_seq_range_rejects_all_in_room ... ok [INFO] [stdout] test query::tests::mention_user_passes_when_mentioned ... ok [INFO] [stdout] test query::tests::mention_user_rejects_no_content ... ok [INFO] [stdout] test query::tests::mention_user_rejects_when_not_mentioned ... ok [INFO] [stdout] test query::tests::public_only_excludes_dm ... ok [INFO] [stdout] test query::tests::public_only_false_passes_dm ... ok [INFO] [stdout] test query::tests::public_only_passes_regular_message ... ok [INFO] [stdout] test query::tests::rooms_filter_empty_passes_all ... ok [INFO] [stdout] test query::tests::rooms_filter_multiple_rooms_passes_any ... ok [INFO] [stdout] test query::tests::content_regex_passes_matching_pattern ... ok [INFO] [stdout] test query::tests::rooms_filter_passes_matching_room ... ok [INFO] [stdout] test query::tests::rooms_filter_rejects_other_room ... ok [INFO] [stdout] test query::tests::target_id_passes_exact_match ... ok [INFO] [stdout] test query::tests::target_id_rejects_no_seq ... ok [INFO] [stdout] test query::tests::target_id_rejects_wrong_room ... ok [INFO] [stdout] test query::tests::target_id_rejects_wrong_seq ... ok [INFO] [stdout] test query::tests::target_id_short_circuits_other_seq_filters ... ok [INFO] [stdout] test query::tests::triple_and_user_mention_search_all_match ... ok [INFO] [stdout] test query::tests::triple_and_user_mention_search_one_fails ... ok [INFO] [stdout] test query::tests::users_filter_multiple_users ... ok [INFO] [stdout] test query::tests::users_filter_passes_matching_user ... ok [INFO] [stdout] test query::tests::users_filter_rejects_other_user ... ok [INFO] [stdout] test registry::tests::expand_team_mention_nonexistent_returns_none ... ok [INFO] [stdout] test registry::tests::expand_team_mention_returns_members ... ok [INFO] [stdout] test registry::tests::has_token_for_user_false_when_no_token ... ok [INFO] [stdout] test registry::tests::has_token_for_user_true_when_token_exists ... ok [INFO] [stdout] test registry::tests::import_token_fails_for_unregistered_user ... ok [INFO] [stdout] test registry::tests::import_token_preserves_uuid ... ok [INFO] [stdout] test registry::tests::issue_and_validate_token ... ok [INFO] [stdout] test registry::tests::import_token_noop_if_already_present ... ok [INFO] [stdout] test registry::tests::issue_token_for_unregistered_user_fails ... ok [INFO] [stdout] test registry::tests::join_and_leave_room ... ok [INFO] [stdout] test registry::tests::join_team_empty_name_rejected ... ok [INFO] [stdout] test registry::tests::join_team_creates_and_adds_member ... ok [INFO] [stdout] test registry::tests::join_team_empty_username_rejected ... ok [INFO] [stdout] test registry::tests::leave_team_nonexistent_returns_error ... ok [INFO] [stdout] test registry::tests::legacy_registry_without_teams_loads_cleanly ... ok [INFO] [stdout] test registry::tests::join_team_multiple_members ... ok [INFO] [stdout] test registry::tests::leave_team_deletes_on_empty ... ok [INFO] [stdout] test registry::tests::leave_room_not_member_returns_false ... ok [INFO] [stdout] test registry::tests::leave_team_removes_member ... ok [INFO] [stdout] test registry::tests::load_missing_file_returns_empty ... ok [INFO] [stdout] test registry::tests::register_and_get_user ... ok [INFO] [stdout] test registry::tests::join_multiple_rooms ... ok [INFO] [stdout] test registry::tests::list_users_returns_all ... ok [INFO] [stdout] test registry::tests::leave_team_non_member_returns_false ... ok [INFO] [stdout] test registry::tests::list_teams_sorted_by_name ... ok [INFO] [stdout] test registry::tests::load_corrupt_file_returns_error ... ok [INFO] [stdout] test registry::tests::join_team_idempotent_returns_false ... ok [INFO] [stdout] test registry::tests::register_empty_username_rejected ... ok [INFO] [stdout] test registry::tests::persistence_survives_remove_and_reload ... ok [INFO] [stdout] test registry::tests::register_user_idempotent_creates_new_user ... ok [INFO] [stdout] test registry::tests::register_duplicate_rejected ... ok [INFO] [stdout] test registry::tests::multiple_users_tokens_isolated ... ok [INFO] [stdout] test registry::tests::register_user_idempotent_noop_for_existing ... ok [INFO] [stdout] test registry::tests::remove_nonexistent_user_returns_false ... ok [INFO] [stdout] test registry::tests::status_on_unregistered_user_fails ... ok [INFO] [stdout] test registry::tests::revoke_nonexistent_token_returns_false ... ok [INFO] [stdout] test registry::tests::room_ops_on_unregistered_user_fail ... ok [INFO] [stdout] test registry::tests::save_and_load_round_trip ... ok [INFO] [stdout] test registry::tests::revoke_user_tokens_removes_all ... ok [INFO] [stdout] test registry::tests::remove_user_cleans_tokens ... ok [INFO] [stdout] test registry::tests::team_names_returns_sorted_vec ... ok [INFO] [stdout] test registry::tests::revoke_token ... ok [INFO] [stdout] test registry::tests::set_and_clear_status ... ok [INFO] [stdout] test registry::tests::teams_persist_across_save_and_load ... ok [INFO] [stdout] test registry::tests::validate_unknown_token_returns_none ... ok [INFO] [stdout] test registry::tests::token_snapshot_returns_all_tokens ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 549 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.28s [INFO] [stdout] [INFO] [stderr] Doc-tests room_daemon [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" "6ec5b209c02b8f148367bba3300e092cf915219a0bfe15416e1f03c35ee4a6ab", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "6ec5b209c02b8f148367bba3300e092cf915219a0bfe15416e1f03c35ee4a6ab", kill_on_drop: false }` [INFO] [stdout] 6ec5b209c02b8f148367bba3300e092cf915219a0bfe15416e1f03c35ee4a6ab