โ† deemwar engineering examples Runnable ยท Node ยท zero deps ยท free

Your CI has been red for weeks. It's probably not your YAML.

GitHub Actions can fail at startup, in 0 seconds, with zero jobs run, on every single push โ€” doc-only commits included. GitHub's own message blames the workflow file. Most of the time, for this exact shape of failure, that message is wrong.

The crux

A 0-second startup_failure means GitHub never got as far as reading your workflow file โ€” it short-circuits before that, which is exactly why it fires on every push regardless of what the commit touched. The real cause, most of the time: exhausted Actions minutes, or a hit spending limit. A billing state, not a code state.

A real YAML/syntax bug behaves differently โ€” it usually still starts the job and fails inside it, or only breaks on commits that touch the workflow file or the paths it filters on. That difference is the whole diagnosis.

The fingerprint (need all four)

We hit this across four of our own private repos, over two dates a couple of days apart. Same fingerprint, every time โ€” and until we recognized the pattern, each one separately read as "our CI broke," not "the org ran out of minutes."

Check it yourself

node check.js <owner>/<repo>

Zero dependencies โ€” it shells out to the gh CLI (already authenticated) to read your last 20 runs and tell you whether the billing-exhaustion fingerprint is present.

$ node check.js your-org/your-repo Checked the last 20 runs on your-org/your-repo. startup_failure runs: 20 (of which 20 finished in <=2s) DIAGNOSIS: this looks like exhausted Actions minutes / a spending-limit hit, not a workflow-file bug -- despite what the failure message suggests. Why: a 0-second startup_failure on most recent runs, regardless of what each commit touched, means GitHub is short-circuiting BEFORE it reads your workflow file or evaluates any path filter.

The fix

There's no code fix for the root cause โ€” it's a billing action (buy more minutes, clear the spending limit, an org admin resolves it). There is a code fix for the noise: if a bot pushes on a schedule, every push creates another dark 0-second run and another failure email, stacking alert fatigue on top of the billing problem. gh workflow disable <name> --repo owner/repo stops that without touching the workflow file; re-enable once billing is restored.

Get the code