Skip to content

ci: triage every checkout, and surface the signature that hid three timeouts - #6767

Merged
forkwright merged 1 commit into
mainfrom
ci/6757-checkout-triage
Aug 14, 2026
Merged

ci: triage every checkout, and surface the signature that hid three timeouts#6767
forkwright merged 1 commit into
mainfrom
ci/6757-checkout-triage

Conversation

@forkwright

Copy link
Copy Markdown
Owner

Closes #6757

The result is mostly a negative, and that is the finding

All 32 actions/checkout steps across 20 workflows were enumerated and classified by what the job actually reads. The 27 not already fixed were re-derived independently rather than taken from #6756's summary.

There is almost nothing left to filter.

filter: blob:none only does anything alongside fetch-depth: 0. Most steps here never set it, so a filter would be a no-op — including several that looked like obvious candidates (yaml-validate, docs-lint, llm-freshness, pii-scan, both security.yml cargo jobs).

Of the steps that do set fetch-depth: 0, nearly all genuinely need the objects:

job why the full tree
desktop, integration-server-smoke, online-tests ×2, release/test, gate-coverage-compile-checks they compile
secret-scan (trufflehog), gitleaks they scan history content by design — security.yml's own WHY(#6609) says so

For those a blob-filtered clone is a loss, not a win — it fetches blobs lazily and they need all of them.

So #6756 already fixed the entire qualifying population: check-trailer, detect CodeQL scope, attestation-verify. The class was three, not twenty-seven.

What actually needed building

The three were each found only by reading a job log after something else looked broken. That is the durable problem: an overrun reports cancelled, and GitHub uses that same status for a superseded run, so a real timeout reads as "an older run got replaced" and nobody investigates.

scripts/check-checkout-filter-risk.py surfaces the signature — fetch-depth: 0 + a short timeout-minutes + no filter: — so the next instance announces itself instead of waiting to be noticed sideways.

Deliberately report-only, not gating

One job carries that exact shape on purpose: gate-coverage-scripts reads nearly every tracked file at HEAD via check-conflict-markers.py, so blob:none buys it little. A gating check would nag a documented, reasoned exception until someone silenced it — and a silenced check is worse than none.

So the script names the pattern and states plainly that not every flag wants a filter; a human still applies the same "what does this job read" judgement the triage did. It runs inside yaml-validate, which already walks the workflow directory.

Against current main it reports exactly one flag, gate-coverage-scripts — the known exception, correctly identified.

Triage of all 32 `actions/checkout` steps, and the result is mostly a
negative: **there is almost nothing left to filter.**

`filter: blob:none` only matters alongside `fetch-depth: 0`. Most steps here
do not set it, so a filter would be a no-op. Of the ones that do, nearly all
genuinely need the objects -- desktop, integration-smoke, online-tests,
release and the coverage compile-checks all build, and trufflehog and
gitleaks scan history by design, where a filtered clone is a loss rather than
a win.

So #6756 already fixed the whole population that qualifies: check-trailer,
detect CodeQL scope, attestation-verify. The class was three, not twenty-seven.

What remains is that those three were each found only by reading a job log
after something ELSE looked broken -- an overrun reports `cancelled`, which
GitHub also uses for a superseded run, so nobody investigates. This adds a
report-only check for the signature (`fetch-depth: 0` + a short timeout + no
filter) so the next one surfaces on its own.

Deliberately report-only. `gate-coverage-scripts` carries that exact shape on
purpose -- it reads nearly every tracked file at HEAD -- so a gating check
would nag a documented, reasoned exception. It names the pattern; a human
still decides whether a filter is right for that job.
@sonarqubecloud

Copy link
Copy Markdown

@forkwright
forkwright merged commit 9fc16ab into main Aug 14, 2026
30 checks passed
@forkwright
forkwright deleted the ci/6757-checkout-triage branch August 14, 2026 02:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

30 checkouts, none blob-filtered — a timed-out clone reports 'cancelled' and reads as a supersede

1 participant