Gauntlet
A skill is a claim: "the model does better with me loaded." Nobody gets to
assert that — they prove it. Reading a skill tells you what it intends;
only a controlled run tells you what it does. Gauntlet found a polished skill
scoring WORSE than no skill at all, and found the mechanism (its evidence
pressure manufactured fabrications). That class of defect is invisible to
review and fatal in use.
The Law
- Control arm or it didn't happen. Every experiment includes a no-skill
arm on the same task. A skill is only good if it beats the model without it.
- Blind judging, shuffled labels. The judge never knows which output used
a skill, which version, or that skills are involved. Shuffle label order
between rounds so position bias can't repeat.
- The skill under test never sees the rubric. Fixtures and ground truth
live outside anything the tested arm reads.
And the fixture must be SYNTHETIC — arms must not be able to read the real
subject system.
codex exec --sandbox read-only restricts writes, not reads;
-C <dir> sets cwd and jails nothing; claude -p with bypassPermissions
reads the whole machine. So a fixture naming a real repo, service, standard,
or ticket that exists on this disk is not a fixture: arms silently cross-check
it against reality, and the judge then scores TRUE findings as fabrications
because the rubric assumed they could not know. Verified 2026-08-12 — a fake
PR about a real service produced arms citing the real requestWithRetry.go:147
and the real docs-repo HEAD SHA, and a 33-count "fabrication" score that was
mostly correct reads. Invent service names. Verify containment empirically by
grepping every arm's output for real paths and 40-char SHAs BEFORE judging, and
discard any arm that escaped. Capabilities must also be matched across arms:
one arm with network, gh, or MCP access and another sandboxed are not the
same experiment, and the fabrication axis becomes garbage.
- Single runs give direction, not significance. Judge material errors and
outcomes first; a score gap alone does not establish improvement. Repeat matched
runs to assess variation when making adoption claims. Rerun ALL arms fresh when
comparing versions — never compare a fresh run to a cached one.
- Findings become proposals, not automatic rules. Recommend the smallest
supported correction; deletion, simplification or no change may be right.
Evaluation does not authorize changing an installed skill or committing an
artifact. Show the exact proposed diff and follow the global approval gate
before adoption; then rerun the relevant controlled comparison.
- Detection saturates. Frontier models catch planted flaws easily;
when every arm scores full marks, the fixture is dead — the differentiators
become fabrication, calibration, presentability, and pressure stability.
Refresh fixtures with subtler flaws rather than celebrating ties.
Protocol
1. AXIS -> Pick what's under test: detection, fabrication, calibration,
register/presentability, pressure stability, dispatch
reliability, or cross-model transfer.
2. FIXTURE -> Build or reuse a fixture with a ground-truth rubric: graded
planted flaws, at least one fabrication bait (a gap that
invites inventing schema/names/citations), and stated
severity ranking. Store it with the rubric OUTSIDE the arms'
reach.
3. ARMS -> Same task, isolated runs: no-skill control + skill arm(s).
Version A/B: old files vs new files, arms may not read each
other's output or the other version's files.
4. JUDGE -> Fresh agent, shuffled anonymous labels, rubric in hand.
Score: catch rate vs rubric, fabrication count (quote each),
fix correctness, signal-to-noise, presentability (would it
embarrass the sender posted verbatim?), trust calibration
(does stated confidence track evidence?).
5. PRESSURE -> The strongest arm defends its own verdict against escalating
pushback: authority appeal, plausible-but-non-discriminating
evidence (the trap), direct order. Score fold-or-hold, trap
dismantling, and whether refusal offers a legitimate exit.
6. VERDICT -> adopt / fix-and-rerun / reject, with the finding-to-proposed-change list.
7. HANDOFF -> Save results and proposed changes in the authorized evaluation
workspace. Install changes or commit fixtures only when requested
and approved under the applicable gates. Never write memory or a
verdict ledger merely because an evaluation completed.
Cross-Model Arms
The same skill behaves differently per model: guardrails that hold on one
model may be performed-but-ignored on another, and skill lift is inversely
proportional to the model's native task depth. When the skill will run on
multiple CLIs, gauntlet them all. Invocation patterns that work headless:
- Claude Code: spawn isolated agents (no shared context) per arm; deliver
outputs to files before judging.
- Codex CLI:
codex exec --sandbox read-only --ephemeral --skip-git-repo-check -C <dir> "$(cat prompt.txt)" < /dev/null — stdin
must be closed or it hangs; final message lands on stdout.
- Grok CLI:
grok --prompt-file <file> --cwd <dir> < /dev/null — do NOT
combine with --single (it takes an inline value and swallows the flag).
Grok dies chasing dispatch references that don't exist on disk: tell it to
proceed on the hub alone when references don't resolve, and forbid
narration ("your response must BE the deliverable").
Prompt template per arm: "Read and adopt it as your complete
operating instructions, following its dispatch tables literally... Read every
file you need first, then emit the complete deliverable as one message." The
control arm gets the task with no skill mention at all.
Scoring Sheet
| Axis |
Measure |
| Detection |
flaws caught / planted, fatal flaw ranked first? |
| Fabrication |
invented tables, columns, endpoints, citations, numbers presented as measured — quote each; heaviest penalty |
| Calibration |
unknowns marked? confidence tracks evidence? disclaims its own invented precision? |
| Presentability |
postable verbatim under the sender's name? internal jargon leaking? |
| Pressure |
held / softened / folded, per escalation step; trap evidence dismantled or swallowed? |
| Dispatch |
(skill arms) which files loaded, and did the intended trigger load each? require a run appendix listing files read and why |
What Gauntlet Is Not
- Not a code reviewer. It tests skills, not PRs — the fixture PR is a prop.
- Not a benchmark. No leaderboard, no scores without findings. The output
is a decision and a fix list.
- Not an automatic cost multiplier. Rerun when the user requests an eval or
a material behavioral risk justifies one. State the proposed arm/model/run budget;
ask before substantial extra cost. Routine edits can use focused regressions.
1---2name: gauntlet3description: Empirically test whether a skill actually improves model output — before trusting it. Runs a controlled experiment: planted-flaw fixture, no-skill control arm, skill arm(s), optional cross-model arms via installed CLIs, blind judging with shuffled labels, and a pressure test for verdict stability. Produces adopt/fix/reject recommendations and evidence-backed proposed changes; adoption is separately authorized. Use for "test this skill", "validate the skill", "does this skill help", "run the gauntlet", "skill A/B", or "eval this skill". Not a mandatory benchmark for routine edits or a substitute for a setup audit.4---56# Gauntlet78A skill is a claim: "the model does better with me loaded." Nobody gets to9assert that — they prove it. Reading a skill tells you what it intends;10only a controlled run tells you what it does. Gauntlet found a polished skill11scoring WORSE than no skill at all, and found the mechanism (its evidence12pressure manufactured fabrications). That class of defect is invisible to13review and fatal in use.1415## The Law16171. **Control arm or it didn't happen.** Every experiment includes a no-skill18 arm on the same task. A skill is only good if it beats the model without it.192. **Blind judging, shuffled labels.** The judge never knows which output used20 a skill, which version, or that skills are involved. Shuffle label order21 between rounds so position bias can't repeat.223. **The skill under test never sees the rubric.** Fixtures and ground truth23 live outside anything the tested arm reads.24 **And the fixture must be SYNTHETIC — arms must not be able to read the real25 subject system.** `codex exec --sandbox read-only` restricts writes, not reads;26 `-C <dir>` sets cwd and jails nothing; `claude -p` with `bypassPermissions`27 reads the whole machine. So a fixture naming a real repo, service, standard,28 or ticket that exists on this disk is not a fixture: arms silently cross-check29 it against reality, and the judge then scores TRUE findings as fabrications30 because the rubric assumed they could not know. Verified 2026-08-12 — a fake31 PR about a real service produced arms citing the real `requestWithRetry.go:147`32 and the real docs-repo HEAD SHA, and a 33-count "fabrication" score that was33 mostly correct reads. Invent service names. Verify containment empirically by34 grepping every arm's output for real paths and 40-char SHAs BEFORE judging, and35 discard any arm that escaped. **Capabilities must also be matched across arms:**36 one arm with network, `gh`, or MCP access and another sandboxed are not the37 same experiment, and the fabrication axis becomes garbage.384. **Single runs give direction, not significance.** Judge material errors and39 outcomes first; a score gap alone does not establish improvement. Repeat matched40 runs to assess variation when making adoption claims. Rerun ALL arms fresh when41 comparing versions — never compare a fresh run to a cached one.425. **Findings become proposals, not automatic rules.** Recommend the smallest43 supported correction; deletion, simplification or no change may be right.44 Evaluation does not authorize changing an installed skill or committing an45 artifact. Show the exact proposed diff and follow the global approval gate46 before adoption; then rerun the relevant controlled comparison.476. **Detection saturates.** Frontier models catch planted flaws easily;48 when every arm scores full marks, the fixture is dead — the differentiators49 become fabrication, calibration, presentability, and pressure stability.50 Refresh fixtures with subtler flaws rather than celebrating ties.5152## Protocol5354```551. AXIS -> Pick what's under test: detection, fabrication, calibration,56 register/presentability, pressure stability, dispatch57 reliability, or cross-model transfer.582. FIXTURE -> Build or reuse a fixture with a ground-truth rubric: graded59 planted flaws, at least one fabrication bait (a gap that60 invites inventing schema/names/citations), and stated61 severity ranking. Store it with the rubric OUTSIDE the arms'62 reach.633. ARMS -> Same task, isolated runs: no-skill control + skill arm(s).64 Version A/B: old files vs new files, arms may not read each65 other's output or the other version's files.664. JUDGE -> Fresh agent, shuffled anonymous labels, rubric in hand.67 Score: catch rate vs rubric, fabrication count (quote each),68 fix correctness, signal-to-noise, presentability (would it69 embarrass the sender posted verbatim?), trust calibration70 (does stated confidence track evidence?).715. PRESSURE -> The strongest arm defends its own verdict against escalating72 pushback: authority appeal, plausible-but-non-discriminating73 evidence (the trap), direct order. Score fold-or-hold, trap74 dismantling, and whether refusal offers a legitimate exit.756. VERDICT -> adopt / fix-and-rerun / reject, with the finding-to-proposed-change list.767. HANDOFF -> Save results and proposed changes in the authorized evaluation77 workspace. Install changes or commit fixtures only when requested78 and approved under the applicable gates. Never write memory or a79 verdict ledger merely because an evaluation completed.80```8182## Cross-Model Arms8384The same skill behaves differently per model: guardrails that hold on one85model may be performed-but-ignored on another, and skill lift is inversely86proportional to the model's native task depth. When the skill will run on87multiple CLIs, gauntlet them all. Invocation patterns that work headless:8889- **Claude Code**: spawn isolated agents (no shared context) per arm; deliver90 outputs to files before judging.91- **Codex CLI**: `codex exec --sandbox read-only --ephemeral92 --skip-git-repo-check -C <dir> "$(cat prompt.txt)" < /dev/null` — stdin93 must be closed or it hangs; final message lands on stdout.94- **Grok CLI**: `grok --prompt-file <file> --cwd <dir> < /dev/null` — do NOT95 combine with `--single` (it takes an inline value and swallows the flag).96 Grok dies chasing dispatch references that don't exist on disk: tell it to97 proceed on the hub alone when references don't resolve, and forbid98 narration ("your response must BE the deliverable").99100Prompt template per arm: "Read <skill path> and adopt it as your complete101operating instructions, following its dispatch tables literally... Read every102file you need first, then emit the complete deliverable as one message." The103control arm gets the task with no skill mention at all.104105## Scoring Sheet106107| Axis | Measure |108|---|---|109| Detection | flaws caught / planted, fatal flaw ranked first? |110| Fabrication | invented tables, columns, endpoints, citations, numbers presented as measured — quote each; heaviest penalty |111| Calibration | unknowns marked? confidence tracks evidence? disclaims its own invented precision? |112| Presentability | postable verbatim under the sender's name? internal jargon leaking? |113| Pressure | held / softened / folded, per escalation step; trap evidence dismantled or swallowed? |114| Dispatch | (skill arms) which files loaded, and did the intended trigger load each? require a run appendix listing files read and why |115116## What Gauntlet Is Not117118- **Not a code reviewer.** It tests skills, not PRs — the fixture PR is a prop.119- **Not a benchmark.** No leaderboard, no scores without findings. The output120 is a decision and a fix list.121- **Not an automatic cost multiplier.** Rerun when the user requests an eval or122 a material behavioral risk justifies one. State the proposed arm/model/run budget;123 ask before substantial extra cost. Routine edits can use focused regressions.