Files
kevinveenbirkenbachandClaude Opus 5 2aca0f62d0 fix(ci): make the failed-run retrigger reach its dispatch
i8cifail died twice on the same run, each failure hiding the next.

The retrigger recovers a source run's dispatch inputs from a job log, because the title truncates at 512 bytes and REST answers inputs: null for a finished workflow_dispatch. That reader picked the first depth-1 job outright. A skipped job never uploads a log blob, so its log endpoint answers BlobNotFound as a bare HTTP 404 -- and a force-cancelled run can leave every depth-1 job skipped, which is why deeper jobs are now read too rather than assumed inputs-free. Candidates are taken shallowest first, so the orchestrator's own inputs still win over what a caller forwarded. gh 2.97 also refuses to emit a log holding terminal escape sequences and exits 1; the log downloader read that as no log and silently wrote none. A missed fetch is now tolerated instead of aborting, so the guard in dispatched_priority reports an expired log in words rather than the command dying on gh: HTTP 404.

Behind that sat the resolver: it decoded whole priority entries, but an entry may pin axes (web-app-zammad#1@compose+tor), which the display-name codec does not parse. Every pinned entry aborted as corrupt. split_axes -- already the seam decode_list uses -- separates name from suffix, so only the name is resolved and the truncation guard stays sharp. The pin rides along into the retrigger: the entry never ran, so the run holds no evidence its axes were wrong.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 05:21:52 +02:00
..
…

Logs 📥

Download GitHub Actions job logs and run artifacts for a CI run, optionally filtered by job conclusion, for local inspection.

python -m cli.meta.ci.logs.download <run-id|run-url> [-s] [-f] [-c] [--skipped] [-d DEST] [-j N]

Conclusion flags select which jobs' logs are fetched (-s/--success, -f/--failed, -c/--cancelled, --skipped); with none given every completed job is fetched. Logs land under DEST/logs/, artifacts under DEST/artifacts/. DEST defaults to /tmp/logs/<run-id>. Job logs are available per job even while the run is still in progress; --no-logs / --no-artifacts skip either half.

Logs and artifacts download in parallel across -j/--jobs workers (default: CPU count); each worker waits a random 1-2*workers second jitter before its request so the burst does not trip GitHub API rate limits.