A coding agent is a chat. Shipping is a workflow.
6 min readVigneshMarkdown
I use coding agents all day. Each one is good. Each one is also a chat.
A chat is one mind and one pass. It plans, builds and grades its own work in the same breath. When it says the tests pass, I take its word, or I go and check. When the window closes, the reasoning goes with it.
That is not how my team ships. We plan, and someone agrees to the plan. Someone builds. Someone else reviews. A command says pass or fail. A person decides what ships. Each of those is a step, and each step has a reason to be a different mind.
So Loopgate runs coding agents as a workflow. Each step picks its harness, its model and how hard it thinks. A check is a command your repository declares, and its exit code routes the run. Every loop has a bound, and when the bound is used a person decides. Every word a step is sent is visible before it is sent and after.
That is the claim. Here is one real run, on Loopgate's own repository, read top to bottom.
Say it
I picked plan-build-review in the composer and typed the task. I added one line of setup: keep it under $10.
Write docs/notes/runner-door.md: how a runner admits a member, from the code.
Setup words open a draft before anything runs. The copilot read them and drew this card.

Read it like a receipt. The task, as the steps will get it. Each step with its engine. Up to two review rounds. A ten dollar stop.
Two things went wrong here, and both are in this post on purpose.
First, I had chosen pi for plan and review in the composer before I pressed Run. The draft dropped those choices and showed Codex. I set them again on the card. That is a bug, and the next post is two agents finding its cause.
Second, the copilot proposed a note for build that was only the task again. I removed it with the ×. When I opened the draft again it was back, and the run sent it. You can see it below as You → build · note. That is a bug too.
A workflow does not make the tools perfect. It makes their mistakes visible on a card you read before you press Start.
The planner talks first
The plan step waits for me after each reply. Its first turn was a question, with its own recommendation.

I chose both. It read more code and replied. One line in that reply stopped me: the pass's org claim is not compared with the runner's pin. That is the planner's reading of our admission code, and it is right as far as it goes. I checked after the run. The runner ignores that claim because it does not need it: the portal mints a pass only for a runner in the member's own org, the pass names one runner and one address, and the runner is pinned to one org and admits only the members that org listed in the last 150 seconds. Nothing to fix. I would not have looked without a planner that reads before it writes.

The lock
Write PLAN.md asks for the whole document. Then the lock opens on it. Nothing builds until I lock a version.

I read it and locked v1.
What the builder was sent
Every agent turn opens with what Loopgate sent it, on the right, in my colour. The task first, then the step's own direction, then the plan it reads, the workspace and one rules line. Full message opens every word, the system prompt included.

The builder ran on Codex. It wrote the note, about 90 lines with the plan. It reported what it checked: the links resolve, git diff --check is clean, only the note is new. It said what it did not run: the runtime tests and a live admission.
The review
The reviewer ran on pi, a different harness from the builder. It read the plan, the diff and the builder's report.

It approved in round one. The useful part was what it said it had not done. It had not run the builder's checks itself, and it did not count them as passing.
Its verdict routed the run to a decision. That decision is mine.
The record
The conversation keeps every turn. The card at its top keeps the track. Each round is a band you can fold.
The band above the review said Round 1 of 2. Had the reviewer asked for changes, the fixer would have taken the plan and the review, and the review would have run again in round two. After round two the loop is spent. The run does not try a third time on its own. It asks me.

Ship
I pressed Open PR. Loopgate pushed the branch and opened a draft pull request. Its body is facts: the workflow, the task, the steps whose commits the branch holds, the cost, then the plan and the review.

What it cost
The run header says $1.02 and 12 minutes 54 seconds. That time includes me reading and answering. The plan was $0.42 over two turns, the build $0.40, the review $0.20. The fix step never ran, because the review approved.
For a dollar I got a plan I agreed to, a note from the code, a second harness reading it, and a decision that was mine. I also got two bugs in my own product, found because every word was on the screen.
One agent in one chat could have written the note. Here a planner asked me first, a second harness read the result, and the last word was mine.
Try it on your laptop: npx loopgate ui. Your first workflow takes ten minutes, mostly watching.