---
name: a-failing-step-masks-the-job-budget-wall-behind-it
description: "A timeout-minutes kill is reported as `cancelled`, never `failure` — and a failing step SHORTENS the job, so fixing it can reveal a wall that was always there and make a late gate structurally unreachable"
metadata:
  node_type: memory
  type: feedback
  originSessionId: 67eaf193-4427-47cd-bf9b-94b9db7bb25a
  modified: 2026-09-09T06:39:42.950Z
---

Two mechanisms that fired together on v0.68.0 golden r3 attempt 2, 2026-09-09.

**1. GitHub reports a `timeout-minutes` kill as `cancelled`, not `failure`.** So a job that ran out of budget is indistinguishable at the conclusion field from one a human cancelled or a concurrency group preempted — and `cancelled` invites a cancellation story ("who killed my run?") or, worse, no triage at all, because it does not look like a red. **Check the job's own duration against its `timeout-minutes` BEFORE reaching for any other explanation.** Measured: `timeout-minutes: 50`, job 05:44:37→06:35:16Z = 50m39s, the killed step cancelled 49m59s after step 1 began. The arithmetic settles it in one read; the conclusion field never will.

**2. A FAILING step makes a job SHORTER, so it masks a budget wall behind it.** A red short-circuits every later step to `skipped` and jumps to cleanup. Fix the red and the job runs *longer* — and can then hit a timeout that was always there but never reached. On this run attempt 1 failed in Phase B and finished in 48m39s, **within 1m21s of the 50-minute wall while failing early**. Attempt 2's Phase B passed (the rerun did exactly what it was authorized to do), the job went four steps further than any attempt ever had, and died at the wall with the whole docs block — floors, both per-OS drift gates, bundle gate — never executed.

**The consequence is the part to carry: a gate late in a job can be STRUCTURALLY UNREACHABLE while every single skip is correctly attributed to the failure above it.** That attribution was true on every previous attempt, and being true is exactly what hid the wall. "Has never passed" and "cannot pass at this budget" look identical from a skip. Sibling of [[cascade-red-from-a-skipped-driver-is-zero-information]] and of the standing rule that a skip is not a pass — this is the case where the skip is not even *evidence about the gate*, it is evidence about the clock.

**How to apply:** (1) on any `cancelled`, compute job duration vs `timeout-minutes` first; (2) when a long job's late steps have never run, ask what the job costs with everything GREEN, not what it cost when it failed — the green path is the expensive one; (3) before claiming a late gate is merely unearned, check whether the budget can reach it at all, and say "unreachable at this budget" rather than "skipped again" when it cannot; (4) fixing the wall is a WORKFLOW change (raise the budget or split the job), which means a rider, a new head and a fresh gate run — a milestone-shape decision, not a rerun mechanic, so it belongs to the gater. Kin: [[rerun-carried-jobs-dedupe-executions]], [[a-terminal-exit-watcher-is-blind-to-a-rerun-of-the-same-run]].
