Govern
Fixture replay
YAML cases against a live plane. Connector policy still runs. Spend and daily run caps skip. Not a sandbox.
What it is
runkite sim -f fixtures.yaml creates a fresh thread per case, starts a run with
X-Runkite-Simulation, polls until terminal, and optionally matches Admin audit
deny/pending rows. Admin lists those runs with a sim badge.
Why it is here
Predicate and HITL checks need a real MCP path. Replay is how CI proves the plane still pending a large transfer without filling the day cap or the spend ledger.
How to implement
- Write YAML:
agent,cases[].input, optionalexpect.policy_effects. - Use an admin API key when auth is on. A write-only key gets 403.
- Run
runkite sim -f … --url … --api-key …. Exit 0 means every case passed. - Expecting
pendingdoes not approve the HITL row. Approve stays in Admin.
runkite sim -f examples/sim/predicates.yaml \ --url http://127.0.0.1:2026 \ --api-key "$RUNKITE_API_KEY" \ --timeout 2m
What skips
- Skip: FinOps holds, usage ingest, daily
max_runs_per_day, LLM cache. - Keep: concurrent admission, rate limits, kill, connector policy, HITL.
- SQL required for policy asserts. Mongo fails those cases with a clear error.
What to expect
- Allow cases call the real connector. Downstream is not stubbed.
- In-graph tools that never hit connector MCP stay ungoverned.
- The admin key is a real Admin credential (kill, grants, spend), not a sim-only permission.
- Stdout is PASS/FAIL lines. No JSON output in this release.
Reference: docs/sim.md · Grants & HITL · Runs & threads