# mvirt 0.29.12

migrations: no
wire: unchanged
floor: undeclared
rev: 2dd536b4d1f7dce6922688ddc63ed01d60852a95

mvirt 0.29.12

Hard anti-affinity can no longer be bypassed by a pod created in the gap
before its group membership, and the Postgres provider repairs members that
already share a node. Includes everything in 0.29.11.

- cplane: a pod's (and a VM's) placement-group membership is written in the
  same transaction as the pod, so no placement pass sees it without its group
  (#423; the race that put both mirc Postgres members on one host and
  deadlocked the primary on 2026-09-29).
- cplane: hard anti-affinity members sharing a node are reported every pass
  (status.violations on the group, scheduler log entries); the scheduler
  ranks last a node that is the sole feasible node of a disk-pinned sibling.
- provider-pg (image m5, deployed separately): re-adds missing group members;
  on a reported violation rebuilds the REPLICA elsewhere (primary up, 0 lag,
  one move fleet-wide, 30 min cooldown) (#423).
- everything in 0.29.11 (#400 logind hand-over, #421 transit verdict, #247
  meta-plane multi-replica, #422).


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