🤖 Generated by the Agentic Engineer
Evidence
The 2026-08-07 delivery freeze (~35h, cleared by a manual cluster write on 2026-08-08) had a single
structural cause: the trust configuration for the root OCI source is delivered through that
source. ksail.prod.yaml / flux-instance.yaml → Kustomization infrastructure-controllers →
rendered by flux-operator → onto OCIRepository/flux-system — which must verify the artifact
carrying that very config.
Once the live matcher was wrong, main already held the corrected value and could not deliver it.
Both automatic escape routes were void (verified in #3005): cd.yaml shares the deploy-prod
composite and reaches the same reconcile, and ksail cluster update does not own the FluxInstance.
The heal shares the deploy path too, so it failed alongside the deploy (#3005) — there is no second
line of defence. Blast radius reached the repo: every merge_group deploy timed out and evicted its
PR, so nothing could merge either.
The incident is resolved and the loop is not. The same deadlock recurs on any future bad value.
Proposed fix
The deploy already solves this exact class for the pull credential: a
🔑 Reassert Flux and consumer GHCR pull credential step writes it out-of-band, ahead of the
reconcile that depends on it. The root source's spec.verify has the same bootstrap circularity and
no equivalent step.
Add the mirror-image step: reassert spec.verify on the root OCIRepository from the values main
declares, before the reconcile, under the field manager that already owns the resource
(flux-operator) so there is no second writer and no SSA pruning question.
Acceptance criteria
Scope
Recovery only. Prevention — catching a matcher that cannot verify before it ships — is #3007, and
the two are complementary: #3007 stops the bad value being published, this stops a bad value that is
already live from being unrecoverable.
Rough size: S–M. Supersedes the remediation halves of #3005 and #3006, both closed as resolved.
Evidence
The 2026-08-07 delivery freeze (~35h, cleared by a manual cluster write on 2026-08-08) had a single
structural cause: the trust configuration for the root OCI source is delivered through that
source.
ksail.prod.yaml/flux-instance.yaml→ Kustomizationinfrastructure-controllers→rendered by
flux-operator→ ontoOCIRepository/flux-system— which must verify the artifactcarrying that very config.
Once the live matcher was wrong,
mainalready held the corrected value and could not deliver it.Both automatic escape routes were void (verified in #3005):
cd.yamlshares thedeploy-prodcomposite and reaches the same reconcile, and
ksail cluster updatedoes not own the FluxInstance.The heal shares the deploy path too, so it failed alongside the deploy (#3005) — there is no second
line of defence. Blast radius reached the repo: every
merge_groupdeploy timed out and evicted itsPR, so nothing could merge either.
The incident is resolved and the loop is not. The same deadlock recurs on any future bad value.
Proposed fix
The deploy already solves this exact class for the pull credential: a
🔑 Reassert Flux and consumer GHCR pull credentialstep writes it out-of-band, ahead of thereconcile that depends on it. The root source's
spec.verifyhas the same bootstrap circularity andno equivalent step.
Add the mirror-image step: reassert
spec.verifyon the root OCIRepository from the valuesmaindeclares, before the reconcile, under the field manager that already owns the resource
(
flux-operator) so there is no second writer and no SSA pruning question.Acceptance criteria
spec.verifybefore the reconcile step.it with no manual intervention — it must fail before the change and pass after.
flux-operator; no field contention.green deploy is otherwise invisible).
Scope
Recovery only. Prevention — catching a matcher that cannot verify before it ships — is #3007, and
the two are complementary: #3007 stops the bad value being published, this stops a bad value that is
already live from being unrecoverable.
Rough size: S–M. Supersedes the remediation halves of #3005 and #3006, both closed as resolved.