[INFO] cloning repository https://github.com/intjiraya/constellation
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/intjiraya/constellation" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fintjiraya%2Fconstellation", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fintjiraya%2Fconstellation'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] ea282ddc4cc0648c692fd0f78ed6143d0ec190bd
[INFO] testing intjiraya/constellation against 1.97.0-beta.6 for beta-1.98-1
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fintjiraya%2Fconstellation" "/workspace/builds/worker-1-tc1/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-1-tc1/source'...
[INFO] [stderr] done.
[INFO] removed /workspace/builds/worker-1-tc1/source/rust-toolchain.toml
[INFO] started tweaking git repo https://github.com/intjiraya/constellation
[INFO] finished tweaking git repo https://github.com/intjiraya/constellation
[INFO] tweaked toml for git repo https://github.com/intjiraya/constellation written to /workspace/builds/worker-1-tc1/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/intjiraya/constellation on toolchain 1.97.0-beta.6
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.97.0-beta.6" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/intjiraya/constellation already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.97.0-beta.6" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Updating crates.io index
[INFO] [stderr]  Downloading crates ...
[INFO] [stderr]   Downloaded http-range-header v0.4.2
[INFO] [stderr]   Downloaded rust-embed-utils v8.11.0
[INFO] [stderr]   Downloaded rust-embed-impl v8.11.0
[INFO] [stderr]   Downloaded wasm-bindgen-shared v0.2.122
[INFO] [stderr]   Downloaded wasm-bindgen-macro v0.2.122
[INFO] [stderr]   Downloaded shell-words v1.1.1
[INFO] [stderr]   Downloaded filedescriptor v0.8.3
[INFO] [stderr]   Downloaded shared_library v0.1.9
[INFO] [stderr]   Downloaded pretty_assertions v1.4.1
[INFO] [stderr]   Downloaded open v5.3.5
[INFO] [stderr]   Downloaded data-encoding v2.11.0
[INFO] [stderr]   Downloaded portable-pty v0.9.0
[INFO] [stderr]   Downloaded serial2 v0.2.37
[INFO] [stderr]   Downloaded wasm-bindgen v0.2.122
[INFO] [stderr]   Downloaded yansi v1.0.1
[INFO] [stderr]   Downloaded wasm-bindgen-macro-support v0.2.122
[INFO] [stderr]   Downloaded js-sys v0.3.99
[INFO] [stderr]   Downloaded rust-embed v8.11.0
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-1-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:3d5ced03c013a94a2f102a4510f48a6e9184255caf5fd8244f58017bde7f5210" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 29e62878d720f8e6239f0e43b1c6306dda80b535dbcc2fb2052cda95928de3d4
[INFO] running `Command { std: "docker" "start" "29e62878d720f8e6239f0e43b1c6306dda80b535dbcc2fb2052cda95928de3d4", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "29e62878d720f8e6239f0e43b1c6306dda80b535dbcc2fb2052cda95928de3d4", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "29e62878d720f8e6239f0e43b1c6306dda80b535dbcc2fb2052cda95928de3d4" "/opt/rustwide/cargo-home/bin/cargo" "+1.97.0-beta.6" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "29e62878d720f8e6239f0e43b1c6306dda80b535dbcc2fb2052cda95928de3d4", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "29e62878d720f8e6239f0e43b1c6306dda80b535dbcc2fb2052cda95928de3d4" "/opt/rustwide/cargo-home/bin/cargo" "+1.97.0-beta.6" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling libc v0.2.186
[INFO] [stderr]    Compiling cfg-if v1.0.4
[INFO] [stderr]    Compiling pin-project-lite v0.2.17
[INFO] [stderr]    Compiling futures-core v0.3.32
[INFO] [stderr]    Compiling bytes v1.11.1
[INFO] [stderr]    Compiling itoa v1.0.18
[INFO] [stderr]    Compiling once_cell v1.21.4
[INFO] [stderr]    Compiling smallvec v1.15.1
[INFO] [stderr]    Compiling futures-sink v0.3.32
[INFO] [stderr]    Compiling typenum v1.20.0
[INFO] [stderr]    Compiling scopeguard v1.2.0
[INFO] [stderr]    Compiling log v0.4.30
[INFO] [stderr]    Compiling unicase v2.9.0
[INFO] [stderr]    Compiling tokio-macros v2.7.0
[INFO] [stderr]    Compiling parking_lot_core v0.9.12
[INFO] [stderr]    Compiling generic-array v0.14.7
[INFO] [stderr]    Compiling zerocopy v0.8.48
[INFO] [stderr]    Compiling memchr v2.8.0
[INFO] [stderr]    Compiling lock_api v0.4.14
[INFO] [stderr]    Compiling serde_core v1.0.228
[INFO] [stderr]    Compiling futures-channel v0.3.32
[INFO] [stderr]    Compiling getrandom v0.3.4
[INFO] [stderr]    Compiling futures-macro v0.3.32
[INFO] [stderr]    Compiling mime_guess v2.0.5
[INFO] [stderr]    Compiling slab v0.4.12
[INFO] [stderr]    Compiling cpufeatures v0.2.17
[INFO] [stderr]    Compiling tracing-core v0.1.36
[INFO] [stderr]    Compiling futures-task v0.3.32
[INFO] [stderr]    Compiling futures-io v0.3.32
[INFO] [stderr]    Compiling httparse v1.10.1
[INFO] [stderr]    Compiling mime v0.3.17
[INFO] [stderr]    Compiling tower-service v0.3.3
[INFO] [stderr]    Compiling thiserror v2.0.18
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling percent-encoding v2.3.2
[INFO] [stderr]    Compiling tower-layer v0.3.3
[INFO] [stderr]    Compiling http v1.4.0
[INFO] [stderr]    Compiling tracing v0.1.44
[INFO] [stderr]    Compiling autocfg v1.5.1
[INFO] [stderr]    Compiling cfg_aliases v0.1.1
[INFO] [stderr]    Compiling same-file v1.0.6
[INFO] [stderr]    Compiling utf8parse v0.2.2
[INFO] [stderr]    Compiling block-buffer v0.10.4
[INFO] [stderr]    Compiling crypto-common v0.1.7
[INFO] [stderr]    Compiling httpdate v1.0.3
[INFO] [stderr]    Compiling thiserror v1.0.69
[INFO] [stderr]    Compiling digest v0.10.7
[INFO] [stderr]    Compiling walkdir v2.5.0
[INFO] [stderr]    Compiling anstyle-parse v1.0.0
[INFO] [stderr]    Compiling futures-util v0.3.32
[INFO] [stderr]    Compiling nix v0.28.0
[INFO] [stderr]    Compiling num-traits v0.2.19
[INFO] [stderr]    Compiling sha1 v0.10.6
[INFO] [stderr]    Compiling zmij v1.0.21
[INFO] [stderr]    Compiling thiserror-impl v1.0.69
[INFO] [stderr]    Compiling atomic-waker v1.1.2
[INFO] [stderr]    Compiling serde_json v1.0.150
[INFO] [stderr]    Compiling http-body v1.0.1
[INFO] [stderr]    Compiling bitflags v2.11.1
[INFO] [stderr]    Compiling http-body-util v0.1.3
[INFO] [stderr]    Compiling anstyle-query v1.1.5
[INFO] [stderr]    Compiling anstyle v1.0.14
[INFO] [stderr]    Compiling is_terminal_polyfill v1.70.2
[INFO] [stderr]    Compiling colorchoice v1.0.5
[INFO] [stderr]    Compiling data-encoding v2.11.0
[INFO] [stderr]    Compiling sync_wrapper v1.0.2
[INFO] [stderr]    Compiling regex-syntax v0.8.10
[INFO] [stderr]    Compiling anyhow v1.0.102
[INFO] [stderr]    Compiling errno v0.3.14
[INFO] [stderr]    Compiling socket2 v0.6.3
[INFO] [stderr]    Compiling mio v1.2.0
[INFO] [stderr]    Compiling sha2 v0.10.9
[INFO] [stderr]    Compiling signal-hook-registry v1.4.8
[INFO] [stderr]    Compiling anstream v1.0.0
[INFO] [stderr]    Compiling parking_lot v0.12.5
[INFO] [stderr]    Compiling rand_core v0.9.5
[INFO] [stderr]    Compiling rust-embed-utils v8.11.0
[INFO] [stderr]    Compiling tokio v1.52.3
[INFO] [stderr]    Compiling form_urlencoded v1.2.2
[INFO] [stderr]    Compiling is-docker v0.2.0
[INFO] [stderr]    Compiling ryu v1.0.23
[INFO] [stderr]    Compiling strsim v0.11.1
[INFO] [stderr]    Compiling option-ext v0.2.0
[INFO] [stderr]    Compiling clap_lex v1.1.0
[INFO] [stderr]    Compiling lazy_static v1.5.0
[INFO] [stderr]    Compiling dirs-sys v0.5.0
[INFO] [stderr]    Compiling clap_derive v4.6.1
[INFO] [stderr]    Compiling sharded-slab v0.1.7
[INFO] [stderr]    Compiling serde_urlencoded v0.7.1
[INFO] [stderr]    Compiling clap_builder v4.6.0
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling is-wsl v0.4.0
[INFO] [stderr]    Compiling serde_path_to_error v0.1.20
[INFO] [stderr]    Compiling filedescriptor v0.8.3
[INFO] [stderr]    Compiling rust-embed-impl v8.11.0
[INFO] [stderr]    Compiling serial2 v0.2.37
[INFO] [stderr]    Compiling axum-core v0.5.6
[INFO] [stderr]    Compiling futures-executor v0.3.32
[INFO] [stderr]    Compiling tracing-log v0.2.0
[INFO] [stderr]    Compiling thread_local v1.1.9
[INFO] [stderr]    Compiling axum-macros v0.5.1
[INFO] [stderr]    Compiling shell-words v1.1.1
[INFO] [stderr]    Compiling http-range-header v0.4.2
[INFO] [stderr]    Compiling downcast-rs v1.2.1
[INFO] [stderr]    Compiling pathdiff v0.2.3
[INFO] [stderr]    Compiling base64 v0.22.1
[INFO] [stderr]    Compiling ppv-lite86 v0.2.21
[INFO] [stderr]    Compiling nu-ansi-term v0.50.3
[INFO] [stderr]    Compiling iana-time-zone v0.1.65
[INFO] [stderr]    Compiling matchit v0.8.4
[INFO] [stderr]    Compiling open v5.3.5
[INFO] [stderr]    Compiling chrono v0.4.44
[INFO] [stderr]    Compiling portable-pty v0.9.0
[INFO] [stderr]    Compiling rand_chacha v0.9.0
[INFO] [stderr]    Compiling rand v0.9.4
[INFO] [stderr]    Compiling futures v0.3.32
[INFO] [stderr]    Compiling rust-embed v8.11.0
[INFO] [stderr]    Compiling matchers v0.2.0
[INFO] [stderr]    Compiling tracing-subscriber v0.3.23
[INFO] [stderr]    Compiling dirs v6.0.0
[INFO] [stderr]    Compiling tungstenite v0.29.0
[INFO] [stderr]    Compiling clap v4.6.1
[INFO] [stderr]    Compiling hyper v1.9.0
[INFO] [stderr]    Compiling tokio-util v0.7.18
[INFO] [stderr]    Compiling tokio-tungstenite v0.29.0
[INFO] [stderr]    Compiling tower v0.5.3
[INFO] [stderr]    Compiling tower-http v0.6.11
[INFO] [stderr]    Compiling hyper-util v0.1.20
[INFO] [stderr]    Compiling axum v0.8.9
[INFO] [stderr]    Compiling constellation v0.1.2 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `dev` profile [optimized + debuginfo] target(s) in 1m 50s
[INFO] running `Command { std: "docker" "inspect" "29e62878d720f8e6239f0e43b1c6306dda80b535dbcc2fb2052cda95928de3d4", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "29e62878d720f8e6239f0e43b1c6306dda80b535dbcc2fb2052cda95928de3d4" "/opt/rustwide/cargo-home/bin/cargo" "+1.97.0-beta.6" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling bitflags v2.11.1
[INFO] [stderr]    Compiling rustix v1.1.4
[INFO] [stderr]    Compiling getrandom v0.4.2
[INFO] [stderr]    Compiling linux-raw-sys v0.12.1
[INFO] [stderr]    Compiling yansi v1.0.1
[INFO] [stderr]    Compiling diff v0.1.13
[INFO] [stderr]    Compiling fastrand v2.4.1
[INFO] [stderr]    Compiling nix v0.28.0
[INFO] [stderr]    Compiling tower-http v0.6.11
[INFO] [stderr]    Compiling pretty_assertions v1.4.1
[INFO] [stderr]    Compiling portable-pty v0.9.0
[INFO] [stderr]    Compiling constellation v0.1.2 (/opt/rustwide/workdir)
[INFO] [stderr]    Compiling tempfile v3.27.0
[INFO] [stderr]     Finished `test` profile [optimized + debuginfo] target(s) in 38.85s
[INFO] running `Command { std: "docker" "inspect" "29e62878d720f8e6239f0e43b1c6306dda80b535dbcc2fb2052cda95928de3d4", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "29e62878d720f8e6239f0e43b1c6306dda80b535dbcc2fb2052cda95928de3d4" "/opt/rustwide/cargo-home/bin/cargo" "+1.97.0-beta.6" "test" "--frozen", kill_on_drop: false }`
[INFO] [stderr]     Finished `test` profile [optimized + debuginfo] target(s) in 0.21s
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/constellation-ef9f478018082f7d)
[INFO] [stdout] 
[INFO] [stdout] running 77 tests
[INFO] [stdout] test dto::tests::index_stats_json_shape_is_stable ... ok
[INFO] [stdout] test http::tests::origin_check_accepts_ipv6_loopback ... ok
[INFO] [stdout] test http::tests::origin_check_accepts_localhost ... ok
[INFO] [stdout] test dto::tests::project_out_json_shape_is_stable ... ok
[INFO] [stdout] test http::tests::origin_check_accepts_loopback_ipv4 ... ok
[INFO] [stdout] test http::tests::origin_check_rejects_external_host ... ok
[INFO] [stdout] test http::tests::origin_check_rejects_non_http_scheme ... ok
[INFO] [stdout] test http::tests::origin_check_rejects_null_origin ... ok
[INFO] [stdout] test http::tests::origin_check_rejects_missing_origin ... ok
[INFO] [stdout] test parser::tests::block_serializes_with_kind_discriminator ... ok
[INFO] [stdout] test index::tests::scanning_flag_resets_after_normal_rebuild ... ok
[INFO] [stdout] test parser::tests::full_parse_empty ... ok
[INFO] [stdout] test parser::tests::is_noise_with_leading_whitespace ... ok
[INFO] [stdout] test parser::tests::full_parse_malformed_still_works ... ok
[INFO] [stdout] test index::tests::rebuild_populates_search_index_with_session_bodies ... ok
[INFO] [stdout] test index::tests::empty_index_safe_to_read ... ok
[INFO] [stdout] test parser::tests::full_parse_minimal ... ok
[INFO] [stdout] test parser::tests::indexable_text_empty_session ... ok
[INFO] [stdout] test parser::tests::is_noise_empty_string_is_not_noise ... ok
[INFO] [stdout] test parser::tests::indexable_text_collects_all_block_kinds ... ok
[INFO] [stdout] test parser::tests::meta_empty_file_returns_placeholder ... ok
[INFO] [stdout] test parser::tests::meta_has_timestamps ... ok
[INFO] [stdout] test index::tests::concurrent_rebuilds_are_serialised ... ok
[INFO] [stdout] test parser::tests::meta_minimal ... ok
[INFO] [stdout] test parser::tests::meta_malformed_lines_are_skipped_and_counted ... ok
[INFO] [stdout] test parser::tests::full_parse_extracts_tool_use ... ok
[INFO] [stdout] test index::tests::rebuild_is_idempotent_and_swaps_atomically ... ok
[INFO] [stdout] test parser::tests::is_noise_mid_string_is_not_noise ... ok
[INFO] [stdout] test index::tests::rebuild_populates_snapshots ... ok
[INFO] [stdout] test parser::tests::meta_no_title_falls_back_to_first_user ... ok
[INFO] [stdout] test parser::tests::meta_only_mode_matches_full_mode_for_counts ... ok
[INFO] [stdout] test parser::tests::meta_returns_path_and_size ... ok
[INFO] [stdout] test parser::tests::full_parse_skips_meta_records ... ok
[INFO] [stdout] test parser::tests::title_is_whitespace_collapsed ... ok
[INFO] [stdout] test parser::tests::tool_use_serialization_includes_required_fields ... ok
[INFO] [stdout] test parser::tests::usage_missing_yields_zero ... ok
[INFO] [stdout] test parser::tests::usage_is_aggregated_across_assistant_turns ... ok
[INFO] [stdout] test pty::tests::client_frame_parses_input ... ok
[INFO] [stdout] test pty::tests::client_frame_rejects_missing_fields ... ok
[INFO] [stdout] test pty::tests::client_frame_rejects_unknown_type ... ok
[INFO] [stdout] test scanner::tests::empty_root_returns_empty ... ok
[INFO] [stdout] test pty::tests::client_frame_parses_resize ... ok
[INFO] [stdout] test scanner::tests::falls_back_to_naive_path_when_no_cwd_known ... ok
[INFO] [stdout] test scanner::tests::aggregated_stats ... ok
[INFO] [stdout] test scanner::tests::finds_one_project ... ok
[INFO] [stdout] test search::tests::build_index_from_session_finds_internal_terms ... ok
[INFO] [stdout] test scanner::tests::resolve_cwd_naive_known_cases ... ok
[INFO] [stdout] test scanner::tests::sorts_projects_by_latest_session_activity ... ok
[INFO] [stdout] test scanner::tests::list_sessions_in_dir_sorts_by_latest ... ok
[INFO] [stdout] test search::tests::index_case_insensitive ... ok
[INFO] [stdout] test search::tests::index_empty_returns_no_hits ... ok
[INFO] [stdout] test scanner::tests::handles_multiple_projects ... ok
[INFO] [stdout] test search::tests::index_multi_term_is_and_across_terms ... ok
[INFO] [stdout] test search::tests::index_substring_of_token_matches ... ok
[INFO] [stdout] test search::tests::search_hit_carries_a_snippet_with_match_offsets ... ok
[INFO] [stdout] test search::tests::search_respects_limit ... ok
[INFO] [stdout] test search::tests::index_single_session_single_term_hit ... ok
[INFO] [stdout] test search::tests::search_results_sorted_by_score_desc ... ok
[INFO] [stdout] test search::tests::snippet_offset_at_document_end ... ok
[INFO] [stdout] test parser::tests::meta_with_tools ... ok
[INFO] [stdout] test parser::tests::title_skips_slash_command_messages ... ok
[INFO] [stdout] test parser::tests::usage_helpers_compute_totals_and_ratio ... ok
[INFO] [stdout] test scanner::tests::display_path_replaces_home_with_tilde ... ok
[INFO] [stdout] test search::tests::snippet_offset_at_document_start ... ok
[INFO] [stdout] test search::tests::tokenize_text_drops_short_numeric_tails ... ok
[INFO] [stdout] test search::tests::tokenize_text_drops_single_char_tokens ... ok
[INFO] [stdout] test search::tests::tokenize_text_keeps_alphanumeric_words_with_digits ... ok
[INFO] [stdout] test search::tests::tokenize_text_handles_empty_and_whitespace ... ok
[INFO] [stdout] test search::tests::tokenize_text_lowercases_and_splits_on_non_alnum ... ok
[INFO] [stdout] test search::tests::tokenize_text_supports_unicode ... ok
[INFO] [stdout] test scanner::tests::missing_root_returns_empty ... ok
[INFO] [stdout] test parser::tests::full_parse_extracts_thinking ... ok
[INFO] [stdout] test search::tests::index_drops_short_query_terms_silently ... ok
[INFO] [stdout] test pty::tests::env_allowlist_contains_minimum_set ... ok
[INFO] [stdout] test parser::tests::meta_skips_meta_user_messages ... ok
[INFO] [stdout] test scanner::tests::resolves_cwd_from_session_record ... ok
[INFO] [stdout] test scanner::tests::skips_non_jsonl_files_and_subdirs ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 77 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.23s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/main.rs (/opt/rustwide/target/debug/deps/cchats-3dcd505b49abbdc6)
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stderr]      Running tests/http_integration.rs (/opt/rustwide/target/debug/deps/http_integration-fb5617d443f03349)
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 26 tests
[INFO] [stdout] test api_stats_rejects_non_loopback_host ... ok
[INFO] [stdout] test get_search_clamps_limit_max_actually_caps_results ... ok
[INFO] [stdout] test api_accepts_loopback_host_with_loopback_origin ... ok
[INFO] [stdout] test list_projects_returns_correct_shape ... ok
[INFO] [stdout] test get_search_no_q_param_returns_empty_array ... ok
[INFO] [stdout] test get_stats_returns_populated_index_shape ... ok
[INFO] [stdout] test get_search_quoted_phrase_is_anded_by_server_tokenize ... ok
[INFO] [stdout] test api_accepts_loopback_host_with_no_origin ... ok
[INFO] [stdout] test security_headers_are_set_on_every_response ... ok
[INFO] [stdout] test list_project_sessions_404_for_unknown_name ... ok
[INFO] [stdout] test api_search_rejects_non_loopback_host ... ok
[INFO] [stdout] test get_search_finds_term_inside_session_body ... ok
[INFO] [stdout] test ws_resume_rejects_cross_origin_with_403 ... ok
[INFO] [stdout] test static_known_vendor_asset_served ... ok
[INFO] [stdout] test get_search_clamps_limit_zero_to_min ... ok
[INFO] [stdout] test get_search_empty_query_returns_empty ... ok
[INFO] [stdout] test root_serves_index_html ... ok
[INFO] [stdout] test post_reindex_returns_fresh_stats_with_scanning_false ... ok
[INFO] [stdout] test ws_resume_rejects_missing_origin_with_403 ... ok
[INFO] [stdout] test ws_resume_unknown_session_does_not_200 ... ok
[INFO] [stdout] test get_session_404_for_unknown_id ... ok
[INFO] [stdout] test ws_new_chat_unknown_project_does_not_200 ... ok
[INFO] [stdout] test list_project_sessions_200_for_known_name ... ok
[INFO] [stdout] test get_session_200_returns_typed_blocks ... ok
[INFO] [stdout] test static_unknown_path_404 ... ok
[INFO] [stderr]      Running tests/js_search.rs (/opt/rustwide/target/debug/deps/js_search-fff5d0f41fe8af3f)
[INFO] [stdout] test api_rejects_external_origin_even_when_host_is_loopback ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 26 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 1 test
[INFO] [stdout] TAP version 13
[INFO] [stdout] # Subtest: tokenize splits by whitespace
[INFO] [stdout] ok 1 - tokenize splits by whitespace
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 7.10006
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: tokenize keeps quoted strings as one token
[INFO] [stdout] ok 2 - tokenize keeps quoted strings as one token
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.57306
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: tokenize collapses runs of whitespace
[INFO] [stdout] ok 3 - tokenize collapses runs of whitespace
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.31936
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: tokenize trims leading and trailing whitespace
[INFO] [stdout] ok 4 - tokenize trims leading and trailing whitespace
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.27632
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: tokenize returns empty array for empty / blank input
[INFO] [stdout] ok 5 - tokenize returns empty array for empty / blank input
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.24658
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: tokenize treats unterminated quote as a single trailing token
[INFO] [stdout] ok 6 - tokenize treats unterminated quote as a single trailing token
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 1.32734
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: tokenize keeps colon-form operators intact
[INFO] [stdout] ok 7 - tokenize keeps colon-form operators intact
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.2531
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: tokenize allows quotes inside an operator value
[INFO] [stdout] ok 8 - tokenize allows quotes inside an operator value
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.29047
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: empty input returns empty defaults
[INFO] [stdout] ok 9 - parseQuery: empty input returns empty defaults
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 2.66018
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: plain term goes to terms, lowercased
[INFO] [stdout] ok 10 - parseQuery: plain term goes to terms, lowercased
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.65602
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: multiple plain terms preserved (AND set)
[INFO] [stdout] ok 11 - parseQuery: multiple plain terms preserved (AND set)
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.32163
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: project: operator captured
[INFO] [stdout] ok 12 - parseQuery: project: operator captured
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.29603
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: model: and has: operators captured
[INFO] [stdout] ok 13 - parseQuery: model: and has: operators captured
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.4015
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: before: parses ISO date
[INFO] [stdout] ok 14 - parseQuery: before: parses ISO date
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.56866
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: after: parses ISO date
[INFO] [stdout] ok 15 - parseQuery: after: parses ISO date
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.29563
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: mixed terms and operators
[INFO] [stdout] ok 16 - parseQuery: mixed terms and operators
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.40153
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: invalid date falls through to a term
[INFO] [stdout] ok 17 - parseQuery: invalid date falls through to a term
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.46944
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: unknown operator stays as a plain term
[INFO] [stdout] ok 18 - parseQuery: unknown operator stays as a plain term
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.639849
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: repeated same operator accumulates
[INFO] [stdout] ok 19 - parseQuery: repeated same operator accumulates
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.29666
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: quoted operator value preserves spaces
[INFO] [stdout] ok 20 - parseQuery: quoted operator value preserves spaces
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.408019
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: leading-colon token treated as term
[INFO] [stdout] ok 21 - parseQuery: leading-colon token treated as term
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.22156
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: parseQuery: operator with empty value falls through to term
[INFO] [stdout] ok 22 - parseQuery: operator with empty value falls through to term
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.20654
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: empty query matches anything
[INFO] [stdout] ok 23 - matches: empty query matches anything
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.54684
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: term in title (case-insensitive)
[INFO] [stdout] ok 24 - matches: term in title (case-insensitive)
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.26446
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: term in snippet, id, cwd, model
[INFO] [stdout] ok 25 - matches: term in snippet, id, cwd, model
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.27038
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: term in project display_path or sanitized_name
[INFO] [stdout] ok 26 - matches: term in project display_path or sanitized_name
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.22329
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: multi-term AND across fields
[INFO] [stdout] ok 27 - matches: multi-term AND across fields
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.21552
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: project: operator
[INFO] [stdout] ok 28 - matches: project: operator
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.28378
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: project: OR within same operator
[INFO] [stdout] ok 29 - matches: project: OR within same operator
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.19392
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: model: operator
[INFO] [stdout] ok 30 - matches: model: operator
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.62979
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: has:tool
[INFO] [stdout] ok 31 - matches: has:tool
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.32082
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: has:cache
[INFO] [stdout] ok 32 - matches: has:cache
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 2.37712
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: has:model
[INFO] [stdout] ok 33 - matches: has:model
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.37967
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: has: AND across different flags
[INFO] [stdout] ok 34 - matches: has: AND across different flags
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.30285
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: unknown has-flag is permissive (does not filter)
[INFO] [stdout] ok 35 - matches: unknown has-flag is permissive (does not filter)
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.21463
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: before: filters by last_at
[INFO] [stdout] ok 36 - matches: before: filters by last_at
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.3267
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: after: filters by last_at
[INFO] [stdout] ok 37 - matches: after: filters by last_at
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 3.176299
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: session without last_at fails any date filter
[INFO] [stdout] ok 38 - matches: session without last_at fails any date filter
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.3668
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: AND across different operators
[INFO] [stdout] ok 39 - matches: AND across different operators
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.32846
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: matches: graceful on missing fields
[INFO] [stdout] ok 40 - matches: graceful on missing fields
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.22635
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlight: empty text returns empty string
[INFO] [stdout] ok 41 - highlight: empty text returns empty string
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.32509
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlight: empty terms returns escaped text
[INFO] [stdout] ok 42 - highlight: empty terms returns escaped text
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 1.52467
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlight: wraps single term
[INFO] [stdout] ok 43 - highlight: wraps single term
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.53444
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlight: case-insensitive but preserves original case
[INFO] [stdout] ok 44 - highlight: case-insensitive but preserves original case
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.44382
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlight: wraps multiple terms
[INFO] [stdout] ok 45 - highlight: wraps multiple terms
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.45153
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlight: escapes HTML in non-matched parts
[INFO] [stdout] ok 46 - highlight: escapes HTML in non-matched parts
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.36849
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlight: escapes HTML in the matched span
[INFO] [stdout] ok 47 - highlight: escapes HTML in the matched span
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.31726
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlight: treats regex meta-chars as literal
[INFO] [stdout] ok 48 - highlight: treats regex meta-chars as literal
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.36992
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlight: no match returns escaped text untouched
[INFO] [stdout] ok 49 - highlight: no match returns escaped text untouched
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.35534
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlight: supports Unicode terms
[INFO] [stdout] ok 50 - highlight: supports Unicode terms
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.44137
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlight: ignores empty strings in terms list
[INFO] [stdout] ok 51 - highlight: ignores empty strings in terms list
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.20082
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlight: handles overlapping terms without infinite loop
[INFO] [stdout] ok 52 - highlight: handles overlapping terms without infinite loop
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.53177
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlightSegments: empty text returns a single empty segment
[INFO] [stdout] ok 53 - highlightSegments: empty text returns a single empty segment
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.27051
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlightSegments: no terms yields single non-match segment
[INFO] [stdout] ok 54 - highlightSegments: no terms yields single non-match segment
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.19214
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlightSegments: single match in middle
[INFO] [stdout] ok 55 - highlightSegments: single match in middle
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.41398
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlightSegments: match at start and end
[INFO] [stdout] ok 56 - highlightSegments: match at start and end
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.340871
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlightSegments: case-insensitive but preserves original case
[INFO] [stdout] ok 57 - highlightSegments: case-insensitive but preserves original case
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.50422
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlightSegments: regex meta-chars treated literally
[INFO] [stdout] ok 58 - highlightSegments: regex meta-chars treated literally
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.24274
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: highlightSegments: Unicode terms
[INFO] [stdout] ok 59 - highlightSegments: Unicode terms
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.21344
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: segmentsFromRanges: empty ranges yield single segment
[INFO] [stdout] ok 60 - segmentsFromRanges: empty ranges yield single segment
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.459609
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: segmentsFromRanges: one range in middle
[INFO] [stdout] ok 61 - segmentsFromRanges: one range in middle
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.32338
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: segmentsFromRanges: multiple non-overlapping ranges
[INFO] [stdout] ok 62 - segmentsFromRanges: multiple non-overlapping ranges
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.28828
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: segmentsFromRanges: handles char offsets, not byte offsets
[INFO] [stdout] ok 63 - segmentsFromRanges: handles char offsets, not byte offsets
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.25884
[INFO] [stdout]   ...
[INFO] [stdout] # Subtest: segmentsFromRanges: clamps and skips out-of-range entries
[INFO] [stdout] ok 64 - segmentsFromRanges: clamps and skips out-of-range entries
[INFO] [stdout]   ---
[INFO] [stdout]   duration_ms: 0.25817
[INFO] [stdout]   ...
[INFO] [stdout] 1..64
[INFO] [stdout] # tests 64
[INFO] [stdout] # suites 0
[INFO] [stdout] # pass 64
[INFO] [stdout] # fail 0
[INFO] [stdout] # cancelled 0
[INFO] [stdout] # skipped 0
[INFO] [stdout] # todo 0
[INFO] [stdout] # duration_ms 668.556083
[INFO] [stderr]    Doc-tests constellation
[INFO] [stdout] test js_search_tests_pass ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.20s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] running `Command { std: "docker" "inspect" "29e62878d720f8e6239f0e43b1c6306dda80b535dbcc2fb2052cda95928de3d4", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "29e62878d720f8e6239f0e43b1c6306dda80b535dbcc2fb2052cda95928de3d4", kill_on_drop: false }`
[INFO] [stdout] 29e62878d720f8e6239f0e43b1c6306dda80b535dbcc2fb2052cda95928de3d4
