Expand description
Wave-promotion gate (new-shape). Host’s wave index must not exceed
the rollout’s current_wave. Wave index comes from the verified
FleetResolved.waves[channel] (positional). current_wave lives on
RolloutSummary and is maintained by the applier.
Default-deny on inconsistent inputs. A silent pass when
host-wave resolution returns None (host not listed in any wave for
its channel) would mask operator misconfiguration. An unstaged
host in a channel that declares waves is blocked with
GateBlock::HostUnstaged. The “channel has no waves at all”
shape (typical of all-at-once policies; mk-fleet builds
fleet.waves[channel] = [] when the policy declares no explicit
waves) still passes — that’s intentional “no wave gating”, not
misconfiguration.