# AgentGovBench scenarios — what ACP catches that framework defaults don't

All 48 AgentGovBench scenarios in plain English, with per-tier pass/fail (vanilla · audit-only · ACP). The concrete catalog of what agent governance actually does.

<style>
  .bench-intro { margin: 12px 0 24px; }
  .bench-intro p { font-size: 15px; color: var(--color-text-secondary); line-height: 1.6; }

  .bench-summary {
    display: flex;
    flex-wrap: wrap;
    gap: 14px;
    margin: 24px 0 20px;
    padding: 18px 22px;
    border: 1px solid var(--color-border);
    border-radius: 12px;
    background: linear-gradient(180deg, rgba(79,70,229,0.04), var(--color-surface));
  }
  .bench-summary .bs-item {
    flex: 1;
    min-width: 140px;
    font-family: var(--acp-font-mono, 'JetBrains Mono', monospace);
  }
  .bench-summary .bs-label {
    font-size: 10px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--color-text-muted);
    margin-bottom: 4px;
  }
  .bench-summary .bs-value {
    font-size: 22px;
    font-weight: 700;
    color: var(--color-text-primary);
    font-family: 'Inter Tight', sans-serif;
    letter-spacing: -0.01em;
  }
  .bench-summary .bs-item.acp .bs-value { color: var(--color-accent); }

  /* filter bar */
  .bench-filters {
    padding: 18px 20px;
    border: 1px solid var(--color-border);
    border-radius: 12px;
    background: var(--color-surface);
    margin-bottom: 22px;
  }
  .bench-filter-row {
    display: flex;
    flex-wrap: wrap;
    gap: 6px 8px;
    align-items: center;
    margin-bottom: 10px;
  }
  .bench-filter-row:last-child { margin-bottom: 0; }
  .bench-filter-label {
    font-family: var(--acp-font-mono, 'JetBrains Mono', monospace);
    font-size: 10px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--color-text-muted);
    margin-right: 6px;
    min-width: 80px;
  }
  .bench-filter-pill {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 5px 11px;
    border-radius: 5px;
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    color: var(--color-text-secondary);
    font-family: var(--acp-font-mono, 'JetBrains Mono', monospace);
    font-size: 11px;
    cursor: pointer;
    transition: all 140ms;
    user-select: none;
  }
  .bench-filter-pill:hover {
    border-color: var(--color-accent);
    color: var(--color-text-primary);
  }
  .bench-filter-pill.active {
    background: var(--color-accent);
    border-color: var(--color-accent);
    color: #fff;
    font-weight: 600;
  }
  .bench-filter-pill .fp-count {
    font-size: 10px;
    opacity: 0.7;
  }
  .bench-filter-pill.active .fp-count { opacity: 0.85; }
  .bench-filter-count {
    margin-top: 12px;
    padding-top: 12px;
    border-top: 1px dashed var(--color-border);
    font-family: var(--acp-font-mono, 'JetBrains Mono', monospace);
    font-size: 11px;
    color: var(--color-text-muted);
    letter-spacing: 0.04em;
  }
  .bench-filter-count strong {
    color: var(--color-accent);
    font-weight: 700;
  }

  /* scenario card — flat list */
  .bench-scen {
    padding: 18px 20px;
    border: 1px solid var(--color-border);
    border-radius: 10px;
    background: var(--color-surface);
    margin-bottom: 12px;
    box-shadow: 0 1px 3px rgba(91,91,214,0.04);
  }
  .bench-scen.hidden { display: none; }
  .bench-scen-top {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 12px;
    margin-bottom: 10px;
    flex-wrap: wrap;
  }
  .scen-cat-pill {
    display: inline-flex;
    align-items: center;
    padding: 3px 10px;
    border-radius: 4px;
    background: rgba(79,70,229,0.06);
    color: var(--color-accent);
    font-family: var(--acp-font-mono, 'JetBrains Mono', monospace);
    font-size: 10.5px;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    border: 1px solid rgba(79,70,229,0.2);
  }
  .bench-scen-source {
    font-family: var(--acp-font-mono, 'JetBrains Mono', monospace);
    font-size: 11px;
    color: var(--color-text-muted);
    text-decoration: none;
    padding: 3px 8px;
    border: 1px solid var(--color-border);
    border-radius: 4px;
  }
  .bench-scen-source:hover {
    color: var(--color-accent);
    border-color: var(--color-accent);
  }
  .bench-scen-title {
    font-size: 15px;
    font-weight: 600;
    color: var(--color-text-primary);
    line-height: 1.4;
    margin-bottom: 8px;
  }
  .bench-scen-desc {
    font-size: 13.5px;
    color: var(--color-text-secondary);
    line-height: 1.6;
    margin-bottom: 14px;
    white-space: pre-wrap;
  }
  .bench-scen-tiers {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-bottom: 10px;
  }
  .tier-badge {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 10px;
    border-radius: 5px;
    font-family: var(--acp-font-mono, 'JetBrains Mono', monospace);
    font-size: 11px;
    letter-spacing: 0.02em;
    border: 1px solid;
  }
  .tier-badge .tb-check { font-weight: 700; font-size: 13px; line-height: 1; }
  .tier-badge.pass {
    color: #059669;
    background: rgba(16,185,129,0.06);
    border-color: rgba(16,185,129,0.3);
  }
  .tier-badge.fail {
    color: #b91c1c;
    background: rgba(220,38,38,0.05);
    border-color: rgba(220,38,38,0.25);
  }
  .tier-badge.pass .tb-label { color: #047857; }
  .tier-badge.fail .tb-label { color: #991b1b; }

  /* NIST — promoted treatment */
  .bench-scen-nist {
    margin: 14px 0 0;
    padding: 10px 12px;
    border-left: 3px solid var(--color-accent);
    background: rgba(79,70,229,0.03);
    border-radius: 0 6px 6px 0;
  }
  .bench-scen-nist-label {
    display: block;
    font-family: var(--acp-font-mono, 'JetBrains Mono', monospace);
    font-size: 10px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--color-accent);
    font-weight: 700;
    margin-bottom: 5px;
  }
  .bench-scen-nist-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 5px;
  }
  .bench-scen-nist-tags a {
    display: inline-block;
    padding: 3px 9px;
    border-radius: 4px;
    background: #fff;
    border: 1px solid rgba(79,70,229,0.25);
    color: var(--color-accent);
    font-family: var(--acp-font-mono, 'JetBrains Mono', monospace);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.02em;
    text-decoration: none;
    transition: all 140ms;
  }
  .bench-scen-nist-tags a:hover {
    background: var(--color-accent);
    color: #fff;
    border-color: var(--color-accent);
  }

  /* expandable YAML */
  .bench-scen-yaml {
    margin-top: 12px;
    border-top: 1px dashed var(--color-border);
    padding-top: 10px;
  }
  .bench-scen-yaml summary {
    font-family: var(--acp-font-mono, 'JetBrains Mono', monospace);
    font-size: 11px;
    color: var(--color-text-muted);
    cursor: pointer;
    list-style: none;
    user-select: none;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 2px 0;
  }
  .bench-scen-yaml summary::-webkit-details-marker { display: none; }
  .bench-scen-yaml summary::before {
    content: "▸";
    font-size: 10px;
    color: var(--color-text-muted);
    transition: transform 0.15s ease;
  }
  .bench-scen-yaml[open] summary::before { transform: rotate(90deg); }
  .bench-scen-yaml summary:hover { color: var(--color-accent); }
  .bench-scen-yaml summary:hover::before { color: var(--color-accent); }
  .bench-scen-yaml pre {
    margin: 10px 0 0;
    padding: 14px 16px;
    background: #1d1d1f;
    color: #d4d4d8;
    border-radius: 8px;
    font-family: var(--acp-font-mono, 'JetBrains Mono', monospace);
    font-size: 12px;
    line-height: 1.55;
    overflow-x: auto;
    white-space: pre;
  }
  .bench-scen-yaml-foot {
    margin-top: 8px;
    font-size: 11px;
    color: var(--color-text-muted);
    font-family: var(--acp-font-mono, 'JetBrains Mono', monospace);
  }
  .bench-scen-yaml-foot a {
    color: var(--color-text-muted);
    border-bottom: 1px dotted var(--color-border);
    text-decoration: none;
  }
  .bench-scen-yaml-foot a:hover { color: var(--color-accent); border-color: var(--color-accent); }

  .bench-empty {
    padding: 48px 24px;
    text-align: center;
    border: 1px dashed var(--color-border);
    border-radius: 10px;
    color: var(--color-text-muted);
    font-size: 14px;
    display: none;
  }
  .bench-empty.show { display: block; }

  .bench-footer-cta {
    margin-top: 56px;
    padding: 28px 24px;
    border-radius: 12px;
    border: 1px solid var(--color-border);
    background: linear-gradient(180deg, rgba(79,70,229,0.04), var(--color-surface));
    text-align: center;
  }
  .bench-footer-cta h3 { font-size: 20px; margin: 0 0 6px; color: var(--color-text-primary); }
  .bench-footer-cta p { font-size: 14px; color: var(--color-text-secondary); margin: 0 0 18px; }

  .bench-footnote {
    margin-top: 32px;
    font-size: 11px;
    color: var(--color-text-muted);
    font-family: var(--acp-font-mono, 'JetBrains Mono', monospace);
  }
  .bench-footnote code { background: rgba(0,0,0,0.04); padding: 1px 6px; border-radius: 3px; }
