fix: require runtime provenance for follower closeout

This commit is contained in:
Codex
2026-07-03 07:52:42 +00:00
parent 227ea2b4fa
commit a88adc796f
+6 -3
View File
@@ -937,6 +937,7 @@ async function decideAndMaybeTrigger(
const previousInFlight = stringOrNull(previous.inFlightJob);
const previousLastSucceeded = stringOrNull(previous.lastSucceededSha);
const previousObserved = stringOrNull(recordAt(previous, ["source"])?.observedSha);
const previousTarget = stringOrNull(recordAt(previous, ["target"])?.targetSha);
const superseded = previousInFlight !== null && previousObserved !== null && observedSha !== null && previousObserved !== observedSha;
let phase: BranchFollowerPhase;
let decision: string;
@@ -944,7 +945,7 @@ async function decideAndMaybeTrigger(
let inFlightJob: string | null = live.inFlightJob;
let lastTriggeredSha = live.lastTriggeredSha ?? previousLastTriggered;
let lastSucceededSha = live.lastSucceededSha ?? previousLastSucceeded;
if (targetSha === null && observedSha !== null && previousLastSucceeded === observedSha) targetSha = observedSha;
if (targetSha === null && observedSha !== null && previousLastSucceeded === observedSha && previousTarget === observedSha) targetSha = observedSha;
if (!follower.enabled) {
phase = "Skipped";
@@ -1023,6 +1024,7 @@ async function decideAndMaybeTrigger(
status: live.command,
exitCode: live.exitCode,
timedOut: live.timedOut,
payload: live.payload,
},
};
}
@@ -1273,13 +1275,14 @@ async function readAdapterStatus(registry: BranchFollowerRegistry, follower: Fol
const runtimeReady = follower.nativeStatus.runtime === null ? null : runtimeWorkloadsReady(follower.nativeStatus.runtime, bundle.workloads);
const hasTektonGate = follower.nativeStatus.tekton !== null;
const hasRuntimeTarget = runtimeTargetSha !== null;
const hasTargetEvidence = hasRuntimeTarget || hasTektonGate;
const requiresRuntimeTarget = follower.nativeStatus.runtime !== null;
const hasTargetEvidence = hasRuntimeTarget || (!requiresRuntimeTarget && hasTektonGate);
const pipelineGateOk = !hasTektonGate
|| pipelineSucceeded === true
|| (hasRuntimeTarget && runtimeTargetSha === observedSha && argoReady !== false && runtimeReady !== false);
const aligned = observedSha !== null
&& hasTargetEvidence
&& (hasRuntimeTarget ? runtimeTargetSha === observedSha : true)
&& (requiresRuntimeTarget ? hasRuntimeTarget && runtimeTargetSha === observedSha : true)
&& pipelineGateOk
&& argoReady !== false
&& runtimeReady !== false;