1. Paste your required status check names
From Settings → Branches → Branch protection rules → Require status checks to pass, one per line — or paste the JSON from gh api repos/:owner/:repo/branches/:branch/protection directly, contexts array and all. Leave this blank to just see the check names your workflows would currently report.
2. Paste one or more workflow files
Copy the contents of each file under .github/workflows/ that could produce one of the checks above.
Paste at least one workflow file above and click Check.
Findings
| Required check name | Status | What this means |
|---|
Prefer a CLI, or want this in your own CI?
Same logic, zero dependencies, one file:
python3 check.py # list computed check names for .github/workflows
python3 check.py --required-checks names.txt # compare against a plain-text list
python3 check.py --required-checks protection.json # or the branch-protection API's own JSON
python3 check.py --required-checks names.txt --format json
python3 check.py --required-checks names.txt --fail-on-stale # exit 2 if any required check is stale
Get check.py from the repo — stdlib only, nothing to install, no network calls. Fetch your own required-checks JSON with gh api repos/:owner/:repo/branches/:branch/protection > protection.json and feed it straight in.
Common questions
Why does a pull request get stuck at “Expected — Waiting for status to be reported”?
Branch protection matches required status checks by exact name. If the job that used to report that name was renamed, removed, or its workflow no longer triggers on pull_request, GitHub has nothing left to satisfy that name — every future pull request sits pending forever, with nothing in the pull request itself explaining why.
Does this tool read my branch protection settings for me?
No. It makes no network calls at all — nothing here can, because nothing here talks to a server. Paste the required check names (from Settings → Branches, or the JSON from the GitHub API) and your workflow YAML, and the comparison happens entirely in this page.
How does it compute a job's check name?
A job's name: field if it has one, otherwise its job id, exactly as GitHub Actions reports it. A matrix job gets " (value1, value2, ...)" appended for each combination, in the matrix's declared order.
What can't it verify?
A dynamic matrix built from an expression like fromJson(...), or one using include/exclude, cannot be enumerated statically — those jobs are reported as unverifiable rather than guessed at. A job that calls a reusable workflow (uses: a .yml file) uses a different naming convention this tool does not compute, for the same reason.
Does a clean result mean my branch protection is fully correct?
No. This checks one specific, well-documented thing: whether each required check name matches a job that would report on a pull request today. It is not a full audit of your branch protection rules or CI configuration.
More: how a required status check goes stale, and how to fix it, and this checker vs. reading every workflow file by hand.