Simulations · how it works
How a row gets made
One draw through the engine, on the real airline agent from the public dataset. A situation is drawn across the world and the human, it fills a cell in the coverage grid, it nudges the search arms, the agent plays it against a world that sometimes breaks, and the row that comes out splits into four objects that feed six kinds of training.
The draw
World · from the agent's tools
tool outcome
world state
history
Human · from a separate writer
stance
tone
typing
Every scenario is one value from each axis. The world axes come from the agent’s own tool schemas: what a call can return, what state an entity can be in, whether this person has been here before. The human axes come from a writer model that never sees the agent’s system prompt, so it cannot write the ask the policy is hoping for.
Ordinary asks come first, then the edges. The draw is biased toward the plain case early and drifts toward adversarial, hurried, and broken as the run goes on. Openers are embedded and jittered before selection, so a batch is not two hundred copies of the same prompt.
explore: N unique · sft: n phrasings · rl: k repeats
The coverage grid
Each draw lands in a cell. This view shows two of the axes, tool outcome by stance, twenty cells. The real grid crosses all of them. A cell with five copies is considered walked. The run is saturated only when every expected cell has five copies, no action shape is uncovered, and twelve batches in a row produced fewer than two percent new behavior signatures.
That is a plateau detector, not an estimate of what remains unseen. It answers “have we stopped finding new things” and cannot tell that apart from “we have found everything”.
&& uncovered shapes = 0
&& 12 flat batches (new signatures < 2%)
The search arms
bar = current weight · tick = starting weight · highlighted arm drew this scenario
Five ways to propose a scenario compete for the budget. Structured draws walk the grid. Open-ended draws let the writer wander. LLM-guided draws ask the writer to aim at gaps. Behavior-targeted and failure-mutation draws start from a rollout that went wrong and change one thing.
After each batch, an arm that yielded new behavior signatures gets its weight multiplied up and the rest renormalized. Floors keep the rare arms alive at one percent and caps hold them under eight, so a lucky streak cannot capture the run.
rare arms: 1% ≤ w ≤ 8% · variety floor 15%
The rollout
nearest real rollout · stale world, played as a timeout
conduct grade · training reward
1.0
tool fault observed; conduct ok
marker · eval only
1.0
grounded: every number in the reply appears in a tool result
The agent plays the scenario against a world built from its own tool schemas: objects, plausible results, and scheduled faults. A timeout, a denial, a stale or malformed result arrives on schedule, and the row records what the agent did next. These five rollouts are real rows from the airline agent in the public set.
Two scorers look at the same rollout and they are kept apart on purpose. The conduct grade is a rule cascade that can be a training reward. The marker is a string rule that only ever evaluates. When the agent invents a fare that no tool returned, the grade says conforms and the marker says otherwise. That gap is the product.
row = prompt · steps · final_text · reward · reason
The split
The row that came out of station 4 is one flat JSONL line. Underneath it is four objects, and every training method is a projection of some of them. That is why one dataset can feed an eval, an SFT set, preference pairs, a GRPO prompt set, and the hints for on-policy self-distillation without being regenerated.
Two invariants come free with the objects. A Task never contains a rollout, so the situations can ship without any model’s behavior leaking. A Rollout never contains a verdict, so the scorer that trains and the scorer that measures cannot be the same field by accident.
from_row(row) → the four, any legacy shape
What it is and is not
Nothing in the engine is mathematically novel, and it does not need to be. The draw is a factorial design over hand-chosen axes. The grid counts copies per cell. The arms are a multiplicative-weights heuristic with floors and caps. The stopping rule is a plateau detector. Each is sound as a heuristic; none carries a guarantee.
The part that earns its keep is the measurement around it: the two scorers kept apart, the marker that catches what the grade misses, and the four-object contract that makes that separation a property of the data rather than a habit. That contract is zeroproof.simulations.schema in the SDK.
Questions, or a higher limit: jacob@zeroproofai.com