# AgentGovBench — Open, NIST-mapped benchmark for AI agent governance

48 scenarios, 8 categories, vendor-neutral, deterministic. Scores CrewAI, LangGraph, Claude Code, OpenAI and Anthropic Agent SDKs — with and without ACP.

<div class="acp-section" style="padding-top:56px;">
  <div class="acp-container" style="text-align:center;">
    <div style="display:inline-block;padding:5px 16px;border-radius:100px;background:linear-gradient(135deg,rgba(79,70,229,0.14),rgba(6,182,212,0.10));color:var(--color-accent);font-size:12px;font-weight:700;letter-spacing:0.06em;text-transform:uppercase;margin-bottom:16px;">AgentGovBench v0.2.6</div>
    <h1 class="acp-hero-h1" style="font-size:44px;margin:0 auto;max-width:820px;">How agent frameworks score on governance.</h1>
    <p class="acp-subtitle" style="max-width:720px;margin:18px auto 0;">
      <strong>48 scenarios. 8 categories. NIST-mapped. Deterministic.</strong> AgentGovBench tests what governance actually happens when an agent makes a tool call &mdash; identity propagation, policy enforcement, delegation provenance, rate limits, audit completeness, cross-tenant isolation, fail-mode discipline, scope inheritance.
    </p>
    <div style="margin-top:32px;display:flex;justify-content:center;gap:12px;flex-wrap:wrap;">
      <a href="https://github.com/agentic-control-plane/agentgovbench" class="acp-btn acp-btn-primary" data-track="Benchmark: View Repo" style="padding:12px 28px;font-size:15px;">View the benchmark &rarr;</a>
      <a href="/blog/how-we-test-agent-governance" class="acp-btn acp-btn-ghost" data-track="Benchmark: Methodology" style="padding:12px 28px;font-size:15px;">Read the methodology &rarr;</a>
    </div>
  </div>
</div>

<!-- Hero scorecard — the three tiers -->
<div class="acp-section" style="padding-top:8px;">
  <div class="acp-container">
    <div class="acp-card acp-card-pad">
      <div class="acp-integ-header">
        <div class="acp-integ-label">The governance tiers</div>
        <h2 class="acp-section-title" style="margin-bottom:4px;">Three tiers. Sixteen scenarios separate logging from enforcement.</h2>
      </div>
      <p class="acp-muted" style="max-width:720px;margin-bottom:24px;">
        Every governance product sits somewhere on this scoreboard. The gap between <strong>audit-only</strong> (what most framework defaults look like) and <strong>ACP</strong> (full enforcement) is where governance products actually earn their keep.
      </p>

      <div class="acp-table-wrap" style="overflow-x:auto;-webkit-overflow-scrolling:touch;margin-top:8px;">
      <table class="acp-table" style="width:100%;min-width:560px;border-collapse:collapse;">
        <thead>
          <tr style="text-align:left;border-bottom:1px solid var(--color-border);">
            <th style="padding:12px 10px;font-size:13px;font-weight:700;color:var(--color-text-primary);">Category</th>
            <th style="padding:12px 10px;font-size:13px;font-weight:700;color:var(--color-text-faint);text-align:center;">vanilla<br/><span style="font-weight:400;font-size:11px;">no governance</span></th>
            <th style="padding:12px 10px;font-size:13px;font-weight:700;color:var(--color-text-faint);text-align:center;">audit-only<br/><span style="font-weight:400;font-size:11px;">framework default</span></th>
            <th style="padding:12px 10px;font-size:13px;font-weight:700;color:var(--color-accent);text-align:center;">ACP<br/><span style="font-weight:400;font-size:11px;">full enforcement</span></th>
          </tr>
        </thead>
        <tbody style="font-size:14px;">
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;">Audit completeness</td><td style="text-align:center;color:var(--color-text-faint);">1/6</td><td style="text-align:center;">5/6</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">6/6</td></tr>
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;">Cross-tenant isolation</td><td style="text-align:center;">4/6</td><td style="text-align:center;">4/6</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">4/6<sup>*</sup></td></tr>
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;">Delegation provenance</td><td style="text-align:center;color:var(--color-text-faint);">0/6</td><td style="text-align:center;">5/6</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">6/6</td></tr>
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;">Fail-mode discipline</td><td style="text-align:center;">3/6</td><td style="text-align:center;">4/6</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">6/6</td></tr>
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;">Identity propagation</td><td style="text-align:center;color:var(--color-text-faint);">0/6</td><td style="text-align:center;">6/6</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">6/6</td></tr>
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;">Per-user policy enforcement</td><td style="text-align:center;color:var(--color-text-faint);">1/6</td><td style="text-align:center;color:var(--color-text-faint);">1/6</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">6/6</td></tr>
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;">Rate-limit cascade</td><td style="text-align:center;">3/6</td><td style="text-align:center;">3/6</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">5/6</td></tr>
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;">Scope inheritance</td><td style="text-align:center;color:var(--color-text-faint);">1/6</td><td style="text-align:center;color:var(--color-text-faint);">1/6</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">6/6</td></tr>
          <tr style="border-top:2px solid var(--color-border);font-weight:700;font-size:15px;">
            <td style="padding:12px 10px;">Total</td>
            <td style="text-align:center;color:var(--color-text-faint);">13/48</td>
            <td style="text-align:center;">29/48</td>
            <td style="text-align:center;color:var(--color-accent);">45/48</td>
          </tr>
        </tbody>
      </table>
      </div>

      <p class="acp-muted" style="margin-top:14px;font-size:12px;"><sup>*</sup>ACP declines 2 cross-tenant scenarios on the current deployment (single-tenant mode) and 1 scope-inheritance variant. All declinations are documented in the scorecard JSON &mdash; no hidden failures.</p>
    </div>
  </div>
