Expand description
Planner gates over &FleetState (the v0.2 shape, replacing the
v0.1 &Observed-based gates per RFC-0006 §12).
Two design properties the new shape enforces that the old didn’t:
-
No fail-open defaults. The old gates carried
unwrap_or(true)for missing probe state (seeObserved::host_probes_passingdocstring). The new gates consult the reducer state —HostRolloutState::probe_observed_first_atetc. — where absence has explicit meaning (probe hasn’t run yet = soak gate fails closed). RFC-0005 §6. -
Verified manifests only. Every gate takes
&SignedManifestSet. Phase 2’sVerified<T>newtype graduates from “type exists” to “type is required on the dispatch path”.
First-block-wins order matches the old evaluate_for_host:
quarantine → channel_edges → wave_promotion → host_edges → disruption_budget → compliance_wave. Quarantine is FIRST: a hash
that just rolled back must stop instantly even if other gates would
otherwise hold the host — otherwise the agent re-fetches and re-
activates the bad closure on every cycle.
Modules§
- channel_
edges - Channel-edges gate (new-shape).
- compliance_
wave - Compliance-wave gate. Earlier-wave hosts with outstanding evidence failures hold later-wave dispatch.
- disruption_
budget - Disruption-budget gate (new-shape).
max_in_flightenforced at dispatch time, summed across all active rollouts whose budgets share a selector (matches the old gate’s “max one workstation in flight, ever” cross-rollout semantics). - host_
edges - Host-edges gate. Per-host DAG within a single rollout:
Edge { gated: A, gates: B }holds A’s dispatch until B is ordering-eligible — Converged (canonical “health-verified at target”) OR Deferred (activation staged, live-switch pending operator reboot per RFC-0005 §3 terminal-for-ordering). - quarantine
- Anti-thrash quarantine gate (new-shape). Same predicate as
gates::quarantine, just parameterized directly on(channel, target_closure, quarantines)instead of digging throughObserved. Phase 6g deletes the old version. - wave_
promotion - Wave-promotion gate (new-shape). Host’s wave index must not exceed
the rollout’s
current_wave. Wave index comes from the verifiedFleetResolved.waves[channel](positional).current_wavelives onRolloutSummaryand is maintained by the applier.
Enums§
- Gate
Block - Reason a host can’t be dispatched right now. Variants carry enough
detail to render the log line + observability event without re-
querying state. The legacy
&Observed-shaped gate variants from v0.1 are not represented.
Functions§
- evaluate_
for_ dispatch - First block wins. Cheapest-first; quarantine is FIRST for the anti-thrash property (see module docstring).