Skip to content
Small team, full backlog, zero orders dropped. Support replies are slower than we’d like. Read our status update → Zero orders dropped. Status → 📬 Check your spam folder — most of our replies land there. We do answer. Status update → 📬 Check your spam folder. Status →

AGENTIC ENGINEERING

Gauntlet Loops

A builder makes the thing. A separate critic with fresh context judges the thing itself and is allowed to reject it. The largest gap goes back. Repeat until the work wins. This is how we build DCENT_ADE.

What A Gauntlet Loop Is

A gauntlet loop is an adversarial build cycle. A builder produces a real artifact. A separate critic receives fresh context, gets handed the artifact itself, and decides whether it clears a bar written down before the work started. If the work loses, the single largest gap goes back to a builder and the loop runs again.

Four properties make it a gauntlet rather than a review. The critic is separate. Its context is fresh. It judges the artifact, not the story about the artifact. And it has real authority to reject. Remove any one of those and you still have a workflow. You no longer have an adversary.

The failure it fixes is familiar. An agent finishes a task and reports success. The report is fluent, structured and confident, and often describes intent rather than what landed on disk. A loop with no adversary converges on whatever the builder already believes. Gauntlet loops exist to close the distance between implemented and actually good, and the only reliable way to close it is to let something with no stake in the work say no.

It is a specialization of loop engineering. A plain loop asks whether the work is finished. A gauntlet loop asks whether it is good, which is a different question with a different stopping condition. Run panels of critics in parallel and it becomes graph engineering. The full ladder sits on the agentic engineering hub.

1976
Year code inspection was formalized at IBM
2
Effective votes in a nine-judge LLM panel
0
Builder self-reports accepted as evidence
1
Gaps sent back per round: the largest one

How One Round Actually Runs

The loop is small. Most of the engineering is in the setup, and almost every failure comes from skipping step one.

  1. Write the bar before anything exists. A bar written afterwards is a description of the artifact. Point at something concrete and inspectable: a product you want to beat, a spec, a screenshot, a golden file, a baseline measured before the change.
  2. The builder produces a real artifact. Not a plan, not a diff summary. Something that runs, renders or fails on its own.
  3. Package the evidence. Pixels, logs, test output, a git range, a recording of a failure being induced and recovered from.
  4. Hand a fresh critic the artifact and the bar, and nothing else. No builder history, no rationale, no list of known limitations. Those are the inputs that talk a critic out of a rejection.
  5. The critic reproduces, then rules. A claim it cannot reproduce did not happen. The verdict is a binary pick against the bar plus one named largest gap.
  6. The largest gap goes back. One gap, to a builder, with the artifact. Smaller gaps get recorded and deliberately left alone.
  7. Stop on a rule written in advance. Not on a feeling that it is probably fine now.
