[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 1.95.0 for beta-1.96-1 [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fwitlox%2Fkith" "/workspace/builds/worker-0-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-0-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-0-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/witlox/kith on toolchain 1.95.0 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.95.0" "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" "+1.95.0" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded bollard-stubs v1.47.1-rc.27.3.1 [INFO] [stderr] Downloaded docker_credential v1.3.2 [INFO] [stderr] Downloaded structmeta v0.3.0 [INFO] [stderr] Downloaded parse-display v0.9.1 [INFO] [stderr] Downloaded structmeta-derive v0.3.0 [INFO] [stderr] Downloaded hostname v0.4.2 [INFO] [stderr] Downloaded nostr-gossip v0.44.0 [INFO] [stderr] Downloaded lazy-regex v3.6.0 [INFO] [stderr] Downloaded typed-builder-macro v0.15.2 [INFO] [stderr] Downloaded cucumber-expressions v0.3.0 [INFO] [stderr] Downloaded synthez-codegen v0.3.1 [INFO] [stderr] Downloaded synthez v0.3.1 [INFO] [stderr] Downloaded peg-runtime v0.6.3 [INFO] [stderr] Downloaded peg-macros v0.6.3 [INFO] [stderr] Downloaded synthez-core v0.3.1 [INFO] [stderr] Downloaded nostr-database v0.44.0 [INFO] [stderr] Downloaded askama_parser v0.14.0 [INFO] [stderr] Downloaded askama_derive v0.14.0 [INFO] [stderr] Downloaded defguard_boringtun v0.6.5 [INFO] [stderr] Downloaded bip39 v2.2.2 [INFO] [stderr] Downloaded defguard_wireguard_rs v0.9.4 [INFO] [stderr] Downloaded cucumber v0.21.1 [INFO] [stderr] Downloaded bollard v0.18.1 [INFO] [stderr] Downloaded rustyline v15.0.0 [INFO] [stderr] Downloaded uniffi_bindgen v0.31.0 [INFO] [stderr] Downloaded netlink-packet-route v0.29.0 [INFO] [stderr] Downloaded nostr v0.44.2 [INFO] [stderr] Downloaded bech32 v0.11.1 [INFO] [stderr] Downloaded nostr-relay-pool v0.44.0 [INFO] [stderr] Downloaded tonic v0.13.1 [INFO] [stderr] Downloaded async-wsocket v0.13.2 [INFO] [stderr] Downloaded nostr-sdk v0.44.1 [INFO] [stderr] Downloaded prost-types v0.13.5 [INFO] [stderr] Downloaded uniffi_core v0.31.0 [INFO] [stderr] Downloaded uniffi_macros v0.31.0 [INFO] [stderr] Downloaded bitcoin_hashes v0.14.1 [INFO] [stderr] Downloaded prost-build v0.13.5 [INFO] [stderr] Downloaded tokio-tar v0.3.1 [INFO] [stderr] Downloaded cucumber-codegen v0.21.1 [INFO] [stderr] Downloaded typed-builder v0.15.2 [INFO] [stderr] Downloaded ip_network_table-deps-treebitmap v0.5.0 [INFO] [stderr] Downloaded askama v0.14.0 [INFO] [stderr] Downloaded uniffi_udl v0.31.0 [INFO] [stderr] Downloaded toml_writer v1.1.0+spec-1.1.0 [INFO] [stderr] Downloaded gherkin v0.14.0 [INFO] [stderr] Downloaded sealed v0.5.0 [INFO] [stderr] Downloaded netlink-packet-core v0.8.1 [INFO] [stderr] Downloaded hex-conservative v0.2.2 [INFO] [stderr] Downloaded tonic-build v0.13.1 [INFO] [stderr] Downloaded testcontainers v0.23.3 [INFO] [stderr] Downloaded peg v0.6.3 [INFO] [stderr] Downloaded ip_network_table v0.2.0 [INFO] [stderr] Downloaded uniffi_meta v0.31.0 [INFO] [stderr] Downloaded uniffi_internal_macros v0.31.0 [INFO] [stderr] Downloaded uniffi v0.31.0 [INFO] [stderr] Downloaded petgraph v0.7.1 [INFO] [stderr] Downloaded hyperlocal v0.9.1 [INFO] [stderr] Downloaded lazy-regex-proc_macros v3.6.0 [INFO] [stderr] Downloaded uniffi_pipeline v0.31.0 [INFO] [stderr] Downloaded netlink-packet-utils v0.6.0 [INFO] [stderr] Downloaded netlink-packet-wireguard v0.3.0 [INFO] [stderr] Downloaded uniffi_build v0.31.0 [INFO] [stderr] Downloaded netlink-packet-generic v0.4.0 [INFO] [stderr] Downloaded negentropy v0.5.0 [INFO] [stderr] Downloaded bitcoin-io v0.1.4 [INFO] [stderr] Downloaded parse-display-derive v0.9.1 [INFO] [stderr] Downloaded wireguard-nt v0.5.0 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-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" "+1.95.0" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 48a58fad508233c672afaa62ab7f95ebaafc022483096235884e6814cb6131a7 [INFO] running `Command { std: "docker" "start" "-a" "48a58fad508233c672afaa62ab7f95ebaafc022483096235884e6814cb6131a7", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "48a58fad508233c672afaa62ab7f95ebaafc022483096235884e6814cb6131a7", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "48a58fad508233c672afaa62ab7f95ebaafc022483096235884e6814cb6131a7", kill_on_drop: false }` [INFO] [stdout] 48a58fad508233c672afaa62ab7f95ebaafc022483096235884e6814cb6131a7 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-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=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+1.95.0" "build" "--frozen" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] a6c58ac6a0a1995a1a589119df10cb258f56d4fbfe52df39182b43a1f94097af [INFO] running `Command { std: "docker" "start" "-a" "a6c58ac6a0a1995a1a589119df10cb258f56d4fbfe52df39182b43a1f94097af", kill_on_drop: false }` [INFO] [stderr] Compiling libc v0.2.183 [INFO] [stderr] Compiling hashbrown v0.16.1 [INFO] [stderr] Compiling memchr v2.8.0 [INFO] [stderr] Compiling futures-sink v0.3.32 [INFO] [stderr] Compiling slab v0.4.12 [INFO] [stderr] Compiling cc v1.2.57 [INFO] [stderr] Compiling tokio-macros v2.6.1 [INFO] [stderr] Compiling tracing-attributes v0.1.31 [INFO] [stderr] Compiling futures-macro v0.3.32 [INFO] [stderr] Compiling zerovec-derive v0.11.2 [INFO] [stderr] Compiling anyhow v1.0.102 [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 either v1.15.0 [INFO] [stderr] Compiling futures-channel v0.3.32 [INFO] [stderr] Compiling itertools v0.13.0 [INFO] [stderr] Compiling num-traits v0.2.19 [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 toml_write v0.1.2 [INFO] [stderr] Compiling indexmap v2.13.0 [INFO] [stderr] Compiling signature v2.2.0 [INFO] [stderr] Compiling winnow v0.7.15 [INFO] [stderr] Compiling aho-corasick v1.1.4 [INFO] [stderr] Compiling prettyplease v0.2.37 [INFO] [stderr] Compiling bytes v1.11.1 [INFO] [stderr] Compiling openssl-sys v0.9.112 [INFO] [stderr] Compiling toml_datetime v0.6.11 [INFO] [stderr] Compiling serde_spanned v0.6.9 [INFO] [stderr] Compiling futures-util v0.3.32 [INFO] [stderr] Compiling getrandom v0.4.2 [INFO] [stderr] Compiling tracing v0.1.44 [INFO] [stderr] Compiling ed25519 v2.2.3 [INFO] [stderr] Compiling zerofrom v0.1.6 [INFO] [stderr] Compiling parking_lot_core v0.9.12 [INFO] [stderr] Compiling errno v0.3.14 [INFO] [stderr] Compiling socket2 v0.6.3 [INFO] [stderr] Compiling mio v1.1.1 [INFO] [stderr] Compiling yoke v0.8.1 [INFO] [stderr] Compiling getrandom v0.2.17 [INFO] [stderr] Compiling dirs-sys-next v0.1.2 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Compiling signal-hook-registry v1.4.8 [INFO] [stderr] Compiling zerovec v0.11.5 [INFO] [stderr] Compiling rand_core v0.6.4 [INFO] [stderr] Compiling zerotrie v0.2.3 [INFO] [stderr] Compiling parking_lot v0.12.5 [INFO] [stderr] Compiling regex-automata v0.4.14 [INFO] [stderr] Compiling rand_chacha v0.3.1 [INFO] [stderr] Compiling sha2 v0.10.9 [INFO] [stderr] Compiling async-trait v0.1.89 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling tokio v1.50.0 [INFO] [stderr] Compiling tinystr v0.8.2 [INFO] [stderr] Compiling potential_utf v0.1.4 [INFO] [stderr] Compiling fixedbitset v0.5.7 [INFO] [stderr] Compiling icu_locale_core v2.1.1 [INFO] [stderr] Compiling icu_collections v2.1.1 [INFO] [stderr] Compiling openssl v0.10.76 [INFO] [stderr] Compiling rand v0.8.5 [INFO] [stderr] Compiling prost-derive v0.13.5 [INFO] [stderr] Compiling petgraph v0.7.1 [INFO] [stderr] Compiling chrono v0.4.44 [INFO] [stderr] Compiling ahash v0.8.12 [INFO] [stderr] Compiling ed25519-dalek v2.2.0 [INFO] [stderr] Compiling dirs-next v2.0.0 [INFO] [stderr] Compiling uuid v1.22.0 [INFO] [stderr] Compiling icu_provider v2.1.1 [INFO] [stderr] Compiling toml_edit v0.22.27 [INFO] [stderr] Compiling libsqlite3-sys v0.30.1 [INFO] [stderr] Compiling multimap v0.10.1 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling icu_properties v2.1.2 [INFO] [stderr] Compiling icu_normalizer v2.1.1 [INFO] [stderr] Compiling native-tls v0.2.18 [INFO] [stderr] Compiling hashbrown v0.14.5 [INFO] [stderr] Compiling axum-core v0.5.6 [INFO] [stderr] Compiling pin-project-internal v1.1.11 [INFO] [stderr] Compiling tempfile v3.27.0 [INFO] [stderr] Compiling prost v0.13.5 [INFO] [stderr] Compiling regex v1.12.3 [INFO] [stderr] Compiling hashlink v0.9.1 [INFO] [stderr] Compiling fallible-iterator v0.3.0 [INFO] [stderr] Compiling nix v0.29.0 [INFO] [stderr] Compiling prost-types v0.13.5 [INFO] [stderr] Compiling futures-executor v0.3.32 [INFO] [stderr] Compiling futures v0.3.32 [INFO] [stderr] Compiling idna_adapter v1.2.1 [INFO] [stderr] Compiling socket2 v0.5.10 [INFO] [stderr] Compiling idna v1.1.0 [INFO] [stderr] Compiling nu-ansi-term v0.50.3 [INFO] [stderr] Compiling serde_urlencoded v0.7.1 [INFO] [stderr] Compiling pin-project v1.1.11 [INFO] [stderr] Compiling hostname v0.4.2 [INFO] [stderr] Compiling nibble_vec v0.1.0 [INFO] [stderr] Compiling endian-type v0.1.2 [INFO] [stderr] Compiling unicode-segmentation v1.12.0 [INFO] [stderr] Compiling url v2.5.8 [INFO] [stderr] Compiling radix_trie v0.2.1 [INFO] [stderr] Compiling prost-build v0.13.5 [INFO] [stderr] Compiling toml v0.8.23 [INFO] [stderr] Compiling tonic-build v0.13.1 [INFO] [stderr] Compiling fd-lock v4.0.4 [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 kith-daemon v2026.1.0 (/opt/rustwide/workdir/crates/kith-daemon) [INFO] [stderr] Compiling h2 v0.4.13 [INFO] [stderr] Compiling tower v0.5.3 [INFO] [stderr] Compiling matchers v0.2.0 [INFO] [stderr] Compiling tracing-subscriber v0.3.23 [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 hyper-util v0.1.20 [INFO] [stderr] Compiling kith-sync v2026.1.0 (/opt/rustwide/workdir/crates/kith-sync) [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 36s [INFO] running `Command { std: "docker" "inspect" "a6c58ac6a0a1995a1a589119df10cb258f56d4fbfe52df39182b43a1f94097af", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "a6c58ac6a0a1995a1a589119df10cb258f56d4fbfe52df39182b43a1f94097af", kill_on_drop: false }` [INFO] [stdout] a6c58ac6a0a1995a1a589119df10cb258f56d4fbfe52df39182b43a1f94097af [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-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=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+1.95.0" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] b6d17592bf25bc4f3dba6f07ad7cc0b0e9382a9d493e28ddbb8d9bd9ef966584 [INFO] running `Command { std: "docker" "start" "-a" "b6d17592bf25bc4f3dba6f07ad7cc0b0e9382a9d493e28ddbb8d9bd9ef966584", kill_on_drop: false }` [INFO] [stderr] Compiling itertools v0.13.0 [INFO] [stderr] Compiling regex v1.12.3 [INFO] [stderr] Compiling bytecount v0.6.9 [INFO] [stderr] Compiling sealed v0.5.0 [INFO] [stderr] Compiling nom v7.1.3 [INFO] [stderr] Compiling derive_more v0.99.20 [INFO] [stderr] Compiling bstr v1.12.1 [INFO] [stderr] Compiling regex-syntax v0.7.5 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling peg-runtime v0.6.3 [INFO] [stderr] Compiling terminal_size v0.4.3 [INFO] [stderr] Compiling crossbeam-deque v0.8.6 [INFO] [stderr] Compiling typed-builder-macro v0.15.2 [INFO] [stderr] Compiling unicode-linebreak v0.1.5 [INFO] [stderr] Compiling inflections v1.1.1 [INFO] [stderr] Compiling lazy-regex-proc_macros v3.6.0 [INFO] [stderr] Compiling clap_builder v4.6.0 [INFO] [stderr] Compiling console v0.15.11 [INFO] [stderr] Compiling peg-macros v0.6.3 [INFO] [stderr] Compiling globset v0.4.18 [INFO] [stderr] Compiling synthez-core v0.3.1 [INFO] [stderr] Compiling textwrap v0.16.2 [INFO] [stderr] Compiling smart-default v0.7.1 [INFO] [stderr] Compiling inventory v0.3.22 [INFO] [stderr] Compiling ignore v0.4.25 [INFO] [stderr] Compiling typed-builder v0.15.2 [INFO] [stderr] Compiling drain_filter_polyfill v0.1.3 [INFO] [stderr] Compiling humantime v2.3.0 [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 lazy-regex v3.6.0 [INFO] [stderr] Compiling globwalk v0.9.1 [INFO] [stderr] Compiling synthez-codegen v0.3.1 [INFO] [stderr] Compiling kith-mesh v2026.1.0 (/opt/rustwide/workdir/crates/kith-mesh) [INFO] [stderr] Compiling nom_locate v4.2.0 [INFO] [stderr] Compiling kith-common v2026.1.0 (/opt/rustwide/workdir/crates/kith-common) [INFO] [stderr] Compiling peg v0.6.3 [INFO] [stderr] Compiling synthez v0.3.1 [INFO] [stderr] Compiling gherkin v0.14.0 [INFO] [stderr] Compiling prost-derive v0.13.5 [INFO] [stderr] Compiling clap v4.6.0 [INFO] [stderr] Compiling cucumber-expressions v0.3.0 [INFO] [stderr] Compiling prost v0.13.5 [INFO] [stderr] Compiling cucumber-codegen v0.21.1 [INFO] [stderr] Compiling tonic v0.13.1 [INFO] [stderr] Compiling prost-types v0.13.5 [INFO] [stderr] Compiling cucumber v0.21.1 [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 01s [INFO] running `Command { std: "docker" "inspect" "b6d17592bf25bc4f3dba6f07ad7cc0b0e9382a9d493e28ddbb8d9bd9ef966584", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "b6d17592bf25bc4f3dba6f07ad7cc0b0e9382a9d493e28ddbb8d9bd9ef966584", kill_on_drop: false }` [INFO] [stdout] b6d17592bf25bc4f3dba6f07ad7cc0b0e9382a9d493e28ddbb8d9bd9ef966584 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-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=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+1.95.0" "test" "--frozen", kill_on_drop: false }` [INFO] [stdout] 5564b6dc123f8c3c9814023985cbdec1fbb7e7fed0ecccdec3eef93468d86419 [INFO] running `Command { std: "docker" "start" "-a" "5564b6dc123f8c3c9814023985cbdec1fbb7e7fed0ecccdec3eef93468d86419", kill_on_drop: false }` [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 0.67s [INFO] [stderr] Running tests/acceptance.rs (/opt/rustwide/target/debug/deps/acceptance-8dd652ec3c4b8bec) [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] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/kith_common-61858150b0c54fd3) [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] [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::magnitude_sq_zero_weight_ignores_dimension ... ok [INFO] [stdout] test drift::tests::blacklist_glob_matching ... ok [INFO] [stdout] test config::tests::config_load_nonexistent_returns_none ... ok [INFO] [stdout] test credential::tests::pubkey_from_hex_rejects_invalid ... ok [INFO] [stdout] test event::tests::event_builder ... ok [INFO] [stdout] test drift::tests::magnitude_sq_with_default_weights ... ok [INFO] [stdout] test error::tests::kith_error_display_messages ... ok [INFO] [stdout] test credential::tests::keypair_roundtrip_from_secret ... ok [INFO] [stdout] test drift::tests::reset_clears_all_dimensions ... ok [INFO] [stdout] test credential::tests::pubkey_hex_roundtrip ... ok [INFO] [stdout] test config::tests::inference_provider_config_serialization ... ok [INFO] [stdout] test inference::tests::message_serialization ... ok [INFO] [stdout] test drift::tests::increment_updates_correct_dimension ... ok [INFO] [stdout] test event::tests::event_ids_are_unique ... ok [INFO] [stdout] test inference::tests::stream_chunk_variants ... ok [INFO] [stdout] test drift::tests::blacklist_filters_default_noisy_paths ... 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_rejects_wrong_request_hash ... ok [INFO] [stdout] test credential::tests::keypair_generate_and_sign_verify ... ok [INFO] [stdout] test error::tests::inference_error_display_messages ... ok [INFO] [stdout] test inference::tests::default_inference_config ... ok [INFO] [stdout] test inference::tests::tool_call_serialization ... ok [INFO] [stdout] test event::tests::event_serialization_roundtrip ... ok [INFO] [stdout] test policy::tests::default_policy_has_standard_blacklist ... ok [INFO] [stdout] test policy::tests::scope_lookup_known_user ... 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 policy::tests::scope_lookup_unknown_user_with_tofu ... ok [INFO] [stdout] test policy::tests::viewer_can_query_and_read ... 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_extracts_semver ... ok [INFO] [stdout] test policy::tests::known_user_overrides_tofu ... ok [INFO] [stdout] test tool_registry::tests::capability_tools_excludes_other ... ok [INFO] [stdout] test tool_registry::tests::parse_version_handles_two_part ... ok [INFO] [stdout] test policy::tests::viewer_cannot_execute ... ok [INFO] [stdout] test policy::tests::ops_user_can_do_everything ... ok [INFO] [stdout] test tool_registry::tests::registry_from_entries ... ok [INFO] [stdout] test config::tests::config_load_from_toml_string ... ok [INFO] [stdout] test tool_registry::tests::parse_version_returns_none_for_garbage ... 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 tool_registry::tests::prompt_summary_groups_by_category ... ok [INFO] [stdout] test types::tests::capability_report_serialization ... ok [INFO] [stdout] test inference::tests::tool_definition_serialization ... ok [INFO] [stdout] test tool_registry::tests::prompt_summary_under_budget ... 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.15s [INFO] [stdout] [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/kith_daemon-f660b8b55a5af692) [INFO] [stdout] [INFO] [stdout] running 53 tests [INFO] [stdout] test audit::tests::audit_entries_have_machine_name ... ok [INFO] [stdout] test audit::tests::audit_entries_have_unique_ids ... ok [INFO] [stdout] test audit::tests::record_exec_denied ... ok [INFO] [stdout] test audit::tests::record_change_expired ... ok [INFO] [stdout] test audit::tests::record_change_lifecycle ... ok [INFO] [stdout] test audit::tests::record_exec_success ... ok [INFO] [stdout] test audit::tests::scope_filtering ... ok [INFO] [stdout] test commit::tests::commit_unknown_id_errors ... ok [INFO] [stdout] test commit::tests::rollback_all_removes_all ... ok [INFO] [stdout] test commit::tests::commit_all_removes_all ... ok [INFO] [stdout] test commit::tests::commit_removes_pending ... ok [INFO] [stdout] test commit::tests::rollback_removes_pending ... ok [INFO] [stdout] test commit::tests::tick_does_not_expire_fresh_changes ... ok [INFO] [stdout] test commit::tests::open_creates_pending_change ... ok [INFO] [stdout] test drift::tests::blacklisted_events_ignored ... ok [INFO] [stdout] test drift::tests::custom_blacklist ... ok [INFO] [stdout] test drift::tests::magnitude_matches_spec ... ok [INFO] [stdout] test drift::tests::non_blacklisted_events_counted ... ok [INFO] [stdout] test drift::tests::reset_clears_drift ... ok [INFO] [stdout] test exec::tests::exec_nonexistent_command ... ok [INFO] [stdout] test containment::tests::copy_transaction_commit ... ok [INFO] [stdout] test containment::tests::transaction_manager_rollback ... ok [INFO] [stdout] test containment::tests::copy_transaction_rollback ... ok [INFO] [stdout] test exec::tests::exec_nonzero_exit ... ok [INFO] [stdout] test commit::tests::tick_expires_old_changes ... ok [INFO] [stdout] test commit::tests::custom_duration_per_change ... ok [INFO] [stdout] test commit::tests::multiple_changes_independent_expiry ... ok [INFO] [stdout] test exec::tests::exec_captures_stderr ... ok [INFO] [stdout] test exec::tests::exec_pipeline ... ok [INFO] [stdout] test exec::tests::exec_echo ... ok [INFO] [stdout] test containment::tests::transaction_manager_lifecycle ... ok [INFO] [stdout] test containment::tests::copy_transaction_auto_rollback_on_drop ... ok [INFO] [stdout] test containment::tests::multiple_files_in_one_transaction ... ok [INFO] [stdout] test containment::tests::transaction_manager_rollback_all ... ok [INFO] [stdout] test audit::tests::sink_receives_events ... ok [INFO] [stdout] test service::tests::exec_no_credential_returns_unauthenticated ... ok [INFO] [stdout] test policy::tests::ops_user_allowed_exec ... ok [INFO] [stdout] test policy::tests::viewer_allowed_query ... ok [INFO] [stdout] test policy::tests::expired_credential_rejected ... ok [INFO] [stdout] test policy::tests::wrong_request_hash_rejected ... ok [INFO] [stdout] test policy::tests::unknown_user_denied ... ok [INFO] [stdout] test policy::tests::viewer_denied_exec ... ok [INFO] [stdout] test service::tests::exec_unauthorized_returns_permission_denied ... ok [INFO] [stdout] test policy::tests::tofu_gives_viewer_scope ... ok [INFO] [stdout] test service::tests::query_returns_state ... ok [INFO] [stdout] test exec::tests::exec_timeout ... ok [INFO] [stdout] test service::tests::exec_authorized_returns_output ... ok [INFO] [stdout] test service::tests::exec_creates_audit_entry ... ok [INFO] [stdout] test service::tests::apply_commit_cycle ... ok [INFO] [stdout] test policy::tests::tampered_credential_rejected ... ok [INFO] [stdout] test observer::tests::file_observer_detects_change ... ok [INFO] [stdout] test observer::tests::file_observer_detects_deletion ... ok [INFO] [stdout] test observer::tests::file_observer_detects_new_file ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 53 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.34s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/kith-daemon.rs (/opt/rustwide/target/debug/deps/kith_daemon-98b9bd8f8389b7c8) [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-12d3e1d463851df3) [INFO] [stderr] Running tests/broken_paths.rs (/opt/rustwide/target/debug/deps/broken_paths-f76bdf19d8114731) [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 5 tests [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] test vector_index_populated_from_events ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s [INFO] [stdout] [INFO] [stderr] Running tests/chaos.rs (/opt/rustwide/target/debug/deps/chaos-b44208d30ebcc108) [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_daemon_unreachable_mid_session ... ok [INFO] [stdout] test chaos_commit_window_expiry_race ... ok [INFO] [stdout] test chaos_auth_abuse_doesnt_affect_legit ... ok [INFO] [stdout] test chaos_concurrent_apply_commit ... ok [INFO] [stdout] test chaos_concurrent_exec ... ok [INFO] [stderr] Running tests/containers.rs (/opt/rustwide/target/debug/deps/containers-1a265aa609411773) [INFO] [stdout] [INFO] [stdout] test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.42s [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/drift_sync.rs (/opt/rustwide/target/debug/deps/drift_sync-599bee8e853efe6c) [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_blacklist_prevents_events ... ok [INFO] [stdout] test e2e_drift_multiple_categories ... ok [INFO] [stdout] test e2e_drift_to_sync_to_retrieval ... ok [INFO] [stderr] Running tests/full_flow.rs (/opt/rustwide/target/debug/deps/full_flow-666c604a3e24d9b1) [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] [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_shell_to_daemon_exec ... ok [INFO] [stdout] test e2e_apply_commit_via_shell ... 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.22s [INFO] [stdout] [INFO] [stderr] Running tests/integration_wiring.rs (/opt/rustwide/target/debug/deps/integration_wiring-d990b79d7df8dc00) [INFO] [stdout] [INFO] [stdout] running 10 tests [INFO] [stdout] test config_bow_embedding ... ok [INFO] [stdout] test config_roundtrip_all_sections ... ok [INFO] [stdout] test hybrid_retriever_in_agent ... ok [INFO] [stdout] test agent_with_embedder ... ok [INFO] [stdout] test sqlite_store_persists ... 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] [stdout] [INFO] [stdout] test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.73s [INFO] [stdout] [INFO] [stderr] Running tests/local_model.rs (/opt/rustwide/target/debug/deps/local_model-38dcc38988e5c797) [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-6858fe64eebe9d73) [INFO] [stdout] [INFO] [stdout] running 4 tests [INFO] [stdout] test e2e_passthrough_independent_of_backend ... ok [INFO] [stdout] test e2e_thinking_optional ... ok [INFO] [stdout] test e2e_model_swap_same_workflow ... ok [INFO] [stdout] test e2e_backend_failure_graceful ... 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-646846d7d0cd6374) [INFO] [stdout] [INFO] [stdout] running 6 tests [INFO] [stdout] test e2e_passthrough_latency ... ok [INFO] [stdout] test e2e_escape_hatch ... ok [INFO] [stdout] test e2e_common_commands_recognized ... ok [INFO] [stdout] test e2e_intent_classified_correctly ... ok [INFO] [stdout] test e2e_passthrough_no_inference_call ... ok [INFO] [stdout] test e2e_passthrough_executes_directly ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s [INFO] [stdout] [INFO] [stderr] Running tests/sync_exchange.rs (/opt/rustwide/target/debug/deps/sync_exchange-7c2218a82f6cf0ba) [INFO] [stdout] [INFO] [stdout] running 1 test [INFO] [stdout] test e2e_sync_exchange_between_daemons ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.13s [INFO] [stdout] [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/kith_mesh-0eaf0cf0c0a07a11) [INFO] [stdout] [INFO] [stdout] running 34 tests [INFO] [stdout] test manager::tests::ipv4_fallback ... ok [INFO] [stdout] test manager::tests::ipv4_different_machines ... ok [INFO] [stdout] test manager::tests::ipv4_deterministic ... ok [INFO] [stdout] test manager::tests::ipv6_explicit_prefix ... ok [INFO] [stdout] test manager::tests::ipv6_ula_deterministic ... ok [INFO] [stdout] test manager::tests::ipv6_ula_different_machines_different_ips ... ok [INFO] [stdout] test manager::tests::ipv6_ula_from_mesh_identifier ... ok [INFO] [stdout] test manager::tests::ipv6_ula_different_meshes_different_prefixes ... ok [INFO] [stdout] test manager::tests::manager_has_mesh_ip ... 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] test peer::tests::subscribe_receives_events ... ok [INFO] [stdout] test manager::tests::announce_publishes_to_signaling ... ok [INFO] [stdout] test manager::tests::discover_skips_self ... ok [INFO] [stdout] test peer::tests::expire_stale_removes_old_peers ... ok [INFO] [stdout] test peer::tests::is_reachable_false_by_default ... ok [INFO] [stdout] test peer::tests::multiple_peers_tracked ... ok [INFO] [stdout] test peer::tests::peer_endpoint_change_emits_event ... ok [INFO] [stdout] test peer::tests::remove_peer_emits_left_event ... ok [INFO] [stdout] test peer::tests::remove_unknown_peer_returns_none ... ok [INFO] [stdout] test peer::tests::duplicate_peer_same_endpoint_no_event ... ok [INFO] [stdout] test peer::tests::set_connected_makes_reachable ... ok [INFO] [stdout] test manager::tests::refresh_connectivity_updates_registry ... ok [INFO] [stdout] test peer::tests::new_peer_emits_joined_event ... ok [INFO] [stdout] test peer::tests::stale_peer_event_rejected ... ok [INFO] [stdout] test signaling::tests::multiple_machines ... ok [INFO] [stdout] test signaling::tests::publish_and_fetch ... ok [INFO] [stdout] test signaling::tests::publish_replaces_existing ... ok [INFO] [stdout] test signaling::tests::shared_signaling_visible_across_nodes ... ok [INFO] [stdout] test wireguard::tests::add_and_check_peer ... 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::simulate_handshake ... 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-41379219deaeb504) [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::absolute_path_is_passthrough ... 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::natural_language_is_intent ... ok [INFO] [stdout] test classify::tests::known_command_is_passthrough ... ok [INFO] [stdout] test classify::tests::unknown_command_is_intent ... ok [INFO] [stdout] test context::tests::new_context_is_empty ... ok [INFO] [stdout] test context::tests::compaction_keeps_system_and_tail ... 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_replaced_not_duplicated ... ok [INFO] [stdout] test context::tests::tool_result_added ... ok [INFO] [stdout] test context::tests::system_prompt_set ... ok [INFO] [stdout] test context::tests::user_and_assistant_messages ... ok [INFO] [stdout] test classify::tests::empty_input_is_passthrough ... ok [INFO] [stdout] test agent::tests::backend_unavailable_degrades ... ok [INFO] [stdout] test agent::tests::intent_produces_tool_call ... 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::index_event_embeds_exec_events ... ok [INFO] [stdout] test agent::tests::apply_tool_with_paths ... ok [INFO] [stdout] test agent::tests::index_event_skips_system_events ... ok [INFO] [stdout] test agent::tests::passthrough_command ... ok [INFO] [stdout] test agent::tests::intent_produces_text ... ok [INFO] [stdout] test agent::tests::context_accumulates ... ok [INFO] [stdout] test agent::tests::empty_input ... ok [INFO] [stdout] test classify::tests::from_path_env_finds_real_commands ... ok [INFO] [stdout] test inference::openai_compat::tests::message_conversion_tool_calls ... 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_system ... ok [INFO] [stdout] test mock_backend::tests::mock_default_response_when_queue_empty ... 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 agent::tests::escape_hatch ... ok [INFO] [stdout] test daemon_client::tests::e2e_unauthorized_exec ... 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 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 daemon_client::tests::e2e_apply_commit_cycle ... 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 inference::anthropic::tests::request_has_correct_defaults ... ok [INFO] [stdout] test inference::anthropic::tests::tool_calls_converted ... ok [INFO] [stdout] test inference::anthropic::tests::message_conversion_system_extracted ... ok [INFO] [stdout] test inference::anthropic::tests::tool_result_converted ... ok [INFO] [stdout] test inference::openai_compat::tests::endpoint_trailing_slash_stripped ... ok [INFO] [stdout] test inference::openai_compat::tests::request_no_tools ... ok [INFO] [stdout] test pty::tests::exec_pipeline ... ok [INFO] [stdout] test inference::anthropic::tests::tools_serialized_with_input_schema ... ok [INFO] [stdout] test inference::openai_compat::tests::request_building ... ok [INFO] [stdout] test inference::openai_compat::tests::from_config_reads_env ... ok [INFO] [stdout] test pty::tests::exec_with_exit_code ... 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.11s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/kith.rs (/opt/rustwide/target/debug/deps/kith-98516abf648be5ab) [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_state-4f1e8a1d101a3c33) [INFO] [stdout] [INFO] [stdout] running 27 tests [INFO] [stdout] test retrieval::tests::search_by_path ... ok [INFO] [stdout] test retrieval::tests::search_by_event_type ... ok [INFO] [stdout] test retrieval::tests::search_case_insensitive ... ok [INFO] [stdout] test retrieval::tests::search_by_detail ... ok [INFO] [stdout] test retrieval::tests::search_limits_results ... ok [INFO] [stdout] test retrieval::tests::search_multi_term ... ok [INFO] [stdout] test retrieval::tests::search_no_matches ... ok [INFO] [stdout] test retrieval::tests::search_ranks_by_score ... ok [INFO] [stdout] test vector_index::tests::clear_removes_all ... ok [INFO] [stdout] test retrieval::tests::search_respects_scope ... ok [INFO] [stdout] test hybrid::tests::hybrid_keyword_only_when_no_embeddings ... ok [INFO] [stdout] test embedding::tests::bow_similar_texts_closer ... ok [INFO] [stdout] test hybrid::tests::hybrid_respects_weights ... ok [INFO] [stdout] test embedding::tests::bow_empty_text ... ok [INFO] [stdout] test embedding::tests::bow_normalized ... ok [INFO] [stdout] test embedding::tests::bow_batch ... ok [INFO] [stdout] test vector_index::tests::cosine_identical_vectors ... ok [INFO] [stdout] test vector_index::tests::empty_index_returns_nothing ... ok [INFO] [stdout] test vector_index::tests::cosine_opposite_vectors ... ok [INFO] [stdout] test hybrid::tests::hybrid_deduplicates_across_sources ... ok [INFO] [stdout] test vector_index::tests::cosine_orthogonal_vectors ... ok [INFO] [stdout] test embedding::tests::bow_embed_produces_vector ... ok [INFO] [stdout] test vector_index::tests::insert_and_search ... ok [INFO] [stdout] test vector_index::tests::search_respects_model_version ... ok [INFO] [stdout] test hybrid::tests::hybrid_combines_keyword_and_vector ... ok [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/kith_sync-fcb7bc03448fc3df) [INFO] [stdout] test api_embedding::tests::ollama_constructor ... ok [INFO] [stdout] test api_embedding::tests::endpoint_trailing_slash ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 27 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.17s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 23 tests [INFO] [stdout] test store::tests::empty_store ... ok [INFO] [stdout] test store::tests::filter_by_event_type ... ok [INFO] [stdout] test store::tests::filter_by_scope_public_excludes_ops ... ok [INFO] [stdout] test store::tests::filter_with_limit ... ok [INFO] [stdout] test store::tests::merge_adds_new_events ... ok [INFO] [stdout] test store::tests::merge_notifies_subscribers ... ok [INFO] [stdout] test store::tests::subscribe_receives_new_events ... ok [INFO] [stdout] test store::tests::write_and_query_all ... ok [INFO] [stdout] test sqlite_store::tests::filter_with_limit ... ok [INFO] [stdout] test sqlite_store::tests::filter_by_category ... ok [INFO] [stdout] test store::tests::filter_by_machine ... ok [INFO] [stdout] test sqlite_store::tests::write_and_read ... ok [INFO] [stdout] test sqlite_store::tests::crdt_not_available_gracefully ... ok [INFO] [stdout] test sqlite_store::tests::filter_by_scope ... ok [INFO] [stdout] test sqlite_store::tests::every_event_category_roundtrips ... ok [INFO] [stdout] test sqlite_store::tests::merge_adds_new ... ok [INFO] [stdout] test sqlite_store::tests::filter_by_machine ... ok [INFO] [stdout] test sqlite_store::tests::subscribe_receives ... ok [INFO] [stdout] test store::tests::merge_deduplicates_by_id ... ok [INFO] [stdout] test sqlite_store::tests::roundtrip_preserves_fields ... ok [INFO] [stdout] test sqlite_store::tests::merge_deduplicates ... ok [INFO] [stdout] test store::tests::filter_by_category ... 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.05s [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] [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_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] [stderr] Doc-tests kith_mesh [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] [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] [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] [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" "5564b6dc123f8c3c9814023985cbdec1fbb7e7fed0ecccdec3eef93468d86419", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "5564b6dc123f8c3c9814023985cbdec1fbb7e7fed0ecccdec3eef93468d86419", kill_on_drop: false }` [INFO] [stdout] 5564b6dc123f8c3c9814023985cbdec1fbb7e7fed0ecccdec3eef93468d86419