8000 build(deps): bump the cargo group across 1 directory with 22 updates by dependabot[bot] · Pull Request #2844 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content

build(deps): bump the cargo group across 1 directory with 22 updates - #2844

Open
dependabot[bot] wants to merge 2 commits into
mainfrom
dependabot/cargo/cargo-1faa5e5e04
Open

dependabot[bot] wants to merge 2 commits into
mainfrom
dependabot/cargo/cargo-1faa5e5e04

Conversation

@dependabot
@dependabot dependabot Bot commented on behalf of github Nov 2, 2026
Copy link
Copy Markdown
Contributor

Bumps the cargo group with 22 updates in the / directory:

Package From To
aes-gcm 0.11.0 0.11.1
async-compression 0.4.50 0.4.51
getrandom 0.3.4 0.4.3
google-cloud-auth 1.17.0 1.18.0
google-cloud-storage 1.20.0 1.21.0
jaq-all 0.3.0 0.4.0
libc 0.2.190 0.2.191
opentelemetry-otlp 0.33.0 0.33.1
russh 0.64.1 0.65.0
size 0.5.0 0.6.0
smallvec 1.16.3 1.16.4
sysinfo 0.39.6 0.40.0
tokio 1.53.3 1.54.1
tonic 0.14.6 0.14.9
tonic-prost 0.14.6 0.14.9
tonic-prost-build 0.14.6 0.14.9
unicode-width 0.2.2 0.2.3
uuid 1.28.0 1.29.0
zeroize 1.9.0 1.9.1
globset 0.4.20 0.4.21
rustls-native-certs 0.8.4 0.8.5
tokio-rustls 0.26.5 0.26.6

Updates aes-gcm from 0.11.0 to 0.11.1

Commits

Updates async-compression from 0.4.50 to 0.4.51

Release notes

Sourced from async-compression's releases.

async-compression-v0.4.51

