# mvirt 0.28.1

migrations: no
wire: unchanged
rev: 26e2f7995b05770bd9c18e4428b04f7483805e01

mvirt 0.28.1

LB health and liveness gate the Maglev pool again, an operator's forced
prefix switch no longer waits out the damping hold, and every daemon
refuses to start twice.

- ebpf, node, cplane: a backend whose host has only red backends is still
  announced but marked (new route type LB_TARGET_UNHEALTHY); each SDN node
  applies the all-red fail-open over the whole pool, so health gates even
  with one replica per node. A backend whose VM/pod is observed not serving
  for >=15 s is withheld from the pool (additive membership field 22). If
  every backend of a VIP is proven dead the pool empties and the VIP is
  withdrawn. Roll the cplane first (an old reflector rejects the marker
  with a warning). Closes #306, #311, #313.
- cplane: an outstanding forced external-prefix switch passes the D3
  damping hold once (the drill's 279 s of 353 s); a force issued during an
  in-flight switch is no longer lost (#403). A provider or pin change that
  does not move the anchor clears the stale announcedTarget (#406).
- all daemons: --help/--version exit 0, unknown arguments exit 2, and a
  second instance is refused before it touches any state (per-daemon lock
  file). Twice on 2026-09-27 `mvirt-ebpf --help`/`--version` started a
  second dataplane daemon on prod (#404).
- cplane: IPAM never hands out a network's first host (.1 / ::1), the
  address the DNS responder answers on; existing holders keep it. An
  explicit delegated block covering .0 or .1 is now a 409 (#369).
- cplane: the import Task gets the published object endpoint instead of
  the node-subnet gateway it cannot reach from the overlay (refs #215).
- cplane: log SQL and /v1/logs/stats re-parse stale rows under the current
  parser, like the feed; meta.rowsRepaired reports it (#53).
- providers: a managed database is Provisioning until its first Ready, not
  Degraded; a Ready instance that loses a member still degrades (#392).
- gw-agent: logs the TLS it negotiates with the control plane when
  RUST_LOG enables mvirt_tls (refs #207).


## 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.
