From 76c2a589964470625e0c499eaac26982cc60167c Mon Sep 17 00:00:00 2001 From: Codex Date: Fri, 3 Jul 2026 11:42:01 +0000 Subject: [PATCH] cicd do not infer legacy timings --- .../references/branch-follower.md | 2 +- scripts/src/cicd.ts | 26 ++----------------- 2 files changed, 3 insertions(+), 25 deletions(-) diff --git a/.agents/skills/unidesk-cicd/references/branch-follower.md b/.agents/skills/unidesk-cicd/references/branch-follower.md index f892a5d9..b81b3b19 100644 --- a/.agents/skills/unidesk-cicd/references/branch-follower.md +++ b/.agents/skills/unidesk-cicd/references/branch-follower.md @@ -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`. diff --git a/scripts/src/cicd.ts b/scripts/src/cicd.ts index 00971715..8c999a38 100644 --- a/scripts/src/cicd.ts +++ b/scripts/src/cicd.ts @@ -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 | 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 | null | u }; } -function totalTimingFromLivePayload(payload: Record | 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 | null): StageTiming[] { if (payload === null) return []; const stages: StageTiming[] = [];