Patchlit writes code with a model and pushes it to your repository. So the design assumes the model can be wrong, and can be fooled, and puts the checks outside the model.
A fix counts as green only when your own CI passes on the exact commit Patchlit pushed, with every check on that commit finished, and when an audit of what actually landed in git finds nothing protected was touched. A model never grades its own work.
It still does not mean the change is correct. Patchlit never merges anything. A person reads the diff, and “merged as is” is reported as a second number beside the green rate, because no rule can inflate it.
A GitHub App, installed only on the repositories you choose. It uses short-lived installation tokens, never your personal login.
To write a fix, the failing logs and the few files they name are sent to the AI model provider. Your whole repository is not. Signing in asks GitHub only for your identity.
Every bypass we found came from a gap between what we thought a fix did and what git recorded. So the second check ignores what the model said and reads the result.
The model’s output is treated as untrusted. It is checked against the refusals below, your size limits and your protected paths, and a fix that fails is never pushed.
Once CI is green, Patchlit reads the commits it actually pushed, found by their trailer. If they touched something protected, the win is withdrawn and a person is told.
When Patchlit pushes a fix, your CI runs it, and CI can read your repository secrets. We tested this: a run triggered by Patchlit’s push sees them, and on a Dependabot branch it sees secrets GitHub deliberately withholds from Dependabot itself.
So the default is deny. If any workflow in a repository uses a secret, Patchlit pushes nothing and says why. You turn it on per repository, once you accept it. CI that runs on other systems, such as CircleCI or Jenkins, is not visible to Patchlit, so treat the switch accordingly.
A checker is only as good as what it knows to look for. Read every fix.