bash
$ tree -L 1 gauntlet/round-03
gauntlet/round-03
|-- bar.md           <- written before the builder started
|-- builder-out/     <- the artifact itself, runnable
|-- evidence/        <- pixels, logs, test output, git range
|-- critic-brief.md  <- everything the critic is allowed to see
`-- verdict.txt      <- PASS or REJECT, plus one largest gap

$ cat gauntlet/round-03/critic-brief.md
ROLE      you are the critic. you did not build this.
BAR       bar.md. read it first. it is not negotiable this round.
ARTIFACT  builder-out/. run it yourself.
EVIDENCE  evidence/ is corroboration, not proof. verify what you use.
OUTPUT    verdict.txt. REJECT is a valid and expected answer.
RULE      if you cannot reproduce a claim, it did not happen.
RULE      do not read builder notes. they are not in this directory
          for a reason.
The Three Non-Negotiables

Fresh Context

The critic does not inherit the builder's session. Shared context means shared assumptions, and an evaluator grading against the builder's mental model is grading against the wrong thing.

Real Evidence

Real pixels, real files, real git effects, real test runs, real measurements, real failure recovery. A builder's self-report is not evidence. It is a hypothesis about the artifact.

Real Authority To Reject

A critic that cannot fail the work is theatre. If nothing in your last ten rounds was rejected, you are not running a gauntlet. You are running an approval queue.


Why Fresh Context Is Load-Bearing

When an agent builds something, it builds a picture of what the thing is supposed to be. That picture lives in the context window next to the code. Ask the same session to review the result and it compares the artifact against its own picture rather than against the requirement. If it misread the requirement, the review confirms the misreading. The error and the check come from the same well.

Research has been unkind to the alternative. Huang and colleagues tested intrinsic self-correction, where a model revises its own answer with no external signal, and found performance often degrades rather than improves. Self-Refine, where one model generates, critiques and refines, does produce gains, but later work documents a persistent self-bias: models favour text they produced. The LLM-as-a-judge paper named the same effect from the judging side, alongside position and verbosity bias.

Fresh context is the cheapest fix available and not a complete one. A different model family is better, because two instances of the same model make correlated mistakes. If you can change only one variable, change the context. The critic should be able to look at the artifact and ask what this even is, which is the question the builder can no longer ask. Context engineering and gauntlet loops are the same problem from two ends: one context is curated for building, the other for judging, and mixing them is a defect.

Judge The Artifact, Not The Story About It

This rule carries the most weight and gets abandoned first, because reading a summary is fast and running the artifact is slow. A build report is a compressed, self-authored account written by the party with the most reason to be generous. It is a useful pointer. It is never the evidence. The practical test is whether the critic could reach the same verdict with the report deleted. If not, the critic is grading prose.

What The Critic Refuses To Accept
The builder says What the critic accepts instead
The layout is fixed. A render at the widths named in the bar, captured by the critic.
Tests pass. The command, its exit code and its output, run in the critic's shell.
I merged the branch. git log and the diff range, produced by the critic, not quoted to it.
Performance improved. Before and after on the same machine with the same input.
It recovers from the failure. The failure induced live, and the recovery observed happening.
It works on the target device. The device, connected, doing it.
Edge cases are handled. The edge case, entered by hand, producing the stated behaviour.

For us this is a product constraint, not a preference. DCENT_ADE is built under development rules that reject fake agents, simulated activity, fabricated telemetry and optimistic availability indicators. An environment that lies about agent state makes every gauntlet loop inside it worthless, because the evidence layer is the thing being faked. The awareness layer reads busy, idle, awaiting input and finished from real terminal behaviour, not from a status field somebody set hopefully. The catalog execution layer refuses to claim a Git merge it does not perform. Claiming it would have been cheaper, and it would have shipped the exact defect a gauntlet exists to catch into the tool that runs the gauntlets.

bash
$ cat gauntlet/round-03/verdict.txt
VERDICT   REJECT
BAR MET   no
REPRO     yes. built and ran locally. 3 window sizes.

LARGEST GAP
  Resizing the window drops the last row of the PTY scrollback.
  Reproduced by hand at 80x24, 120x40 and full screen.
  No test covers resize at all.
  The build report says resize handled. The artifact disagrees.
  The artifact wins.

SMALLER GAPS (recorded, do not fix this round)
  tab label truncation at narrow widths
  focus ring contrast on the split handle

NOTE
  Bar is still the right bar. Do not renegotiate it to pass.

Writing A Bar You Can Actually Lose Against

Most gauntlet loops fail here. The bar says make it excellent, or match industry standards, or ship production quality. None of those can be lost against, so the critic approves, and the loop degrades into an expensive way of agreeing with yourself.

A losable bar has three properties. It names something that exists outside the loop. The critic can inspect it without asking the builder for anything. And there is a plausible world in which the work fails it. If you cannot describe what failure would look like, you have written an aspiration.

Blind comparison is the sharpest form. Put the artifact and the reference side by side with the labels stripped and ask which is better. A binary pick is much harder to fudge than a score out of ten, because a score can be nudged and a pick cannot. That framing comes from Matt Shumer’s public write-up of the technique, and it is a genuine improvement on what we were doing before we read it.

Daniel Kahneman’s adversarial collaboration supplies the other half. Opposing researchers agree in advance on what result each would accept as evidence against their own position. Do the same before the builder starts: write down what would make you reject, while you have nothing invested in passing. A bar renegotiated after the artifact exists is not a bar, and the urge to soften it is the most common way these loops die.

The bar is itself a prompt artifact, so it benefits from the prompt engineering rung: explicit acceptance criteria, worked examples of pass and fail, and reuse across rounds so the standard does not drift.

Send Back The Largest Gap, Not The Easiest One

Hand a builder a list of eight problems and it will fix the six cheap ones, report a strong round, and leave the architectural one untouched. Every round after that inherits the same defect, now buried under polish. The loop looks productive right up until the real problem surfaces and the work stacked on top of it has to be thrown away.

One gap per round is a forcing function. It makes the critic rank rather than enumerate, which is the harder and more useful judgment. Largest means largest distance from the bar, not longest to fix. A structural flaw that takes an hour beats a cosmetic flaw that takes a minute, every time.

Record the smaller gaps and leave them. Half of them disappear when the largest one is fixed properly, and the survivors are better understood by then. This ordering also keeps each round’s diff reviewable by a person, which matters when the loop ends at a merge gate with a human on it.


When The Critic And The Builder Are Wrong Together

Fresh context stops the critic inheriting the builder’s reasoning. It does nothing about a wrong assumption they both hold because they were trained on the same internet. If both parties believe an API works a certain way, the artifact will implement that belief and the critic will confirm it. The loop converges, confidently, on a bug.

Adding more critics is the obvious move and it is weaker than it looks. A recent Apple study of nine frontier judges drawn from seven model families found their errors correlated enough that the panel carried roughly two independent votes’ worth of information, and its accuracy barely beat the best single judge. Nine opinions, two votes. Scaling up similar reviewers buys agreement, not independence.

What works is critics that differ in what they are looking for, not just in weights. Give each one a lens and a mandate to find the worst instance of its own concern. A security critic and a performance critic disagree about the same artifact in useful ways. Six copies of a general reviewer produce the same paragraph six times.

Two mechanisms keep a panel honest. First, majority-refute rather than majority-approve: if any critic produces a reproducible failure, the artifact loses even if the rest passed it. Approval needs consensus, rejection needs one. The asymmetry is deliberate, because a demonstrated failure is evidence while an approval is only the absence of one. Second, anchor the panel to something that cannot be talked around. A test suite, a compiler, a device, a real measurement. Model consensus is an opinion. A failing test is a fact.

A Panel That Disagrees With Itself

Correctness

Does it do the stated thing, including at the boundaries nobody enumerated? Reads the bar literally and hunts for the case the builder assumed away.

Security

What authority did this quietly grant, and to whom? Looks at trust boundaries, inputs that cross them, and permissions that got wider than the feature needed.

Performance

Measured against a baseline captured before the change, on the same machine with the same input. A claimed improvement with no baseline is not a result.

Reproduction

Clone it clean, follow the instructions exactly, see whether it runs. This critic catches more real defects than any other and is the one most often skipped.

Human Surface

Contrast, focus order, keyboard reachability, what happens at the wrong window size. Anything a person touches gets judged by looking at it, not at the CSS.

Claims Versus Artifact

Reads every assertion in the build report and tries to falsify it against the running thing. Its only question is whether the story and the artifact still match.

How Many Rounds, And When To Stop

Returns are front-loaded. The Self-Refine authors reported most of their gains in the early iterations, and that matches what we see. Round one removes the obvious defects, round two removes the ones the obvious defects were hiding, and by round five the critic is mostly rearranging opinions. Refinement is also not monotonic: a revised version is not reliably better than the one it replaced, so keep every round’s artifact instead of overwriting it.

Pick a stop rule before you start. Four work well. Stop when the artifact wins the blind comparison twice with different critics. Stop when the largest gap two rounds running is cosmetic, which means the bar has been met and the critic is inventing work. Stop when the budget is spent, which is a legitimate answer and should be logged as one. Stop when the same gap returns a third time, because that is oscillation, and it means the bar and the artifact are in conflict rather than the artifact being wrong.

Never stop on a fixed round count alone. Three rounds is a schedule, not a quality signal. Termination, oscillation detection and cost control are the core of loop engineering and they apply here unchanged.

Endless rejection is a bar problem, not a critic problem. Require every rejection to name a specific reproducible gap. A rejection that cannot point at the artifact is not a rejection, and three vague ones in a row mean the bar is unreachable or badly written. That signal is one of the more valuable things a gauntlet loop produces.


Gauntlet Loops Versus RALPH Loops

These are not rivals, and picking the wrong one is expensive in both directions. RALPH, from Geoffrey Huntley, reruns the same prompt against a fresh context in a shell loop and lets the filesystem and git history carry the state. There is no adversary. The pushback comes from the compiler, the type system and the test suite, which Huntley calls deterministic back pressure. It is cheap, unglamorous, and on well-defined work it is effective in a way that annoys people expecting something more sophisticated.

A gauntlet loop adds a party whose job is to say no. That costs real tokens and real wall time. You are buying judgment, and you only need judgment when the definition of done and the definition of good have come apart.

Two Loops, Two Jobs
RALPH loop Gauntlet loop
Shape Same prompt, fresh context, repeat Build, independent critic judges, largest gap goes back
Adversary None. The repo and the compiler push back A separate critic whose job is to reject
Best at Grinding through defined work: migrations, coverage, backlogs Work where done and good are different questions
Fails at Quality nobody defined. It converges on adequate Cheap bulk work. The critic overhead is not worth paying
Cost per unit Low. Its whole point is being cheap enough to leave running Higher. Judgment is the thing you are paying for
Stops when Budget runs out or the task list empties The bar is met blind, or the gaps stop being real
Origin Geoffrey Huntley, 2025 Named publicly by Matt Shumer, 2026. The method is far older

Where This Sits On The Ladder

Below It

Loop engineering gives you the cycle, the termination conditions and the cost controls. A gauntlet is that machinery with an adversary bolted into the observe step.

Beside It

Harness engineering decides which agent, model, tools and isolation the critic runs under. A critic sharing the builder’s worktree is not independent, whatever its prompt says.

Above It

Graph engineering takes over the moment panels run in parallel. Fan out to critics, join on verdicts, gate the merge, route the largest gap back.

That last shape is what DCENT_ADE was built around. Its Mission Control roles run Coordinator to Scouts to Builders to Reviewers, then human approval, then integration and delivery. Claims stop two builders taking the same work. Worktree isolation keeps a critic from grading a tree the builder is still editing. Review packets are the evidence bundle in a defined form, and MergeGate is the gate a human co-signs. The architecture exists to make the honest version of this loop the convenient one, because the dishonest version is always cheaper in the moment.


Shoulders We Stand On

We run this as our standing build doctrine. We did not invent adversarial review, and we did not publish the name first. Both facts belong on a page whose whole argument is that claims should match reality.

The name is Matt Shumer’s. He named the Gauntlet Loop publicly in mid-2026 while building a browser-based first-person shooter from a single prompt, and his formulation contributed the blind comparison against a named, fetchable reference and the binary pick instead of a score. We had been running the same shape internally against DCENT_ADE. We are not going to overstate that in either direction. Credit lands where it lands.

The method is older than either of us. Michael Fagan formalized design and code inspection at IBM in 1976, and what made it stick was the finding that structured inspection by people who did not write the code caught defects unit testing missed. Ian Goodfellow’s generative adversarial networks put a generator and a discriminator in a minimax game in 2014, the same architecture with gradients instead of prompts. Karl Cobbe and colleagues at OpenAI trained verifiers in 2021 to rank candidate solutions, establishing that a separate judge can beat a bigger generator. Ethan Perez and colleagues published red teaming language models with language models in 2022, and red teaming itself is older still, borrowed from military and security practice.

The agent-era work is worth reading directly. Self-Refine established the generate, critique, refine cycle. Reflexion turned a verbal self-critique into episodic memory across attempts. Du and colleagues showed multi-agent debate improving factuality, and later work catalogued how debate degrades into premature consensus. OpenAI’s CriticGPT trained a model specifically to find bugs in another model’s code, and reviewers helped by it outperformed reviewers working alone in a clear majority of cases. Verga and colleagues showed panels of smaller diverse judges beating a single large one, and the correlated-errors work since showed how fast that advantage collapses when judges resemble each other. Daniel Kahneman and Anne Treisman contributed adversarial collaboration, the source of the discipline of agreeing on the evidence before the argument.

What we add is operational rather than conceptual: running this every day against a real product, with the evidence rules enforced instead of aspirational, and reporting what breaks. The tooling we build for it is free and open, as-is, with no paid tier and nothing held back. If it saves you real time or you use it commercially, a voluntary subscription or donation is expected and never enforced. That lives at d-central.tech/fund.

The mechanism is the one Michael Fagan formalized at IBM in 1976: someone who did not write the work inspects it against a standard and defects go back. What changes with agents is cost and volume. Human inspection is expensive so teams ration it, while a critic agent is cheap enough to run on every meaningful unit of work. The interesting problem stops being whether to review and becomes how to keep the critic honest at scale.
Same model yes, same context no. The context carries the builder’s assumptions, and an evaluator that inherits them grades the work against the builder’s picture instead of against reality. A different model family is better still, because two instances of the same model make correlated mistakes. If you can only change one variable, change the context.
Gains are front-loaded. The Self-Refine authors reported most improvement in the early iterations and that matches our experience. Rounds one and two do the heavy lifting, three and four usually pay for themselves on anything a person will touch, and past that you are mostly paying for churn. Stop on a rule you wrote in advance rather than on a feeling that it is good enough now.
Require every rejection to name a specific reproducible gap in the artifact. A rejection that cannot point at the thing is not a rejection. Three vague ones in a row mean the bar is unreachable or badly written, which is a bar problem rather than a critic problem, and it is one of the more useful outputs the loop produces.
No. Two terminal sessions and a directory holding the bar, the artifact, the evidence and the verdict is a working gauntlet loop. Frameworks earn their place when you want panels of critics running in parallel, claims so two builders do not take the same work, worktree isolation so the critic is not grading a moving target, and a gate before anything merges.
RALPH reruns the same prompt with fresh context and lets the repo, the compiler and the test suite supply the pushback. There is no adversary and it is cheap, which is exactly why it works so well on defined work. A gauntlet loop adds a party whose job is to reject. Use RALPH when done is a checkable fact. Use a gauntlet when done and good are different questions.

Run The Loop On Something Real

DCENT_ADE is the local-first, open-source environment we build this way and build for this. Terminal-first, native host, agent coordination that reports what actually happened.