</style>

# What ACP catches. What your setup doesn't.

<div class="bench-intro">
  <p>All 48 scenarios from <a href="" target="_blank" rel="noopener">AgentGovBench</a>, rewritten in plain English, with pass/fail for each governance tier. Filter by category or by coverage gap to see what ACP adds over framework defaults. <a href="/benchmark">See the aggregate scoreboard &rarr;</a></p>
</div>

<div class="bench-summary">
  <div class="bs-item">
    <div class="bs-label">Total scenarios</div>
    <div class="bs-value"></div>
  </div>
  <div class="bs-item">
    <div class="bs-label">Vanilla · no governance</div>
    <div class="bs-value">/</div>
  </div>
  <div class="bs-item">
    <div class="bs-label">Audit-only · framework default</div>
    <div class="bs-value">/</div>
  </div>
  <div class="bs-item acp">
    <div class="bs-label">ACP · full enforcement</div>
    <div class="bs-value">/</div>
  </div>
</div>

<div class="bench-filters">
  <div class="bench-filter-row">
    <span class="bench-filter-label">Category</span>
    <button type="button" class="bench-filter-pill active" data-filter="category" data-value="all">All <span class="fp-count"></span></button>
    
    <button type="button" class="bench-filter-pill" data-filter="category" data-value=""> <span class="fp-count"></span></button>
    
  </div>
  <div class="bench-filter-row">
    <span class="bench-filter-label">Coverage</span>
    <button type="button" class="bench-filter-pill active" data-filter="coverage" data-value="all">All <span class="fp-count">48</span></button>
    <button type="button" class="bench-filter-pill" data-filter="coverage" data-value="vanilla-fails" title="Scenarios where vanilla fails (what any governance catches)">Vanilla fails <span class="fp-count">35</span></button>
    <button type="button" class="bench-filter-pill" data-filter="coverage" data-value="audit-gaps" title="Scenarios where audit-only fails but ACP passes (what ACP adds over framework defaults)">Audit-only gaps ACP catches <span class="fp-count">16</span></button>
    <button type="button" class="bench-filter-pill" data-filter="coverage" data-value="acp-gaps" title="Scenarios where ACP fails — documented declinations">ACP's known gaps <span class="fp-count">3</span></button>
  </div>
  <div class="bench-filter-count">
    Showing <strong id="bench-shown-count">48</strong> of  scenarios
  </div>
