Run the whole dataset
Run every task; optional Always-k and pass@k.
Omit --task and ageval run schedules every member — each locks, runs, and evaluates independently:
ageval run examples/datasets/minimal-demo
ageval run examples/datasets/minimal-demo --max-concurrent-tasks 2Two axes (do not mix)
| Axis | Purpose | Not for |
|---|---|---|
Concurrency --max-concurrent-tasks | Finish sooner — more units in flight | Does not change k or PASS/FAIL |
Always-k --n-attempts / -k | Fixed k independent Attempts per task for pass@k / pass^k samples | Not conditional “retry on fail”; not a task.yaml / fingerprint field |
# Full suite, k=5 per task (CLI/job only)
ageval run examples/datasets/minimal-demo -k 5 --max-concurrent-tasks 2
# Always-k on one task
ageval run examples/datasets/minimal-demo --task terminal-jsonl-agg -k 5
# Continue an existing suite: recover unfinished slots in place, skip settled PASS / FAIL / ERROR
ageval run examples/datasets/minimal-demo --resume-suite <suite_run_id> --task terminal-jsonl-agg -k 5
# Replace one finished row (PASS / FAIL / ERROR): new Attempt, same suite id
ageval run examples/datasets/minimal-demo --resume-suite <suite_run_id> --task terminal-jsonl-agg --replace-slot
# Always-k: one (task_id, attempt_index)
# ageval run examples/datasets/minimal-demo --resume-suite <id> --task terminal-jsonl-agg --replace-slot --attempt-index 1
# Retry every finished ERROR in this filter (PASS / FAIL stay skipped)
ageval run examples/datasets/minimal-demo --resume-suite <suite_run_id> --retry-errors
# Regrade one finished Attempt from its harvested artifacts (new Attempt; the agent does not run)
ageval results regrade examples/datasets/minimal-demo --run <attempt_id>Hard rules:
n_attemptsis not allowed intask.yamland is not part ofconfig_fingerprint- Resume without
--replace-slotor--retry-errorsskips settled PASS / FAIL / ERROR. An unfinished slot whoseactivity.jsonlheader matches this suite, task, attempt index, and lock digest continues in place. A slot with no matching header, or a digest mismatch, starts a new Attempt. Missing Always-k indices are still appended --retry-errors(with--resume-suite) re-runs finished ERROR rows in this filter. PASS and FAIL stay skipped. Each retry is a new Attempt; the old row stays inprevious[]--replace-slotwrites a new Attempt; the old row stays on disk and inprevious[]; metrics use the new current onlyageval results regrademints a new Attempt, copies the source Attempt’stask-artifacts/onto the scoring host, and runs evaluate only. Gold andevaluator.pycome from the dataset. The sourceresult.jsonstays. A missing harvest is ERROR. Trajectory text is not a verdict. There is no task field that turns regrade on or offtask-artifacts/stays after the default slim. Cleaning up the live workspace does not remove that snapshot- Hub / Viewer history is
patch Nplus that Attempt’s start time (not the suite replace clock, not therun_id) - Rows that only have a suite-cancel placeholder (never actually ran) are retried on resume so pass@k is not permanently deflated
- Progress / cancel below; Hub Leaderboard shows pass@k / pass^k / n_attempts when
metrics.pass_at_kis present; localmetricsare always written after Always-k - Default system
suite_run_idis 8 hex (nosuite_prefix)
Aggregate metrics
Under .ageval/suite-runs/<suite_run_id>/summary.json → metrics:
| Field | Meaning |
|---|---|
pass_rate / mean_score | Mean over tasks in this job |
pass_at_k | pass@k (Harbor-style unbiased); suite score = mean over tasks |
pass_power_k | pass^k (all-k success estimate); also mean over tasks |
n_attempts | Job k budget |
Tasks with too few samples are omitted from that k’s denominator.
Same directory: progress.json. Attempt result.json may include phase_timing (environment / run / evaluate / record / cleanup).
Progress and cancel
ageval status <suite_run_id> --dataset examples/datasets/minimal-demo
ageval cancel <suite_run_id> --dataset examples/datasets/minimal-demo- status — ControlStore record + suite progress when present
- cancel — writes
cancel.requested(no new units); SIGTERM stored pid if any
Running the whole dataset is the task axis; campaign sweeps parameters on one task. Always-k is not the campaign matrix axis.
Results land under .ageval/suite-runs/. Open the dataset in the local viewer to see Timing bars. With Kind set to suite, those jobs can also switch to a waffle: one square is one trial.

Upload to Hub (Leaderboard / Jobs)
Hub Dataset → Leaderboard and Task → Jobs list whole-dataset results in Registry, not a feed of single-task uploads.
| Step | Command |
|---|---|
| 1. Run suite | ageval run <dataset> (omit --task; optional --profiles) |
| 2. Note id | suite_run_id in stdout / summary.json (default 8 hex) |
| 3. Upload suite | ageval results upload-suite <dataset> --suite-run <id> --public (or id@version) |
| 4. Deep-link trajectory | Add --with-attempts |
ageval run examples/datasets/minimal-demo --profiles examples/datasets/minimal-demo/profiles.yaml
# suite_run_id e.g. d3e5fba6
ageval results upload-suite examples/datasets/minimal-demo \
--suite-run d3e5fba6 --public --with-attempts \
--agent acp-pi --model zai-coding-cn/glm-5.2Common mistake: only ageval run … --task X then ageval results upload --run … — the attempt may exist in Registry, but Leaderboard usually still has no row. Leaderboard needs a suite job + upload-suite.
The public board has two more gates: the suite must be complete (every task on the bound version has a result; FAIL / ERROR still count) and bound to a release. Incomplete or draft-bound rows stay on Task Jobs. Upload a working tree with ageval publish --draft, then an owner runs ageval release — or ageval publish a release directly.