PRFlow Runs Your Checks, Not Its Own
PRFlow has no test framework of its own. It runs the tests, linters and build commands your repository already has, in the environment the run is executing in, using commands your repository configures and permits. That means two things:- The quality of PRFlow’s verification is the quality of your test suite. PRFlow can only report what your checks are able to detect.
- PRFlow can only run a command you have permitted. See Tool Permissions.
prflow_implement.allowed_tools is where you add your repository’s own commands. Here is how you permit a test command:
npm test and npm run lint and record what they returned. Without it, the same commands are refused before they run.
prflow_implement.allowed_tools covers implementation runs. It does not inherit from prflow.allowed_tools, which covers the general cloud command workflow. Set the one that matches the runs you want to change.A Focused Check Is Not a Finished Job
While PRFlow is iterating on a change, it runs the narrow check that covers the code it just touched. That is the right thing to do mid-change: it is fast and it tells the run whether the last edit worked. A focused check is evidence for that iteration. It is not evidence that the change is finished, because it only ever covered the part of the repository it was selected for. Before a run can reportComplete, it needs a result that covers the full set your repository expects, not the slice it happened to iterate on.
Unknown Is Never a Pass
This is the rule that decides most of PRFlow’s behavior around verification. Each of these is an unknown result, and none of them lets a run claim its work is verified:
A run that ends with any of those in place of a required result stops and says so. It does not round the unknown down to a pass and it does not round it up to a failure. It reports that the result was never established.
Why silence is treated as unknown rather than success
Why silence is treated as unknown rather than success
A command that a permission boundary refuses does not print an error the way a failing test does. It simply produces nothing. If a run treated “no output” as “no problems”, every refused check would read as a clean pass, and the runs most likely to be under-verified would be the ones reporting the cleanest results. Treating silence as unknown is what makes that failure visible instead of invisible.
When a Needed Command Is Not Permitted
If verifying an acceptance criterion requires a command the run is not permitted to execute, PRFlow does not skip the criterion and does not quietly mark it satisfied. The run stops. It recordsBlocked on the workpad, names the criterion it could not verify and names the permission setting you would add to unblock it. On the workpad you see:
allowed_tools list and run the command again.
Continuous Integration Is a Different Gate
Your CI is the check a person reads before merging. It runs on the pull request, under your branch protection rules, on your infrastructure. PRFlow does not merge and does not tick anything on your behalf there. See Human Control. CI is not a substitute for the run verifying its own work. An implementation run has to establish its own result while it is still working, because a run that outsources its verification to a later CI job is reporting on a change it never checked. When the run finishes, both signals exist for you: the evidence the run recorded, and CI’s independent result on the pushed commit.By default a cloud implementation run verifies in its own environment and leaves your merge-gate CI to you. When
prflow_implement.ci_verification.enabled is true and the deployment check passes, a full-suite boundary instead dispatches your ci.yml workflow for the pushed commit and waits on that run through ci-verification-request.py. A failed wait still exits 7. After the existing first line FAILED <request-id> run=<run-id> url=<url> conclusion=<conclusion> it prints one failed-job: line per failed job and one recap: line per identifier in those jobs’ Failure recap blocks. If the job list or a job log cannot be read, it prints recap-status: unestablished — <reason> instead of those recap identifiers. Passing, cancelled, superseded and pending outcomes keep the same first lines and exit codes they already used.What the Evidence Looks Like
Verification evidence is recorded on the workpad, alongside the run’s other progress. TheReview section of the progress checklist shows the gate that consumes it:
What This Does Not Promise
- Passing checks mean your checks passed. They do not mean the change is correct.
- Verification evidence cannot show a defect your test suite has no way to detect.
- The run environment can differ from production.
- A recorded pass is a record of what a command returned at one point in time on one commit.