</div>

<div id="bench-list">

  
  <div class="bench-scen" data-category="" data-vanilla="passfail" data-audit="passfail" data-acp="passfail">
    <div class="bench-scen-top">
      <span class="scen-cat-pill"></span>
    </div>
    <div class="bench-scen-title"></div>
    <div class="bench-scen-desc"></div>
    <div class="bench-scen-tiers">
      <span class="tier-badge passfail">
        <span class="tb-check">&#10003;&#10007;</span>
        <span class="tb-label">Vanilla</span>
      </span>
      <span class="tier-badge passfail">
        <span class="tb-check">&#10003;&#10007;</span>
        <span class="tb-label">Audit-only</span>
      </span>
      <span class="tier-badge passfail">
        <span class="tb-check">&#10003;&#10007;</span>
        <span class="tb-label">ACP</span>
      </span>
    </div>
    <div class="bench-scen-nist">
      <span class="bench-scen-nist-label">Maps to NIST AI RMF 1.0</span>
      <div class="bench-scen-nist-tags">
        <a href="https://airc.nist.gov/AI_RMF_Knowledge_Base/AI_RMF/Core_And_Profiles/5-sec-core" target="_blank" rel="noopener" title="NIST AI RMF 1.0 control "></a>
      </div>
    </div>
    <details class="bench-scen-yaml">
      <summary>View scenario YAML</summary>
      <pre><code></code></pre>
      <div class="bench-scen-yaml-foot">
        <a href="" target="_blank" rel="noopener" data-track="Scenarios: GitHub source">View on GitHub &rarr;</a>
      </div>
    </details>
  </div>
  

