Skip to content

Scope and limits

waznggo edited this page Jul 26, 2026 · 1 revision

Scope and limits

Measured across 243 real failed jobs from 15 popular repositories:

share status
Plain Ubuntu jobs 63% supported
Reusable workflows 13% supported — exact when the call is same-repo or SHA-pinned
macOS / Windows 23% refused
Unknown runner labels 1% asks you to map it

So it helps with roughly 76% of real CI failures. That number is measured, not estimated, and the corpus it came from is committed in the repository.

Why macOS and Windows are refused

A Linux container cannot run them. Windows containers exist but only on a Windows host, GitHub's windows-2022 runner image is not published anywhere, and there is no community equivalent. The honest options were "refuse" or "run something that is not what CI ran" — and a tool whose entire value is fidelity cannot choose the second.

You still get the full resolution for those jobs: commit, matrix leg, which step failed, which secrets it needed. Only the reproduction is refused, with exit code 3.

Moving refs

When a job calls org/repo/.github/workflows/x.yml@main, the steps live in another repository at a ref that has moved. GitHub does not record which commit the run used, so exact fidelity is impossible in principle. reenact reproduces it anyway — using today's file — and says so loudly. When it can prove the file changed, it names the step that disappeared.

When it refuses to guess

Three places, all deliberate:

  • Two jobs produce the same display name. Real example: test-smoke and test in pnpm both render as TS CI / Test / ubuntu. reenact reports both candidates instead of picking one.
  • A step name resolves to nothing but an expression, so its pattern would match any step.
  • The failing step cannot be mapped to a YAML step. You can override with --step N.

Guessing wrong here means dropping you in front of the wrong step, in the wrong environment, with full confidence. That is worse than an error message.

Exit codes

code meaning
0 reproducible (and, for reenact <url>, reproduced)
1 error
3 resolved, but cannot be reproduced faithfully

Clone this wiki locally