Patchward opens draft pull requests with a recorded verification receipt. That is the invariant — it holds on every run, in every environment. What follows is the mechanism that produces it.
Static analysis runs inside a Docker sandbox with default-deny network egress. Each scanner is an independent input lane; their findings converge on a single SARIF normalization point so that everything downstream reasons about one format, not five.
Normalized findings are triaged by severity, then handed to fix generation one at a time. The patch is written against a single finding with declared line bounds — so the review surface stays small enough that a human can actually check it.
These two stages call the Anthropic API and read repository file contents to do their work. That crossing point is documented in full on/data-boundary — it is a design choice, stated plainly, not a footnote.
A patch that fails a gate is discarded and never reaches a pull request. Gate 3 has two legitimate exits, and both are drawn here with equal weight — see/verification for the receipt itself.
exit A — your suite ran and passed
exit B — no runner present, disclosed in the PR
Every mutation lands on a dedicated branch. Worst-case rollback is onegit branch -D.
requires python >=3.12
Where this stops short is written down, not implied — see/limits, and every number quoted on this page in /facts.