Skip to content

fix(fleet): fan out on a dispatched Release and fail closed on a no-op - #464

Merged
joshua-temple merged 1 commit into
mainfrom
fix/fleet-e2e-reliability
Jul 5, 2026
Merged

joshua-temple merged 1 commit into
mainfrom
fix/fleet-e2e-reliability

Conversation

@joshua-temple

Copy link
Copy Markdown
Collaborator

Problem

Two fleet-gate reliability defects surfaced publishing v0.8.0.

Bug 2 - a dispatched Release never fans out the fleet. The resolve job gates on github.event.workflow_run.event == 'push'. When the rc Release is started by an explicit workflow_dispatch against the tag (the reliable trigger, since a tag-push is suppressed when the tag points at a CI-skip state commit), the source run's event is workflow_dispatch, the gate is false, resolve is skipped, and no version-under-test artifact is produced. auto-promote then cannot identify the validated rc.

Bug 3 - the fleet reports SUCCESS when it validated NOTHING. Because aggregate was gated on needs.resolve.result == 'success', a skipped resolve (the Bug 2 symptom) skipped the gate too, and a skipped job reads as success. The rc.7 fleet run resolved no rc, skipped every lane, skipped the Fleet gate, and still concluded green. That false green is what let v0.8.0 publish on a no-op.

Fix

  • Resolve gate: accept a source Release started by push OR workflow_dispatch for an rc/dryrun tag. A dispatch against a non-candidate ref (the final vX.Y.Z tag, or main) still fails the head_branch candidate check and does not fan out.
  • Fleet gate: if: always() so it renders a verdict rather than inheriting a skip, and fail closed. In a context obligated to validate a candidate (a manual dispatch, or a green Release for an rc/dryrun tag), it now requires a resolved candidate version AND at least one fan-out lane run to success, else it reds. A context with nothing to validate stays a clean green no-op. This mirrors the reconcile require-ledger guard.

Bug 3 is the defense-in-depth for Bug 2: Bug 2 removes the cause (missing artifact / skipped resolve), Bug 3 ensures the symptom (a false-green no-op gate) can never recur.

Verification

actionlint on fleet-e2e.yaml is clean.

Notes

Release-path change: warrants a fleet validation run before it is considered fully accepted. Land this before (or with) the companion trigger PR fix/release-trigger-reliability, whose explicit candidate dispatch depends on this broadened resolve gate to fan the fleet out.

Two fleet-gate reliability fixes.

Resolve gate: accept a source Release started by workflow_dispatch, not
only by a tag push. When the candidate tag points at a state commit whose
message suppresses CI, the tag-push trigger does not fire and orchestrate
dispatches Release explicitly against the tag; that arrives here as
event workflow_dispatch and must fan the fleet out exactly like the push
path. A dispatch against a non-candidate ref still fails the head_branch
candidate check and does not fan out.

Fleet gate: run always and fail closed on a no-op. A skipped aggregate
job reads as success, so a run that resolved no candidate and ran no
lanes previously concluded green having validated nothing. The gate now
runs unconditionally and, in a context obligated to validate a candidate
(a manual dispatch, or a green Release for an rc/dryrun tag), requires a
resolved candidate version and at least one fan-out lane run to success,
else it reds. A context with nothing to validate stays a clean green
no-op. This mirrors the reconcile require-ledger guard.

Verification: actionlint on fleet-e2e.yaml clean.
Signed-off-by: Joshua Temple <joshua.temple@stablekernel.com>
@joshua-temple
joshua-temple merged commit d303ce9 into main Jul 5, 2026
15 checks passed
@joshua-temple
joshua-temple deleted the fix/fleet-e2e-reliability branch July 5, 2026 15:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant