ebman v0.35.0
If you rely on :freeze-deploys or :incident as a safety net, this release matters.
A freeze marker whose timestamp could not be parsed was treated as stale, deleted, and enforcement stopped — silently, and by definition during the incident the freeze was declared for. The cause was a sentinel (i64::MAX) that overflowed when the pid-reuse window was added to it, so every real process start time compared greater and the marker read as pid-reused. Release builds lifted the freeze; debug builds panicked. Found by reviewing this release's own lineup before tagging.
Fixed
- A corrupt freeze marker lifted the freeze instead of holding it (above).
- A reused pid could hold a phantom freeze indefinitely. The marker recorded only a pid, so once the OS wrapped its pid counter an unrelated process kept the freeze alive. It now checks process start time too, and still fails closed when that cannot be read.
- A rollout halted by a freeze exited 0, reporting success for a deploy that stopped part-way. It exits 3, and the unattempted regions are listed as
skipped (rollout halted). - A freeze declared mid-rollout did not stop the remaining regions. Both the sequential and parallel dispatch loops now re-check before each region.
- An empty
Selectfield panicked the TUI on a keypress. ebman ctl key shift+tabmoved the cursor forwards, not backwards.- Four glyphs ignored
icons = "ascii"and rendered as tofu on terminals without them — the armed-rollback and watching-deploy pills, the header sort arrow, and the HEALTH column label.
Added
:help <topic>opens one help topic by name (global,detail,dlq,shell, …) rather than scrolling the full keymap.:help shellis the only way to read the embedded-shell keys.
Documentation
docs/headless.mdnow spells out that exit3also covers refused and halted writes — a safety pin, read-only mode, an active freeze, or a rollout halted mid-run — not only "issues / drift found". CI scripts branching on the published convention were reading a safety refusal as a lint finding.
No breaking changes.