Repository navigation
atrium 0.38.0
A hardening release. Most of the 33 commits reorganize the source for the people
and agents who maintain it, with no change in behavior. The rest fix what a
review of that work and an audit against the rustkb knowledge base turned up.
It is the first release since 0.32.0 that builds on Windows with the Rust version
it declares (1.70), and the local gate now checks that on every push.
Fixed
cargo install atriumworks on Rust 1.70-1.72 on Windows again. Since
0.33.0 the Windows reaper calledusize::div_ceil, which needs Rust 1.73, so
on Windows every release from 0.33.0 to 0.37.2 failed to build on the
rust-versionit declared. The call is replaced by plain ceiling division, anddev.py check
now runscargo +1.70 check --all-targets --locked.atrium ctlrefuses a malformed command instead of sending the wrong
request.- A flag that takes a value (
--role,--identity,--worktree,--mode,
--to,--kind) used to swallow the next flag when its value was missing.
bus pub work --to --decision item=Xaddressed a role named--decision
and sent the escalation as an FYI. A flag is no longer accepted as a value. - An oversized
board claim --ttlcould wrap the lease negative, and a huge
audit <n>asked for a negative tail. Both now report "too large". - Leases are capped at 365 days. The client refuses a longer
--ttl, and the
server clamps any request'sttl_ms, since a raw request is not bound by
the client. - A repeated
--since, or a field named twice (board set k a=1 a=2), is an
error. Before, both copies reached the server and one won silently.
- A flag that takes a value (
atrium reapwaits once per sweep, not once per dead session. Cleaning up
64 dead sessions took 48 s, because each registry got its own 750 ms grace
period. On Windows, where nothing is signalled (the Job Object is the reaper),
it no longer waits at all.- Windows: a dead session's registry file is removed at the next launch.
Any session that ended without a teardown (the window's X, logoff, a crash)
left itsatrium-session-<pid>.pidsin%TEMP%, and only a manual
atrium reapremoved it. - A failed
fleet upremoves the worktrees it made. If the terminal could
not be taken, the roster failed to spawn, or a later member's worktree could
not be made, the worktrees created before the failure stayed on disk. They are
now torn down under the usual rule: removed only if clean and fully merged,
otherwise kept and reported. - Linux: a clean quit no longer reports "pane process group(s) survived
teardown" for plain shell panes. Teardown now reaps each pane's child
(bounded at 250 ms) before checking for survivors. - Unix: atrium never signals a pid above
i32::MAX. The cast to a signed
pid went negative, andkill(-1, sig)signals every process the user owns.
The pids come frompsand from registry files the same user can write. - Windows: the control pipe's access list is built from a correctly aligned
buffer. The token read cast a byte buffer to a pointer-aligned struct, which
is undefined behaviour. It was harmless in practice, but it sits on the path
that restricts the pipe to the current user. A new test checks the result.
Changed
- Library API:
atrium::ctl::build_requestreturns
Result<String, UsageError>instead ofResult<String, String>.
UsageErrorimplementsDisplay(the message alone) and
std::error::Error.atrium ctlprints the same messages as before. - Built on
nativelite-ansi0.4.0 andnativelite-vterm0.5.3, whose
tokenizer no longer allocates per token when feeding pane output. atrium's
own throughput was not re-measured for this release. - The source is split into modules a reader can navigate.
ipc,ctl,
fleet,ctl_serverandfleet_cliare now directories, and the end-to-end
suite has one module per area. Long functions became named steps:run(),
fleet_up,dispatch_ctl,build_requestandspawn_pane_full.main.rs
went from 4,365 lines to 594. No behavior changed. - Stricter lint discipline, enforced by the gate. The gate runs clippy
with-D warningsfor Windows, Linux and macOS. The crate has a[lints]
table, everyunsafeblock states why it is sound (// SAFETY:), and
unwrapis refused outside tests.
Full notes: CHANGELOG.md