FR acceptance map
Where every functional requirement's promised behaviour lives — in the docs and in CI. (FR numbering follows the internal PRD; this page exists so no promise can quietly vanish.)
| FR | Promise | Docs | Proof in CI |
|---|---|---|---|
| FR-1 | CLI surface + exit codes 0/1/2/3, --json everywhere, crash → prefilled issue link |
Quickstart | tests/cli/ (incl. --help example audit) |
| FR-2 | Scenario DSL, error envelopes with YAML line:col, canonical world digest per seed | DSL | tests/scenario/, golden vectors |
| FR-3 | Determinism pillars: virtual clock, keyed PRNG, single writer | Reproducibility | golden digests, 3 OS × 2 Py |
| FR-4 | email/crm/calendar packs, pagination, referential integrity | Packs | tests/packs/ |
| FR-5 | MCP stdio+HTTP, run lifecycle (eval.finish, budgets), strict/observed ordering |
Integrations | tests/protocol/ |
| FR-6 | Five faults × after_calls/probability, reproducible per seed | DSL — faults | tests/runner/, m2 golden |
| FR-7 | 14-field append-only journal, wall time excluded from digests | Contracts | tests/journal/ |
| FR-8 | Run-set verdict, six-ring attribution, CEL + helpers, collateral allowlist | Contracts | tests/verdict/ |
| FR-9 | Content-addressed repro_id; verify four-way classification |
Reproducibility | tests/cli/test_verify.py |
| FR-10 | FC adapters (OpenAI/Anthropic), pytest fixture + JUnit, DeepEval extra | Integrations | tests/integrations/ |
| FR-11 | TTFD ≤ 60s cold (CI-timed), errors documented, help has examples | Quickstart, Errors | ttfd CI job, docs-sync tests |
| FR-12 | ~10 examples dual-indexed, anti-pattern guide, all runnable offline | examples/ | tests/examples/ |
| FR-13 | Hosted service (triggered milestone) = same code, same digests | Roadmap | n/a until triggered |
| FR-14 | BYO: declarative pack.yaml (zero code) + Python entry point | BYO | tests/packs/test_byo.py |
| FR-15 | --repeat/--parallel/--seed/--pass-threshold, cross-run first divergence |
Reproducibility | tests/verdict/test_repeat.py |
| FR-16 | Scripted multi-turn: when: triggers, world events, zero LLM |
DSL — turns | tests/runner/test_turns.py |