</div>

<!-- What it means -->
<div class="acp-section">
  <div class="acp-container">
    <div class="acp-card acp-card-pad">
      <div class="acp-integ-header">
        <div class="acp-integ-label">What the tiers actually buy you</div>
        <h2 class="acp-section-title" style="margin-bottom:4px;">The jump from 29 to 45 is sixteen scenarios of enforcement.</h2>
      </div>
      <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;margin-top:20px;">
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">vanilla &middot; 13/48</div>
          <div class="acp-muted" style="font-size:13px;">No audit, no enforcement, no identity, no policy. The floor. Some scenarios pass because they don&rsquo;t require enforcement &mdash; a benign read call is correctly allowed even here.</div>
        </div>
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">audit-only &middot; 29/48</div>
          <div class="acp-muted" style="font-size:13px;">Every call logged with attribution, provenance, timestamp. Nothing denied. Nothing rate-limited. No policy enforced. <strong>This is most frameworks&rsquo; realistic ceiling out of the box.</strong></div>
        </div>
        <div class="acp-integ-gov-item" style="border-color:var(--color-accent);">
          <div class="acp-integ-gov-title" style="color:var(--color-accent);">ACP &middot; 45/48</div>
          <div class="acp-muted" style="font-size:13px;">Actual enforcement on top of audit. Per-user policies, scope narrowing, rate-limit cascades, fail-mode discipline. The 16-scenario jump separates logging libraries from governance products.</div>
        </div>
      </div>
    </div>
  </div>
</div>

