# mvirt 0.29.4

migrations: no
wire: unchanged
rev: 5b29fa5856f042d0f3542a118f08c3c981bacc71

mvirt 0.29.4

Signed CLI releases, a manifest that round-trips the carrier, logs that say how
far back they reach, and tunnels that find the leader without backing off.

- cli: releases are Ed25519-signed (version + asset + sha256); `mvirt upgrade`
  verifies before replacing itself and refuses unsigned/tampered builds; the
  release workflow fails without CLI_SIGNING_KEY (closes #140).
- cplane, node: a follower refuses a node tunnel with a typed NOT_LEADER frame
  naming the leader (only to nodes that offer it in ALPN); the node redials
  that leader at once instead of backing off (closes #95).
- manifest: an externally-routed block in no pool (the carrier) is exported
  and applied; carriers are registered before the blocks they carry
  (closes #407).
- logs: each read derives its ring boundary from its plane's retention
  (infra 72 h vs workload 168 h rows were invisible) (closes #411); a ring
  that starts cold is trusted only from its floor and backfilled from
  segments (closes #35); feed/stats/sql state retentionHorizon; the row feed
  has its own rate budget (two console tabs no longer 429); platform stats
  count the ring rows the feed shows; every /v1/logs filter documented;
  CLI footers state completeBefore / retentionHorizon (closes #27).
- cplane: the registry holds on "object domain not configured" instead of
  guessing obj.mvirt.io (closes #62).


## Upgrading

Point your flake's `mvirt` input at this release and redeploy the control-plane
host first, then each node in turn:

```
nix run .#colmena -- apply boot --reboot --on <control-plane host>
nix run .#colmena -- apply boot --reboot --on <node>   # one at a time
```

This release adds no migrations, so the control-plane host rolls back the same way
a node does: boot the previous NixOS generation.