Added

  • (zstd) add mzstd v0.2.5 (#505)

Other

  • add keywords to compression crates (#502)
Commits

Updates getrandom from 0.3.4 to 0.4.3

Changelog

Sourced from getrandom's changelog.

0.4.3 - 2026-06-17

Added

  • wasm64-unknown-unknown target support for wasm_js backend #848

Changed

  • Drop wasip2 and wasip3 dependencies in favor of manual bindings #830

#830: rust-random/getrandom#830 #848: rust-random/getrandom#848

0.4.2 - 2026-03-03

Changed

  • Bump r-efi dependency to v6 #814

Fixed

  • Read errno only when it is set #810
  • Check the return value of ProcessPrng on Windows #811

#810: rust-random/getrandom#810 #811: rust-random/getrandom#811 #814: rust-random/getrandom#814

0.4.1 - 2026-02-03

Fixed

  • Documentation build on docs.rs #801

#801: rust-random/getrandom#801

0.4.0 - 2026-02-02

Added

  • RawOsError type alias #739
  • SysRng behind new feature sys_rng #751
  • WASIp3 support #779
  • extern_impl opt-in backend #786 #794
  • Motor OS support #797

Changed

  • Use Edition 2024 and MSRV 1.85 #749

#739: 8000 rust-random/getrandom#739 #749: rust-random/getrandom#749 #751: rust-random/getrandom#751 #779: rust-random/getrandom#779

... (truncated)

Commits

Updates google-cloud-auth from 1.17.0 to 1.18.0

Commits

Updates google-cloud-storage from 1.20.0 to 1.21.0

Commits

Updates jaq-all from 0.3.0 to 0.4.0

Commits

Updates libc from 0.2.190 to 0.2.191

Release notes

Sourced from libc's releases.

0.2.191

Support

  • Emscripten: Support v4.0.12 to v6.0.11 (#5610)

Added

  • Apple: Add F_SETNOSIGPIPE and F_GETNOSIGPIPE (#5609)
  • Apple: add ifaliasreq and in6_aliasreq (#5557)
  • FreeBSD: Add PT_* constants (#5625)
  • Haiku: Add AI_* and NI_* constants from netdb.h (#5585)
  • Hurd: Add POSIX_SPAWN_* flags (#5578)
  • NuttX: Add AT_SYMLINK_NOFOLLOW (#5614)
  • OpenBSD: Add sensordev (#5534)
  • QuRT: Add isatty (#5618)
  • WASI: Add pthread_condattr_{get,set}clock (#5626)

Fixed

  • FreeBSD-aarch64: Fix gpregs and fpregs (#5603)

Changed

  • AIX: Restore 'c_ulong' as the type of 'statvfs.f_fsid'. (#5616)
  • Android: Make prop_info an extern type (#5561)
  • Apple: Mach API is now available on non-MacOS targets again. This should resolve some issues building ecosystem crates. (#5612), (#5636)
  • FreeBSD: Add back NOTE_PCTRLMASK with a deprecation warning (#5600)
Changelog

Sourced from libc's changelog.

0.2.191 - 2026-10-16

Support

  • Emscripten: Support v4.0.12 to v6.0.11 (#5610)

Added

  • Apple: Add F_SETNOSIGPIPE and F_GETNOSIGPIPE (#5609)
  • Apple: add ifaliasreq and in6_aliasreq (#5557)
  • FreeBSD: Add PT_* constants (#5625)
  • Haiku: Add AI_* and NI_* constants from netdb.h (#5585)
  • Hurd: Add POSIX_SPAWN_* flags (#5578)
  • NuttX: Add AT_SYMLINK_NOFOLLOW (#5614)
  • OpenBSD: Add sensordev (#5534)
  • QuRT: Add isatty (#5618)
  • WASI: Add pthread_condattr_{get,set}clock (#5626)

Fixed

  • FreeBSD-aarch64: Fix gpregs and fpregs (#5603)

Changed

  • AIX: Restore 'c_ulong' as the type of 'statvfs.f_fsid'. (#5616)
  • Android: Make prop_info an extern type (#5561)
  • Apple: Mach API is now available on non-MacOS targets again. This should resolve some issues building ecosystem crates. (#5612), (#5636)
  • FreeBSD: Add back NOTE_PCTRLMASK with a deprecation warning (#5600)
Commits
  • ccc2ff4 libc: Release 0.2.191
  • bce6efb apple: Add mach_task_self and mach_task_self_ to semver checks
  • ecf4fd4 apple: Re-restrict mach_vm_map to MacOS-only
  • b0e0423 Revert "apple: Disable mach.h API on Apple mobile OSs"
  • 9c7f568 apple: add ifaliasreq and in6_aliasreq
  • 018c7e9 wasi: Add pthread_condattr_{get,set}clock
  • 2c77185 openbsd: add sensordev structure
  • e10813c hurd: Add missing POSIX_SPAWN_* flags
  • 2ea4bc1 Fix FreeBSD/aarch64
  • 6d666fd dragonfly: Parse version from headers rather than CLI
  • Additional commits viewable in compare view

Updates opentelemetry-otlp from 0.33.0 to 0.33.1

Commits
  • 372ebbc chore: prepare 0.33.1 release and stabilize OTLP logs and metrics (#3782)
  • 5582e71 docs(logs): polish design doc and fill perf numbers (#3566)
  • 7ce1269 fix(sdk): log when the periodic metrics reader panics (#3777)
  • b547036 fix(prometheus): keep resource labels when scope info is disabled (#3751)
  • e8480db chore(deps): bump rust-toolchain from 1.98.0 to 1.99.0 (#3770)
  • 0fdfc48 feat(proto): Add support for protobuffer descriptor output (#3675)
  • 87929d7 ci: install markdown-link-check from npm (#3661)
  • ff2ab2d docs(trace): explain async context propagation (#3759)
  • 2595432 fix(proto): accept omitted default fields in OTLP/JSON exponential histogram,...
  • 952bdee fix: accept optional whitespace in TraceState (#3761)
  • Additional commits viewable in compare view

Updates russh from 0.64.1 to 0.65.0

Release notes

Sourced from russh's releases.

v0.65.0

Breaking changes

  • d507707: feat(server): expose the publickey algorithms to Handler (#785) (@​Eric-D) #785
    • Handler::auth_publickey_offered now takes a server::PublicKeyOffer and Handler::auth_publickey takes a server::VerifiedPublicKey instead of &PublicKey. Read the key from the public_key field. The new algorithm field makes accessible the signature algorithm used by the client, allowing the server to react to it
  • 62efa5a: Remove the no-op async-trait dependency and crate feature (#786) (@​FalkWoldmann) #786

Security fixes

GHSA-9wfm-jcj8-jfv9 - russh's SSH agent server is susceptible to unbound allocations via repeated SSH_AGENT_CONSTRAIN_CONFIRM messages

  • 23aa5d2 - A malicious SSH agent client can trigger unbounded allocations in russh based agents

GHSA-4p9f-7p9m-5vfg - russh's SSH client is susceptible to unbounded allocations via EXT_INFO packets

  • b33e93b - russh did not limit the number of EXT_INFO messages that a malicious server can send, leading to unbounded memory growth over time

GHSA-fw5c-8223-6h42 - russh: peer-declared zero maximum packet size permanently stalls channel writes

  • 39cb9db - malicious peers can hang up the channel by setting max packet size to zero

GHSA-662x-8wvj-2276 - pageant: unbounded frame buffering on peer-controlled 4-byte length prefix

  • 69e4b55 - a malicious SSH agent client can trigger unbounded allocations in russh based agents

GHSA-vp5q-ff62-jwqv - Agent server never calls Agent::confirm

  • 62db6e7 - Agent::confirm was defunct and never got called by the agent server

GHSA-3hm4-p7h4-rvwp - russh: pre-authentication stack exhaustion via nested OpenSSH certificates

  • 730d663 - a malicious client could trigger a stack overflow via a crafted OpenSSH certificate

Features

  • d65823f: feat(client): support OpenSSH agent session binding (#794) (@​inureyes) #794
    • Exposes the verified initial key-exchange data through a typed AgentSessionBinding. You need it to send session-bind@openssh.com for OpenSSH destination-constrained agent keys.

Fixes

  • 13c94f0: Fix channel window accounting on window adjust (#790) (@​notsapinho) #790
  • e2bdf85: client: keep the session usable when a Signer fails after PK_OK (#788) (@​meanaverage) #788
  • b10506e: Re-arm the client keepalive timer before authentication (#791) (@​Bokjan) #791
    • Fixes the client session task spinning on a CPU core when the keepalive timer fired before authentication.
  • c1fada1: fix(agent): honor SSH_AGENT_RSA_SHA2_* flags when signing with RSA keys (#796) (@​mdevolde) #796
  • 3beb126: client: don't arm the rekey timer on wasm32 (#797) (@​biao29) #797

New Contributors

... (truncated)

Commits

Updates size from 0.5.0 to 0.6.0

Release notes

Sourced from size's releases.

prettysize-rs 0.6.0

This release is technically non-breaking and probably could have been released as 0.5.1 but since it introduces new convenience methods and rejects some (invalid) inputs that were previously accepted by Size::from_str(), I'm releasing it as 0.6.0 to be safe.

What's Changed

  • Implement std::iter::Sum by @​amitayh in neosmart/prettysize-rs#15
  • Allow using fmt::Display without std by @​nobbele in neosmart/prettysize-rs#17
  • Implement Size::ubytes() to get unsigned size as suggested by @​kevinchannon in #16
  • Increase strictness of Size::from_str() when it comes to out-of-range or nonsensical values (66f6e8734c62525dfe1f1e726861dcf829ea601b)
  • Add Size::new() and Size::const_new() helpers as aliases for from_bytes() and from_const() to make the crate friendlier to use for newcomers (fe453c37e1177359286bad035f744101a5f429b6)
  • Fix a panic when parsing invalid size strings that contain non-ascii sequences with String::from_str(), as reported by @​jessekrubin

New Contributors

Full Changelog: neosmart/prettysize-rs@0.5.0...0.6.0

On crates.io: https://crates.io/crates/size

Commits
  • 5eb283f Bump to version 0.6.0
  • 9f9849a Add Size::ubytes() to get size as a u64
  • f4787f1 Clarify Size formatting restrictions in no_std mode
  • dad0c82 Re-enable some doc tests under no_std now that formatting is possible
  • 1a3fb31 Allow using fmt::Display without std (#17)
  • 9578e89 Explicitly denote elided lifetime
  • fe453c3 Add Size::const_new() and Size::new() aliases/helpers
  • 66f6e87 Reject some edge cases when parsing sizes from strings
  • 1ac08de Address lint about redundant/superseded Cargo.toml package property
  • 01990ff Fix errantly splitting on non-ascii byte boundaries
  • Additional commits viewable in compare view

Updates smallvec from 1.16.3 to 1.16.4

Release notes

Sourced from smallvec's releases.

v1.16.4

What's Changed

Full Changelog: servo/rust-smallvec@v1.16.3...v1.16.4

Commits 8000

Updates sysinfo from 0.39.6 to 0.40.0

Changelog

Sourced from sysinfo's changelog.

0.40.0

  • Add new gpu feature.
  • Add new Process::gpu_usage and Process::gpu_memory API.
  • Add new GPUs API.
  • Add new NetworkData::transmit_link_speed and NetworkData::receive_link_speed API.
  • Add new Disk::id API.
  • Remove IS_SUPPORTED_SYSTEM constant.
  • Remove set_open_files_limit API.
  • Remove list[_mut] methods for Users, Components and Disks.
  • Remove Networks::list method.
  • Remove From trait implementations for Users, Groups and Disks.
  • Fix Networks refresh.
  • Networks interface names have been switched from String to OsString.
  • Unix: Fix not thread-safe code in Groups.
  • Unix: Fix potential crash when a user's group cannot be retrieved.
  • Linux: Correctly mark a process as existing after update.
  • Linux: Fix cgroup memory information retrieval.
  • Linux: Multiple performance optimizations and memory usage reduction.
  • Linux: Fixes for thermal zone temperatures.
  • Linux: Keep Component max temperature across refreshes.
  • Android: Fall back to /proc/cpuinfo when /proc/stat is unreadable.
  • Raspberry Pi: Fix toolchain package name in README.
  • FreeBSD/NetBSD: Fix System::free_memory and System::available_memory.
  • FreeBSD: Correctly query sysctl values.
  • FreeBSD: Fix swap memory information retrieval.
  • NetBSD: Fix Process::accumulated_cpu_time unit.
  • macOS: Implement System::open_files_limit.
  • macOS: Fix bug in Disks::refresh.
  • iOS: Mark Networks as unsupported.
  • iOS: Make Process::open_files return None.
  • Windows: Don't keep thread-less processes alive.
  • Windows: Fix CPU brand on ARM64.
  • Windows: Fix crash in Components::refresh.
Commits
  • 48972c4 Merge pull request #1784 from GuillaumeGomez/update
  • f412287 Update crate version to 0.40.0
  • f158d77 Improve wording
  • 8b0fd35 Update migration guide for 0.40
  • 355bd2d Update changelog for 0.40.0
  • 79cff2d Merge pull request #1783 from pkubaj/be-fbsd-fix
  • df67344 FreeBSD: check sysctl value sizes and use the kernel's C types
  • 936a010 Merge pull request #1782 from GuillaumeGomez/components-cleanup
  • 457cc92 Remove Components::list[_mut] methods
  • edd9ae6 Merge pull request #1780 from GuillaumeGomez/cleanup-network
  • Additional commits viewable in compare view

Updates tokio from 1.53.3 to 1.54.1

Release notes

Sourced from tokio's releases.

Tokio v1.54.1

1.54.1 (October 21st, 2026)

Fixed

  • time: revert "remove the runtime handle from timers" (#8692)

#8692: tokio-rs/tokio#8692

Tokio v1.54.0

1.54.0 (October 19th, 2026)

The 1.54.0 release includes all changes up to 1.53.3.

The MSRV is increased to 1.85. (#8514)

Added

  • fs: add File::set_times, File::set_modified, and fs::FileTimes (#8504)
  • net: implement Default for named_pipe::{ClientOptions, ServerOptions} (#8378)
  • runtime: add Builder::max_io_events_per_busy_tick (#8410)
  • runtime: stabilize tokio::runtime::worker_index() (#8431)
  • sync: add SemaphorePermit::semaphore() (#8482)
  • sync: add blocking_acquire methods to Semaphore (#8269)
  • sync: add watch::Receiver::is_closed (#8481)
  • wasm: support JSPI for Emscripten target (#8285, #8627)
  • wasm: support the wasm32-unknown-emscripten target (#8281, #8422, #8528, #8628)

Changed

  • fs: reject zero in File::set_max_buf_size (#8449)
  • io: make copy_buf cooperative (#8459)
  • io: panic when BufReader or BufStream is created with zero capacity (#8494)
  • io: panic when in-memory pipe is created with zero capacity (#8397)
  • io: reject zero buffer size in copy_bidirectional_with_sizes (#8454)
  • io: support vectored writes in Sink (#8663)
  • net: start UnixStream::pair and UnixDatagram::pair sockets as writable (#8444)
  • net: start accepted sockets as readable and writable (#8435)
  • net: support UCred on Fuchsia (#8257)
  • process: use mio::unix::pipe for Unix child stdio (#8603)
  • runtime: cache-pad the shared injection queue and idle state (#8622)
  • runtime: decide auto-boxing of spawned futures at monomorphization time (#8414)
  • runtime: make enable_io available whenever rt is enabled (#8387)
  • runtime: move block_in_place setup into a non-generic function (#8315)
  • runtime: move the multi-thread inject queue to its own mutex (#8382)
  • runtime: panic when max_io_events_per_tick is zero (#8476)
  • runtime: suggest .await in nested block_on panic message (#8501)
  • sync: avoid atomic reader count in broadcast slots (#8357)
  • sync: use acquire/release orderings in Notify (#8325)
  • time: remove the runtime handle from timers (#8458)

... (truncated)

Commits

Updates tonic from 0.14.6 to 0.14.9

Release notes

Sourced from tonic's releases.

tonic-build-v0.14.9

Fixed

  • fix/silence all clippy warnings (#2807)

Other

  • fix changelog duplicate and update repository URLs (#2943)
  • License update (#2749)

tonic-health-v0.14.9

Other

  • fix changelog duplicate and update repository URLs (#2943)
  • License update (#2749)

tonic-prost-build-v0.14.9

Fixed

  • fix/silence all clippy warnings (#2807)

Other

  • fix changelog duplicate and update repository URLs (#2943)
  • License update (#2749)

tonic-prost-v0.14.9

Fixed

  • fix/silence all clippy warnings (#2807)

Other

  • fix changelog duplicate and update repository URLs (#2943)
  • relax codec Default bounds (#2681)
  • License update (#2749)

tonic-reflection-v0.14.9

Fixed

  • (reflection) preserve custom options in served descriptors (#2730)

Other

  • fix changelog duplicate and update repository URLs (#2943)
  • enable missing feature for test build (#2820)
  • License update (#2749)

tonic-types-v0.14.9

Fixed

... (truncated)

Commits
  • 4c0f455 chore: release v0.14.9 (#2979)
  • 4ee0483 fix(server): set a timer on HTTP/1 connections so hyper's header read timeout...
  • a47b608 feat(transport): expose h2 reset stream settings on Endpoint (#2972)
  • 349166e grpc/load_balancing: Add address-checked subchannel helpers to TestEnv. (#2938)
  • 78a8f2d feat(tonic-xds): expose ADS keepalive knob in config (#2973)
  • 954d6d7 xds-client: align ADS keepalive defaults with other gRPC languages (#2970)
  • 4b61ef9 xds-client: add grpc crate transport implementation (#2920)
  • 5413799 chore: release v0.14.8 (#2966)
  • b8282b9 fix(tonic-web): fix dropped trailers in combined streaming call. (#2474)
  • 818532d chore: release v0.14.7 (#2800)
  • Additional commits viewable in compare view

Updates tonic-prost from 0.14.6 to 0.14.9

Release notes

Sourced from tonic-prost's releases.

tonic-prost-build-v0.14.9

Fixed

  • fix/silence all clippy warnings (#2807)

Other

  • fix changelog duplicate and update repository URLs (#2943)
  • License update (#2749)

tonic-prost-v0.14.9

Fixed

  • fix/silence all clippy warnings (#2807)

Other

  • fix changelog duplicate and update repository URLs (#2943)
  • relax codec Default bounds (#2681)
  • License update (#2749)

tonic-prost-build-v0.14.8

Fixed

  • fix/silence all clippy warnings (#2807)

Other

  • fix changelog duplicate and update repository URLs (#2943)
  • License update (#2749)

tonic-prost-v0.14.8

Fixed

  • fix/silence all clippy warnings (#2807)

Other

  • fix changelog duplicate and update repository URLs (#2943)
  • relax codec Default bounds (#2681)
  • License update (#2749)

tonic-prost-build-v0.14.7

Fixed

  • fix/silence all clippy warnings (#2807)

Other

  • fix changelog duplicate and update repository URLs (#2943)

... (truncated)

Commits
  • 4c0f455 chore: release v0.14.9 (#2979)
  • 4ee0483 fix(server): set a timer on HTTP/1 connections so hyper's header read timeout...
  • a47b608 feat(transport): expose h2 reset stream settings on Endpoint (#2972)
  • 349166e grpc/load_balancing: Add address-checked subchannel helpers to TestEnv. (#2938)
  • 78a8f2d feat(tonic-xds): expose ADS keepalive knob in config (#2973)
  • 954d6d7 xds-client: align ADS keepalive defaults with other gRPC languages (#2970)
  • 4b61ef9 xds-client: add grpc crate transport implementation (#2920)
  • 5413799 chore: release v0.14.8 (#2966)
  • b8282b9 fix(tonic-web): fix dropped trailers in combined streaming call. (#2474)
  • 818532d chore: release v0.14.7 (#2800)
  • Additional commits viewable in compare view

Updates tonic-prost-build from 0.14.6 to 0.14.9

Release notes

Sourced from tonic-prost-build's releases.

tonic-prost-build-v0.14.9

Fixed

  • fix/silence all clippy warnings (#2807)

Other

  • fix changelog duplicate and update repository URLs (#2943)
  • License update (#2749)

tonic-prost-build-v0.14.8

Fixed

  • fix/silence all clippy warnings (#2807)

Other

  • fix changelog duplicate and update repository URLs (#2943)
  • License update (#2749)

tonic-prost-build-v0.14.7

Fixed

  • fix/silence all clippy warnings (#2807)

Other

  • fix changelog duplicate and update repository URLs (#2943)
  • License update (#2749)
Commits

Bumps the cargo group with 22 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [aes-gcm](https://github.com/RustCrypto/AEADs) | `0.11.0` | `0.11.1` |
| [async-compression](https://github.com/Nullus157/async-compression) | `0.4.50` | `0.4.51` |
| [getrandom](https://github.com/rust-random/getrandom) | `0.3.4` | `0.4.3` |
| [google-cloud-auth](https://github.com/googleapis/google-cloud-rust) | `1.17.0` | `1.18.0` |
| [google-cloud-storage](https://github.com/googleapis/google-cloud-rust) | `1.20.0` | `1.21.0` |
| [jaq-all](https://github.com/01mf02/jaq) | `0.3.0` | `0.4.0` |
| [libc](https://github.com/rust-lang/libc) | `0.2.190` | `0.2.191` |
| [opentelemetry-otlp](https://github.com/open-telemetry/opentelemetry-rust) | `0.33.0` | `0.33.1` |
| [russh](https://github.com/warp-tech/russh) | `0.64.1` | `0.65.0` |
| [size](https://github.com/neosmart/prettysize-rs) | `0.5.0` | `0.6.0` |
| [smallvec](https://github.com/servo/rust-smallvec) | `1.16.3` | `1.16.4` |
| [sysinfo](https://github.com/GuillaumeGomez/sysinfo) | `0.39.6` | `0.40.0` |
| [tokio](https://github.com/tokio-rs/tokio) | `1.53.3` | `1.54.1` |
| [tonic](https://github.com/grpc/grpc-rust) | `0.14.6` | `0.14.9` |
| [tonic-prost](https://github.com/grpc/grpc-rust) | `0.14.6` | `0.14.9` |
| [tonic-prost-build](https://github.com/grpc/grpc-rust) | `0.14.6` | `0.14.9` |
| [unicode-width](https://github.com/unicode-rs/unicode-width) | `0.2.2` | `0.2.3` |
| [uuid](https://github.com/uuid-rs/uuid) | `1.28.0` | `1.29.0` |
| [zeroize](https://github.com/RustCrypto/utils) | `1.9.0` | `1.9.1` |
| [globset](https://github.com/BurntSushi/ripgrep) | `0.4.20` | `0.4.21` |
| [rustls-native-certs](https://github.com/rustls/rustls-native-certs) | `0.8.4` | `0.8.5` |
| [tokio-rustls](https://github.com/rustls/tokio-rustls) | `0.26.5` | `0.26.6` |



Updates `aes-gcm` from 0.11.0 to 0.11.1
- [Commits](RustCrypto/AEADs@aes-gcm-v0.11.0...aes-gcm-v0.11.1)

Updates `async-compression` from 0.4.50 to 0.4.51
- [Release notes](https://github.com/Nullus157/async-compression/releases)
- [Commits](Nullus157/async-compression@async-compression-v0.4.50...async-compression-v0.4.51)

Updates `getrandom` from 0.3.4 to 0.4.3
- [Changelog](https://github.com/rust-random/getrandom/blob/master/CHANGELOG.md)
- [Commits](rust-random/getrandom@v0.3.4...v0.4.3)

Updates `google-cloud-auth` from 1.17.0 to 1.18.0
- [Release notes](https://github.com/googleapis/google-cloud-rust/releases)
- [Commits](https://github.com/googleapis/google-cloud-rust/commits)

Updates `google-cloud-storage` from 1.20.0 to 1.21.0
- [Release notes](https://github.com/googleapis/google-cloud-rust/releases)
- [Commits](https://github.com/googleapis/google-cloud-rust/commits)

Updates `jaq-all` from 0.3.0 to 0.4.0
- [Release notes](https://github.com/01mf02/jaq/releases)
- [Commits](https://github.com/01mf02/jaq/commits)

Updates `libc` from 0.2.190 to 0.2.191
- [Release notes](https://github.com/rust-lang/libc/releases)
- [Changelog](https://github.com/rust-lang/libc/blob/0.2.191/CHANGELOG.md)
- [Commits](rust-lang/libc@0.2.190...0.2.191)

Updates `opentelemetry-otlp` from 0.33.0 to 0.33.1
- [Release notes](https://github.com/open-telemetry/opentelemetry-rust/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/main/docs/release_0.32.md)
- [Commits](open-telemetry/opentelemetry-rust@opentelemetry-otlp-0.33.0...opentelemetry-otlp-0.33.1)

Updates `russh` from 0.64.1 to 0.65.0
- [Release notes](https://github.com/warp-tech/russh/releases)
- [Commits](Eugeny/russh@v0.64.1...v0.65.0)

Updates `size` from 0.5.0 to 0.6.0
- [Release notes](https://github.com/neosmart/prettysize-rs/releases)
- [Commits](neosmart/prettysize-rs@0.5.0...0.6.0)

Updates `smallvec` from 1.16.3 to 1.16.4
- [Release notes](https://github.com/servo/rust-smallvec/releases)
- [Commits](smallvec/smallvec@v1.16.3...v1.16.4)

Updates `sysinfo` from 0.39.6 to 0.40.0
- [Changelog](https://github.com/GuillaumeGomez/sysinfo/blob/main/CHANGELOG.md)
- [Commits](GuillaumeGomez/sysinfo@v0.39.6...v0.40.0)

Updates `tokio` from 1.53.3 to 1.54.1
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](tokio-rs/tokio@tokio-1.53.3...tokio-1.54.1)

Updates `tonic` from 0.14.6 to 0.14.9
- [Release notes](https://github.com/grpc/grpc-rust/releases)
- [Changelog](https://github.com/grpc/grpc-rust/blob/master/CHANGELOG.md)
- [Commits](grpc/grpc-rust@tonic-v0.14.6...tonic-v0.14.9)

Updates `tonic-prost` from 0.14.6 to 0.14.9
- [Release notes](https://github.com/grpc/grpc-rust/releases)
- [Changelog](https://github.com/grpc/grpc-rust/blob/master/CHANGELOG.md)
- [Commits](grpc/grpc-rust@tonic-prost-v0.14.6...tonic-prost-v0.14.9)

Updates `tonic-prost-build` from 0.14.6 to 0.14.9
- [Release notes](https://github.com/grpc/grpc-rust/releases)
- [Changelog](https://github.com/grpc/grpc-rust/blob/master/CHANGELOG.md)
- [Commits](grpc/grpc-rust@tonic-prost-build-v0.14.6...tonic-prost-build-v0.14.9)

Updates `unicode-width` from 0.2.2 to 0.2.3
- [Commits](unicode-rs/unicode-width@v0.2.2...v0.2.3)

Updates `uuid` from 1.28.0 to 1.29.0
- [Release notes](https://github.com/uuid-rs/uuid/releases)
- [Commits](uuid-rs/uuid@v1.28.0...v1.29.0)

Updates `zeroize` from 1.9.0 to 1.9.1
- [Commits](RustCrypto/utils@zeroize-v1.9.0...zeroize-v1.9.1)

Updates `globset` from 0.4.20 to 0.4.21
- [Release notes](https://github.com/BurntSushi/ripgrep/releases)
- [Changelog](https://github.com/BurntSushi/ripgrep/blob/master/CHANGELOG.md)
- [Commits](BurntSushi/ripgrep@globset-0.4.20...globset-0.4.21)

Updates `rustls-native-certs` from 0.8.4 to 0.8.5
- [Release notes](https://github.com/rustls/rustls-native-certs/releases)
- [Commits](rustls/rustls-native-certs@v/0.8.4...v/0.8.5)

Updates `tokio-rustls` from 0.26.5 to 0.26.6
- [Release notes](https://github.com/rustls/tokio-rustls/releases)
- [Commits](rustls/tokio-rustls@v/0.26.5...v/0.26.6)

---
updated-dependencies:
- dependency-name: aes-gcm
  dependency-version: 0.11.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: async-compression
  dependency-version: 0.4.51
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: getrandom
  dependency-version: 0.4.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo
- dependency-name: google-cloud-auth
  dependency-version: 1.18.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo
- dependency-name: google-cloud-storage
  dependency-version: 1.21.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo
- dependency-name: jaq-all
  dependency-version: 0.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo
- dependency-name: libc
  dependency-version: 0.2.191
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: opentelemetry-otlp
  dependency-version: 0.33.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: russh
  dependency-version: 0.65.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo
- dependency-name: size
  dependency-version: 0.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo
- dependency-name: smallvec
  dependency-version: 1.16.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: sysinfo
  dependency-version: 0.40.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo
- dependency-name: tokio
  dependency-version: 1.54.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo
- dependency-name: tonic
  dependency-version: 0.14.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: tonic-prost
  dependency-version: 0.14.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: tonic-prost-build
  dependency-version: 0.14.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: unicode-width
  dependency-version: 0.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: uuid
  dependency-version: 1.29.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo
- dependency-name: zeroize
  dependency-version: 1.9.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: globset
  dependency-version: 0.4.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: rustls-native-certs
  dependency-version: 0.8.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
- dependency-name: tokio-rustls
  dependency-version: 0.26.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot
dependabot Bot requested a review from a team as a code owner November 2, 2026 14:05
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file rust Pull requests that update rust code labels Nov 2, 2026
@coderabbitai
coderabbitai Bot commented Nov 2, 2026 •
Copy link
Copy Markdown
Contributor

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: cb30339b-3fea-4bc5-8585-e8bfeefef575

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

CodeRabbit Verify

  • Run CodeRabbit Verify to test the changes in this pull request.

@minimal-foundry
minimal-foundry Bot commented Nov 2, 2026 •
Copy link
Copy Markdown
Contributor

Reviewed: 1 finding, none blocking at 12e12ada7232.

Address the comments on the diff.

Clobber: not found, but the diff is too large to confirm that. If that was not intentional, restore the earlier change.

@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minimal-review — approved

Verdict APPROVE — No findings.

Panel: 3 of 3 personas ran (correctness, security, supply-chain).

@minimal-foundry minimal-foundry Bot added the review:approved minimal-review approved the current head label Nov 2, 2026
* fix(deps): bump pulldown-cmark to 0.13.6 for RUSTSEC-2026-0433 (#2846)

Claude-Session: https://claude.ai/code/session_01NSAwDroXL6KqsSxUzdbZGw

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(minimald): hand a reaped name over in one manager step (#2842)

A reap read the records and then sent the handover as a second message.
A removal that began between the two left the name with no row while
another retained box still had it. The manager now releases the reaped
box's row, picks the successor among boxes not being removed, and
registers it in one message. The reap and the prune return after both.

The daemon log names the release (name-released) before the handover
(name-handed-over), both with box ids.

Co-authored-by: minimal-foundry[bot] <327719912+minimal-foundry[bot]@users.noreply.github.com>

* T126 — A host-address box's port that collides on the host is shown at session start and in `min ls` (#2830)

* feat(minvmd): answer a node's collided mirror ports over control

The host control socket answers a read-only mirror_collisions verb
with the node's mirrored ports that collided with a holder on the
host. The node mirror keeps the time each port first collided.

* feat(minimal): show collided mirror ports in min ls and activate

min ls prints a MIRROR PORTS row per VM whose host_ip box ports are
held by another program on the host, and --json carries
mirror_collisions per VM. min session activate of a host_ip box on a
VM host prints the same sentence per port when it does not attach.

* fix(minimal): show an unread VM's mirror ports as null in min ls

Read each VM's collided mirror ports concurrently, and keep a failed
read apart from an empty one: --json writes null for a VM with no
answer and [] only for an answered empty read.

* fix(minimal): name a VM host whose mirror ports were not read

min ls printed nothing for a running VM host that gave no answer, so
it looked the same as one with no collisions. It now prints one
MIRROR PORTS row that says the VM did not report its ports.

* fix(minimal): skip the mirror-port read on a native host

A native host has no VM host daemon. The fallback listing's control
socket there is minimald's, which does not serve the collided-port
read, so min ls printed a false MIRROR PORTS row on every native host.

* fix(minimal): name an unread VM host at activate, enter the span

min session activate now prints the unread sentence that min ls prints
when the VM host daemon gives no answer. The ListSessions span wraps the
collided-port reads, and a native host's --json carries no
mirror_collisions field.

---------

Co-authored-by: minimal-foundry[bot] <327719912+minimal-foundry[bot]@users.noreply.github.com>

* T42 — Start every box's entrypoint from its spec through one launcher (#2841)

* feat(mfile): carry entrypoint and lifetime in the box spec

The spec gains an [execution] table with the box's lifetime and, for a
box that does not run its login shell, its entrypoint argv. A v0 spec
stored before the table existed reads with the entrypoint its type
implies.

* feat(minimald): start each box's entrypoint from its spec

One launcher decision, LaunchSpec::entrypoint, reads the first process
from the box's stored spec: the login shell, or the spec's argv. The
actor reads the stored spec once, keeps its hold, and hands it to every
launcher. A launch minted for an exec keeps the shell, because the exec
runs the box's command. Each launch logs its entrypoint in a
box.launch span.

* fix(minimald): keep the shell on every launch of an exec-run box

A task's run arrives over the exec channel. A hook launch or an attach
can come before or after that exec, and a hook launch's gated first
process starts at the next attach. Only the exec-minted launch held
the shell, so a task box could run its task twice, and an attach got
the task, not a shell. Every launch now says an exec carries the run,
and the launcher starts the shell for it.

* refactor(mfile): write box.lifetime and execution.exec in the spec

Rename Lifetime::Persistent to UntilStopped, move the lifetime to
[box] with a until_complete default for v0 specs, and serialize the
entrypoint as execution.exec. List the argv shape as a v0 exception.

* fix(minimald): refuse a launch whose stored spec cannot be read

held_spec returns an error for unreadable spec bytes or a failed store
read, and launch_host refuses with SpawnFailed instead of starting the
shell. Mark run_by_exec as an interim that T43 (#2405) removes.

* test(minimald): store a readable spec in the stopped-box record test

A launch now refuses a stored spec it cannot read, so the test's
placeholder bytes failed its ensure_host. Store a session spec instead.

* docs(mfile): say that no launch reads the spec's lifetime yet

A box ends when its entrypoint returns, whatever box.lifetime says.

* fix(minimald): keep entrypoint arguments out of the launch log

The box.launch span and its info event printed every argument of an
argv entrypoint. An argument can carry a secret, so they now name the
program (or the login shell) and the argument count only. A test pins
that a secret-looking argument does not reach the log.

---------

Co-authored-by: minimal-foundry[bot] <327719912+minimal-foundry[bot]@users.noreply.github.com>
Co-authored-by: Karl Godard <karl@minimal.dev>

* T30 — Run a command in a box with a terminal or detached, under an exec id (#2843)

* feat(minimald-rpc): carry exec mode, timeout and exec id on the wire

min://exec carries an argv with its mode (attached, tty or detached) and
an optional timeout. min://exec/attach, min://exec/output and
min://exec/wait name an exec by its UUIDv7 id. The box store places
each exec's transcript beside the record and appends events by path.

* feat(minimald): run box execs under an id, with a terminal or detached

Every command for a box gets a UUIDv7 exec id, and a box that is not
running refuses it with exit 2 naming its state. min://exec runs an
argv with no shell: attached, on a daemon terminal, or detached with
stdin closed. Tty and detached execs answer with their id at once,
capture their output beside the box record, and keep their exit for
min://exec/wait. An exec's own timeout stops it and records an
exec_exited event with reason timeout, and the box keeps running.

* style(minimald-rpc): format the exec id parse and its tests

* fix(minimald): bound the wait after an exec timeout; drop reaped execs

A command that survives the stop at its timeout no longer holds its
wait open: the wait after the stop is bounded, then SIGKILLed and
recorded as a timeout. Ended execs of a reaped box leave the exec map.

* fix(minimald): exit 124 on exec timeout; wait reads stored exit

An exec that its own timeout ends now exits 124, attached or detached.
A wait on an exec that this daemon holds no entry for reads the box's
stored exec_exited event, so a detached exec's exit code outlives a
daemon restart.

* fix(minimald): cap exec transcripts at 8 MiB and stream reads

A detached exec now writes through a pipe and a pump, as a tty exec
does, so the daemon can cap its transcript. Past the cap the transcript
keeps a mark and the newest half of the cap, and the command keeps
running. The output read and the attach replay copy the transcript in
64 KiB chunks, up to its length at the open, and the attach takes the
terminal lock only to open the file and subscribe.

* fix(minimald): bound tty exec input; no deadline past the clock

A tty exec's terminal input went through an unbounded channel, so a
program that never reads stdin let the daemon queue grow without
limit. The terminal now holds typed input in a HeldInput with the
attached path's bounds (EXEC_INPUT_HELD_MAX per exec,
EXEC_INPUT_HELD_DAEMON_MAX for the daemon). Past either bound the
chunk is dropped and the log says so once per exec. The exec's end
releases what it held.

An attached exec's timeout too large for the clock panicked after the
spawn. timeout_deadline now uses checked_add and gives no deadline.

Tests: unread tty input stays within the cap, a timeout of u64::MAX
seconds runs the exec to its end, and an exec id from one box finds no
exec, output or exit in another.

* fix(minimald): wait on exec terminals in the runtime, not a thread

The tty feed wrote to the terminal from a blocking thread. When the
program never read its input, that write never returned, and each such
exec left a blocking thread behind for good. The terminal and the
detached pipe are now non-blocking and watched through AsyncFd, so the
supervisor can stop the pump and the feed at the exec's end. Both stop
on a closed state too, because tokio never clears it and a wait for it
returns at once.

---------

Co-authored-by: minimal-foundry[bot] <327719912+minimal-foundry[bot]@users.noreply.github.com>
Co-authored-by: Karl Godard <karl@minimal.dev>

* fix(minimald): hand a destroyed box's name to the next holder (#2849)

A destroy removed the box that held a name's row and left the name
with no row, while another retained box still had that name. The
destroy now runs the same handover as a reap: the row goes to the
running box with the name, else to the most recent creation. The
destroy answers after the handover.

The daemon log names the destroyed box and the successor, and the
destroy span records the successor id or "none".

Co-authored-by: minimal-foundry[bot] <327719912+minimal-foundry[bot]@users.noreply.github.com>

* T114 — `min ls` and the box commands tell the truth, end to end (#2839)

* test(e2e): prove min ls and the box commands across two VMs

Adds the ls_and_box_commands_tell_the_truth case: a stopped VM's boxes
in min ls, the ADDRESS and EGRESS cells against min session policy,
policy and forward without --vm, the unknown-box and stopped-VM
refusals, both proxy ports after the preferred port frees, and the
--public and out-of-range expose refusals.

* test(e2e): record ls_and_box gates as NOT RUN, check declared rules

The four gates of ls_and_box_commands_tell_the_truth now call not_run,
so the lane summary names the case. A 'declared rules' EGRESS cell is
now checked against the subnets rule row that min session policy
prints, not only against an egress heading.

* test(e2e): read the expose address past a trailing carriage return

The ls_and_box case read the box's address from the in-box expose reply
with an end-of-line anchor. A reply over the exec channel can end in a
carriage return, which left the address empty.

* test(e2e): brace lt_port before a bracket class in the expose read

shellcheck reads $lt_port[[:space:]] as an array index (SC1087).
The braces keep the same match and make the script lint-clean again.

* fix(minimal): poll the owning VM in min net forward

A forward to a box on another VM polled the selected VM for its
session. That VM does not hold the box, so the forward closed on the
first tick. Reconnect the poll to the owning VM, version-gated.

---------

Co-authored-by: minimal-foundry[bot] <327719912+minimal-foundry[bot]@users.noreply.github.com>
Co-authored-by: Norrie Taylor <91171431+norrietaylor@users.noreply.github.com>

* docs(spec): specify dns steering and the host_ip lane for spec 24 (#2851)

* docs(spec): specify dns steering and the host_ip lane for spec 24

Add BEP-080 to BEP-087 so the default `dns` steering works for own_ip
and host_ip boxes on a VM host, as architecture D6 and networking §5.4
require.

- BEP-080, BEP-081: direct TLS to the proxy on port 443, routed by
  SNI, and admitting dns and both on a VM host (#2805).
- BEP-082 to BEP-087: the host_ip lane: a host-side box id, the cohort
  proxy lane, cohort-attributed delivery with the named box's egress
  and audit subject, the in-effect rule, per-box steering, and the
  live proof.
- BEP-015 gains a host_ip proxy_env case.
- Security considerations states the cohort lane and per-box steering.

* docs(spec): keep the first slice paragraph unchanged and move the host_ip e2e checks to BEP-087

* docs(spec): address review on the host_ip lane requirements

- BEP-083: the cohort lane also admits TCP 443 at the proxy's address,
  the direct TLS path dns steering uses.
- BEP-084: refuse and audit a cohort-attributed value that names no
  live host_ip box of this host.
- BEP-086: cite NET-003's VM-backed resolver requirement, not NET-079.
- BEP-087: the proxy_env case is its own sub-requirement.
- Security considerations: BEP-083 and BEP-084 join the redemption
  invariant, and BEP-084 the egress invariant.

* T10 — Log a box's output from its start, out of the box's reach (#2852)

* feat(boxes): name a box's output log beside its record

Adds LOG_FILE and BoxDir, the box's directory as code outside the store
sees it: the log path, a lookup by id through the index, a log read by
offset, and an event append for a writer that holds no DiskBox.

* feat(minimald-rpc): add a streamed read of a box's output log

* feat(minimald): log a box's output from its start

The host appends every read from the box's terminal to its output log
before it hands the bytes to an attached client, so the client is a
second reader. A binding whose client closes its channel, drops its
connection or is shed records a detached event, and the box runs on.

* feat(minimald): serve a box's output log by its id

ReadLog streams the log from a byte offset, and with follow sends new
output until the box is reaped. A test shows that files written into
the box's own directories reach neither the log nor the record.

* fix(minimald): read a box's log on the blocking pool

The followed log read polled the store with blocking std::fs calls on an
async task. The find, the chunk reads and the retained check now run
through spawn_blocking, so a slow disk does not hold a runtime worker.

* fix(boxes): cap a box's output log and read it across a drop

The log keeps a drop mark and the newest half past 8 MiB. A reader
keeps its file open and moves to the replaced file with no byte sent
twice. The read refuses a link or a file that is not regular.

* fix(minimald): start no store box without its output log

BoxOutputLog::open returns the open's error for a box in the store, and
Host::build stops before the launch. The log writes through the capped
store writer, and ReadLog keeps one reader for the whole stream.

* fix(minimald): run detach hooks when a PTY client is lost

A lost client already records a detached event. Its on_detach hooks now
run too, so the event and the hooks agree. A test drives a box past the
log cap.

* style: format the log cap tests

* docs(boxes): mark the 8 MiB log cap as not yet in the design

The cap drops the start of a box's output past 8 MiB. That departs from
architecture.md line 473. gominimal/arch#159 decides the bound.

* docs(specs): record the interim 8 MiB box log cap in BOX

The decision that logs a box's output from its start now states the
8 MiB cap, what the log keeps past it, and the arch#159 decision that
removes the cap or changes BOX-155.

---------

Co-authored-by: minimal-foundry[bot] <327719912+minimal-foundry[bot]@users.noreply.github.com>

* T9 — End a box when its entrypoint returns, never for idleness or client loss (#2850)

* feat(minimald): end an until_complete box when its entrypoint returns

The host loop now says whether a kill ended it. The actor watches each
launch's loop and, when the entrypoint returned on its own and the spec
sets lifetime = "until_complete", sets the record to exited with the
exit code and records an exited event with reason "exit". The daemon
does this whether or not a client is attached. Such a box raises no
shell-exit prompt (BOX-038). A client that goes away never stops a box
(BOX-015).

* test(minimald): pin box ends on entrypoint return, not client loss

Adds the actor tests for BOX-038 and BOX-015. The shell round trip now
expects no prompt and an exited record. Tests about a box kept after its
shell exits now create an until_stopped box. The rpc shutdown test no
longer answers a prompt.

* fix(minimald): retry the exited-record write when an entrypoint ends

The host and the watch are gone by the time the write runs, so a
single failed write left the box running with nothing in it. Retry it
with a short backoff, and pin the retry with a test seam.

* test(e2e): expect an exited box, not a prompt, when a shell exits

The session-exit prompt is gone: exiting the shell ends the box, which
stays listed as exited. The pty driver no longer answers a prompt. Each
leg that exited a shell now checks the box is exited with code 0, and
destroys it where it used to answer Delete.

* docs(minimald): put the launch-record seam doc back on its module

* test(e2e): resume the exited kept box before the exec into it

An exec runs only in a running box. After the shell exits and the row is
withdrawn, the leg now resumes the box with a pty 'min session attach',
checks that it runs under the same id and that its row is back, and then
runs the exec as before.

* test(minimald): fail when the channel stays open after shell exit

The wait loop ended on a timeout as well as on close, so the test
passed even if the channel never closed. Panic on the timeout.

* fix(minimald): end an exited box before a queued attach or exec

A message queued beside a returned entrypoint ran first and launched
a new host, so the entrypoint ran again and its exit was lost. Now
only a stop or a destroy goes ahead of the exit, and ensure_host
refuses a stopped or exited box.

---------

Co-authored-by: minimal-foundry[bot] <327719912+minimal-foundry[bot]@users.noreply.github.com>

* build(deps): bump sysinfo to 0.40

sysinfo 0.40 makes System construction fallible (System::new returns
Result<System, sysinfo::Error>). The three callers keep their 0.39
behaviour on an unsupported platform: minvmd's metrics sample and
minimald's resource-pool probe return None, and minvmd's host capacity
probe reports zero memory.

Unblocks the dependabot cargo group (#2844), which bumped sysinfo
without migrating the callers.

---------

Co-authored-by: Karl Godard <karl@minimal.dev>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: minimal-foundry[bot] <327719912+minimal-foundry[bot]@users.noreply.github.com>
@github-actions
github-actions Bot commented Nov 3, 2026
Copy link
Copy Markdown
Contributor

Spec lint

docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md — 15 finding(s)

docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:117: P004 BEP-003 names test 'bep_second_box_needs_no_sign_in', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:174: P004 BEP-007 names test 'bep_box_env_holds_sealed_value_only', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:218: P004 BEP-011 names test 'bep_root_ca_present_in_box_trust_store', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:234: P004 BEP-012 names test 'bep_proxy_env_and_no_proxy_are_set', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:290: P004 BEP-015 names test 'bep_git_and_gh_against_private_repo', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:341: P004 BEP-080 names test 'direct_tls_on_443_routes_by_sni', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:354: P004 BEP-081 names test 'vm_host_admits_dns_and_both_for_own_ip_and_host_ip', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:361: P004 BEP-082 names test 'host_ip_box_registration_mints_a_creation_unique_id', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:370: P004 BEP-083 names test 'host_ip_cohort_reaches_proxy_while_a_member_declares_a_lane', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:378: P004 BEP-084 names test 'cohort_delivery_names_no_box', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:392: P004 BEP-085 names test 'detail_pane_shows_a_host_ip_lane_in_effect_on_a_vm_host', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:397: P004 BEP-086 names test 'host_ip_grant_box_steered_names_resolve_to_proxy', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:406: P004 BEP-087 names test 'bep_host_ip_git_and_gh_under_dns_steering', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:718: P004 BEP-043 names test 'bep_destroyed_box_values_refused_within_60s', which was not found in the repository
docs/specs/24-spec-box-egress-proxy/24-spec-box-egress-proxy.md:727: P004 BEP-044 names test 'bep_logout_refuses_every_reference_at_next_request', which was not found in the repository

docs/specs/29-spec-box-local-first/29-spec-box-local-first.md — 38 finding(s)

docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:98: P004 BOX-007 names test 'self_as_name_is_exit3', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:190: P004 BOX-028 names test 'hooks_on_resume_reruns_on_activate', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:201: P004 BOX-037 names test 'until_complete_timeout_terms_then_kills_box_and_execs_reason_timeout', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:250: P004 BOX-046 names test 'type_noun_tables_are_boxes_sugar', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:257: P004 BOX-048 names test 'defaults_merge_lists_union_scalars_replace', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:262: P004 BOX-049 names test 'flat_per_entry_keys_and_legacy_keys_keep_meaning', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:266: P004 BOX-050 names test 'legacy_session_table_reads_as_defaults_session_with_hint', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:273: P004 BOX-165 names test 'no_session_entry_expands_implicit_default_session', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:280: P004 BOX-051 names test 'legacy_defaults_task_keys_with_hint', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:284: P004 BOX-052 names test 'legacy_params_reads_as_args_with_hint', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:288: P004 BOX-054 names test 'interactive_task_exit3_names_session', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:292: P004 BOX-059 names test 'box_type_resolves_to_builtin_root', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:301: P004 BOX-061 names test 'expanded_spec_violating_constraint_exit3_names_type_and_layer', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:306: P004 BOX-156 names test 'derived_type_loosening_constraint_exit3_names_type_key_parent', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:311: P004 BOX-160 names test 'admission_refuses_spec_breaching_builtin_root_constraint_exit3', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:315: P004 BOX-062 names test 'constraint_never_adds_package_port_or_egress', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:320: P004 BOX-063 names test 'session_and_task_entries_expand_and_validate', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:327: P004 BOX-064 names test 'expansion_order_and_merge_rules', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:332: P004 BOX-065 names test 'expansion_is_byte_identical_across_runs', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:337: P004 BOX-066 names test 'invalid_key_exit3_names_key_and_layer', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:341: P004 BOX-161 names test 'expansion_reports_layer_and_type_per_value_outside_spec_bytes', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:352: P004 BOX-071 names test 'projection_is_the_6_3_2_field_set', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:366: P004 BOX-072 names test 'projection_digest_mismatch_refuses_create', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:371: P004 BOX-073 names test 'unenrolled_evaluates_no_policy', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:375: P004 BOX-074 names test 'get_version_reports_expander_version', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:382: P004 BOX-145 names test 'example_expansion_matches_golden_vectors', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:386: P004 BOX-076 names test 'sections_follow_box_toml_with_nested_egress', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:408: P004 BOX-079 names test 'network_mode_legacy_spelling_hint_and_canonical_value', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:412: P004 BOX-157 names test 'flat_egress_keys_hint_and_canonical_nested_keys', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:416: P004 BOX-080 names test 'network_bep_secrets_passed_unchanged', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:423: P004 BOX-081 names test 'broker_secret_unenrolled_exit5', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:427: P004 BOX-085 names test 'params_accepted_and_rendered', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:467: P004 BOX-151 names test 'stop_exec_ends_process_group', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:472: P004 BOX-152 names test 'exec_events_carry_principal_argv_pty_code', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:477: P004 BOX-153 names test 'exec_disabled_refuses_exit5', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:484: P004 BOX-140 names test 'unenrolled_operations_over_file_mode_trust', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:488: P004 BOX-141 names test 'store_secret_passed_through_unenrolled', which was not found in the repository
docs/specs/29-spec-box-local-first/29-spec-box-local-first.md:492: P004 BOX-142 names test 'enrolled_and_unenrolled_expansion_identical', which was not found in the repository

Advisory. None of this blocks the merge; the review decides.

Advisory, and never a merge gate. Linter: gominimal/foundry@fb5932b8, spec format: How Minimal Writes Specs.

@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minimal-review — advisory review

Verdict COMMENT — 1 finding, 1 inline.

Panel: 3 of 3 personas ran (correctness, security, supply-chain).

Comment thread Cargo.toml
# (`cargo hack check --rust-version`). Every crate inherits this via
# `rust-version.workspace = true`; bump here, in one place, when the floor moves.
# 1.95 is the dependency-driven floor (sysinfo 0.39 requires rustc 1.95); no
# 1.95 is the dependency-driven floor (sysinfo 0.40 requires rustc 1.95); no
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MEDIUM · correctness · confidence 0.70

This dependency bump carries unrelated feature work. The diff has about 8000 added lines in crates/boxes, crates/minimald, crates/minimald-rpc, crates/minimal, crates/minvmd, the specs and scripts/session-e2e.sh. The head commit squashes other PRs (#2842, #2846) under a sysinfo title. The base 2d06816e is behind main. Rebase the branch so the PR holds only the Cargo.toml and Cargo.lock changes. The mixed diff cannot be reviewed as a dependency bump, and a revert of the bump would also revert the other work.

What the reviewer checked

pr.diff: store.rs +784/-30, exec/bridge.rs +722, exec/tests.rs +790, session-e2e.sh +721/-96. HEAD 12e12ad 'build(deps): bump sysinfo to 0.40 (#2866)' body lists #2846 and #2842.

Hand this to an agent
Act on a code-review finding.

File:       Cargo.toml
Lines:      48-48
Category:   correctness
Severity:   medium (reviewer confidence 0.70)

Finding:
This dependency bump carries unrelated feature work. The diff has about 8000 added lines in `crates/boxes`, `crates/minimald`, `crates/minimald-rpc`, `crates/minimal`, `crates/minvmd`, the specs and `scripts/session-e2e.sh`. The head commit squashes other PRs (#2842, #2846) under a sysinfo title. The base `2d06816e` is behind main. Rebase the branch so the PR holds only the `Cargo.toml` and `Cargo.lock` changes. The mixed diff cannot be reviewed as a dependency bump, and a revert of the bump would also revert the other work.

First verify this against the code yourself. It is model output and
may be wrong. If it is wrong, or the tradeoff was deliberate, say so
and change nothing.

👍 useful · 👎 noise — react to tell the reviewer. Replying works too, and says more.

@minimal-foundry minimal-foundry Bot removed the review:approved minimal-review approved the current head label Nov 3, 2026
@norrietaylor norrietaylor left a comment
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Scope does not match the title. The open bot thread on Cargo.toml:48 already says this, so this review does not raise it again. New fact for that thread: git log origin/main shows that the squashed PRs in the head commit are on main as their own commits, for example #2850 and #2852. #2866 is not on main. A rebase on main leaves the dependency bump and the three sysinfo caller changes.

Clobber none found. The merge base is 2d06816e. The diff adds to that base and reverts no fix. main moved on after that base, so the merge result was not checked.

Correctness The sysinfo 0.40 migration covers all three System::new callers. The findings below are in the feature code that the head commit carries. Because that code is on main, fix each finding on main, not on this branch. The two medium findings are the refusal with no next step and the OOM kill recorded as a plain exit. I checked a race between the entrypoint watch and has_live_host, and a leak of output.log into min bug bundles. Both checks came back clean.

Dependencies The diff has no code change for size 0.6, jaq-all 0.4, russh 0.65 or getrandom 0.4. Cargo.lock has sysinfo 0.40.1 and async-compression 0.4.52, and the PR body says 0.40.0 and 0.4.51.

Not checked No build ran, by rule. The sources of these crates are not in the local cargo registry, so their API compatibility is not proved. trivy and gh pr checks were denied in this sandbox, so there is no advisory scan and no CI result. gitleaks was not run, and a targeted rg over the diff stood in for it. The new session-e2e.sh case was read and not run.

Outside the diff AGENTS.md:145 still says that only a tty can answer the session-exit prompt. docs/specs/18-spec-box-networking lines 224 and 1145 still say "subject to the exit prompt".

/// The refusal for a command sent to a box that is not running.
pub(crate) fn not_running_message(box_label: &str, status: boxes::BoxState) -> String {
format!(
"box {box_label} is {}. Only a running box can run a command.\n",
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium · This refusal states why but gives no next step. min session exec prints it to a person. Since BOX-038, every exit from a session's shell leaves the box exited, so a person meets it in ordinary use. For a stopped or exited box, min session attach <name> resumes the box, and the e2e leg eib_vm_kept_box_resumes_leg proves that. Add that command for those two states. A pending or materializing box needs other words, because an attach is not the remedy there. The same sentence is copied at crates/minimald/src/box_actor/host.rs:1281, and exec/tests.rs pins the text. Change them together.

// The host is gone and the watch is cleared, so this is the one
// chance to record the exit: a failed write is retried with a short
// backoff before the box is left running with nothing in it.
let ending = boxes::core::record::ExitEnding::Exit { exit_code };
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium · end_on_entrypoint_return records every end without a daemon kill as ExitEnding::Exit. An entrypoint that an OOM kill ends has requested = false, so its record says reason exit with the kill's status. ExitEnding::Oom documents that case, and rg finds no production code in minimald that writes it. This line is the only production writer of an exited record there. The person then reads a plain exit and not an out-of-memory end. Confidence is limited because I did not prove what ExitReason holds for such a kill, and a later task may own this.

),
2,
));
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low · This refusal is unreachable. Line 1266 returns SessionPending for every status other than Active, and RecordState::from_stored gives Stopped or Exited only for those two statuses. So a stopped or exited box gets the pending error, not this message with exit 2. The test until_complete_ends_on_entrypoint_return_without_client_before_queued_ensure_host asserts only is_err(), so it does not see this. No relaunch happens, but an exec that loses the race reads a wrong reason. Move this check above the status check, and pin the error in the test.

};
if entry.mode != ExecMode::Tty {
let message = format!(
"exec {id} has no terminal to attach to. Read its output with min://exec/output {id}.\n"
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low · This instruction names the wire verb min://exec/output, which is not a command that a person can run. rg finds no ExecMode or ExecSpec use in crates/minimal/src, so no CLI command reads an exec's output at this head. No CLI path reaches this message yet, so it is low. State the situation and stop, or name the real command when it exists. This is the one instruction of this kind in the new exec messages.

Comment thread crates/mfile/src/spec.rs
/// When the box's run is over. Serialized as `box.lifetime`.
///
/// The spec stores and round-trips this value, but no launch reads it
/// yet. A box ends when its entrypoint returns, whatever it says.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low · This comment describes a state that the same diff ended. box_actor::host::ends_with_entrypoint reads spec.lifetime, and end_on_entrypoint_return and the shell-exit prompt depend on it. So UntilStopped has an effect today. The enum doc at line 114 repeats the claim: "Nothing enforces this yet" and "has no effect today". The two docs came from the entrypoint PR and the end-of-box PR changed the behaviour. Update both.

Comment thread crates/boxes/src/store.rs
pub fn append_event_at(
events_path: &camino::Utf8Path,
event: &BoxEvent,
) -> Result<(), std::io::Error> {
Copy link
10BC8 Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low · append_event_at repeats the body of append_event_line in the same file line for line: the open, the lock, the torn-line cut, the write and the sync. Its doc says that the same lock, cut and sync apply, but only the copy keeps that true. A later fix to one will miss the other. Make one function the body and let the other call it, with event.box_id for the log field. crates/minimald/src/exec/process.rs:1079 is the only caller of this copy.

file: std::fs::File,
len: u64,
cap: u64,
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low · CappedTranscript repeats boxes::store::LogWriter (crates/boxes/src/store.rs): the same 8 MiB cap, the same log.next file and rename, and the same keep-the-newest-half rule. TRANSCRIPT_DROPPED has the same bytes as boxes::store::LOG_DROPPED, so the printed line now has two definitions. The two differ in one detail: LogWriter appends first, and CappedTranscript folds the chunk in. Use one writer for both, or at least reuse LOG_DROPPED.

self.attrs.stdout_last = Some(SystemTime::now());
// The log first: a client is a second reader, and
// the log has these bytes whatever the client does.
self.output_log.write(b);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low · The host loop calls output_log.write synchronously on a runtime worker for each read from the terminal. Past the cap, LogWriter::drop_oldest reads and rewrites about 4 MiB in that same call. So a slow disk stalls this box's terminal and the other tasks on that worker. The read side of the same log moved to spawn_blocking for this reason, as read_log_stream says. ExecEntry::record_output has the same shape and also holds the terminal lock during the write. Nothing is observed to fail yet.

// argument reaches the daemon log. The name extends the T42 test line's
// filter, so that line runs this test too.
#[test]
fn launcher_starts_session_and_task_entrypoints_from_spec_without_logging_args() {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low · The test name says that the launcher starts session and task entrypoints, but the test starts nothing. It checks only what launch_span logs. The comment says why: the name exists to match a task's test filter. That is narration about the plan, and it means nothing to the next reader. Name the test for the log behaviour and remove the sentence. If a filter needs it, change the filter.

.iter()
.map(|(port, since)| (*port, *since))
.collect()
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit · collisions_since has one caller, a test at crates/minvmd/src/control.rs:8331. The mirror_collisions reply carries ports only. So the Instant in MirrorState::collided and this public method serve no reader yet. Keep a BTreeSet until something reads the time, or name the reader.

@norrietaylor norrietaylor left a comment •
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Second pass on the same commit as my Nov 4 review: six additional findings inline. The summary and earlier findings there still stand.

self.attrs.stdout_last = Some(SystemTime::now());
// The log first: a client is a second reader, and
// the log has these bytes whatever the client does.
self.output_log.write(b);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium · The output log can lose the last bytes of an entrypoint. The host loop calls try_wait at each loop head and breaks at once when the process has exited. Nothing drains the terminal first, and line 1908 is the only write to the log. Each step reads at most 8 KiB. So output still in the terminal buffer at exit never reaches the log, and that contradicts the doc on BoxOutputLog. A wake from another source can also lose a short last line. This is one instance: pump_output for a managed exec reads to the end of its output. Drain the master into output_log before the try_wait arm breaks. The loss grows when T43 starts argv entrypoints, because a failed task prints its error last.

ExecRequest::Exec(spec) => Some(spec.mode),
_ => None,
};
let exec_id = if let Some(mode) = mode {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium · Every min session exec gets an exec id that goes nowhere. The Shell and Argv forms mint the id here, but run_in_session does not take it, and it writes no exec_started or exec_exited event. Only run_attached_exec and the managed path write events, and no CLI code sends those forms at this head. BOX-152 requires the events when an exec starts or exits. So the box's events have no record of the commands that people run, and a later fix cannot restore that history. ExecBox::write_event also omits the principal and the argv that BOX-152 names. main changed write_event since this base, so check that part again after a rebase.

command
.stdin(Stdio::from(slave.try_clone()?))
.stdout(Stdio::from(slave.try_clone()?))
.stderr(Stdio::from(slave));
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low · A tty exec gets the terminal as its stdio, but the terminal never becomes its controlling terminal. No setsid or TIOCSCTTY call is on this path, and the shim only calls setpgid(0, 0). So Ctrl-C typed through min://exec/attach signals nothing, and an interactive shell starts with no job control. No CLI command reaches this mode at this head, so nothing fails yet. The fix is local to this exec path.

// The client sends no more input, but it still reads.
Some(russh::ChannelMsg::Eof) => typing = false,
Some(russh::ChannelMsg::Close) | None => return Ok(AttachEnd::ClientGone),
Some(_) => {}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low · relay_terminal drops ChannelMsg::WindowChange in its Some(_) arm, and serve_exec_attach ignores the size on the attach channel's terminal. The start request's size, or 24 by 80, stays for the life of the exec. A full-screen program then draws at the wrong size after an attach or a resize. The session path handles this through set_winsize at box_runtime.rs:2251. ExecEntry keeps no way to reach the master, so the fix needs a resize path on ExecTerminal. No CLI command reaches this at this head.

};
// One reader for the whole stream, so a drop of the log's oldest
// bytes during the read sends no byte twice (see `LogReader`).
let mut reader = Some(boxes::store::LogReader::new(&dir, req.offset));
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low · The requested offset is not checked against the log file. After a drop the file is at most 4 MiB, so a Done offset from before the drop can be past its end. A followed read from that offset then sends nothing until the file grows past it. An offset inside the new file skips bytes silently. In both cases the client gets no LOG_DROPPED mark. ReadLogRequest documents that the old offset names another byte, but a client cannot detect that case. When the offset is past the end, start from byte 0, so the mark shows the gap. An offset inside the new file needs a generation value or a similar check. No CLI code calls this RPC at this head.

{
command.env("PS1", prompt);
}
command
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit · The body of the LaunchEntrypoint::Shell arm keeps its old indentation, level with the arm, and the closing command sits deeper. rustfmt probably leaves the whole statement alone because the write_all(format!(..)) line is 102 columns. So just fmt will not correct it. Split that line, and rustfmt can then format the arm. Moving the arm's body into a helper is also an option.

@norrietaylor
Copy link
Copy Markdown
Member

@dependabot rebase

@dependabot @github
dependabot Bot commented on behalf of github Nov 5, 2026
Copy link
A17E Copy Markdown
Contributor Author

Looks like this PR has been edited by someone other than Dependabot. That means Dependabot can't rebase it - sorry!

If you're happy for Dependabot to recreate it from scratch, overwriting any edits, you can request @dependabot recreate.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file rust Pull requests that update rust code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

0