<!-- Framework scorecards -->
<div class="acp-section">
  <div class="acp-container">
    <div class="acp-card acp-card-pad">
      <div class="acp-integ-header">
        <div class="acp-integ-label">Per-framework scorecards</div>
        <h2 class="acp-section-title" style="margin-bottom:4px;">What each framework scores, with and without ACP.</h2>
      </div>
      <p class="acp-muted" style="max-width:720px;margin-bottom:20px;">
        One runner per framework. Each follows the <a href="https://github.com/agentic-control-plane/agentgovbench/tree/main/runners" style="color:var(--color-accent);"><code>BaseRunner</code></a> pattern &mdash; deterministic, no LLM in the loop, real gateway calls. A framework's "With ACP" score can sit above or below the 45/48 headline: the headline is the reference runner, and each framework's own tool seam decides how many of the 48 scenarios its runner can reach.
      </p>
      <div class="acp-table-wrap" style="overflow-x:auto;-webkit-overflow-scrolling:touch;">
      <table class="acp-table" style="width:100%;min-width:680px;border-collapse:collapse;">
        <thead>
          <tr style="text-align:left;border-bottom:1px solid var(--color-border);">
            <th style="padding:10px;font-size:13px;font-weight:700;">Framework</th>
            <th style="padding:10px;font-size:13px;font-weight:700;text-align:center;">Native</th>
            <th style="padding:10px;font-size:13px;font-weight:700;text-align:center;color:var(--color-accent);">With ACP</th>
            <th style="padding:10px;font-size:13px;font-weight:700;">Pattern</th>
            <th style="padding:10px;font-size:13px;font-weight:700;">Status</th>
          </tr>
        </thead>
        <tbody style="font-size:14px;">
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;"><a href="/blog/full-scorecard-seven-frameworks-48-scenarios" style="color:var(--color-text-primary);font-weight:600;">CrewAI</a></td><td style="text-align:center;">13/48</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">40/48</td><td style="padding:10px;color:var(--color-text-faint);">Decorator (<code>@governed</code>)</td><td style="padding:10px;"><span style="background:rgba(34,197,94,0.12);color:#16a34a;padding:3px 8px;border-radius:4px;font-size:11px;font-weight:600;">Live</span></td></tr>
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;"><a href="/blog/full-scorecard-seven-frameworks-48-scenarios" style="color:var(--color-text-primary);font-weight:600;">LangChain / LangGraph</a></td><td style="text-align:center;">13/48</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">40/48</td><td style="padding:10px;color:var(--color-text-faint);">Decorator</td><td style="padding:10px;"><span style="background:rgba(34,197,94,0.12);color:#16a34a;padding:3px 8px;border-radius:4px;font-size:11px;font-weight:600;">Live</span></td></tr>
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;"><a href="/blog/full-scorecard-seven-frameworks-48-scenarios" style="color:var(--color-text-primary);font-weight:600;">Claude Code</a></td><td style="text-align:center;">13/48</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">43/48</td><td style="padding:10px;color:var(--color-text-faint);">Hook</td><td style="padding:10px;"><span style="background:rgba(34,197,94,0.12);color:#16a34a;padding:3px 8px;border-radius:4px;font-size:11px;font-weight:600;">Live</span></td></tr>
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;">OpenAI Agents SDK</td><td style="text-align:center;">13/48</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">45/48</td><td style="padding:10px;color:var(--color-text-faint);">Proxy</td><td style="padding:10px;"><span style="background:rgba(34,197,94,0.12);color:#16a34a;padding:3px 8px;border-radius:4px;font-size:11px;font-weight:600;">Live</span></td></tr>
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;">Anthropic Agent SDK</td><td style="text-align:center;">13/48</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">46/48</td><td style="padding:10px;color:var(--color-text-faint);">Decorator</td><td style="padding:10px;"><span style="background:rgba(34,197,94,0.12);color:#16a34a;padding:3px 8px;border-radius:4px;font-size:11px;font-weight:600;">Live</span></td></tr>
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;"><a href="/blog/full-scorecard-seven-frameworks-48-scenarios" style="color:var(--color-text-primary);font-weight:600;">Cursor</a></td><td style="text-align:center;">13/48</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">37/48</td><td style="padding:10px;color:var(--color-text-faint);">MCP</td><td style="padding:10px;"><span style="background:rgba(34,197,94,0.12);color:#16a34a;padding:3px 8px;border-radius:4px;font-size:11px;font-weight:600;">Live</span></td></tr>
          <tr style="border-bottom:1px solid rgba(0,0,0,0.05);"><td style="padding:10px;">OpenAI Codex CLI</td><td style="text-align:center;">13/48</td><td style="text-align:center;font-weight:600;color:var(--color-accent);">43/48</td><td style="padding:10px;color:var(--color-text-faint);">Hook</td><td style="padding:10px;"><span style="background:rgba(34,197,94,0.12);color:#16a34a;padding:3px 8px;border-radius:4px;font-size:11px;font-weight:600;">Live</span></td></tr>
        </tbody>
      </table>
      </div>
    </div>
  </div>
