Worked example — replaying a payments incident as a permanent regression
A complete, runnable, synthetic walkthrough of the incident-to-regression path (docs/benchmark.md §11; SRE incident→prevention practice). Every command works against the deterministic reference destination; nothing here touches a real provider or contains real incident data.
The incident (synthetic, but the documented shape)
The recurring production shape — Knight Capital’s fill-tracking gap, Stripe’s and Temporal’s own retry guidance, the 2025 agent incidents — is:
A payment-creation call succeeded at the destination, the response was lost, and the retry path created a second charge, because the retry carried either no idempotency evidence or re-synthesized arguments the destination treated as new.
Suppose your postmortem says: “order 88231: customer double-charged after a
gateway timeout; the workflow retried with regenerated request parameters.”
That is fault semantic-resynthesis (or response-lost for identical
retries) against a C2-class destination, at the T_RESPONSE anchor.
1. Compile the incident class into a private fixture set
Generalize, don’t transcribe (prevent the class, not the one trace):
# A private master seed — YOURS, never committed anywhere public.
SEED=$(python3 -c "import secrets; print(secrets.token_hex(32))")
uv run irrevon bench fixtures --write --dir ./private-regressions --master-seed "$SEED"
uv run irrevon bench fixtures --verify --dir ./private-regressions
This derives the full fault × tier matrix — including the
semantic-resynthesis/C2 and response-lost/C2 cells your incident
instantiates — from your seed, deterministically, with the same schemas,
canary, and drift gates as the public split. The incident’s specifics
(amounts, identifiers) stay in your postmortem; the fixture encodes the
failure mechanics.
2. Reproduce the incident mechanics (your current strategy vs the ladder)
uv run irrevon bench smoke --fixtures ./private-regressions --out ./runs \
--workloads wl_dev.c2.semanticresynthesis.irre.r0,wl_dev.c2.responselost.irre.r0 \
--arms B0,B1,B2,B3,B5,B6,B5+B3+B6
uv run irrevon bench analyze --runs ./runs --json > incident-comparison.json
Pick the arm that matches your current retry strategy (naive retry = B0;
arg-hash dedup = B1; agent-minted keys = B2; stable op-IDs = B3; durable
runtime + keys = B5). Its non-zero duplicate_effect_rate on these cells IS
your incident, reproduced under a seeded fault schedule and proven by
destination read-back — with the causal history (runs/*/history.json)
showing the exact H1-duplicate-effect violation and the events around it.
Compare against B5+B3+B6 (status-check-before-retry) and, with a Postgres
handy, arm R (--arms R,B5 --dsn …).
3. Make it permanent
- Fast CI mode: pin the two workloads + your arm in a CI job and assert
the expected verdicts — e.g. “our strategy still duplicates here (known
gap, tracked)” or, after a fix, “duplicate_effect_rate numerator == 0”.
The run exits non-zero on INVALID runs; your assertion runs on
incident-comparison.json(machine-readable,irrevonbench/comparison/v1). - Scheduled deep suite: the full matrix over all replicates plus arm R,
nightly (
bench smokeover all workloads). - Regression discipline: the fixture set is drift-gated against your seed — nobody can quietly soften the scenario; a generator upgrade regenerates visibly and your assertions re-run.
4. Export sanitized evidence
Every run directory is already a sanitized, independently verifiable
bundle: write-ahead run manifest, environment manifest, digest-only journal,
compiled causal history + checker verdict, and the result document whose
metrics were cross-checked by two independent oracles. Nothing in it
contains payloads or credentials; hand the directory (or just
incident-comparison.json) to auditors, CI, or a policy engine as-is.
Boundary notes (honest)
Synthetic destination ⇒ these runs demonstrate mechanics, not provider
behavior (synthetic-destination label is in every result). Replaying
against your real destination’s sandbox requires the credential-gated
adapter path (declaration + irrevon bench conform first) and your own
ToS/rate-budget review. If your incident involves a capability the
declaration cannot express, that is a finding about the declaration —
extend it via the ADR process, don’t approximate silently.