| 01 | Axes | Declare what varies: tool, policy rule, user stance, world state, tool condition, history. A situation is a point in that space, not a prompt. | generate/scenarios.py |
| 02 | Cover | Plan cells so every pair of axis values co-occurs at least once (a pairwise covering array). Most failures are two-factor interactions [6]. data.coverage["pairwise"] is pairs_planned, pairs_covered and fraction: pairwise cells of the six-axis grid, which is training-data coverage, not policy coverage. A low fraction on a short run is a small sample of a large grid, not a failed eval; for policy coverage use coverage_gap. | generate/coverage.py |
| 03 | Search | Five search arms fill the grid, starting at structured 42%, llm_guided 42%, open_ended 10%, behavior_targeted 3%, failure_mutation 3%. Each batch, weights move toward the arms that produced new behavior signatures and cells: w *= 1 + 0.5 * yield, renormalized, with floors (15% for each grid arm, 1% for the rare arms) and caps (8% for the rare arms, 10% for open-ended). Novelty search, not importance sampling [7]. Stops at saturation. | generate/scenarios.py, generate/generator.py |
| 04 | World | Tools answer from schema-shaped state. Deterministic per seed. Unknown id: not found. An argument that echoes the schema instead of the customer: refused with a hint. Every dial (fault modes, hit counts, id and date ranges, name pools, the result-kind routing table) is a WorldOptions field with its reason in defaults.py; advanced={"world": {...}} or MockEnvironment(options=) turns it. | world/sandbox.py, defaults.py |
| 05 | Rollout | Run the agent on N situations x n phrasings x k samples. With logprobs=True every row keeps the policy’s summed log-probability and token count, the per-token list when the backend returns one, the policy version and the sampling settings. | run/engine.py |
| 06 | Grade | Deterministic conduct rules first, then your judge. The judge is scored against gold labels before its grades are trusted. | score/grading.py, score/judge_trust.py |
| 07 | Cut | SFT rows (reward=1, loss mask on agent turns), DPO pairs with margin, GRPO groups in the 20 to 80 percent band [4, 5], or a reward-model set. | score/optimize.py, score/publish_gate.py, export.py |
| 08 | Delta | Re-run held-out tasks after training. A paired difference per task with a bootstrap interval and a sign-flip permutation p [1]. | score/delta.py, score/stats.py |