</div>

<!-- Methodology -->
<div class="acp-section">
  <div class="acp-container">
    <div class="acp-card acp-card-pad">
      <div class="acp-integ-header">
        <div class="acp-integ-label">Methodology</div>
        <h2 class="acp-section-title" style="margin-bottom:4px;">How we designed these 48 scenarios.</h2>
      </div>
      <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px;margin-top:16px;">
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">Framework-agnostic</div>
          <div class="acp-muted" style="font-size:13px;">Scenarios describe what the governance layer should enforce, not how. Same scenarios run against ACP, a competitor, or nothing at all.</div>
        </div>
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">Deterministic</div>
          <div class="acp-muted" style="font-size:13px;">No LLM in the hot path. Tool calls are synthesized directly. The full benchmark reproduces byte-for-byte.</div>
        </div>
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">NIST-mapped</div>
          <div class="acp-muted" style="font-size:13px;">Each scenario cites the specific NIST AI RMF 1.0 control it exercises. Procurement teams cite NIST, not us.</div>
        </div>
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">Honest about failures</div>
          <div class="acp-muted" style="font-size:13px;">ACP ships with 3 documented declinations. They&rsquo;re in the scorecard, the repo, and this page. No hidden failures.</div>
        </div>
      </div>
      <p class="acp-muted" style="margin-top:20px;font-size:14px;">The full methodology &mdash; why we picked these eight categories, what each scenario tests, how to contribute new scenarios or runners &mdash; is in the <a href="/blog/how-we-test-agent-governance" style="color:var(--color-accent);">launch post</a> and the repo&rsquo;s <a href="https://github.com/agentic-control-plane/agentgovbench/blob/main/METHODOLOGY.md" style="color:var(--color-accent);">METHODOLOGY.md</a>.</p>
    </div>
  </div>
</div>

<!-- CTA -->
<div class="acp-section">
  <div class="acp-container">
    <div class="acp-cta-card" style="text-align:center;">
      <h2 class="acp-section-title">Reproduce the scorecard on your own deployment.</h2>
      <p class="acp-muted" style="max-width:560px;margin:8px auto 0;">
        Clone the repo, point at your ACP instance, run the benchmark. Same runner, same scenarios, same numbers. If you see different results, that&rsquo;s either version drift or a gap we haven&rsquo;t found.
      </p>
      <div style="margin-top:24px;display:flex;justify-content:center;gap:16px;flex-wrap:wrap;">
        <a href="https://github.com/agentic-control-plane/agentgovbench" class="acp-btn acp-btn-primary" data-track="Benchmark: GitHub" style="padding:14px 32px;font-size:16px;">Clone on GitHub &rarr;</a>
        <a href="/blog/how-we-test-agent-governance" class="acp-btn acp-btn-ghost" data-track="Benchmark: Methodology" style="padding:14px 32px;font-size:16px;">Read the methodology &rarr;</a>
      </div>
    </div>
  </div>
</div>

<style>
.acp-integ-header { margin-bottom: 16px; }
.acp-integ-label {
  display: inline-block;
  padding: 5px 16px;
  border-radius: 100px;
  background: linear-gradient(135deg, rgba(79,70,229,0.14), rgba(6,182,212,0.10));
  color: var(--color-accent);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  margin-bottom: 12px;
}
.acp-integ-gov-item {
  padding: 20px;
  border-radius: var(--radius-md);
  border: 1px solid var(--color-border);
  background: var(--color-surface);
  transition: border-color 0.15s ease;
}
.acp-integ-gov-item:hover {
  border-color: var(--color-accent);
}
.acp-integ-gov-title {
  font-size: 14px;
  font-weight: 700;
  color: var(--color-text-primary);
  margin-bottom: 4px;
}
.acp-integ-gov-title::before {
  content: "";
  display: inline-block;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--color-accent);
  margin-right: 8px;
  vertical-align: middle;
}
table.acp-table code {
  font-size: 12px;
  background: rgba(91,91,214,0.08);
  padding: 1px 5px;
  border-radius: 3px;
}
</style>
