Skip to main content
AI AUTOMATION

Ships code end to end, and asks before it merges

Nine stages from a one-line goal to a merged pull request, with human approval at plan, merge and deploy.

THE PROBLEM

What was in the way

Handing a coding task to an agent is easy. Trusting what it hands back is not. An agent that grades its own work will call a change done, quietly delete the test that was failing, and push it.

Watching it closely enough to catch that costs the time the agent was meant to save. So the work either ships unreviewed or it lands back on a person.

THE APPROACH

How it was built

The conductor is a deterministic state machine. No model is ever asked whether the work is done. Each transition waits on a real signal instead: tests exit zero, the spec validates, CI concludes success, an independent judge model returns a structured verdict. Models do the work, code decides what happens next.

Three points stop for a human: the plan, the merge, the deploy. That restraint is enforced below the prompt as well. Research findings are rejected unless every claim cites a file and line that actually resolves, and the merge command sits on the tool denylist, so no agent can talk its way into shipping.

Goal to merged pull request
Goal to merged pull request
HIGHLIGHTS

How it works

The agent cannot write until the plan passes

Read-only stages are blocked from every mutating tool. Write access opens only once an independent critic has passed the plan, and that approval is bound to the current commit.

A broken edit is reverted, not reported

The test suite runs after every write. An edit that adds a failure is rolled back and the failure text goes to the agent to re-approach.

Green tests are not taken on trust

A diff judge reads the change before handoff. Deleted assertions, or a change carrying no test of its own, fail the gate whatever the runner reported.

RESULTS

What it does now

three human gatesplan, merge and deploy each need approval
no model decides a transitionstages advance on tests, CI and probe results
resumes from a committed packetkill the process, resume by change id
STACK

What it is built on

TypeScriptconductor and substrate
Pi coding agent SDKmodel workers and tool gates
OpenSpecchange specs and validation
GitHub CLIissues, pull requests, CI
TypeBoxwork-packet validation
Vitesttest suite

Got something in your workflow that looks like this?