Note

WHY WE BUILT IT

Agents write the code.
Approving it is the hard part.

Selvage started as internal tooling for a small team carrying more products than it should. We built it because coding agents solved the part we expected — writing code — and did nothing for the part that actually consumes a week: deciding whether a change is safe to merge. This is what we built, and what it cost us to prove it works.

THE PROBLEM

A process problem
that no better model fixes.

We ship across more surface area than our headcount justifies. TutorQ is our own product. Alongside it we build for clients: Q3 Assurance, a national cybersecurity compliance assessment platform, and Steward, an offline-first asset intelligence platform. Different stacks, different repositories, different review standards, the same shortage of hours.

Client work is where the pressure showed first. On your own product you can absorb a bad merge and fix it next week. On someone else's platform you cannot, and “the agent said the tests passed” is not something we are willing to put our name behind.

The questions that consume the time are always the same. Did the build pass. Did the tests actually run, or did the agent report that they ran. Did anything independent look at this. What exactly am I approving when I click merge.

The observation that made us build rather than wait: that gap is not a model problem. It is a process problem, and no better model fixes it, because the model is the thing being checked. A more capable agent reviewing its own work is still a single opinion with no independent verification behind it.

WHAT WE BUILT

The loop we were running by hand,
run by a scheduler instead.

Selvage takes a request — an issue number, a sentence, a spec — and drives it through the engineering process, stopping where a human decision is genuinely required.

  • 01
    It implements in an isolated Git worktree.

    Never in your checkout. Your working tree is not a shared workspace with an agent.

  • 02
    It runs your build and your tests itself.

    The scheduler executes the checks and keeps the output, rather than trusting a claim that they passed. Verification the agent narrates is not verification.

  • 03
    It routes the diff to a different model from a different provider.

    Reviewer identity is recorded, and same-model self-review is not treated as independent review.

  • 04
    It stops at a human approval gate.

    Nothing publishes on its own. The final decision stays where the accountability is.

It drives the coding CLIs you already pay for — Claude Code, Kiro, OpenCode, Codex — so there is no second token bill, and orchestration, worktrees and evidence stay on your machine.

Surfaces — web dashboard, CLI and MCP — submit work to a project-scoped scheduler holding leases, routing, budgets, the evidence ledger and per-attempt verification plans. A structural code index orients an implementer working in an isolated Git worktree; the scheduler verifies the resulting commit against a plan pinned for that attempt with a fresh database; an independent model on another provider reviews the diff and evidence with no write tools. Outcomes fan out three ways: approve reaches the human approval gate and then a local merge or pull request, revise becomes one micro-task per finding finalized deterministically before re-verification, and separable findings are deferred to a tracked follow-up.
Open the diagram full size · The whole loop. Retrieval orients the implementer, the scheduler owns verification, review is independent by construction, and the approval gate is the only exit.

WHAT IT COST TO PROVE IT

We did the same work twice —
once by hand, once from one command.

Claims about agent productivity are cheap. We took one real issue from the Q3 Assurance codebase — persist notification records across a multi-service backend — and froze it: the issue text, and a six-point evaluator written before either run and never shown to any model.

Then we did the work twice. Once hand-orchestrated, one model call at a time, the way we would have done it before. Once through Selvage, from a single command. Both reached the same score: 6 of 6.

Hand-orchestrated versus Selvage, same frozen issue and evaluator
MeasureHand-orchestratedSelvage
Frozen evaluator6/66/6
Time to a reviewed result14m10s6m51s
Review cycles21
Human interventions51 command
Cost to the same result$3.41$1.61

The halved numbers are not the interesting part. What matters is why there were two review cycles instead of one.

THE BUG THAT SURVIVES REVIEW

Every test passed.
The endpoint returned 404.

The feature lived in one service. The API gateway in front of it mirrors that service's routes as a hand-maintained allowlist — a convention no import graph can see. The hand-orchestrated run added the endpoint and forgot the gateway. The build passed. Every test passed. The endpoint was unreachable from outside.

A reviewer caught it, which cost a full extra cycle. Across nine runs of this experiment we have now watched that same omission appear in every finished run without our structural route check, and in none of the three runs with it. One human reviewer caught it. A different human reviewer approved it.

That is the class of defect worth building for: the one that survives careful review because nothing in the diff looks wrong. It is not a smarter-model problem. It is a question about a convention that lives in another service, and something has to be holding the map.

WHAT WE ARE NOT CLAIMING

One issue, one repository,
one run per arm.

The cost figures are model cost only. None of the five human interventions in the hand-orchestrated arm are counted in dollars, and counting them would widen the gap rather than narrow it. The models improved between our September measurements, so we re-ran both arms on the same afternoon rather than comparing today's Selvage against last week's baseline — that is the only reason we can say which share of the improvement was ours.

One of those runs also finished on evidence rather than a merge commit, because it hit a bug in our own auto-merge. We found it by running the experiment. It is filed.

A dollar figure travels without its caveats, which is why the numbers live here and not in a feed. The full method, every number, and all seven limits are in the measurement note.

WHY WE ARE PUBLISHING IT Other founders and small studios are where we were: shipping more than the headcount should allow, some of it for clients trusting your judgment rather than your agent's, with tools that write code faster than anyone can responsibly approve it. Selvage is what we built to keep our own name behind the work. It is installable today, it uses the AI subscriptions you already have, it runs locally, and it leaves the final decision with you.