"Agentic coding" was our first act: handing a well-defined task to an AI agent, one at a time, and reviewing what came back. This is the second act — closing the entire loop. Not delegating a task, but running a closed cycle that takes an issue straight from the backlog to code deployed to a test environment, with almost no human pushing it along the way.
By "loop engineering" we don't mean using AI to write code. We mean designing a system with a small number of deliberate checkpoints — a human approving a refinement, a build getting promoted — and a set of automated gates that stop everything the moment something fails. Everything between those checkpoints runs on its own.
This post covers how that loop is built at DIZENZ today: the two stages that make it up, which model does which job and why, why our quality gate runs on a developer's machine instead of GitHub Actions, and the real numbers from the project that has run this loop the longest.
The Loop, End to End
The loop is two stages, chained together, each one an agent or Claude Code skill running against the project's board.
Stage 1 — Refine the backlog. An agent takes a raw issue and checks it against the real repository — it never invents a path or a behavior, it verifies everything by reading the code. It leaves the issue with a clear title, a user story, observable acceptance criteria, technical detail, and a manual QA checklist.
When the backlog has several issues queued up, the same agent also computes a cross-impact map: which issues block each other, which touch the same file and can't be parallelized, which are fully independent. That map goes to a human for approval before a single line gets written — only then is an issue actually "ready to develop".
Clear title & user story
Turns a raw one-line issue into a title and story anyone on the team can act on.
Observable acceptance criteria
Criteria written so a test — human or automated — can say pass or fail, not just "looks right".
Technical detail, verified
Every path and behavior it cites is checked against the real repository, never assumed.
Manual QA checklist
A checklist ready for QA before a single line of code exists.
Cross-issue impact map
Flags which issues block each other and which touch the same file and can't run in parallel.
Human approval gate
The map and the refined issue go to a human before the issue is marked ready to develop.
Stage 2 — Implement and deploy. A second agent takes those already-refined issues, one at a time, until each one is done: it writes an implementation plan, codes against that plan, opens the PR, submits it to our own code review, runs the local quality gate, waits for the deploy, moves the issue to QA, and checks off the checklist — but only what an automated test actually proved. Anything that needs a real device or a human eye is left unchecked, on purpose. It ends with a plain-language hand-off for QA: for every issue, exactly what's still left to verify by hand.
Refine
Turns a raw backlog issue into acceptance criteria, technical detail, and a QA checklist — verified against the real repo, plus a cross-impact map for human approval.
Plan
Writes an implementation plan for one already-refined issue before a line of code gets written.
Implement
Codes against the approved plan and opens the pull request.
Review
A read-only Opus agent hunts the PR for correctness, security, and convention bugs.
Verify
A separate Opus agent re-reads the real code to confirm each finding is real before anything gets fixed.
Ship
Merges, waits for the deploy, moves the issue to QA, and checks off only what a test actually proved.
Which Model Does What
Every stage of the loop runs on a specific Claude Code model, chosen for what that stage actually demands:
| Task | Model |
|---|---|
| Research / refine issues | Sonnet |
| Implementation plan | Opus |
| Write the code | Sonnet |
| Review the code (hunt for bugs) | Opus, high effort, read-only |
| Verify each review finding | Opus, a separate agent from the one above |
| Fix what the review found | Sonnet |
Research / refine issues
Sonnet
Implementation plan
Opus
Write the code
Sonnet
Review the code (hunt for bugs)
Opus, high effort, read-only
Verify each review finding
Opus, a separate agent from the one above
Fix what the review found
Sonnet
reasoning-heavy work goes to Opus, channeled volume goes to Sonnet
It's not "one model for everything." Deep reasoning — planning, reviewing — goes to Opus. The volume work that's already channeled by an approved plan goes to Sonnet.
Review deliberately uses two independent Opus calls: one that hunts for defects, and a separate agent that re-reads the real code to confirm each finding is real before anything gets fixed. That second pass is what keeps us from burning a fix commit on a false positive.
Find
A read-only Opus agent, high reasoning effort, hunts every PR for correctness bugs, security and data-integrity issues, convention drift, and acceptance criteria with no test behind them.
Verify
A separate Opus agent re-reads the real code for each finding and confirms it's real before it goes to a fix.
no fix commit spent on a false positive
Why the Quality Gate Runs on Your Machine, Not GitHub Actions
We started like everyone else: lint, typecheck, tests, and build ran in GitHub Actions on every PR.
We ended up moving all of it to local hooks — pre-commit, pre-push — plus a single command that runs the exact same checks by hand. Running it in Actions burns CI minutes, and it's slower: a cold runner against a developer machine with a warm cache. The agent that just finished implementing runs the gate right there, in seconds, with no queue to wait on. GitHub Actions is now reserved for exactly one thing that genuinely can't run on a laptop: the deploy.
That's not free. It depends on the hooks being installed on every checkout — it's a deliberate decision to move where verification gets paid for, not a way to avoid paying for it.
Every implementing agent runs this exact sequence before a PR is even opened:
A full pre-push gate
Runs on the developer's machine, seconds after implementation finishes — not in a queue.
Results
The project that has run this loop the longest is Crashout, our multiplayer racing game for live events, as of August 2026. These are later, larger numbers than the ones published in the Crashout case study itself, which was written from an earlier cut:
499
commits since the first scaffold (Feb 28, 2026)
160
issues → 160 PRs → 160 squash merges
23
active merge days (~7 merges per active day)
51
merges between midnight and 6am
~46,000
lines of application + test code (Go + TS)
2,368
automated test cases
Every PR that was opened got merged — zero abandoned. 71 of the 160 merges landed in the last 7 days, 65 in the single busiest week. The 2,368 tests break down as 463 in Go, 1,656 in Vitest, and 249 in Playwright across 50 E2E specs. The median PR is 456 lines across 7 files.
Two things worth saying in the open, not in fine print. "Shipped" here means merged and deployed to a test environment, ready for QA to test it — not shipped to production.
And these are the numbers from a project with a single human engineer coordinating the loop, not an average across the whole studio.
What Changes for the Engineer
The loop doesn't replace the engineer — it changes what they do. Less and less writing code line by line; more and more designing the loop itself, calibrating what counts as an acceptance criterion, and deciding which review finding actually matters.
We're just getting started closing this loop further. If you're curious what a system like this could look like for your team, let's talk.



