Swappable coding engines: we run the best, and hold them to one bar
The Software Factory builds with the coding engine you choose, Claude Code or the open-source OpenHands, behind one brief, one set of guardrails and one scoreboard. Switch in one line; clients can run open engines only.
Status: shipped. Built by Jamie Schiesel:
| Release | PR | What it added |
|---|---|---|
v6.2.0 | #1381 | The engine registry and OpenHands |
v6.3.0 | #1383 | A workspace picks its engine |
v6.4.0 | #1384 | The scoreboard |
v7.9.0 | #1429 | The Engines page |
The design is in ADR 0005. Jamie's walkthrough: OpenHands and swappable factory engines (3 minutes).
Building a software factory is hard. A plain request has to become a plan, a working change, passing checks and a pull request a person can trust. Every step has to be safe: no secrets read, nothing pushed on its own, no files changed that a person owns.
The part that writes the code, the coding agent, is a product in its own right. Claude Code has Anthropic behind it, and OpenHands is open source. Both get better every month. Building our own would mean maintaining one forever, so we plug in theirs and keep what's ours: the factory around the engine.
What you can do now
- Pick the engine in one line. A workspace's engineer seat names its engine. Say nothing and it's Claude Code, as before.
- Let a task decide. A task that names its own engine keeps it. With a Jev key, the factory can also pick the engine, model and effort per task from a menu you set.
- Run open engines only. An installation can allow only OpenHands and run an image with no Claude Code in it. That's for clients who need open source, or need their code to stay with a model provider they choose. Nothing routes around the setting.
- See every engine side by side. Software Factory → More → Engines shows, for each engine, its pull-request rate, QA pass rate, acceptance rate, time, spend, cost per landed change and guardrail refusals, over real work or eval runs.
- Roll back by deleting a line. A run already going finishes on its own engine.

One brief in, one stream out
Every engine works the same way inside the factory:
- The runner claims the run, clones the repository and starts its services.
- The engine reads one brief and reports its progress in the same format either way.
- The runner runs the checks, takes the change and opens the pull request.
- Vocion scores it.
Only the second step depends on the engine. Budget, clock, checks, landing and retries are the factory's, and the same for every engine.
OpenHands runs inside the runner's container, which is already the sandbox. Every tool it calls goes through the same guard scripts as Claude Code. An unknown tool is blocked, and the model key is removed before any tool starts.
Measured, not claimed
Every engine is measured the same way: 48 real factory requests, graded by hidden tests the engine never sees. We ran both engines through it today on the same model. Both passed 47 of 48. The results →
Get it
Update to v7.9.0 or later for the Engines page; the engines themselves have shipped since v6.2.0. Docs: Coding engines.