---
name: gh-job-log-refuses-while-run-in-progress
description: "RUN-SCOPED gh refusals: several gh verbs refuse while ANY job in the run is still going. --log exit-1s (a suppressed stderr then reads as 'no failures'); rerun --failed refuses too, and THAT refusal reads as a rerun problem rather than a timing one."
metadata: 
  node_type: memory
  type: reference
  originSessionId: 12a8ef0e-7168-4db4-9cc0-751034b831c8
  modified: 2026-08-18T05:09:25.320Z
---

Measured 2026-08-04 on golden 30928816784 while `twohost-b` was still in_progress:

    gh run view --repo BigscreenVR/spt-bs-core --job 92072944053 --log
    run 30928816784 is still in progress; logs will be available when it is complete
    exit=1        # 0 lines written

The refusal is RUN-scoped, not job-scoped: the job I asked for had been `completed/failure`
for ten minutes. Any sibling job still running withholds every job's log.

**Why it bites:** I had written `--log 2>/dev/null > out.txt` and then grepped `out.txt` for
`FAIL`. Zero matches. That zero is indistinguishable from "the job had no failures" — the tool
refused, the refusal went to /dev/null, and the empty file answered a question it had never
been asked. Same shape as [[zero-match-filter-reads-as-absent]] and
[[verdict-from-probe-competence]], with `2>/dev/null` supplying the blindfold.

**How to apply:** to read a COMPLETED job's log inside a LIVE run, use the API path, which
works and returned 3514 lines on the same job seconds later:

    gh api repos/<owner>/<repo>/actions/jobs/<job_id>/logs

**Provenance (pinned 2026-08-17, GROUNDED 2026-08-18):** this route is deployah's 2026-08-04
measurement against golden 30928816784. Attribution method — NOT assertion, NOT "whose memory
dir it sits in" (the dir is fleet-SHARED; dozens of distinct originSessionIds live here, so
location was never evidence): this note's `originSessionId` 12a8ef0e-7168-4db4-9cc0-751034b831c8
greps to `owlery/deployah/sessions.log`. General instrument: live session → match
`owlery/<agent>/info.json` session_id; dead session → grep the id against
`owlery/*/sessions.log`. Any citation (runbook amendment included) cites the 2026-08-04
measurement + run number, attributed on the sessions.log grep. Retrieval failure filed
separately by deployah: an unrecalled memory is experienced as a TOOL limitation and gets
reported as a false constraint (his "not yet knowable" claim while this note held the answer).

No leading slash (see [[gh-api-leading-slash-msys-rewrite]]). Never put `2>/dev/null` on a
fetch whose emptiness you intend to interpret — print the exit code and the line count next to
the result, so a refusal cannot masquerade as an absence. Kin: [[verdict-from-exit-not-from-silence]],
[[truncated-grep-read-as-the-population]], [[gh-run-poll-jobs-not-status]].

---

## SECOND FACE, same run-scoped mechanism: `gh run rerun --failed` (2026-08-28)

**`gh` refuses `rerun --failed` while the run is still in flight**, for the same
run-scoped reason `--log` refuses: the run is not terminal, so the set of failed
jobs is not yet final. Measured on CONDUIT golden 33223968222 (v0.65.0, head
`110d1751`) — deployah held the rerun rather than fight it, and named the cost.

**Why this face bites differently.** The `--log` face fails toward a FALSE GREEN
(a suppressed refusal reads as "no failures"). This one fails toward a FALSE
DIAGNOSIS: attempt the rerun early and the refusal presents as a problem with the
RERUN — a bad command, a permissions issue, a broken workflow — when it is purely
a statement about TIMING. deployah's framing, worth keeping: *"a rerun attempted
in flight fails in a way that reads as a rerun problem rather than a timing one,
which is how it costs an hour instead of a minute."*

**How to apply:** before `rerun --failed`, confirm the run is terminal
(`gh run view <id> --json status` → not `in_progress`; note that a run with some
jobs green and one job failed is still in flight while any sibling runs). Waiting
is the fix; there is nothing to debug. This also means a partial-failure run
cannot be rerun the moment you spot the red — the red is visible long before the
run is rerunnable, and that gap is the whole trap.

**Provenance:** deployah's 2026-08-28 measurement on run 33223968222, relayed to
me during the CONDUIT golden hold and banked with their words quoted. Same
attribution discipline as the 2026-08-04 face above.

