A patch release dominated by one theme: failures that were silent. Every fix below was something that looked like it was working.
The one to know about
Running the test suite could kill your production fleet. npm test — or even a single npx vitest run <file> — could take down every instance. Two independent causes, both fixed:
getAgendHome()falls back to the real~/.agendwhenAGEND_HOMEis unset, and vitest only pinnedPATH. A test-constructed FleetManager therefore read the realinstances/<name>/daemon.pid— which holds the shared fleet process pid — andstop()s stale-pid fallback SIGTERMd it.- Tests inherited systemds
NOTIFY_SOCKET.stopAll()sendssdNotify("STOPPING=1"), so underType=notify+NotifyAccess=alla test worker could put the real unit into stop-sigterm — bypassing path isolation entirely.
It was hard to spot because the graceful shutdown handler waits for every instance to go idle. The fleet kept serving normally for about five minutes until TimeoutStopSec expired, then died to SIGKILL — so the damage never lined up with the command that caused it.
Three independent layers now guard this: vitest injects a per-run AGEND_HOME and blanks NOTIFY_SOCKET; stop() refuses to signal the fleet main process; and sd-notify strips NOTIFY_SOCKET from the ambient environment at module load, handing it only to the short-lived systemd-notify helper, gated on an isFleetOwner() pid check.
NotifyAccess=main is not a viable alternative — Node cannot write AF_UNIX datagrams, so the actual sender is a child process that main rejects, which breaks READY and the 60s watchdog.
Fixes
Configured models were silently discarded. All seven backends treated an advisory isModelCompatible() heuristic as a hard gate, dropping --model when a name did not match the expected prefix. /model persisted your choice to fleet.yaml, then every restart quietly launched on the CLI default. Verified against the real CLI: kiro-cli chat --model gpt-5.6-sol works fine — only our pattern rejected it. Models are now always passed through; if one is genuinely wrong the CLI says so, which beats pretending it worked. Kiros pattern also now covers gpt, deepseek, minimax, glm and qwen.
Codex usage warnings were never detected. The pattern matched weekly limit, but Codex reports a monthly window (window_minutes: 43800) and has since at least June. Now matches any period and reports the specifics — Codex monthly limit: less than 5% left — rather than a vague "running low".
/view font sizing. Size was computed from the captured texts longest line, so a freshly started CLI printing three short lines fitted to ~3 columns and hit the 48px ceiling — then latched, never correcting. It now derives from the panes actual grid, clamped to 12–22px, with a Fit/Comfortable/Compact control.
Antigravity would not shut down cleanly — /quit is treated as chat text by agy; it now receives 2×Ctrl+C.
Reload safeguards — SIGHUP during the startup window, reconcile aborting on N→0 / empty / >50% instance removal, and root-user codex PATH recovery.
agend update no longer reinstalls and restarts when already current (--force overrides), and a failed restart now exits non-zero.
Features
Configurable tmux geometry, now 120x36 by default. Panes were stuck at tmuxs 80x24, which /view had to blow up to ~33px to fill a screen. Simply passing -x/-y to new-session is not enough: instance windows inherit window-size=latest and the shared no-PTY control client participates in that sizing, pulling them back to 80 columns. Windows are now pinned with window-size manual and the control client attaches with -f ignore-size. Configure via terminal.columns/rows with per-instance overrides; terminal.enabled: false pins legacy 80x24. Columns are validated at a floor of 80 — narrower panes soft-wrap permission prompts across physical lines and measurably degrade detection.
/ctx and /model show the effective model. Previously they showed the literal string default. Inherited values now resolve to something real (auto (default)), and when a default cannot be determined it says why — distinguishing "not probed yet" from "this CLI does not report one".
Kiro TUI effort skill added to the bundled general knowledge.
Upgrading
npm install -g @songsid/agend@latest
agend updateInstances must restart for the new tmux geometry to apply — it is set at create/respawn.