Skip to content
Sign in

How-to

Find out why a pull request is blocked

Updated

On this page

Find the reason Zof gave for a pull request, and what will unblock it. It takes about 3 minutes, and you need to be able to open the pull request on GitHub.

Zof explains every result in its Zof / Control check on GitHub. The console's Releases page lists your open pull requests, each with one status and the reason.

Before you start

  • The Zof GitHub App is installed on the repository. See Connect GitHub.
  • The pull request has a Zof / Control check.
  • To use the console, you're a member of the company in Zof.

Read the check on GitHub

  1. Open the pull request on GitHub, and open its checks.
  2. Open Zof / Control.
  3. Read its title. The title is Zof's result.
  4. Read the sections under the title.
Title on the checkWhat it means
"RELEASE AUTHORIZED"Every required check passed. The check is green.
"AWAITING APPROVAL"An authorized approver has to approve it. See Approve a change.
"RELEASE BLOCKED: evidence missing"Evidence that a rule needs is missing, not enough or out of date. Or an input Zof needs isn't available yet. Zof never allows a change on missing input. See How Zof decides.
"RELEASE DENIED"A required check failed, verification contradicts a required check, or an approver requested changes. A result Zof doesn't recognise also shows as denied.
"Evaluating: waiting for system context"Zof hasn't got the facts about this commit yet. The check updates on its own.
"Evaluating: waiting for verification"Zof is waiting for test and review evidence. The check shows the time it fails if nothing arrives, usually 30 minutes after it starts waiting.
"RELEASE BLOCKED: internal consistency check failed"Zof's records for this commit disagree, so it refused to show it as authorized. Re-evaluate it, or email support@zofai.com.

The check reads from the top:

  • One sentence under the title: how many required checks passed, or which required checks stop the release.
  • "Why": reasons that aren't about one check. Each line is the sentence for a reason code. Look it up in Reason codes.
  • One line per check: its name and one result, Passed, Failed, Not run yet, Running, Couldn't run, Couldn't check or Changed lines untested. An optional check carries an "Optional" tag and never stops the release; every other check is required. When a check didn't pass, the line says what to do next. "Details" under it has the rule, the policy version and the reason code.
  • "To unblock": anything left to do that isn't on a check's line.
  • "Impact and verification" and "Audit" are folded: the services the change touches, its risk, the verification run and policy Zof used, and the decision ID.

If the check starts with "Not enforced: developers can merge this PR despite this result", GitHub doesn't require the check on that branch yet. Zof's result still stands, but GitHub won't stop a merge. See Make Zof block merges.

Find the pull request in Releases

  1. Open Releases from the sidebar. The pull requests that need a person come first, each with one line saying what stands in the way; see Check results and statuses.
  2. Open the pull request. The card at the top shows one word, such as Ready to ship, Blocked, Needs evidence or Waiting for approval. After it come the first reason, then every other reason the decision gave, such as files that don't belong to a service, and when Zof decided. See Decisions in Releases. The header has the one action that word asks for: Fix when it's Blocked or Couldn't check, Approve in GitHub while it waits for an approval, Open in GitHub when it's Ready to ship, and Verify this head when evidence is missing and no run is at the commit. Everything else is in the More actions menu beside it, with the reason when it can't be used. Under the card, the tabs Gates, AI review, Changes, Tests and Activity hold the rest; switching tabs keeps you on the page, and the address keeps the tab. See the review opens the AI review tab, which shows Zof code review's review of the latest commit. Its summary can start with a paragraph the AI wrote: what the pull request changes and, for its findings, how each one fails and why that matters. The size, risk, counts and coverage after it come from Zof, never from the AI. Up to 8 findings follow, most severe first, each on one line with its level, title and file. Click one to open its detail. When the review wrote one, the open finding also has a Prompt for AI agents block with Copy: an instruction you can paste into a coding agent to fix the finding. The page only shows the prompt; it never runs it. Open the review shows every finding. With no review of that commit, click Run code review. The AI review never changes the decision.
  3. The Gates tab lists each requirement, the ones that need something first. Each row shows the gate, Optional when it doesn't block, one status word, what happened, any target such as a coverage target, the next step and one action: Fix for a failed gate, Approve in GitHub for an approval, the run at this commit, Verify this head when no run is there, or the Zof GitHub App's own link. What passed is folded under Passed while something is open. Record override reason, Re-evaluate now, Export report and release history are on the Quality gates tab for now: click Open the full gates view under the list.
  4. Click a gate's Evidence to open its drawer. Under its name, it names the capability and the rule it comes from as Rule:. Evidence shows the result, what happened, what to do next, and whether the gate is required or optional. Evidence with files reads Sealed · this run's evidence matches its record only when the engine's re-check of the whole run says so. On the unit tests gate, Open Tests closes the drawer and opens the Tests tab.

