---
name: a-run-level-conclusion-is-not-an-attempts-verdict
description: gh run list conclusion/createdAt describe the RUN (latest attempt, attempt-1 creation) — naming an ATTEMPT from them reports a stale red as a fresh verdict; read run_attempt.
metadata:
  type: feedback
---

**A GitHub run object does not answer a question about an ATTEMPT.** `gh run list --json conclusion`
returns the LATEST attempt's conclusion, and `createdAt` is **attempt 1's** creation instant — neither
is scoped to the attempt you have in mind. `gh run view <id> --json jobs` likewise shows the latest
attempt's jobs. **Read `run_attempt`** (`gh run view <id> --json ... -q` / the API's `run_attempt`
field, or `--attempt N`) before putting an attempt number in a sentence.

Mine 2026-09-09, ~01:29Z, spt-core golden #272 r2. I was holding the boxes quiet waiting on **a4**.
Post-clear I ran `gh run list`, saw run 34262154550 at 25e60015 `completed/failure` with
`createdAt` 2026-09-08T18:17:29Z, and told doyle — the gater who set the hold — **"a4 HAS READ and it
is RED"**, plus "sitting complete ~7 h". Every figure was real and the conclusion was false: that was
**attempt 3**, terminal 01:20Z, whose red (`mesh_recovery roster_route_survives_…` 15.715 s) he had
**already triaged** — it is the exact cell my rider 5 exists to fix. Attempt 4 had not been fired at
all; deployah was holding it for an operator answer. The 18:17Z stamp I called a terminal was a
creation.

**Why it matters:** this is a false release of a hold, sent TO the person who set it. Had he acted on
it, cargo runs on both boxes, the quiet-box precondition for the very cell in question is destroyed,
and the next attempt's timing evidence is contaminated by me. The failure is not "I misread a field" —
it is that **a stale red and a fresh red render IDENTICALLY** at run level, so re-reading the same
object more carefully would never have caught it. Same family as
[[an-absent-row-and-an-unreadable-row-render-identically]] and
[[a-stamp-typed-from-the-previous-turns-clock-is-a-guess]].

**How to apply:** before naming an attempt — `run_attempt` in the same command that reads the verdict.
Cite the attempt's own terminal (`updatedAt` / the job's finish), never the run's `createdAt`. When
someone else set the hold, the release comes from THEM with the attempt number in their sentence;
my job is to hand them evidence, not to declare their wait over. Prefer a per-job window
(`gh run view --job <id>`) — job start/finish are attempt-scoped where the run's stamps are not.