</div>

<div class="bench-empty" id="bench-empty">
  No scenarios match the current filters. <a href="#" onclick="document.querySelectorAll('.bench-filter-pill[data-value=all]').forEach(b=>b.click());return false;">Reset filters</a>
</div>

<div class="bench-footer-cta">
  <h3>Reproduce every one of these on your own deployment.</h3>
  <p>Clone the benchmark repo, point it at your ACP instance, run it. Same scenarios, same numbers.</p>
  <div>
    <a href="" class="acp-btn acp-btn-primary" data-track="Scenarios: GitHub" style="padding:10px 22px;margin-right:8px;" target="_blank" rel="noopener">Clone on GitHub &rarr;</a>
    <a href="/blog/how-we-test-agent-governance" class="acp-btn acp-btn-ghost" data-track="Scenarios: Methodology" style="padding:10px 22px;">Read the methodology &rarr;</a>
  </div>
</div>

<p class="bench-footnote">Generated  from results . Regenerate with <code>ruby scripts/regenerate-benchmark-data.rb</code>.</p>

<script>
(function () {
  var state = { category: 'all', coverage: 'all' };
  var list = document.getElementById('bench-list');
  var empty = document.getElementById('bench-empty');
  var countEl = document.getElementById('bench-shown-count');
  if (!list) return;
  var cards = Array.prototype.slice.call(list.querySelectorAll('.bench-scen'));

  function matchesCoverage(card) {
    if (state.coverage === 'all') return true;
    var v = card.getAttribute('data-vanilla');
    var a = card.getAttribute('data-audit');
    var p = card.getAttribute('data-acp');
    if (state.coverage === 'vanilla-fails') return v === 'fail';
    if (state.coverage === 'audit-gaps') return a === 'fail' && p === 'pass';
    if (state.coverage === 'acp-gaps') return p === 'fail';
    return true;
  }

  function matchesCategory(card) {
    if (state.category === 'all') return true;
    return card.getAttribute('data-category') === state.category;
  }

  function apply() {
    var shown = 0;
    cards.forEach(function (card) {
      var visible = matchesCategory(card) && matchesCoverage(card);
      card.classList.toggle('hidden', !visible);
      if (visible) shown++;
    });
    countEl.textContent = shown;
    empty.classList.toggle('show', shown === 0);
  }

  document.querySelectorAll('.bench-filter-pill').forEach(function (btn) {
    btn.addEventListener('click', function () {
      var dim = btn.getAttribute('data-filter');
      var value = btn.getAttribute('data-value');
      state[dim] = value;
      document.querySelectorAll('.bench-filter-pill[data-filter="' + dim + '"]').forEach(function (b) {
        b.classList.toggle('active', b === btn);
      });
      apply();
      try { window.plausible && window.plausible('Scenarios Filter', { props: { dim: dim, value: value } }); } catch (e) {}
    });
  });
})();
</script>
