"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.

01

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.

a human approves the refined backlogautomated gates that fail stop the loop cold
From a raw backlog issue to shipped code — the loop, end to end.
02

Which Model Does What

Every stage of the loop runs on a specific Claude Code model, chosen for what that stage actually demands:

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

The right model for the task, not one model for everything.

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.

Opushigh effortread-only

Verify

A separate Opus agent re-reads the real code for each finding and confirms it's real before it goes to a fix.

Opusseparate agentre-reads the code

no fix commit spent on a false positive

Two independent Opus calls — one hunts for defects, the other confirms they're real.
03

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.

lint
typecheck
test
build
04

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.

05

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.