# mvirt 0.14.14

migrations: no
wire: unchanged
rev: 26ea0f484ffb14bf1d20d2a6b00fbe4d43a94992

mvirt 0.14.14 — a leader that lost its controller reconciled nothing, forever

A 1.2 s quorum-freshness flicker aborted the one reconcile Controller a cplane
process would ever have; when freshness returned 300 ms later, the replica kept
serving as leader — REST answering, nodes Online, raft healthy — while
reconciling nothing, indefinitely. On the production fleet this held for
2 d 17 h until a VM created in the console sat in Pending with no node.

Changed:
- cplane: the Controller is rebuilt on every leadership gain, like every other
  leader loop — taking leadership and running the reconcilers are one
  transition (#217). The tunnel-connect receiver lives in a shared slot each
  controller generation locks for its lifetime; deposition releases it, and a
  successor parks until its predecessor is gone, so two generations can never
  converge concurrently. The parser-binding table is shared across generations.
- Regression test replays the incident: an aborted generation's successor must
  converge a VM created only after the handover.


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