eval-anova¶
Design-of-Experiments (DoE) evaluation with ANOVA. Reads a matrix: block in eval.yaml (factors such as model, thinking-effort, or prompt, plus a replications count), designs the full-factorial grid with a cost estimate (--dry-run), then fans /eval-run out once per matrix cell (condition x replication) -- each cell landing as a standard run with its own summary.yaml tagged by a condition.json. It is not its own executor: eval-run stays the single-condition primitive. analyze.py then computes each case composite via the harness's canonical reward composition and runs repeated-measures ANOVA (single-factor) or a mixed-effects model (multi-factor), restricted to cases present under every condition, plus a cost/quality Pareto frontier, into anova.json. /eval-compare renders the cross-condition comparison (surfacing the statistics section from anova.json) and report.py gives a statistics-forward deep view (condition means, F / p / effect size, per-case matrix). Because the stats read standard summary.yaml runs, --analyze-only can re-analyze runs produced elsewhere (e.g. a CI fan-out) without re-executing.
Plugin: agent-eval-harness | User-invocable
Contract¶
Run a full-factorial Design-of-Experiments comparison of agent configurations (models, thinking-effort, prompts, or other factors) across a fixed set of test cases by fanning /eval-run out over the matrix, then analyze the resulting standard runs with repeated-measures / mixed-effects ANOVA (F, p, effect size) and a cost/quality Pareto frontier, and render the comparison and statistics reports.
Identity
- Reads the eval.yaml matrix: block, expands the full-factorial grid (conditions x cases x replications), and with --dry-run prints the design and a cost estimate without executing.
- Drives /eval-run once per condition x replication so each cell lands as a standard run with its own summary.yaml, stamped with a condition.json recording its factor levels.
- Computes each case composite via the canonical harness reward composition (compose_reward) and writes anova.json containing the ANOVA result (method, F, p, effect size, significance), condition summaries, Pareto frontier, and per-case matrix.
- Selects repeated-measures ANOVA for single-factor designs and the mixed-effects model for multi-factor designs, restricting the analysis to cases present under every condition.
- Renders the /eval-compare comparison report and the statistics-forward report.py deep view from on-disk artifacts; --analyze-only re-analyzes existing runs (including externally produced ones) without re-executing.
Optimization Targets
task_success
deterministic
Invariants
- eval-run stays the single-condition primitive: eval-anova only loops it and must not re-implement workspace/execute/collect/score.
- Repeated-measures ANOVA assumes the same cases run under every condition; keep the design balanced by restricting to common cases and recording excluded cases rather than silently dropping them.
- Compute case composites via the canonical harness reward composition (compose_reward honouring eval.yaml reward:, else boolean-gate + normalised-numeric average); do not invent a scoring scheme.
- Do not auto-select plain one-way ANOVA when cases are reused across conditions.
- Report renderers (report.py, /eval-compare) read only on-disk summary.yaml / anova.json artifacts and never re-run the experiment.
- A failed matrix cell is logged and skipped so a partial matrix still yields an analysis over the cells that succeeded.
Traceability
Diagram¶
Arguments¶
/eval-anova --config <path> [--dry-run] [--analyze-only] [--cases <id> ...] [--output <dir>] [--no-report]
| Argument | Required | Default | Description |
|---|---|---|---|
--config |
- | Path to the eval.yaml containing the matrix: block. | |
--dry-run |
false |
Print the factorial design and a cost estimate without executing any runs. | |
--analyze-only |
false |
Skip execution; re-run ANOVA + Pareto over existing runs (including externally produced ones) and re-render the report. | |
--cases |
- | Restrict the experiment to specific case IDs (space-separated). Defaults to all cases in the dataset. | |
--output |
- | Override the runs/output directory for this experiment. | |
--no-report |
false |
Run and analyze but skip the /eval-compare report render. |
Usage¶
/eval-anova --config eval.yaml
/eval-anova --config eval.yaml --dry-run
/eval-anova --config eval.yaml --analyze-only