A gate's word is one of Passed, Approved, Issues found, Needs evidence, Being checked, Waiting for approval or Couldn't check, and its result says what happened, such as Changed lines untested. A unit tests gate with Changed lines untested links to See the untested lines in its evidence. A gate with no evidence yet links the pull request run for that commit when there is one, for example "Skipped · view run"; hover it for the skip reason when one was recorded. Approval gates show the counted/required approvals and who may approve. AI review findings are advisory and never change a decision. Export report saves a readiness report with Zof's decision record of the pull request (with the record's own digest, to check against the Zof GitHub App later) and the evidence bundle's fingerprint, then downloads it as JSON. The message names the report's sha256 fingerprint, so you can check a copy later. It needs a recorded release decision. On Reports, Download PDF beside the JSON download saves the same decision as a report to share, with no IDs in it. A very long report can't have a PDF, and a long one may ask you to try again in a few seconds; the JSON download still works.

Ask Zof to decide again

Zof decides again on its own after a push, a review, new verification results, a new policy or a change to release approvers. If you fixed something outside the pull request, you can ask for a new decision:

  1. Open the Zof / Control check on GitHub.
  2. Click Re-evaluate. Running the check again with "Re-run" works too.

The check updates once Zof has decided. Re-evaluate now on the Quality gates tab asks Zof to decide again (it needs the Member or Admin role). It says "Re-evaluation queued", and the decision updates when the job finishes; if a newer commit arrived, that commit is evaluated instead.

Check that it worked

Once the cause is fixed, the check's title changes to "RELEASE AUTHORIZED", and its "To unblock" section says there is nothing to do. In Releases, the pull request shows Ready to ship, and its Quality gates banner starts with "Release authorized" and names the commit.

If the banner says "Waiting for check", Zof has allowed the change but GitHub doesn't show the green check yet. Wait a moment and reload.

Common reasons

"Why" saysWhat usually unblocks it
"A required approval is missing."An approver listed for the change's owner approves the current commit on GitHub. An approval of an older commit doesn't count. See Approve a change.
"An approval no longer counts."The approval came from someone who wrote or pushed to the change, came before the evidence for this commit, or the evidence changed since. Ask for a new approval.
"A required check hasn't run yet."Open the linked run in the console to see which required check hasn't reported a result.
"No verification run exists for this change yet."Wait for Verification to report. If nothing arrives, open the pull request in Releases and select Verify this head to start verification for its current commit. The button is off for a closed or merged pull request, for a role that can't start runs, and until a release policy is published. Otherwise the check fails at the time it shows.
"Some changed files don't belong to any service in your system map."Add these files to a service in System map. See Set up System map.
"A reviewer's teams are unresolved; retrying."Zof retries on its own. If it keeps happening, see Members read permission.

Every reason, with its exact words and fix, is in Reason codes.

Not supported yet

The console has no way to waive a requirement. When "To unblock" says "Add verification criteria or waive the requirement", the requirement stays until the evidence arrives or someone who is both a company admin and a GitHub org admin changes the rule in Release policies.

Next steps