[INFO] cloning repository https://github.com/witlox/kith
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/witlox/kith" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fwitlox%2Fkith", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fwitlox%2Fkith'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] c3a1e1b28f8e7a4db2ac50620b102ddc3d35a8ee
[INFO] testing witlox/kith against master#ec6f9a5b4413f74386267ef8efc93712c2ce6db6 for pr-155739
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fwitlox%2Fkith" "/workspace/builds/worker-2-tc1/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-2-tc1/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/witlox/kith
[INFO] finished tweaking git repo https://github.com/witlox/kith
[INFO] tweaked toml for git repo https://github.com/witlox/kith written to /workspace/builds/worker-2-tc1/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/witlox/kith on toolchain ec6f9a5b4413f74386267ef8efc93712c2ce6db6
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+ec6f9a5b4413f74386267ef8efc93712c2ce6db6" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/witlox/kith 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" "+ec6f9a5b4413f74386267ef8efc93712c2ce6db6" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Updating crates.io index
[INFO] [stderr]  Downloading crates ...
[INFO] [stderr]   Downloaded docker_credential v1.3.2
[INFO] [stderr]   Downloaded tonic v0.13.1
[INFO] [stderr]   Downloaded uuid v1.22.0
[INFO] [stderr]   Downloaded iri-string v0.7.11
[INFO] [stderr]   Downloaded tonic-build v0.13.1
[INFO] [stderr]   Downloaded nostr-sdk v0.44.1
[INFO] [stderr]   Downloaded nostr-database v0.44.0
[INFO] [stderr]   Downloaded nostr-relay-pool v0.44.0
[INFO] [stderr]   Downloaded negentropy v0.5.0
[INFO] [stderr]   Downloaded nostr v0.44.2
[INFO] [stderr]   Downloaded bech32 v0.11.1
[INFO] [stderr]   Downloaded atomic-destructor v0.3.0
[INFO] [stderr]   Downloaded async-utility v0.3.1
[INFO] [stderr]   Downloaded tokio-socks v0.5.2
[INFO] [stderr]   Downloaded nostr-gossip v0.44.0
[INFO] [stderr]   Downloaded bip39 v2.2.2
[INFO] [stderr]   Downloaded async-wsocket v0.13.2
[INFO] [stderr]   Downloaded defguard_wireguard_rs v0.9.4
[INFO] [stderr]   Downloaded netlink-packet-utils v0.6.0
[INFO] [stderr]   Downloaded widestring v0.4.3
[INFO] [stderr]   Downloaded netlink-packet-wireguard v0.3.0
[INFO] [stderr]   Downloaded uniffi_internal_macros v0.31.0
[INFO] [stderr]   Downloaded uniffi_macros v0.31.0
[INFO] [stderr]   Downloaded toml_writer v1.1.0+spec-1.1.0
[INFO] [stderr]   Downloaded serde_spanned v1.1.0
[INFO] [stderr]   Downloaded uniffi_pipeline v0.31.0
[INFO] [stderr]   Downloaded uniffi_build v0.31.0
[INFO] [stderr]   Downloaded uniffi_meta v0.31.0
[INFO] [stderr]   Downloaded netlink-packet-generic v0.4.0
[INFO] [stderr]   Downloaded smawk v0.3.2
[INFO] [stderr]   Downloaded scroll_derive v0.12.1
[INFO] [stderr]   Downloaded terminal_size v0.4.3
[INFO] [stderr]   Downloaded scroll v0.12.0
[INFO] [stderr]   Downloaded smart-default v0.7.1
[INFO] [stderr]   Downloaded uniffi v0.31.0
[INFO] [stderr]   Downloaded uniffi_udl v0.31.0
[INFO] [stderr]   Downloaded weedle2 v5.0.0
[INFO] [stderr]   Downloaded askama v0.14.0
[INFO] [stderr]   Downloaded ip_network_table v0.2.0
[INFO] [stderr]   Downloaded sealed v0.5.0
[INFO] [stderr]   Downloaded toml_parser v1.1.0+spec-1.1.0
[INFO] [stderr]   Downloaded fs-err v2.11.0
[INFO] [stderr]   Downloaded uniffi_core v0.31.0
[INFO] [stderr]   Downloaded askama_derive v0.14.0
[INFO] [stderr]   Downloaded askama_parser v0.14.0
[INFO] [stderr]   Downloaded ip_network_table-deps-treebitmap v0.5.0
[INFO] [stderr]   Downloaded peg v0.6.3
[INFO] [stderr]   Downloaded peg-macros v0.6.3
[INFO] [stderr]   Downloaded defguard_boringtun v0.6.5
[INFO] [stderr]   Downloaded typed-builder v0.15.2
[INFO] [stderr]   Downloaded typed-builder-macro v0.15.2
[INFO] [stderr]   Downloaded gherkin v0.14.0
[INFO] [stderr]   Downloaded cucumber-expressions v0.3.0
[INFO] [stderr]   Downloaded synthez-core v0.3.1
[INFO] [stderr]   Downloaded winnow v1.0.0
[INFO] [stderr]   Downloaded cucumber v0.21.1
[INFO] [stderr]   Downloaded peg-runtime v0.6.3
[INFO] [stderr]   Downloaded cucumber-codegen v0.21.1
[INFO] [stderr]   Downloaded synthez v0.3.1
[INFO] [stderr]   Downloaded synthez-codegen v0.3.1
[INFO] [stderr]   Downloaded uniffi_bindgen v0.31.0
[INFO] [stderr]   Downloaded goblin v0.8.2
[INFO] [stderr]   Downloaded nom_locate v4.2.0
[INFO] [stderr]   Downloaded wireguard-nt v0.5.0
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+ec6f9a5b4413f74386267ef8efc93712c2ce6db6" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] 18064340f1c8879e073d71c585ee2f47f2cbd34cc30f2a68821c4376a52802f3
[INFO] running `Command { std: "docker" "start" "-a" "18064340f1c8879e073d71c585ee2f47f2cbd34cc30f2a68821c4376a52802f3", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "18064340f1c8879e073d71c585ee2f47f2cbd34cc30f2a68821c4376a52802f3", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "18064340f1c8879e073d71c585ee2f47f2cbd34cc30f2a68821c4376a52802f3", kill_on_drop: false }`
[INFO] [stdout] 18064340f1c8879e073d71c585ee2f47f2cbd34cc30f2a68821c4376a52802f3
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=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" "+ec6f9a5b4413f74386267ef8efc93712c2ce6db6" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] ce39b6643ce18518f908f9eae2c0fc88f38699a40085de857c57527ae68dd30f
[INFO] running `Command { std: "docker" "start" "-a" "ce39b6643ce18518f908f9eae2c0fc88f38699a40085de857c57527ae68dd30f", kill_on_drop: false }`
[INFO] [stderr]    Compiling libc v0.2.183
[INFO] [stderr]    Compiling memchr v2.8.0
[INFO] [stderr]    Compiling cc v1.2.57
[INFO] [stderr]    Compiling zerocopy v0.8.47
[INFO] [stderr]    Compiling anyhow v1.0.102
[INFO] [stderr]    Compiling zerovec-derive v0.11.2
[INFO] [stderr]    Compiling itertools v0.13.0
[INFO] [stderr]    Compiling zerofrom-derive v0.1.6
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling yoke-derive v0.8.1
[INFO] [stderr]    Compiling regex-syntax v0.8.10
[INFO] [stderr]    Compiling curve25519-dalek v4.1.3
[INFO] [stderr]    Compiling rustix v1.1.4
[INFO] [stderr]    Compiling curve25519-dalek-derive v0.1.1
[INFO] [stderr]    Compiling signature v2.2.0
[INFO] [stderr]    Compiling prettyplease v0.2.37
[INFO] [stderr]    Compiling sha2 v0.10.9
[INFO] [stderr]    Compiling futures-util v0.3.32
[INFO] [stderr]    Compiling serde_spanned v0.6.9
[INFO] [stderr]    Compiling toml_datetime v0.6.11
[INFO] [stderr]    Compiling ed25519 v2.2.3
[INFO] [stderr]    Compiling serde_json v1.0.149
[INFO] [stderr]    Compiling fixedbitset v0.5.7
[INFO] [stderr]    Compiling aho-corasick v1.1.4
[INFO] [stderr]    Compiling getrandom v0.4.2
[INFO] [stderr]    Compiling toml_edit v0.22.27
[INFO] [stderr]    Compiling chrono v0.4.44
[INFO] [stderr]    Compiling prost-derive v0.13.5
[INFO] [stderr]    Compiling petgraph v0.7.1
[INFO] [stderr]    Compiling zerofrom v0.1.6
[INFO] [stderr]    Compiling multimap v0.10.1
[INFO] [stderr]    Compiling yoke v0.8.1
[INFO] [stderr]    Compiling openssl-sys v0.9.112
[INFO] [stderr]    Compiling libsqlite3-sys v0.30.1
[INFO] [stderr]    Compiling zerovec v0.11.5
[INFO] [stderr]    Compiling zerotrie v0.2.3
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling openssl v0.10.76
[INFO] [stderr]    Compiling native-tls v0.2.18
[INFO] [stderr]    Compiling tempfile v3.27.0
[INFO] [stderr]    Compiling tinystr v0.8.2
[INFO] [stderr]    Compiling icu_locale_core v2.1.1
[INFO] [stderr]    Compiling potential_utf v0.1.4
[INFO] [stderr]    Compiling icu_collections v2.1.1
[INFO] [stderr]    Compiling errno v0.3.14
[INFO] [stderr]    Compiling parking_lot_core v0.9.12
[INFO] [stderr]    Compiling signal-hook-registry v1.4.8
[INFO] [stderr]    Compiling socket2 v0.6.3
[INFO] [stderr]    Compiling mio v1.1.1
[INFO] [stderr]    Compiling parking_lot v0.12.5
[INFO] [stderr]    Compiling getrandom v0.2.17
[INFO] [stderr]    Compiling rand_core v0.6.4
[INFO] [stderr]    Compiling prost v0.13.5
[INFO] [stderr]    Compiling dirs-sys-next v0.1.2
[INFO] [stderr]    Compiling uuid v1.22.0
[INFO] [stderr]    Compiling tokio v1.50.0
[INFO] [stderr]    Compiling ppv-lite86 v0.2.21
[INFO] [stderr]    Compiling futures-executor v0.3.32
[INFO] [stderr]    Compiling icu_provider v2.1.1
[INFO] [stderr]    Compiling ahash v0.8.12
[INFO] [stderr]    Compiling prost-types v0.13.5
[INFO] [stderr]    Compiling dirs-next v2.0.0
[INFO] [stderr]    Compiling ed25519-dalek v2.2.0
[INFO] [stderr]    Compiling futures v0.3.32
[INFO] [stderr]    Compiling axum-core v0.5.6
[INFO] [stderr]    Compiling pin-project-internal v1.1.11
[INFO] [stderr]    Compiling nix v0.29.0
[INFO] [stderr]    Compiling icu_properties v2.1.2
[INFO] [stderr]    Compiling icu_normalizer v2.1.1
[INFO] [stderr]    Compiling hashbrown v0.14.5
[INFO] [stderr]    Compiling rand_chacha v0.3.1
[INFO] [stderr]    Compiling socket2 v0.5.10
[INFO] [stderr]    Compiling regex v1.12.3
[INFO] [stderr]    Compiling rand v0.8.5
[INFO] [stderr]    Compiling toml v0.8.23
[INFO] [stderr]    Compiling hashlink v0.9.1
[INFO] [stderr]    Compiling iri-string v0.7.11
[INFO] [stderr]    Compiling prost-build v0.13.5
[INFO] [stderr]    Compiling pin-project v1.1.11
[INFO] [stderr]    Compiling serde_urlencoded v0.7.1
[INFO] [stderr]    Compiling idna_adapter v1.2.1
[INFO] [stderr]    Compiling hostname v0.4.2
[INFO] [stderr]    Compiling idna v1.1.0
[INFO] [stderr]    Compiling unicode-width v0.2.2
[INFO] [stderr]    Compiling tonic-build v0.13.1
[INFO] [stderr]    Compiling url v2.5.8
[INFO] [stderr]    Compiling fd-lock v4.0.4
[INFO] [stderr]    Compiling kith-daemon v2026.1.0 (/opt/rustwide/workdir/crates/kith-daemon)
[INFO] [stderr]    Compiling matchers v0.2.0
[INFO] [stderr]    Compiling tracing-subscriber v0.3.23
[INFO] [stderr]    Compiling rustyline v15.0.0
[INFO] [stderr]    Compiling tokio-util v0.7.18
[INFO] [stderr]    Compiling kith-common v2026.1.0 (/opt/rustwide/workdir/crates/kith-common)
[INFO] [stderr]    Compiling tokio-stream v0.1.18
[INFO] [stderr]    Compiling tokio-native-tls v0.3.1
[INFO] [stderr]    Compiling h2 v0.4.13
[INFO] [stderr]    Compiling tower v0.5.3
[INFO] [stderr]    Compiling kith-mesh v2026.1.0 (/opt/rustwide/workdir/crates/kith-mesh)
[INFO] [stderr]    Compiling axum v0.8.8
[INFO] [stderr]    Compiling tower-http v0.6.8
[INFO] [stderr]    Compiling hyper v1.8.1
[INFO] [stderr]    Compiling rusqlite v0.32.1
[INFO] [stderr]    Compiling kith-sync v2026.1.0 (/opt/rustwide/workdir/crates/kith-sync)
[INFO] [stderr]    Compiling hyper-util v0.1.20
[INFO] [stderr]    Compiling hyper-timeout v0.5.2
[INFO] [stderr]    Compiling hyper-tls v0.6.0
[INFO] [stderr]    Compiling reqwest v0.12.28
[INFO] [stderr]    Compiling tonic v0.13.1
[INFO] [stderr]    Compiling kith-state v2026.1.0 (/opt/rustwide/workdir/crates/kith-state)
[INFO] [stderr]    Compiling kith-shell v2026.1.0 (/opt/rustwide/workdir/crates/kith-shell)
[INFO] [stderr]    Compiling kith-e2e v2026.1.0 (/opt/rustwide/workdir/crates/kith-e2e)
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 32s
[INFO] running `Command { std: "docker" "inspect" "ce39b6643ce18518f908f9eae2c0fc88f38699a40085de857c57527ae68dd30f", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "ce39b6643ce18518f908f9eae2c0fc88f38699a40085de857c57527ae68dd30f", kill_on_drop: false }`
[INFO] [stdout] ce39b6643ce18518f908f9eae2c0fc88f38699a40085de857c57527ae68dd30f
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=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" "+ec6f9a5b4413f74386267ef8efc93712c2ce6db6" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 813f990b1609642c880eb8ba093212fe43e2ba3f9802c76b2595f9dbebe15071
[INFO] running `Command { std: "docker" "start" "-a" "813f990b1609642c880eb8ba093212fe43e2ba3f9802c76b2595f9dbebe15071", kill_on_drop: false }`
[INFO] [stderr]    Compiling either v1.15.0
[INFO] [stderr]    Compiling anyhow v1.0.102
[INFO] [stderr]    Compiling regex v1.12.3
[INFO] [stderr]    Compiling bytecount v0.6.9
[INFO] [stderr]    Compiling derive_more v0.99.20
[INFO] [stderr]    Compiling bstr v1.12.1
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling sealed v0.5.0
[INFO] [stderr]    Compiling nom v7.1.3
[INFO] [stderr]    Compiling regex-syntax v0.7.5
[INFO] [stderr]    Compiling serde_json v1.0.149
[INFO] [stderr]    Compiling peg-runtime v0.6.3
[INFO] [stderr]    Compiling crossbeam-deque v0.8.6
[INFO] [stderr]    Compiling terminal_size v0.4.3
[INFO] [stderr]    Compiling typed-builder-macro v0.15.2
[INFO] [stderr]    Compiling itertools v0.13.0
[INFO] [stderr]    Compiling thiserror-impl v1.0.69
[INFO] [stderr]    Compiling unicode-linebreak v0.1.5
[INFO] [stderr]    Compiling synthez-core v0.3.1
[INFO] [stderr]    Compiling peg-macros v0.6.3
[INFO] [stderr]    Compiling smawk v0.3.2
[INFO] [stderr]    Compiling clap_builder v4.6.0
[INFO] [stderr]    Compiling lazy-regex-proc_macros v3.6.0
[INFO] [stderr]    Compiling textwrap v0.16.2
[INFO] [stderr]    Compiling clap_derive v4.6.0
[INFO] [stderr]    Compiling globset v0.4.18
[INFO] [stderr]    Compiling inflections v1.1.1
[INFO] [stderr]    Compiling console v0.15.11
[INFO] [stderr]    Compiling smart-default v0.7.1
[INFO] [stderr]    Compiling typed-builder v0.15.2
[INFO] [stderr]    Compiling lazy-regex v3.6.0
[INFO] [stderr]    Compiling linked-hash-map v0.5.6
[INFO] [stderr]    Compiling synthez-codegen v0.3.1
[INFO] [stderr]    Compiling ignore v0.4.25
[INFO] [stderr]    Compiling humantime v2.3.0
[INFO] [stderr]    Compiling inventory v0.3.22
[INFO] [stderr]    Compiling synthez v0.3.1
[INFO] [stderr]    Compiling drain_filter_polyfill v0.1.3
[INFO] [stderr]    Compiling kith-state v2026.1.0 (/opt/rustwide/workdir/crates/kith-state)
[INFO] [stderr]    Compiling kith-sync v2026.1.0 (/opt/rustwide/workdir/crates/kith-sync)
[INFO] [stderr]    Compiling nom_locate v4.2.0
[INFO] [stderr]    Compiling thiserror v1.0.69
[INFO] [stderr]    Compiling peg v0.6.3
[INFO] [stderr]    Compiling gherkin v0.14.0
[INFO] [stderr]    Compiling kith-mesh v2026.1.0 (/opt/rustwide/workdir/crates/kith-mesh)
[INFO] [stderr]    Compiling kith-common v2026.1.0 (/opt/rustwide/workdir/crates/kith-common)
[INFO] [stderr]    Compiling cucumber-expressions v0.3.0
[INFO] [stderr]    Compiling prost-derive v0.13.5
[INFO] [stderr]    Compiling globwalk v0.9.1
[INFO] [stderr]    Compiling clap v4.6.0
[INFO] [stderr]    Compiling cucumber-codegen v0.21.1
[INFO] [stderr]    Compiling prost v0.13.5
[INFO] [stderr]    Compiling cucumber v0.21.1
[INFO] [stderr]    Compiling tonic v0.13.1
[INFO] [stderr]    Compiling prost-types v0.13.5
[INFO] [stderr]    Compiling prost-build v0.13.5
[INFO] [stderr]    Compiling tonic-build v0.13.1
[INFO] [stderr]    Compiling kith-daemon v2026.1.0 (/opt/rustwide/workdir/crates/kith-daemon)
[INFO] [stderr]    Compiling kith-shell v2026.1.0 (/opt/rustwide/workdir/crates/kith-shell)
[INFO] [stderr]    Compiling kith-e2e v2026.1.0 (/opt/rustwide/workdir/crates/kith-e2e)
[INFO] [stderr]    Compiling kith-acceptance v2026.1.0 (/opt/rustwide/workdir/crates/kith-acceptance)
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 1m 09s
[INFO] running `Command { std: "docker" "inspect" "813f990b1609642c880eb8ba093212fe43e2ba3f9802c76b2595f9dbebe15071", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "813f990b1609642c880eb8ba093212fe43e2ba3f9802c76b2595f9dbebe15071", kill_on_drop: false }`
[INFO] [stdout] 813f990b1609642c880eb8ba093212fe43e2ba3f9802c76b2595f9dbebe15071
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=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" "+ec6f9a5b4413f74386267ef8efc93712c2ce6db6" "test" "--frozen", kill_on_drop: false }`
[INFO] [stdout] dde3f1fdaaeb845cc752aa6b916a29667e042b8a3e0d8964a2edb6c93e6abe29
[INFO] running `Command { std: "docker" "start" "-a" "dde3f1fdaaeb845cc752aa6b916a29667e042b8a3e0d8964a2edb6c93e6abe29", kill_on_drop: false }`
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.72s
[INFO] [stderr]      Running tests/acceptance.rs (/opt/rustwide/target/debug/deps/acceptance-3ab6fe1c20d2df78)
[INFO] [stdout] Feature: Commit windows and transactional changes
[INFO] [stdout]   Scenario: Local file change with commit
[INFO] [stdout]    ✔  Given kith shell is running
[INFO] [stdout]    ✔  And the commit window is set to 10 minutes
[INFO] [stdout]    ✔  When the agent edits "/etc/nginx/conf.d/api.conf"
[INFO] [stdout]    ✔  Then the change is applied via overlayfs overlay
[INFO] [stdout]    ✔  And the change is marked "pending" with a 10-minute window
[INFO] [stdout]    ✔  And the user is shown the diff
[INFO] [stdout]    ✔  When the user types "commit"
[INFO] [stdout]    ✔  Then the overlay is merged to the base filesystem
[INFO] [stdout]    ✔  And an audit entry records the commit
[INFO] [stdout]   Scenario: Commit window expires — auto-rollback
[INFO] [stdout]    ✔  Given a pending change exists with a 10-minute window
[INFO] [stdout]    ✔  When 10 minutes pass without a commit
[INFO] [stdout]    ✔  Then the overlay is discarded and the file reverts
[INFO] [stdout]    ✔  And an audit entry records the auto-rollback
[INFO] [stdout]    ✔  And the user is notified "pending change expired — rolled back"
[INFO] [stdout]   Scenario: Explicit rollback
[INFO] [stdout]    ✔  Given a pending change exists
[INFO] [stdout]    ✔  When the user types "rollback"
[INFO] [stdout]    ✔  Then the overlay is discarded and the file reverts
[INFO] [stdout]   Scenario: Remote change with commit window
[INFO] [stdout]    ✔  Given "staging-1" is a mesh member
[INFO] [stdout]    ✔  When the agent calls apply("staging-1", "docker compose up -d")
[INFO] [stdout]    ✔  Then the change executes on "staging-1" with a commit window
[INFO] [stdout]    ✔  When the user types "commit"
[INFO] [stdout]    ✔  Then the change is finalized on "staging-1"
[INFO] [stdout]   Scenario: Multiple pending changes committed atomically
[INFO] [stdout]    ✔  Given pending changes exist for "file-a.py" and "file-b.py"
[INFO] [stdout]    ✔  When the user types "commit"
[INFO] [stdout]    ✔  Then both are committed atomically
[INFO] [stdout]   Scenario: Local file change on macOS uses copy-based snapshot
[INFO] [stdout]    ✔  Given kith shell is running on macOS
[INFO] [stdout]    ✔  And overlayfs is not available
[INFO] [stdout]    ✔  When the agent edits "/Users/pim/project/config.toml"
[INFO] [stdout]    ✔  Then the original is copied to ".kith-backup/config.toml"
[INFO] [stdout]    ✔  And the edit is applied to the original file
[INFO] [stdout]    ✔  And the change is marked "pending"
[INFO] [stdout]    ✔  When the user types "rollback"
[INFO] [stdout]    ✔  Then the backup is restored to the original path
[INFO] [stdout]    ✔  And the backup is removed
[INFO] [stdout]   Scenario: macOS commit removes backup
[INFO] [stdout]    ✔  Given a pending change on macOS with a copy-based snapshot
[INFO] [stdout]    ✔  When the user types "commit"
[INFO] [stdout]    ✔  Then the backup is removed
[INFO] [stdout]    ✔  And the edited file remains in place
[INFO] [stdout] Feature: Drift detection
[INFO] [stdout]   Scenario: File change detected as drift
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a declared state from its last commit
[INFO] [stdout]    ✔  When the file "/etc/nginx/conf.d/api.conf" is modified outside kith
[INFO] [stdout]    ✔  Then kith-daemon detects drift in the "files" category
[INFO] [stdout]    ✔  And a drift event is written to the local cr-sqlite store
[INFO] [stdout]    ✔  And the drift event includes the path "/etc/nginx/conf.d/api.conf"
[INFO] [stdout]    ✔  And the drift event includes a timestamp
[INFO] [stdout]   Scenario: Service state change detected as drift
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a declared state from its last commit
[INFO] [stdout]    ✔  Given the declared state expects "postgres" to be running
[INFO] [stdout]    ✔  When "postgres" stops unexpectedly
[INFO] [stdout]    ✔  Then kith-daemon detects drift in the "services" category
[INFO] [stdout]    ✔  And the drift magnitude increases
[INFO] [stdout]   Scenario: Network change detected as drift
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a declared state from its last commit
[INFO] [stdout]    ✔  Given the declared state expects port 8080 to be listening
[INFO] [stdout]    ✔  When port 8080 is no longer listening
[INFO] [stdout]    ✔  Then kith-daemon detects drift in the "network" category
[INFO] [stdout]   Scenario: Package change detected as drift
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a declared state from its last commit
[INFO] [stdout]    ✔  When a package is installed or removed outside kith
[INFO] [stdout]    ✔  Then kith-daemon detects drift in the "packages" category
[INFO] [stdout]   Scenario: Blacklisted paths are excluded from drift
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a declared state from its last commit
[INFO] [stdout]    ✔  Given the blacklist includes "/tmp/**" and "/var/log/**"
[INFO] [stdout]    ✔  When a file is modified at "/tmp/scratch/output.txt"
[INFO] [stdout]    ✔  Then no drift event is generated
[INFO] [stdout]   Scenario: Drift magnitude is computed from weighted categories
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a declared state from its last commit
[INFO] [stdout]    ✔  Given drift weights are configured as files=1.0, services=2.0, network=1.5, packages=1.0
[INFO] [stdout]    ✔  And 2 file changes and 1 service change have been detected
[INFO] [stdout]    ✔  Then the squared drift magnitude is 8.0
[INFO] [stdout]    ✔  And the drift vector shows files=2.0, services=1.0, network=0.0, packages=0.0
[INFO] [stdout]   Scenario: Drift resets after commit
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a declared state from its last commit
[INFO] [stdout]    ✔  Given drift has been detected on "staging-1"
[INFO] [stdout]    ✔  When the user commits the current state
[INFO] [stdout]    ✔  Then the drift vector resets to zero
[INFO] [stdout]    ✔  And an audit entry records the commit
[INFO] [stdout]   Scenario: Drift is surfaced to the agent via fleet query
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a declared state from its last commit
[INFO] [stdout]    ✔  Given "staging-1" has drift magnitude 3.5
[INFO] [stdout]    ✔  When the agent on "dev-mac" calls fleet_query("what's the state of things?")
[INFO] [stdout]    ✔  Then the response includes "staging-1" with drift magnitude 3.5
[INFO] [stdout]    ✔  And the response includes which categories have drifted
[INFO] [stdout]   Scenario: Drift during mesh partition
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a declared state from its last commit
[INFO] [stdout]    ✔  Given "staging-1" is partitioned from the mesh
[INFO] [stdout]    ✔  And drift accumulates on "staging-1"
[INFO] [stdout]    ✔  When connectivity is restored
[INFO] [stdout]    ✔  Then all drift events sync to peers via cr-sqlite
[INFO] [stdout]    ✔  And peers see the full drift history with timestamps
[INFO] [stdout]   Scenario: Drift event carries enough context for the agent to reason
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a declared state from its last commit
[INFO] [stdout]    ✔  When kith-daemon detects a file change at "/etc/nginx/conf.d/api.conf"
[INFO] [stdout]    ✔  Then the drift event metadata includes the category "files"
[INFO] [stdout]    ✔  And the drift event metadata includes the path
[INFO] [stdout]    ✔  And the drift event metadata includes the timestamp
[INFO] [stdout]    ✔  And the drift event metadata includes the machine hostname "staging-1"
[INFO] [stdout]    ✔  And the agent can retrieve this event via retrieve("nginx config change on staging")
[INFO] [stdout] Feature: InferenceBackend abstraction
[INFO] [stdout]   Scenario: Agent uses a hosted API backend
[INFO] [stdout]    ✔  Given kith shell is configured with backend "anthropic/claude-sonnet"
[INFO] [stdout]    ✔  And the Anthropic API is reachable
[INFO] [stdout]    ✔  When the user types an intent
[INFO] [stdout]    ✔  Then kith shell calls InferenceBackend with the input and available tools
[INFO] [stdout]    ✔  And the backend streams a response with tool calls
[INFO] [stdout]    ✔  And tool calls execute via the normal dispatch path
[INFO] [stdout]   Scenario: Agent uses a self-hosted backend
[INFO] [stdout]    ✔  Given kith shell is configured with backend "openai-compatible/self-hosted"
[INFO] [stdout]    ✔  And the endpoint is "http://gpu-server:8000/v1"
[INFO] [stdout]    ✔  When the user types an intent
[INFO] [stdout]    ✔  Then kith shell calls the same InferenceBackend trait
[INFO] [stdout]    ✔  And the backend streams a response from the self-hosted model
[INFO] [stdout]    ✔  And the rest of the system behaves identically
[INFO] [stdout]   Scenario: Model swap is a config change
[INFO] [stdout]    ✔  Given kith shell is running with backend "anthropic/claude-sonnet"
[INFO] [stdout]    ✔  When the config is changed to "openai-compatible/self-hosted-model"
[INFO] [stdout]    ✔  And kith shell is restarted
[INFO] [stdout]    ✔  Then the new backend is used for all inference
[INFO] [stdout]    ✔  And no other component (daemon, mesh, sync, state) is affected
[INFO] [stdout]   Scenario: InferenceBackend returns tool calls in a standard format
[INFO] [stdout]    ✔  Given any backend is configured
[INFO] [stdout]    ✔  When the model produces a tool call for remote("staging-1", "docker ps")
[INFO] [stdout]    ✔  Then the tool call is returned as a structured object with tool name and arguments
[INFO] [stdout]    ✔  And the dispatch layer handles it without knowing which model produced it
[INFO] [stdout]   Scenario: Streaming output reaches the user incrementally
[INFO] [stdout]    ✔  Given any backend is configured
[INFO] [stdout]    ✔  When the model generates a long response
[INFO] [stdout]    ✔  Then tokens stream to the terminal as they are produced
[INFO] [stdout]    ✔  And tool call boundaries are detected in the stream
[INFO] [stdout]   Scenario: Backend unavailable degrades to bash
[INFO] [stdout]    ✔  Given any backend is configured
[INFO] [stdout]    ✔  And the backend becomes unreachable (network failure, GPU busy)
[INFO] [stdout]    ✔  When the user types an intent
[INFO] [stdout]    ✔  Then kith shell shows "inference unavailable - pass-through mode"
[INFO] [stdout]    ✔  And the raw input is passed to bash
[INFO] [stdout]    ✔  And local operations continue normally
[INFO] [stdout]   Scenario: Backend returns malformed response
[INFO] [stdout]    ✔  Given any backend is configured
[INFO] [stdout]    ✔  When the backend returns an unparseable response
[INFO] [stdout]    ✔  Then kith shell logs the error
[INFO] [stdout]    ✔  And retries once
[INFO] [stdout]    ✔  And if retry fails, surfaces the error to the user
[INFO] [stdout]    ✔  And does not pass malformed data to tool dispatch
[INFO] [stdout]   Scenario: No model-specific logic outside InferenceBackend implementations
[INFO] [stdout]    ✔  Given the kith codebase
[INFO] [stdout]    ✔  Then no code in kith-daemon references any specific model or provider
[INFO] [stdout]    ✔  And no code in kith-mesh references any specific model or provider
[INFO] [stdout]    ✔  And no code in kith-sync references any specific model or provider
[INFO] [stdout]    ✔  And no code in kith-state references any specific model or provider
[INFO] [stdout]    ✔  And only kith-shell contains InferenceBackend implementations
[INFO] [stdout]   Scenario: System prompt is backend-appropriate
[INFO] [stdout]    ✔  Given backend "anthropic/claude-sonnet" is configured
[INFO] [stdout]    ✔  Then the system prompt may use backend-specific formatting hints
[INFO] [stdout]    ✔  When the backend is changed to "openai-compatible/self-hosted"
[INFO] [stdout]    ✔  Then the system prompt adjusts formatting for the new backend
[INFO] [stdout]    ✔  And the behavioral instructions remain identical
[INFO] [stdout]   Scenario: Thinking/reasoning content is handled gracefully
[INFO] [stdout]    ✔  Given a backend that produces reasoning traces (thinking tokens)
[INFO] [stdout]    ✔  When the model reasons before a tool call
[INFO] [stdout]    ✔  Then the reasoning is rendered in the terminal (collapsible)
[INFO] [stdout]    ✔  Given a backend that does not produce reasoning traces
[INFO] [stdout]    ✔  When the model makes a tool call
[INFO] [stdout]    ✔  Then the absence of reasoning is handled gracefully with no errors
[INFO] [stdout] Feature: Local command execution
[INFO] [stdout]   Scenario: Pass-through command executes with no LLM involvement
[INFO] [stdout]    ✔  Given kith shell is running
[INFO] [stdout]    ✔  When the user types "ls -la"
[INFO] [stdout]    ✔  Then the command executes directly via bash
[INFO] [stdout]    ✔  And the output appears within 5ms of a raw terminal
[INFO] [stdout]    ✔  And the ingest daemon captures the command and output
[INFO] [stdout]   Scenario: Escape hatch forces pass-through
[INFO] [stdout]    ✔  Given kith shell is running
[INFO] [stdout]    ✔  When the user types "run: rm -rf /tmp/test"
[INFO] [stdout]    ✔  Then the command "rm -rf /tmp/test" executes directly via bash
[INFO] [stdout]    ✔  And no InferenceBackend call is made
[INFO] [stdout]   Scenario: Classification — known command is pass-through
[INFO] [stdout]    ✔  Given kith shell is running
[INFO] [stdout]    ✔  And "git" is in the PATH
[INFO] [stdout]    ✔  When the user types "git push origin main"
[INFO] [stdout]    ✔  Then the command executes directly via bash
[INFO] [stdout]    ✔  And no InferenceBackend call is made
[INFO] [stdout]   Scenario: Classification — natural language is intent
[INFO] [stdout]    ✔  Given kith shell is running
[INFO] [stdout]    ✔  And the InferenceBackend is reachable
[INFO] [stdout]    ✔  When the user types "what's using port 3000?"
[INFO] [stdout]    ✔  Then kith shell routes the input to InferenceBackend
[INFO] [stdout]   Scenario: Classification rule — first token matched against PATH
[INFO] [stdout]    ✔  Given kith shell is running
[INFO] [stdout]    ✔  And "docker" is in the PATH
[INFO] [stdout]    ✔  When the user types "docker compose up -d"
[INFO] [stdout]    ✔  Then the command executes directly via bash
[INFO] [stdout]    ✔  When the user types "deploy the app to staging"
[INFO] [stdout]    ✔  Then kith shell routes the input to InferenceBackend
[INFO] [stdout]   Scenario: Intent is routed to the LLM
[INFO] [stdout]    ✔  Given kith shell is running
[INFO] [stdout]    ✔  And the InferenceBackend is reachable
[INFO] [stdout]    ✔  When the user types "find all Python files that import requests"
[INFO] [stdout]    ✔  Then kith shell calls InferenceBackend with the user's input and available tools
[INFO] [stdout]    ✔  And the model produces a tool call for bash execution
[INFO] [stdout]    ✔  And the command executes via PTY
[INFO] [stdout]    ✔  And the output is returned to the user
[INFO] [stdout]   Scenario: InferenceBackend unavailable degrades to bash
[INFO] [stdout]    ✔  Given kith shell is running
[INFO] [stdout]    ✔  And the InferenceBackend is unreachable
[INFO] [stdout]    ✔  When the user types "find all Python files that import requests"
[INFO] [stdout]    ✔  Then kith shell shows "inference unavailable — pass-through mode"
[INFO] [stdout]    ✔  And the raw input is passed to bash
[INFO] [stdout]   Scenario: Model swap does not affect local execution
[INFO] [stdout]    ✔  Given kith shell is running with backend "anthropic/claude-sonnet"
[INFO] [stdout]    ✔  And the user successfully executes an intent-based command
[INFO] [stdout]    ✔  When the backend is changed to "openai-compatible/self-hosted-model"
[INFO] [stdout]    ✔  And the user executes the same intent-based command
[INFO] [stdout]    ✔  Then the command succeeds with the new backend
[INFO] [stdout]    ✔  And no other component is aware of the backend change
[INFO] [stdout] Feature: Mesh networking
[INFO] [stdout]   Scenario: Two machines form a mesh
[INFO] [stdout]    ✔  Given "dev-mac" and "staging-1" run kith-daemons with the same mesh identifier
[INFO] [stdout]    ✔  When both publish WireGuard keys and endpoints to Nostr
[INFO] [stdout]    ✔  Then each discovers the other via Nostr subscription
[INFO] [stdout]    ✔  And a WireGuard tunnel is established
[INFO] [stdout]    ✔  And gRPC connectivity is verified
[INFO] [stdout]   Scenario: Machine changes network — re-signaling
[INFO] [stdout]    ✔  Given "dev-mac" and "staging-1" are connected
[INFO] [stdout]    ✔  When "dev-mac" moves to a new network
[INFO] [stdout]    ✔  Then "dev-mac" publishes an updated endpoint to Nostr
[INFO] [stdout]    ✔  And the tunnel re-establishes to the new endpoint
[INFO] [stdout]   Scenario: Nostr relays unavailable — cached endpoints
[INFO] [stdout]    ✔  Given all Nostr relays are unreachable
[INFO] [stdout]    ✔  And neither machine has changed network
[INFO] [stdout]    ✔  Then the existing WireGuard tunnel remains active
[INFO] [stdout]   Scenario: New machine joins
[INFO] [stdout]    ✔  Given "dev-mac" and "staging-1" are connected
[INFO] [stdout]    ✔  When "prod-1" starts with the same mesh identifier
[INFO] [stdout]    ✔  Then all three establish pairwise WireGuard tunnels
[INFO] [stdout]    ✔  And cr-sqlite sync begins between all three
[INFO] [stdout]   Scenario: Direct connection fails — relay fallback
[INFO] [stdout]    ✔  Given NAT hole-punching fails between two machines
[INFO] [stdout]    ✔  And a DERP relay is configured
[INFO] [stdout]    ✔  Then traffic routes through the relay
[INFO] [stdout]    ✔  And the connection remains end-to-end encrypted
[INFO] [stdout] Feature: Policy enforcement
[INFO] [stdout]   Scenario: Ops user can execute commands
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a policy configuration
[INFO] [stdout]    ✔  Given user "pim" has "ops" scope on "staging-1"
[INFO] [stdout]    ✔  When the agent sends an exec request for "docker ps" as "pim"
[INFO] [stdout]    ✔  Then kith-daemon allows the execution
[INFO] [stdout]    ✔  And an audit entry records the allowed exec
[INFO] [stdout]   Scenario: Viewer user can query state but not execute
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a policy configuration
[INFO] [stdout]    ✔  Given user "intern" has "viewer" scope on "staging-1"
[INFO] [stdout]    ✔  When the agent sends a query request as "intern"
[INFO] [stdout]    ✔  Then kith-daemon returns the machine state
[INFO] [stdout]    ✔  When the agent sends an exec request for "docker restart api" as "intern"
[INFO] [stdout]    ✔  Then kith-daemon rejects with "policy denied: viewer scope cannot execute commands"
[INFO] [stdout]    ✔  And an audit entry records the denial
[INFO] [stdout]   Scenario: Unauthenticated request is rejected
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a policy configuration
[INFO] [stdout]    ✔  When a request arrives without valid credentials
[INFO] [stdout]    ✔  Then kith-daemon rejects with "authentication required"
[INFO] [stdout]    ✔  And an audit entry records the rejection
[INFO] [stdout]   Scenario: Expired credentials are rejected
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a policy configuration
[INFO] [stdout]    ✔  Given user "pim" has expired credentials
[INFO] [stdout]    ✔  When the agent sends an exec request as "pim"
[INFO] [stdout]    ✔  Then kith-daemon rejects with "credentials expired"
[INFO] [stdout]   Scenario: Policy is enforced for state-changing operations
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a policy configuration
[INFO] [stdout]    ✔  Given user "pim" has "ops" scope on "staging-1"
[INFO] [stdout]    ✔  When the agent calls apply("staging-1", "systemctl restart nginx")
[INFO] [stdout]    ✔  Then kith-daemon checks "pim" has "ops" scope
[INFO] [stdout]    ✔  And the apply proceeds with a commit window
[INFO] [stdout]   Scenario: Policy is enforced independently of the model
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a policy configuration
[INFO] [stdout]    ✔  Given user "intern" has "viewer" scope on "staging-1"
[INFO] [stdout]    ✔  When the InferenceBackend produces a tool call for exec("staging-1", "rm -rf /data")
[INFO] [stdout]    ✔  Then kith-daemon rejects based on policy
[INFO] [stdout]    ✔  And the model's request is irrelevant to the policy decision
[INFO] [stdout]   Scenario: Different users have different scopes on the same machine
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a policy configuration
[INFO] [stdout]    ✔  Given user "pim" has "ops" scope on "staging-1"
[INFO] [stdout]    ✔  And user "intern" has "viewer" scope on "staging-1"
[INFO] [stdout]    ✔  When "pim" sends an exec request for "docker ps"
[INFO] [stdout]    ✔  Then it succeeds
[INFO] [stdout]    ✔  When "intern" sends an exec request for "docker ps"
[INFO] [stdout]    ✔  Then it is denied
[INFO] [stdout]   Scenario: Policy denial produces an audit entry
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a policy configuration
[INFO] [stdout]    ✔  Given any policy denial occurs
[INFO] [stdout]    ✔  Then the audit entry includes who requested, what was requested, which machine, and the denial reason
[INFO] [stdout]   Scenario: Policy configuration is per-machine
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a policy configuration
[INFO] [stdout]    ✔  Given user "pim" has "ops" scope on "staging-1"
[INFO] [stdout]    ✔  And user "pim" has "viewer" scope on "prod-1"
[INFO] [stdout]    ✔  When "pim" sends an exec request to "staging-1"
[INFO] [stdout]    ✔  Then it succeeds
[INFO] [stdout]    ✔  When "pim" sends an exec request to "prod-1"
[INFO] [stdout]    ✔  Then it is denied with "viewer scope cannot execute commands"
[INFO] [stdout]   Scenario: Scope determines what fleet_query reveals
[INFO] [stdout]    ✔> Given kith-daemon is running on "staging-1"
[INFO] [stdout]    ✔> And "staging-1" has a policy configuration
[INFO] [stdout]    ✔  Given user "intern" has "viewer" scope on "staging-1"
[INFO] [stdout]    ✔  And "staging-1" has events tagged with "ops" scope
[INFO] [stdout]    ✔  When "intern" calls fleet_query about "staging-1"
[INFO] [stdout]    ✔  Then metadata is returned but ops-scoped content is withheld
[INFO] [stdout]    ✔  And the response indicates restricted entries exist
[INFO] [stdout] Feature: Remote command execution
[INFO] [stdout]   Scenario: Agent executes a command on a remote machine
[INFO] [stdout]    ✔  Given kith shell is running on "dev-mac"
[INFO] [stdout]    ✔  And "staging-1" is a mesh member with a running kith-daemon
[INFO] [stdout]    ✔  And the user has "ops" scope on "staging-1"
[INFO] [stdout]    ✔  When the user types "check what's running on staging-1 port 8000"
[INFO] [stdout]    ✔  Then the agent calls remote("staging-1", "lsof -i :8000")
[INFO] [stdout]    ✔  And kith-daemon on "staging-1" authenticates the request
[INFO] [stdout]    ✔  And kith-daemon verifies "ops" scope permits "lsof"
[INFO] [stdout]    ✔  And the command output streams back to kith shell
[INFO] [stdout]    ✔  And an audit entry is written on "staging-1"
[INFO] [stdout]   Scenario: Policy denies a remote command
[INFO] [stdout]    ✔  Given the user has "viewer" scope on "prod-1"
[INFO] [stdout]    ✔  When the agent calls remote("prod-1", "systemctl restart nginx")
[INFO] [stdout]    ✔  Then kith-daemon on "prod-1" rejects with "policy denied: viewer scope cannot execute state-changing commands"
[INFO] [stdout]    ✔  And an audit entry records the denial
[INFO] [stdout]   Scenario: Remote machine is unreachable
[INFO] [stdout]    ✔  Given "staging-1" is not reachable via the mesh
[INFO] [stdout]    ✔  When the agent calls remote("staging-1", "docker ps")
[INFO] [stdout]    ✔  Then the tool returns "staging-1 unreachable"
[INFO] [stdout]   Scenario: Streaming output from long-running remote command
[INFO] [stdout]    ✔  Given "staging-1" is reachable
[INFO] [stdout]    ✔  When the agent calls remote("staging-1", "docker build -t myapp .")
[INFO] [stdout]    ✔  Then output streams back incrementally via gRPC streaming
[INFO] [stdout]    ✔  And the user sees real-time build progress
[INFO] [stdout] Feature: Distributed state sync and context retrieval
[INFO] [stdout]   Scenario: Local event syncs to peer
[INFO] [stdout]    ✔  Given "dev-mac" and "staging-1" have active sync
[INFO] [stdout]    ✔  When a command executes on "dev-mac" and is ingested
[INFO] [stdout]    ✔  Then within 5 seconds the event appears in cr-sqlite on "staging-1"
[INFO] [stdout]   Scenario: Agent retrieves cross-machine context
[INFO] [stdout]    ✔  Given "staging-1" had a deployment failure logged 2 hours ago
[INFO] [stdout]    ✔  And the event is synced and embedded on "dev-mac"
[INFO] [stdout]    ✔  When the user on "dev-mac" types "why is staging broken?"
[INFO] [stdout]    ✔  Then retrieve() returns the failure event from "staging-1"
[INFO] [stdout]   Scenario: Fleet query returns structured state
[INFO] [stdout]    ✔  Given three machines are in the mesh
[INFO] [stdout]    ✔  When the agent calls fleet_query("what machines are in the mesh?")
[INFO] [stdout]    ✔  Then it receives each machine's hostname, capabilities, and last-sync timestamp
[INFO] [stdout]   Scenario: Partition and recovery
[INFO] [stdout]    ✔  Given "dev-mac" and "staging-1" lose connectivity
[INFO] [stdout]    ✔  And events accumulate independently on both
[INFO] [stdout]    ✔  When connectivity is restored
[INFO] [stdout]    ✔  Then cr-sqlite merges all events on both machines with no data loss
[INFO] [stdout]   Scenario: Retrieval respects permission scope
[INFO] [stdout]    ✔  Given "prod-1" has events tagged with "security" scope
[INFO] [stdout]    ✔  And the user has "engineering" scope
[INFO] [stdout]    ✔  When the agent calls retrieve("recent security events on prod")
[INFO] [stdout]    ✔  Then metadata is returned but content is withheld
[INFO] [stdout]    ✔  And the agent reports "3 entries exist but require security scope"
[INFO] [stdout] Feature: Tool Discovery
[INFO] [stdout]   Scenario: Shell scans PATH on startup and builds tool registry
[INFO] [stdout]    ?> Given a kith shell running on a machine with PATH set
[INFO] [stdout]       Background step failed: features/tool-discovery.feature:8:5
[INFO] [stdout]   Scenario: Tool registry categorizes tools by function
[INFO] [stdout]    ?> Given a kith shell running on a machine with PATH set
[INFO] [stdout]       Background step failed: features/tool-discovery.feature:8:5
[INFO] [stdout]   Scenario: Tool registry detects versions for key tools
[INFO] [stdout]    ?> Given a kith shell running on a machine with PATH set
[INFO] [stdout]       Background step failed: features/tool-discovery.feature:8:5
[INFO] [stdout]   Scenario: Unknown tools are categorized as "other"
[INFO] [stdout]    ?> Given a kith shell running on a machine with PATH set
[INFO] [stdout]       Background step failed: features/tool-discovery.feature:8:5
[INFO] [stdout]   Scenario: System prompt includes categorized tool summary
[INFO] [stdout]    ?> Given a kith shell running on a machine with PATH set
[INFO] [stdout]       Background step failed: features/tool-discovery.feature:8:5
[INFO] [stdout]   Scenario: System prompt stays under size budget with many tools
[INFO] [stdout]    ?> Given a kith shell running on a machine with PATH set
[INFO] [stdout]       Background step failed: features/tool-discovery.feature:8:5
[INFO] [stdout]   Scenario: Daemon scans PATH for real capability report
[INFO] [stdout]    ?> Given a kith shell running on a machine with PATH set
[INFO] [stdout]       Background step failed: features/tool-discovery.feature:8:5
[INFO] [stdout]   Scenario: Daemon capability report includes system resources
[INFO] [stdout]    ?> Given a kith shell running on a machine with PATH set
[INFO] [stdout]       Background step failed: features/tool-discovery.feature:8:5
[INFO] [stdout]   Scenario: Shell re-scans PATH on explicit command
[INFO] [stdout]    ?> Given a kith shell running on a machine with PATH set
[INFO] [stdout]       Background step failed: features/tool-discovery.feature:8:5
[INFO] [stdout]   Scenario: Daemon re-scans on Capabilities request
[INFO] [stdout]    ?> Given a kith shell running on a machine with PATH set
[INFO] [stdout]       Background step failed: features/tool-discovery.feature:8:5
[INFO] [stdout]   Scenario: Shell sees remote machine tools via daemon
[INFO] [stdout]    ?> Given a kith shell running on a machine with PATH set
[INFO] [stdout]       Background step failed: features/tool-discovery.feature:8:5
[INFO] [stdout]   Scenario: macOS tool scan finds Homebrew tools
[INFO] [stdout]    ?> Given a kith shell running on a machine with PATH set
[INFO] [stdout]       Background step failed: features/tool-discovery.feature:8:5
[INFO] [stdout]   Scenario: Linux tool scan finds system and snap tools
[INFO] [stdout]    ?> Given a kith shell running on a machine with PATH set
[INFO] [stdout]       Background step failed: features/tool-discovery.feature:8:5
[INFO] [stdout] [Summary]
[INFO] [stdout] 9 features
[INFO] [stdout] 72 scenarios (59 passed, 13 skipped)
[INFO] [stdout] 329 steps (316 passed, 13 skipped)
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/kith_common-4f1bf56c84ab954f)
[INFO] [stdout] 
[INFO] [stdout] running 51 tests
[INFO] [stdout] test config::tests::containment_defaults_by_platform ... ok
[INFO] [stdout] test drift::tests::default_drift_vector_is_zero ... ok
[INFO] [stdout] test drift::tests::increment_updates_correct_dimension ... ok
[INFO] [stdout] test drift::tests::blacklist_glob_matching ... ok
[INFO] [stdout] test drift::tests::magnitude_sq_zero_weight_ignores_dimension ... ok
[INFO] [stdout] test drift::tests::reset_clears_all_dimensions ... ok
[INFO] [stdout] test drift::tests::blacklist_filters_default_noisy_paths ... ok
[INFO] [stdout] test config::tests::inference_provider_config_serialization ... ok
[INFO] [stdout] test credential::tests::pubkey_from_hex_rejects_invalid ... ok
[INFO] [stdout] test event::tests::event_ids_are_unique ... ok
[INFO] [stdout] test event::tests::event_builder ... ok
[INFO] [stdout] test config::tests::config_load_nonexistent_returns_none ... ok
[INFO] [stdout] test error::tests::kith_error_display_messages ... ok
[INFO] [stdout] test inference::tests::message_serialization ... ok
[INFO] [stdout] test inference::tests::default_inference_config ... ok
[INFO] [stdout] test error::tests::inference_error_display_messages ... ok
[INFO] [stdout] test policy::tests::default_policy_has_standard_blacklist ... ok
[INFO] [stdout] test policy::tests::known_user_overrides_tofu ... ok
[INFO] [stdout] test policy::tests::ops_user_can_do_everything ... ok
[INFO] [stdout] test credential::tests::keypair_roundtrip_from_secret ... ok
[INFO] [stdout] test inference::tests::tool_call_serialization ... ok
[INFO] [stdout] test credential::tests::pubkey_hex_roundtrip ... ok
[INFO] [stdout] test policy::tests::scope_lookup_known_user ... ok
[INFO] [stdout] test inference::tests::stream_chunk_variants ... ok
[INFO] [stdout] test policy::tests::scope_lookup_unknown_user_no_default ... ok
[INFO] [stdout] test policy::tests::scope_lookup_unknown_user_with_default ... ok
[INFO] [stdout] test inference::tests::tool_definition_serialization ... ok
[INFO] [stdout] test event::tests::event_serialization_roundtrip ... ok
[INFO] [stdout] test policy::tests::scope_lookup_unknown_user_with_tofu ... ok
[INFO] [stdout] test policy::tests::viewer_can_query_and_read ... ok
[INFO] [stdout] test policy::tests::viewer_cannot_execute ... ok
[INFO] [stdout] test tool_registry::tests::capability_tools_excludes_other ... ok
[INFO] [stdout] test config::tests::config_load_from_toml_string ... ok
[INFO] [stdout] test tool_registry::tests::prompt_summary_under_budget ... ok
[INFO] [stdout] test tool_registry::tests::registry_from_entries ... ok
[INFO] [stdout] test tool_registry::tests::categorize_known_tools ... ok
[INFO] [stdout] test tool_registry::tests::categorize_unknown_is_other ... ok
[INFO] [stdout] test tool_registry::tests::parse_version_handles_two_part ... ok
[INFO] [stdout] test tool_registry::tests::parse_version_returns_none_for_garbage ... ok
[INFO] [stdout] test tool_registry::tests::prompt_summary_groups_by_category ... ok
[INFO] [stdout] test tool_registry::tests::parse_version_extracts_semver ... ok
[INFO] [stdout] test tool_registry::tests::registry_names_for_classifier ... ok
[INFO] [stdout] test tool_registry::tests::rescan_if_stale_respects_interval ... ok
[INFO] [stdout] test types::tests::capability_report_serialization ... ok
[INFO] [stdout] test credential::tests::verify_rejects_wrong_request_hash ... ok
[INFO] [stdout] test drift::tests::magnitude_sq_with_default_weights ... ok
[INFO] [stdout] test credential::tests::keypair_generate_and_sign_verify ... ok
[INFO] [stdout] test credential::tests::verify_rejects_expired_timestamp ... ok
[INFO] [stdout] test credential::tests::verify_rejects_tampered_signature ... ok
[INFO] [stdout] test credential::tests::verify_accepts_within_skew_window ... ok
[INFO] [stdout] test tool_registry::tests::scan_finds_real_tools ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 51 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.11s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/kith_daemon-c97e5fe4fb086f3a)
[INFO] [stdout] 
[INFO] [stdout] running 53 tests
[INFO] [stdout] test audit::tests::audit_entries_have_unique_ids ... ok
[INFO] [stdout] test audit::tests::record_change_lifecycle ... ok
[INFO] [stdout] test audit::tests::record_exec_denied ... ok
[INFO] [stdout] test audit::tests::record_change_expired ... ok
[INFO] [stdout] test audit::tests::audit_entries_have_machine_name ... ok
[INFO] [stdout] test audit::tests::record_exec_success ... ok
[INFO] [stdout] test audit::tests::scope_filtering ... ok
[INFO] [stdout] test commit::tests::rollback_removes_pending ... ok
[INFO] [stdout] test commit::tests::commit_all_removes_all ... ok
[INFO] [stdout] test audit::tests::sink_receives_events ... ok
[INFO] [stdout] test commit::tests::commit_removes_pending ... ok
[INFO] [stdout] test commit::tests::tick_does_not_expire_fresh_changes ... ok
[INFO] [stdout] test commit::tests::commit_unknown_id_errors ... ok
[INFO] [stdout] test commit::tests::open_creates_pending_change ... ok
[INFO] [stdout] test containment::tests::copy_transaction_auto_rollback_on_drop ... ok
[INFO] [stdout] test containment::tests::transaction_manager_lifecycle ... ok
[INFO] [stdout] test drift::tests::reset_clears_drift ... ok
[INFO] [stdout] test drift::tests::non_blacklisted_events_counted ... ok
[INFO] [stdout] test drift::tests::magnitude_matches_spec ... ok
[INFO] [stdout] test commit::tests::rollback_all_removes_all ... ok
[INFO] [stdout] test containment::tests::copy_transaction_commit ... ok
[INFO] [stdout] test drift::tests::custom_blacklist ... ok
[INFO] [stdout] test drift::tests::blacklisted_events_ignored ... ok
[INFO] [stdout] test containment::tests::copy_transaction_rollback ... ok
[INFO] [stdout] test exec::tests::exec_nonexistent_command ... ok
[INFO] [stdout] test exec::tests::exec_echo ... ok
[INFO] [stdout] test exec::tests::exec_captures_stderr ... ok
[INFO] [stdout] test commit::tests::multiple_changes_independent_expiry ... ok
[INFO] [stdout] test commit::tests::custom_duration_per_change ... ok
[INFO] [stdout] test exec::tests::exec_nonzero_exit ... ok
[INFO] [stdout] test containment::tests::transaction_manager_rollback_all ... ok
[INFO] [stdout] test containment::tests::multiple_files_in_one_transaction ... ok
[INFO] [stdout] test exec::tests::exec_pipeline ... ok
[INFO] [stdout] test containment::tests::transaction_manager_rollback ... ok
[INFO] [stdout] test policy::tests::expired_credential_rejected ... ok
[INFO] [stdout] test policy::tests::tampered_credential_rejected ... ok
[INFO] [stdout] test service::tests::exec_no_credential_returns_unauthenticated ... ok
[INFO] [stdout] test policy::tests::viewer_denied_exec ... ok
[INFO] [stdout] test policy::tests::tofu_gives_viewer_scope ... ok
[INFO] [stdout] test policy::tests::ops_user_allowed_exec ... ok
[INFO] [stdout] test policy::tests::unknown_user_denied ... ok
[INFO] [stdout] test service::tests::query_returns_state ... ok
[INFO] [stdout] test commit::tests::tick_expires_old_changes ... ok
[INFO] [stdout] test policy::tests::viewer_allowed_query ... ok
[INFO] [stdout] test service::tests::exec_unauthorized_returns_permission_denied ... ok
[INFO] [stdout] test policy::tests::wrong_request_hash_rejected ... ok
[INFO] [stdout] test exec::tests::exec_timeout ... ok
[INFO] [stdout] test service::tests::exec_creates_audit_entry ... ok
[INFO] [stdout] test service::tests::exec_authorized_returns_output ... ok
[INFO] [stdout] test service::tests::apply_commit_cycle ... ok
[INFO] [stderr]      Running unittests src/bin/kith-daemon.rs (/opt/rustwide/target/debug/deps/kith_daemon-80a51503dfceb92e)
[INFO] [stdout] test observer::tests::file_observer_detects_change ... ok
[INFO] [stdout] test observer::tests::file_observer_detects_new_file ... ok
[INFO] [stdout] test observer::tests::file_observer_detects_deletion ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 53 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.32s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/kith_e2e-a726e0dba747a57e)
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/broken_paths.rs (/opt/rustwide/target/debug/deps/broken_paths-cade30fde01f2553)
[INFO] [stdout] 
[INFO] [stdout] running 5 tests
[INFO] [stdout] test vector_index_populated_from_events ... ok
[INFO] [stdout] test containment_commit_keeps_changes ... ok
[INFO] [stdout] test containment_protects_and_restores_files ... ok
[INFO] [stdout] test agent_retrieve_finds_events_in_store ... ok
[INFO] [stdout] test daemon_events_persist_in_sqlite ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/chaos.rs (/opt/rustwide/target/debug/deps/chaos-eb20c18c7abf7034)
[INFO] [stdout] 
[INFO] [stdout] running 7 tests
[INFO] [stdout] test chaos_subscription_under_load ... ok
[INFO] [stdout] test chaos_high_volume_merge ... ok
[INFO] [stdout] test chaos_commit_window_expiry_race ... ok
[INFO] [stdout] test chaos_daemon_unreachable_mid_session ... ok
[INFO] [stdout] test chaos_concurrent_apply_commit ... ok
[INFO] [stdout] test chaos_auth_abuse_doesnt_affect_legit ... ok
[INFO] [stdout] test chaos_concurrent_exec ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.47s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/containers.rs (/opt/rustwide/target/debug/deps/containers-7f5bd42ae60f8f49)
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/drift_sync.rs (/opt/rustwide/target/debug/deps/drift_sync-ce93eb1e371458c9)
[INFO] [stdout] 
[INFO] [stdout] running 6 tests
[INFO] [stdout] test e2e_merge_idempotent ... ok
[INFO] [stdout] test e2e_partition_and_recovery ... ok
[INFO] [stdout] test e2e_drift_to_sync_to_retrieval ... ok
[INFO] [stdout] test e2e_drift_multiple_categories ... ok
[INFO] [stdout] test e2e_drift_blacklist_prevents_events ... ok
[INFO] [stdout] test e2e_long_partition_recovery ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/full_flow.rs (/opt/rustwide/target/debug/deps/full_flow-aca3a91c3064ea75)
[INFO] [stdout] 
[INFO] [stdout] running 6 tests
[INFO] [stdout] test e2e_event_store_retrieval ... ok
[INFO] [stdout] test e2e_permission_enforcement ... ok
[INFO] [stdout] test e2e_apply_rollback_via_shell ... ok
[INFO] [stdout] test e2e_apply_commit_via_shell ... ok
[INFO] [stdout] test e2e_shell_to_daemon_exec ... ok
[INFO] [stdout] test e2e_multi_daemon ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.29s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/integration_wiring.rs (/opt/rustwide/target/debug/deps/integration_wiring-fdef5af5e18b74f7)
[INFO] [stdout] 
[INFO] [stdout] running 10 tests
[INFO] [stdout] test config_roundtrip_all_sections ... ok
[INFO] [stdout] test hybrid_retriever_in_agent ... ok
[INFO] [stdout] test sqlite_store_persists ... ok
[INFO] [stdout] test config_bow_embedding ... ok
[INFO] [stdout] test agent_with_embedder ... ok
[INFO] [stdout] test containment_through_rpcs ... ok
[INFO] [stdout] test with_event_store_shares_state ... ok
[INFO] [stdout] test process_observer_integration ... ok
[INFO] [stdout] test file_observer_integration ... ok
[INFO] [stdout] test capabilities_returns_real_data ... ok
[INFO] [stderr]      Running tests/local_model.rs (/opt/rustwide/target/debug/deps/local_model-d7e9e3a28cf9d681)
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.49s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/model_swap.rs (/opt/rustwide/target/debug/deps/model_swap-a313db8a2f638db0)
[INFO] [stdout] 
[INFO] [stdout] running 4 tests
[INFO] [stdout] test e2e_backend_failure_graceful ... ok
[INFO] [stdout] test e2e_thinking_optional ... ok
[INFO] [stdout] test e2e_passthrough_independent_of_backend ... ok
[INFO] [stdout] test e2e_model_swap_same_workflow ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/pty_passthrough.rs (/opt/rustwide/target/debug/deps/pty_passthrough-41d05397a508ed16)
[INFO] [stdout] 
[INFO] [stdout] running 6 tests
[INFO] [stdout] test e2e_escape_hatch ... ok
[INFO] [stdout] test e2e_intent_classified_correctly ... ok
[INFO] [stdout] test e2e_common_commands_recognized ... ok
[INFO] [stdout] test e2e_passthrough_latency ... ok
[INFO] [stdout] test e2e_passthrough_executes_directly ... ok
[INFO] [stdout] test e2e_passthrough_no_inference_call ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.09s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/sync_exchange.rs (/opt/rustwide/target/debug/deps/sync_exchange-610d7797ba5e9603)
[INFO] [stdout] 
[INFO] [stdout] running 1 test
[INFO] [stdout] test e2e_sync_exchange_between_daemons ... ok
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/kith_mesh-aa249bb204dd1d18)
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 34 tests
[INFO] [stdout] test manager::tests::ipv6_ula_from_mesh_identifier ... ok
[INFO] [stdout] test manager::tests::ipv4_deterministic ... ok
[INFO] [stdout] test manager::tests::ipv6_ula_different_meshes_different_prefixes ... ok
[INFO] [stdout] test manager::tests::ipv4_fallback ... ok
[INFO] [stdout] test manager::tests::ipv6_ula_different_machines_different_ips ... ok
[INFO] [stdout] test manager::tests::ipv4_different_machines ... ok
[INFO] [stdout] test manager::tests::ipv6_ula_deterministic ... ok
[INFO] [stdout] test manager::tests::manager_has_mesh_ip ... ok
[INFO] [stdout] test peer::tests::expire_stale_removes_old_peers ... ok
[INFO] [stdout] test manager::tests::announce_publishes_to_signaling ... ok
[INFO] [stdout] test manager::tests::ipv6_explicit_prefix ... ok
[INFO] [stdout] test manager::tests::discover_skips_self ... ok
[INFO] [stdout] test peer::tests::duplicate_peer_same_endpoint_no_event ... ok
[INFO] [stdout] test manager::tests::refresh_connectivity_updates_registry ... ok
[INFO] [stdout] test peer::tests::multiple_peers_tracked ... ok
[INFO] [stdout] test peer::tests::new_peer_emits_joined_event ... ok
[INFO] [stdout] test peer::tests::peer_endpoint_change_emits_event ... ok
[INFO] [stdout] test peer::tests::remove_unknown_peer_returns_none ... ok
[INFO] [stdout] test peer::tests::is_reachable_false_by_default ... ok
[INFO] [stdout] test wireguard::tests::add_peer_updates_existing ... ok
[INFO] [stdout] test wireguard::tests::own_pubkey ... ok
[INFO] [stdout] test wireguard::tests::remove_peer ... ok
[INFO] [stdout] test wireguard::tests::add_and_check_peer ... ok
[INFO] [stdout] test wireguard::tests::simulate_handshake ... ok
[INFO] [stdout] test peer::tests::remove_peer_emits_left_event ... ok
[INFO] [stdout] test signaling::tests::multiple_machines ... ok
[INFO] [stdout] test signaling::tests::publish_and_fetch ... ok
[INFO] [stdout] test peer::tests::subscribe_receives_events ... ok
[INFO] [stdout] test signaling::tests::publish_replaces_existing ... ok
[INFO] [stdout] test signaling::tests::shared_signaling_visible_across_nodes ... ok
[INFO] [stdout] test peer::tests::stale_peer_event_rejected ... ok
[INFO] [stdout] test peer::tests::set_connected_makes_reachable ... ok
[INFO] [stdout] test manager::tests::discover_new_peer_configures_wireguard ... ok
[INFO] [stdout] test manager::tests::two_nodes_discover_each_other ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 34 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/kith_shell-b32047085b5a736c)
[INFO] [stdout] 
[INFO] [stdout] running 76 tests
[INFO] [stdout] test agent::tests::should_not_embed_infrastructure_events ... ok
[INFO] [stdout] test agent::tests::should_embed_operational_events ... ok
[INFO] [stdout] test classify::tests::escape_hatch_forces_passthrough ... ok
[INFO] [stdout] test classify::tests::escape_hatch_trims_whitespace ... ok
[INFO] [stdout] test classify::tests::absolute_path_is_passthrough ... ok
[INFO] [stdout] test classify::tests::known_command_is_passthrough ... ok
[INFO] [stdout] test classify::tests::empty_input_is_passthrough ... ok
[INFO] [stdout] test classify::tests::natural_language_is_intent ... ok
[INFO] [stdout] test context::tests::new_context_is_empty ... ok
[INFO] [stdout] test classify::tests::unknown_command_is_intent ... ok
[INFO] [stdout] test context::tests::reset_keeps_system_prompt ... ok
[INFO] [stdout] test context::tests::reset_without_system_clears_all ... ok
[INFO] [stdout] test context::tests::system_prompt_set ... ok
[INFO] [stdout] test context::tests::user_and_assistant_messages ... ok
[INFO] [stdout] test context::tests::tool_result_added ... ok
[INFO] [stdout] test context::tests::system_prompt_replaced_not_duplicated ... ok
[INFO] [stdout] test context::tests::compaction_keeps_system_and_tail ... ok
[INFO] [stdout] test agent::tests::index_event_embeds_exec_events ... ok
[INFO] [stdout] test agent::tests::intent_produces_text ... ok
[INFO] [stdout] test daemon_client::tests::e2e_unreachable_daemon ... ok
[INFO] [stdout] test inference::anthropic::tests::from_config_missing_env_errors ... ok
[INFO] [stdout] test agent::tests::apply_tool_without_paths_is_audit_only ... ok
[INFO] [stdout] test agent::tests::empty_input ... ok
[INFO] [stdout] test classify::tests::from_path_env_finds_real_commands ... ok
[INFO] [stdout] test agent::tests::index_event_skips_system_events ... ok
[INFO] [stdout] test agent::tests::context_accumulates ... ok
[INFO] [stdout] test agent::tests::intent_produces_tool_call ... ok
[INFO] [stdout] test agent::tests::backend_unavailable_degrades ... ok
[INFO] [stdout] test agent::tests::apply_tool_with_paths ... ok
[INFO] [stdout] test inference::openai_compat::tests::message_conversion_system ... ok
[INFO] [stdout] test inference::openai_compat::tests::message_conversion_tool_result ... ok
[INFO] [stdout] test inference::openai_compat::tests::message_conversion_user ... ok
[INFO] [stdout] test inference::openai_compat::tests::message_conversion_tool_calls ... ok
[INFO] [stdout] test agent::tests::passthrough_command ... ok
[INFO] [stdout] test agent::tests::escape_hatch ... ok
[INFO] [stdout] test mock_backend::tests::mock_health_check ... ok
[INFO] [stdout] test mock_backend::tests::mock_name ... ok
[INFO] [stdout] test mock_backend::tests::mock_records_calls ... ok
[INFO] [stdout] test mock_backend::tests::mock_returns_queued_text ... ok
[INFO] [stdout] test mock_backend::tests::mock_returns_tool_call ... ok
[INFO] [stdout] test mock_backend::tests::mock_unhealthy_returns_error ... ok
[INFO] [stdout] test prompt::tests::prompt_contains_hostname ... ok
[INFO] [stdout] test prompt::tests::prompt_contains_os_info ... ok
[INFO] [stdout] test prompt::tests::prompt_includes_available_tools ... ok
[INFO] [stdout] test prompt::tests::prompt_includes_fleet_summary ... ok
[INFO] [stdout] test prompt::tests::prompt_includes_project_context ... ok
[INFO] [stdout] test prompt::tests::prompt_instructs_unix_usage ... ok
[INFO] [stdout] test prompt::tests::prompt_is_reasonably_short ... ok
[INFO] [stdout] test prompt::tests::prompt_mentions_commit_rollback ... ok
[INFO] [stdout] test prompt::tests::prompt_omits_fleet_when_empty ... ok
[INFO] [stdout] test prompt::tests::prompt_omits_tools_when_none ... ok
[INFO] [stdout] test mock_backend::tests::mock_default_response_when_queue_empty ... ok
[INFO] [stdout] test daemon_client::tests::e2e_query_state ... ok
[INFO] [stdout] test daemon_client::tests::e2e_remote_exec ... ok
[INFO] [stdout] test daemon_client::tests::e2e_apply_rollback ... ok
[INFO] [stdout] test daemon_client::tests::e2e_apply_commit_cycle ... ok
[INFO] [stdout] test tools::tests::all_tools_have_names_and_descriptions ... ok
[INFO] [stdout] test tools::tests::all_tools_have_valid_json_schema_params ... ok
[INFO] [stdout] test tools::tests::is_native_tool_recognizes_all ... ok
[INFO] [stdout] test tools::tests::is_native_tool_rejects_unix_commands ... ok
[INFO] [stdout] test tools::tests::native_tools_count ... ok
[INFO] [stdout] test daemon_client::tests::e2e_unauthorized_exec ... ok
[INFO] [stdout] test inference::anthropic::tests::tool_result_converted ... ok
[INFO] [stdout] test inference::openai_compat::tests::from_config_reads_env ... ok
[INFO] [stdout] test inference::openai_compat::tests::request_no_tools ... ok
[INFO] [stdout] test inference::anthropic::tests::tools_serialized_with_input_schema ... ok
[INFO] [stdout] test inference::anthropic::tests::request_has_correct_defaults ... ok
[INFO] [stdout] test inference::openai_compat::tests::endpoint_trailing_slash_stripped ... ok
[INFO] [stdout] test inference::openai_compat::tests::request_building ... ok
[INFO] [stdout] test inference::anthropic::tests::message_conversion_system_extracted ... ok
[INFO] [stdout] test inference::anthropic::tests::tool_calls_converted ... ok
[INFO] [stdout] test pty::tests::exec_with_exit_code ... ok
[INFO] [stdout] test pty::tests::exec_pipeline ... ok
[INFO] [stdout] test pty::tests::spawn_and_drop ... ok
[INFO] [stdout] test pty::tests::spawn_and_exec ... ok
[INFO] [stdout] test pty::tests::exec_multiple_commands ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 76 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.12s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/bin/kith.rs (/opt/rustwide/target/debug/deps/kith-cde1cf70e7decb64)
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/kith_state-ba40460601487055)
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 27 tests
[INFO] [stdout] test retrieval::tests::search_by_detail ... ok
[INFO] [stdout] test retrieval::tests::search_case_insensitive ... ok
[INFO] [stdout] test retrieval::tests::search_by_event_type ... ok
[INFO] [stdout] test retrieval::tests::search_by_path ... ok
[INFO] [stdout] test retrieval::tests::search_limits_results ... ok
[INFO] [stdout] test retrieval::tests::search_multi_term ... ok
[INFO] [stdout] test vector_index::tests::clear_removes_all ... ok
[INFO] [stdout] test retrieval::tests::search_respects_scope ... ok
[INFO] [stdout] test vector_index::tests::cosine_opposite_vectors ... ok
[INFO] [stdout] test vector_index::tests::cosine_orthogonal_vectors ... ok
[INFO] [stdout] test vector_index::tests::empty_index_returns_nothing ... ok
[INFO] [stdout] test vector_index::tests::search_respects_model_version ... ok
[INFO] [stdout] test embedding::tests::bow_similar_texts_closer ... ok
[INFO] [stdout] test hybrid::tests::hybrid_deduplicates_across_sources ... ok
[INFO] [stdout] test vector_index::tests::insert_and_search ... ok
[INFO] [stdout] test embedding::tests::bow_embed_produces_vector ... ok
[INFO] [stdout] test hybrid::tests::hybrid_respects_weights ... ok
[INFO] [stdout] test embedding::tests::bow_empty_text ... ok
[INFO] [stdout] test hybrid::tests::hybrid_combines_keyword_and_vector ... ok
[INFO] [stdout] test embedding::tests::bow_batch ... ok
[INFO] [stdout] test embedding::tests::bow_normalized ... ok
[INFO] [stdout] test retrieval::tests::search_ranks_by_score ... ok
[INFO] [stdout] test vector_index::tests::cosine_identical_vectors ... ok
[INFO] [stdout] test retrieval::tests::search_no_matches ... ok
[INFO] [stdout] test hybrid::tests::hybrid_keyword_only_when_no_embeddings ... ok
[INFO] [stdout] test api_embedding::tests::endpoint_trailing_slash ... ok
[INFO] [stdout] test api_embedding::tests::ollama_constructor ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 27 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/kith_sync-c3e09c9916ca4b06)
[INFO] [stdout] 
[INFO] [stdout] running 23 tests
[INFO] [stdout] test store::tests::filter_by_machine ... ok
[INFO] [stdout] test store::tests::empty_store ... ok
[INFO] [stdout] test store::tests::filter_with_limit ... ok
[INFO] [stdout] test store::tests::filter_by_event_type ... ok
[INFO] [stdout] test store::tests::filter_by_category ... ok
[INFO] [stdout] test store::tests::filter_by_scope_public_excludes_ops ... ok
[INFO] [stdout] test store::tests::merge_deduplicates_by_id ... ok
[INFO] [stdout] test store::tests::subscribe_receives_new_events ... ok
[INFO] [stdout] test store::tests::write_and_query_all ... ok
[INFO] [stdout] test store::tests::merge_notifies_subscribers ... ok
[INFO] [stdout] test sqlite_store::tests::every_event_category_roundtrips ... ok
[INFO] [stdout] test sqlite_store::tests::filter_by_category ... ok
[INFO] [stdout] test sqlite_store::tests::filter_with_limit ... ok
[INFO] [stdout] test sqlite_store::tests::crdt_not_available_gracefully ... ok
[INFO] [stdout] test sqlite_store::tests::subscribe_receives ... ok
[INFO] [stdout] test sqlite_store::tests::merge_adds_new ... ok
[INFO] [stdout] test sqlite_store::tests::merge_deduplicates ... ok
[INFO] [stdout] test sqlite_store::tests::filter_by_scope ... ok
[INFO] [stdout] test sqlite_store::tests::filter_by_machine ... ok
[INFO] [stdout] test sqlite_store::tests::roundtrip_preserves_fields ... ok
[INFO] [stdout] test sqlite_store::tests::write_and_read ... ok
[INFO] [stdout] test store::tests::merge_adds_new_events ... ok
[INFO] [stdout] test sqlite_store::tests::persistent_across_reopen ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 23 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests kith_common
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests kith_daemon
[INFO] [stderr]    Doc-tests kith_e2e
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests kith_mesh
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests kith_shell
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests kith_state
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]    Doc-tests kith_sync
[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" "dde3f1fdaaeb845cc752aa6b916a29667e042b8a3e0d8964a2edb6c93e6abe29", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "dde3f1fdaaeb845cc752aa6b916a29667e042b8a3e0d8964a2edb6c93e6abe29", kill_on_drop: false }`
[INFO] [stdout] dde3f1fdaaeb845cc752aa6b916a29667e042b8a3e0d8964a2edb6c93e6abe29
