cicd do not infer legacy timings

This commit is contained in:
Codex
2026-07-03 11:42:01 +00:00
parent e0d83d1d4a
commit 76c2a58996
2 changed files with 3 additions and 25 deletions
@@ -66,7 +66,7 @@ Stage timing must be queryable through normal CLI output, not only raw JSON. `st
`timings.totalSeconds` is the authoritative end-to-end wall-clock measurement for a triggered run: measure from `timings.startedAt` until `timings.finishedAt`, or until query time while closeout is still running. Do not compute total by summing stage rows, because stage rows can overlap, omit external waiting, or be reported by different native objects.
If a controller loop resumes an already-triggered source change and the stored state predates `startedAt`, it may recover the total timer from the native PipelineRun start time and then persist that recovered start point.
Do not backfill, infer, or migrate old branch-follower state when historical timing, stage timing, or other observability fields are missing or known to be unreliable. Compatibility starts with future state written by the current controller; old missing data must render as `-`/unknown in CLI output instead of being recovered from unrelated native objects.
State machine phases are `Observed`, `Noop`, `PendingTrigger`, `Triggering`, `ClosingOut`, `Succeeded`, `Failed`, `Superseded`, `Blocked`, and `Skipped`.
+2 -24
View File
@@ -2087,7 +2087,7 @@ function buildFollowerTimings(
phase?: BranchFollowerPhase,
): FollowerState["timings"] {
const nativePayload = asOptionalRecord(live.payload);
const total = totalTimingFromCommand(triggerCommand, phase) ?? totalTimingFromStored(storedTimings, phase) ?? totalTimingFromLivePayload(nativePayload, phase);
const total = totalTimingFromCommand(triggerCommand, phase) ?? totalTimingFromStored(storedTimings, phase);
const stages = dedupeTimingStages([
...stageTimingsFromCommand(triggerCommand),
...stageTimingsFromNativePayload(nativePayload),
@@ -2152,9 +2152,9 @@ function totalTimingFromStored(storedTimings: Record<string, unknown> | null | u
if (storedTimings === null || storedTimings === undefined) return null;
const status = stringOrNull(storedTimings.totalStatus);
const source = stringOrNull(storedTimings.totalSource);
if (phase === "Noop" && status === "noop" && source === "tekton-pipelinerun-start") return null;
const startedAt = stringOrNull(storedTimings.startedAt);
const finishedAt = stringOrNull(storedTimings.finishedAt);
if (phase === "Noop" && finishedAt === null) return null;
const seconds = totalSecondsFromRange(startedAt, finishedAt) ?? numberOrNull(storedTimings.totalSeconds);
if (seconds === null) return null;
return {
@@ -2166,24 +2166,6 @@ function totalTimingFromStored(storedTimings: Record<string, unknown> | null | u
};
}
function totalTimingFromLivePayload(payload: Record<string, unknown> | null, phase?: BranchFollowerPhase): { seconds: number; status: string; source: string; startedAt: string | null; finishedAt: string | null } | null {
if (payload === null) return null;
if (phase === "Noop") return null;
const tekton = asOptionalRecord(payload.tekton);
const startedAt = stringOrNull(tekton?.startTime);
if (startedAt === null) return null;
const finishedAt = phase !== undefined && terminalPhase(phase) ? new Date().toISOString() : null;
const seconds = totalSecondsFromRange(startedAt, finishedAt);
if (seconds === null) return null;
return {
seconds,
status: phase === undefined ? "native-observed" : phase.toLowerCase(),
source: "tekton-pipelinerun-start",
startedAt,
finishedAt,
};
}
function totalSecondsFromRange(startedAt: string | null, finishedAt: string | null): number | null {
const startedMs = timestampMs(startedAt);
if (startedMs === null) return null;
@@ -2197,10 +2179,6 @@ function timestampMs(value: string | null): number | null {
return Number.isFinite(parsed) ? parsed : null;
}
function terminalPhase(phase: BranchFollowerPhase): boolean {
return phase === "Succeeded" || phase === "Failed" || phase === "Blocked" || phase === "Skipped" || phase === "Noop";
}
function stageTimingsFromNativePayload(payload: Record<string, unknown> | null): StageTiming[] {
if (payload === null) return [];
const stages: StageTiming[] = [];