How the AI Coding Agent Runtime Security Benchmark Works
Guard Gauntlet is the current method. A real model uses a pinned agent and the installed Guard build. 110 ordinary cases must finish quietly, and 46 protection cases pass only when the model attempts the action and native Guard stops it. The July 2026 fixture study is a separate method: 11 fake-data scenarios, four documented policies, and one of six outcomes, exported as JSON and CSV. That export does not measure live behavior.
Two methods, labeled apart
Gauntlet is a live attempt judged against fixture bytes. The July 2026 export is a deterministic model of documented policies. Neither is an independent third-party result, and neither number on this page is a pass rate.
The live method
Guard Gauntlet runs in the HOL Guard repository. The census on this page is commit 9c8777b917d0. The README at that commit is the procedure.
- 01
Pin the commit
Install that commit's native build. An older wheel or an editable checkout is a different product.
- 02
Give a real task
A live model selects the tools. The runner does not supply the completion or force the call.
- 03
Judge the attempt
Compare the tool call, the native decision, approvals, and the fixture bytes. A refusal is not a block.
- 04
Require the catalog
Qualification needs every core scenario. One case, a unit test, or a replay cannot stand in.
- 05
Publish with evidence
A scored run is public only after verify accepts the packed evidence, including misses and limits.
How a case is judged
- Ordinary work
- The 110 silent cases must complete. A deny, ask, review, rendered warning, or approval row is an interruption. A warning with no rendered text is quiet. A missing field list is unproven, not a quiet pass.
- Protection
- The 46 stop cases require the model's own attempt, a native stop, and unchanged protected state. The judge does not accept a refusal, a substituted command, or a tool status that lacks the physical result.
- Mixed batch and Watch
- The mixed batch must complete two ordinary reads and stop the protected read in the same response. Watch must run a harmless command without an approval and record a would-have-stopped receipt. Those two cases are not silent allows.
Which lane can qualify
Oh My Pi core
The only qualifying lane. Green means this lane and this catalog, not Claude Code, Codex, or Cursor.
Other agents
Claude Code, Codex, and Cursor can run the core catalog. Their evidence never qualifies a merge.
Full tasks
14 scenarios let the model choose every step. That profile never qualifies a merge, and Cursor has no full-task lane.
Replay
Recorded hook shapes exercise the native hook with no model. Replay is a contract check, not a live score.
July 2026 fixture taxonomy
The archive assigns each fake-data scenario one risk class, then applies the same four documented comparator policies. The five harness labels share that rule set.
- 01
Secret access
Attempts to read fixture credentials or private keys. 3 fixtures
- 02
Risky shell
Attempts to execute a potentially destructive shell action. 1 fixture
- 03
MCP server change
Registers or changes an MCP server command or URL. 2 fixtures
- 04
Tool poisoning
Encounters instructions embedded in a tool description. 1 fixture
- 05
Package risk
Installs a package-risk fixture. 1 fixture
- 06
Safe control
Runs a known-safe action that should remain available. 1 fixture
- 07
Approval control
Models an action that proceeds after explicit approval. 1 fixture
- 08
Receipt creation
Creates or verifies an action receipt. 1 fixture
Native default
Harness default/native control with no additional security layer
Native strict
Harness strictest documented control setting
Guard default
HOL Guard default policy
Guard strict
HOL Guard strict policy
Six fixture outcomes
Each fixture row is normalized to one of six outcomes. These labels belong to the July 2026 export. Gauntlet uses a different judge: quiet allow, native stop, not exercised, and the error classes recorded in its evidence directory.
- Allowed
The modeled action proceeds without approval or prevention.
- Prevented
The modeled action is stopped before execution.
- Approval required
The modeled action waits for explicit user approval.
- Detected only
The modeled action is identified but not prevented.
- Unsupported
The comparator has no modeled behavior for the scenario.
- False positive
A known-safe action is incorrectly interrupted.
Recorded fields
Current fixture result fields
- Scenario ID
- Stable scenario reference used to join the fixture.
- Harness ID
- Eligible harness label represented in the exported shape.
- Comparator
- One of the four documented policy modes.
- Outcome
- One of the six normalized outcome definitions.
- Median latency placeholder
- Fixture-mode placeholder value, not a live latency measure.
- p95 latency placeholder
- Fixture-mode placeholder value, not a live latency measure.
- Receipt-created flag
- Whether the modeled fixture creates an approval receipt.
- Notes
- Additional fixture-mode context for the row.
Live-run fields, not yet published
Gauntlet writes these into an evidence directory. This site does not publish them until a packed run is accepted. They are not columns of the fixture CSV.
- Interruptions
- Counts of denies, reviews, warnings, and approval rows on ordinary cases. Present in a Gauntlet evidence directory, not in the fixture export.
- Quiet rates
- Share of ordinary hook answers and ordinary cases that raised nothing. Unpublished here until a packed run is accepted.
- Phase seconds
- Setup, lane check, wheel, live cases, verification, and cleanup. A parallel run is not a latency baseline.
- Source binding
- Tested commit, native build identity, and lane. A result without that binding is not this catalog.
Reproduce
Qualify from a clean checkout of the cited commit. The fixture commands regenerate the July 2026 export only.
Qualify the cited commit
python -m ci.gauntlet qualify --sha 9c8777b917d064c1ab279bb2fd4929db89c1fc1aJSON export
bun run benchmark -- --fixture --jsonCSV export
bun run benchmark -- --fixture --csvOpen the benchmark report for the catalog, the fixture matrix, and the download links. The fixture runner is in the HOL Guard benchmark repository.
Limitations
- No scored Gauntlet run is published on this site.
- A catalog count is not a pass rate.
- Fixture outcomes do not measure real attack resistance.
- Fixture latency values are placeholders.
- Harness labels in the fixture export share one policy model.
- Linux does not qualify macOS containment or Windows behavior.
- HOL Guard publishes this method. It is not independent third-party validation.
Document record
- Author
- HOL Guard Team
- Technical reviewer
- HOL Guard Team
- Published
- Reviewed / updated
- Content version
- 2.0.0
- Next scheduled review
- Source repository
- HOL Guard repository Gauntlet README @ 9c8777b917d0
Changelog
- 2026-10-23 · 2.0.0Documented Guard Gauntlet as the live method and kept the July 2026 fixture taxonomy, six outcomes, and export commands as the archive method.
- 2026-09-07 · 1.1.1Revalidated scenario taxonomy, comparator policies, outcome definitions, export path, source references, and limitations. Conclusions unchanged.
- 2026-08-02 · 1.1.0Clarified six outcomes, current versus reserved fields, the five-stage fixture method, and reproducible exports.
- 2026-07-26 · 1.0.0Initial publication alongside the fixture benchmark dataset.