Inside a compat job
Exactly what happens between a breaking release and your pull request.
Seven phases, always in this order. Then the five rules that make it safe to run on code you own.
The full job, phase by phase
For readers who want the mechanics: seven phases, always in this order.
Only select repositories
- your-org/compat-playground
- your-org/billing-service
- your-org/marketing-site
- your-org/infra
01 / 07
The full job, phase by phase
For readers who want the mechanics: seven phases, always in this order.
01Connect
Install the compat GitHub App and pick the repositories it may see; nothing else is visible.
Install compat-devGitHub AppOnly select repositories
- your-org/compat-playground
- your-org/billing-service
- your-org/marketing-site
- your-org/infra
2 repositories. Nothing else is visible.Install02Get a proposal, or ask
compat checks every detected SDK daily, reads the release notes and proposes the migration with the instruction written; or you describe one yourself.
New migrationcompat-playgroundStripeUpgrade stripe from v14 to v18https://docs.stripe.com/upgradesRun migration03Baseline
compat clones the repository into a disposable sandbox and runs your own install, typecheck, test and build to learn what green looks like.
Baseline on mainsandbox 1 of 1Sandbox started, repository clonedinstallpassed 3.0 slintnot run, no scripttypecheckpassed 6.0 stestpassed 1.1 sbuildnot run, no scriptcompat learns what green looks like before it touches a file. Anything already failing here is labelled pre-existing later.
04Plan
Claude reads the code and the upstream changes and writes a plan with explicit steps, the files involved and a confidence estimate.
Planconfidence highUpgrade the Stripe SDK from v14 to v18, pin apiVersion to 2025-08-27.basil, and update the invoice webhook to read subscription from the new parent field.
Affected files
- package.json
- src/billing.ts
5 steps
- 1Bump stripe to ^18
- 2Regenerate the lockfile with npm
- 3Pin apiVersion
- 4Update handleWebhook for invoice.parent
- 5Run typecheck and tests
05Edit
Changes go through a restricted tool set with no shell and no secrets, and lockfiles are regenerated by your package manager.
Editrestricted tool set- read_file src/billing.tsallowed
- write_file src/billing.tsallowed
- write_file package.jsonallowed
- run_script installallowed
- shell not availabledenied
- write_file .github/workflows/ci.ymldenied
- read_env not availabledenied
No shell, no secrets, no hand edits to CI or lockfiles. Repository content is treated as untrusted input.
06Verify and repair
Your checks run again, new failures are repaired within a bounded budget, and failures that were already there are reported.
Verify and repair0 of 3 repairs usedinstallpassed 3.0 stypecheckpassed 6.0 stestpassed 1.1 srepair budgetNew failures are repaired within a bounded budget. This run needed none. Failures that were already on main are reported as pre-existing, not fixed silently.
07Pull request
A branch is pushed, a pull request opens with the recorded evidence in its body, and a person merges.
Pull request#2 openchore(stripe): migrate integration to 18.0.0
integration-maintenance/stripe/8f2c into main
Checks3 passed, 2 not runFiles changed2Manual steps2 listedMergea person, alwaysRendered from recorded evidence.Review
Built to be trusted with your code
Five rules, short enough to draw. The long version is on the security page.
01 of 04
A disposable sandbox per job
Your repository is cloned into a fresh sandbox that runs your checks, hosts the edits and is destroyed when the job ends; compat keeps no copy of your source.
02 of 04
Evidence, not claims
The pull request body lists every check as passed, failed or not run, with its duration, and a check that did not run is never presented as a pass.
03 of 04
Tokens minted per job, never stored
Each job mints a one-hour token scoped to that repository, uses it for the clone, the push and the pull request, and never writes it anywhere.
04 of 04
Repairs inside a budget
When your checks fail after an edit, compat repairs within a bounded loop, then stops and reports instead of guessing.
No production secrets by default
Jobs run with your code and your package manager, not your environment. Checks that need real credentials are reported as not run.
Human merge only
compat opens pull requests and has no merge capability. The branch it pushes is namespaced, and it never touches your default branch.
Ready to see it on your repository?