Shortest commands
--binary-tag T already in the binstore. The acquirer reuses the cached binary instead of re-acquiring it, so the operation collapses to a local symlink swap + restart per node.
Options
Examples
Per-node steps
Each node goes through five idempotent steps:
Idempotency means it’s safe to re-run after a crash — every step is a no-op when the desired state is already in place.
Downgrade
upgrade --binary-tag <older> reuses the binstore if the tag is cached, making the operation a local symlink swap + restart per node. If the tag isn’t cached, mxnode re-acquires it.
Pruning policy is controlled by [install].binary_keep in config.toml; the default of 3 keeps the last three tags.
Self-healing inflight.toml
Every upgrade writes a~/.local/state/mxnode/inflight.toml lock at the start, updates current_step as the orchestrator advances, and removes it on completion. The file records:
op,started_at,strategy,selectednodescompletednodes,currentnode,current_steptarget_binary_tag,target_config_tag,target_proxy_tag[identity]— owner pid + start token
cat inflight.toml after a death tells you what step the upgrade died on).
When mxnode upgrade starts and finds an existing inflight.toml, it classifies the recorded pid:
A crashed upgrade therefore self-recovers on the next invocation; rerunning the same
mxnode upgrade command is the recovery procedure. Every per-node step is idempotent, so steps that already ran become no-ops the second time.
Audit log
Every upgrade attempt appends aMigrationEntry to state.toml’s migrations.entries[]:

