Recommended Free Tools
A green check means one check run passed against one commit under one set of rules. It does not, by itself, mean that every test ran, that the check was required for the branch, or that the exact code that later landed on main was ever tested together. When six tests fail on main after a pull request showed a passing check, one of those gaps is the usual explanation. Which gap applies cannot be named without the run logs, the branch rule configuration, and the commit records for that specific incident.
What a green check actually certifies
A status check is attached to a commit SHA. When a workflow or integration reports success, GitHub records that result against the SHA the run was executed on. Whether that result blocks a merge depends on a separate setting: the branch rule that lists which checks are required. The two are easy to conflate, and most confusing “green but broken” cases come from treating them as one thing.
As an Amazon Associate I earn from qualifying purchases.
| What the green check shows | What it does not show |
|---|---|
| A run with that check name finished successfully on a specific SHA | That the SHA was the one that eventually merged |
| The job that reported success completed | That every test in the suite executed (a skipped job can also report success) |
| The workflow ran for the event that produced the report | That the same workflow ran for the event that the merge depended on |
| The check passed on the pull request branch | That the pull request still passes after the base branch moved and the two were combined |
| A check with that name passed | That the check came from the source your branch rule expects, or that the name was not shared with another workflow |
Why CI passed but tests failed on main
Six different mechanisms can produce the same visible symptom. They are listed roughly from the most common to the least common in practice, but none of them can be ruled in or out from the headline alone.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallCrashes, No Sound, or Screen Glitches?
Random freezes, missing sound and display glitches usually trace back to one bad driver. Find and replace yours safely.Free scan · under a minuteThe required check passed on an earlier commit
GitHub’s troubleshooting guidance for required status checks is direct on this point: “Required checks must pass on the latest commit SHA.” If a pull request received a green result, and then a new commit was pushed without the check completing on that new SHA, the earlier green result does not satisfy the requirement for the newer code. Depending on the check’s state, the object that GitHub evaluates can be the pull request head or a temporary test merge commit, so a check that looks current in the pull request view may refer to a different object than the one that merged. GitHub required-check troubleshooting describes these states.
#1 Best Overall
To test this, compare three identities: the SHA that landed on main, the pull request head SHA at the time of merge, and the SHA each check run reports. A mismatch between the first and the third is the signature of this mechanism.
The branch had no required check, or a bypass applied
A green check only gates a merge if the branch rule lists it as required for that exact target branch. A check can run reliably, pass, and still be non-gating because it was never added to the rule, was added to a rule that targets a different branch pattern, or was added to a rule that exempts some actors. Bypass permissions and direct-push access are the other half of this question. If a maintainer or automation account can push to main directly, or can merge past a failing requirement, the gate was optional in practice even when it was configured.
GitHub documents these controls in its guidance on protected branches, which is the place to check the current options for your plan and repository type: About protected branches.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →The workflow never ran for the event that mattered
GitHub documents that some workflow events do not produce checks that satisfy rulesets. A workflow configured only for one trigger may run on a pull request and report success, while the merge that reached main followed a different path that never executed the tests. A related case is a required check that never reports at all: GitHub’s documentation notes that certain skipped workflows can leave a required check pending rather than passing, which blocks merging rather than letting it through. Either way, the workflow’s trigger configuration determines which events are covered.
Path filters, branch filters, or conditions skipped the tests
Path filters, branch filters, and job-level if conditions can prevent the test suite from running for a particular change. The important detail is what the gate then reports. GitHub notes that a skipped job may report success. If the six failing tests lived in a job that was skipped on the pull request and then executed on the merged state, the green check was accurate about what it ran and silent about what it did not.
Two workflows reported the same check name
GitHub warns that duplicate job names across workflows can produce ambiguous status-check results. If a required check name matches a job in two different workflows, the result that appears against the requirement may come from the one you did not intend to test. Naming collisions are easy to miss because each workflow looks correct in isolation.
Rank #3
Branch rules can also require that a check come from a specific GitHub App or integration. If that expectation is set, a status posted by a different source with the same name should not satisfy it. If the expectation is not set, the name is the only thing being matched, which makes this kind of collision more likely.
The pull request passed, but the combined result was never tested
This is the mechanism that most often surprises teams. Two pull requests can each pass against the base branch as it existed when they were tested, then fail together after the first one merges. Loose status checks allow a pull request to merge without first being brought up to date with the base branch. GitHub cautions that incompatible changes may fail after merging, which is exactly the state a green check on each pull request cannot describe.
Were the required checks run on the latest commit?
This question has a precise answer that can be checked, and it should be checked before any broader theory. Open the pull request’s merge history and identify the head SHA at the moment of merge. Then open the check runs for that SHA and confirm three things: the check ran, it completed with success, and it was reported by the source your branch rule expects. If the check is absent for that SHA, it was not a pass for the code that merged, regardless of what was shown on an earlier commit.
Can a skipped job still pass the gate?
Yes, in the sense that matters for this incident. GitHub documents that a skipped job may report success. A gate that is satisfied by a success status on a skipped job will look green while the tests it was meant to protect did not execute. The fix is to make the gate depend on the tests actually running. Inspect each job that feeds the required check, record whether it ran, skipped, or was cancelled for the merge SHA, and confirm that the required check’s job is not the one that skips in that path.
Did CI test the merge result or only the pull request branch?
By default, a status check tests the commit on the pull request branch. A test that runs against that branch does not validate what main will look like after the merge, because the base branch may have moved in the meantime. Two configurations address this, and they behave differently enough that the choice matters.
Free tools Windows power users keep installed
One-click scans. No signup required.
The first is a strict up-to-date requirement. GitHub’s protected branch documentation says that strict checks require the branch to be current with the base before merging, which means the tests are run against the combined state, but it can also require repeated builds as the base branch advances.
Best Value
- Used Book in Good Condition
The second is a merge queue. GitHub’s merge queue documentation describes the queue as validating temporary merge groups against the latest base branch and against changes queued ahead of them, then merging after required checks pass. In GitHub Actions, the workflow must include the separate merge_group trigger when those checks are required. Without that trigger, the required checks cannot report for the merge group, and the queue cannot rely on them. Managing a merge queue covers the queue behavior, and GitHub required-check troubleshooting covers the trigger requirement.
Strict required checks compared with a merge queue
| Axis | Strict required checks | Merge queue |
|---|---|---|
| Pull request must be current with base | Yes, the branch must be up to date before merging | Not required in the same way; the queue builds a temporary merge group against the latest base |
| Combined or queued changes validated | Only the state of the branch at merge time, after it is brought up to date | Yes, merge groups include changes queued ahead of them |
| Rebuild cost as the base advances | Can require more builds when the base changes often | Builds are performed for merge groups; cost depends on queue size and build concurrency |
| Required workflow configuration | Required checks must report on the relevant SHA and event | Workflow must include the merge_group trigger for required checks |
| Throughput and build concurrency | Not stated in the cited GitHub pages | Build concurrency and grouping behavior are configurable |
| Handling of intermittent failures | Not stated in the cited GitHub pages | Not stated in the cited GitHub pages |
Neither option is automatically better. A team with few concurrent pull requests and a stable base branch may do well with strict checks. A team with frequent merges into a busy base branch is more likely to need the combined-state validation a queue provides, and should expect to configure it deliberately rather than assume it is on.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Was the gate required, or could it be bypassed?
Whether the gate was enforceable is a separate question from whether it ran. Check four things in the branch configuration for the exact target branch: the list of required checks, whether strict up-to-date checks are enabled, which actors can bypass requirements, and whether direct pushes are permitted. A rule that is enabled but exempts an actor, or a branch pattern that does not match main, produces a gate that is present on paper and absent in practice.
The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →A diagnostic sequence for the incident
- Record the commit SHA that reached
main, the pull request head SHA immediately before merge, and any test merge or merge group SHA the platform created. Note which of these each of the six failing tests ran against. - In the repository settings, open the rule for
main. Under Settings, use Rules and Rulesets for repository rulesets, or Branches for classic branch protection rules, and confirm that the intended test checks are listed as required for that exact branch. - Review bypass permissions and direct-push access for the same rule, including any automation accounts, and check the audit history for merges made without a complete set of passing checks.
- For each required check, open the check run for the merge SHA and confirm the source, the workflow, and the event that triggered it. For GitHub Actions, confirm that the relevant workflows run on the pull request events you rely on, and that the workflow includes
merge_groupif a merge queue is in use. - Inspect path filters, branch filters, job-level conditions, and dependencies for every job that feeds the required check. Record which jobs were skipped, cancelled, or pending for the merge SHA.
- Search for duplicate job names across workflows, and confirm that the expected GitHub App or integration supplied each required status.
- If changes can interact, decide between strict up-to-date checks and a merge queue, and verify that the chosen mechanism actually tests the combined state before the next merge.
- Only after these records are reviewed should a single cause be named for the six failures. Where two mechanisms apply, document both, because a fix for one will not stop the other.
What this analysis cannot establish
This article explains the mechanisms by which a green check and red tests on main can coexist. It does not establish which mechanism caused the incident described in the headline, and it does not confirm that the incident used GitHub, GitHub Actions, or a merge queue. The platform-specific steps and cited GitHub documentation are a concrete example of how these mechanisms are configured, and they should be checked against the current documentation for the platform actually in use. The specific six tests, their results, and the repository’s configuration require the run logs and settings records that were not part of this analysis.
Where a figure is not stated in the cited GitHub pages, such as throughput limits or behavior on intermittent failures, this article does not supply one. Those details depend on plan, configuration, and workload, and should be verified in the repository’s own settings.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




