v0.0.54 — waves replace one-shot planning
Builds on v0.0.53, which stopped maxPrs from truncating work. This release stops the plan from being the run.
Wave re-planning
A plan was the whole run: plan once, drive the groups to exhaustion, exit. Nothing ever asked whether the goal was met, so a plan that under-covered it shipped a fraction and exited 0 — with no path by which the remainder would ever be built.
A plan is now one wave. When every group in a wave lands, a goal assessor reads the repo as it now is and either ends the run or names what remains, which the Planner plans as the next wave — against real code instead of a guess.
Bounded by cost, not counts, consistent with how step limits and subagent fan-out already behave:
- only a clean sweep earns another wave — blocked / cancelled / awaiting-pr / session-cap return exactly as before
- the assessor fails safe to complete: a broken or stalled check ends the run rather than planning work off no evidence
- remaining work identical to a goal an earlier wave already planned is a livelock, not progress, and stops the run
maxCostUsd/maxTotalTokensstill trip inside the work loop, and now span waves correctly
Planning-phase fixes
- Small repos skip the scout survey. Measured: an 11-file docs-only repo drew 2 rounds / 6 scouts over ~11 minutes, and the Planner then read the same files itself. Under 25 tracked files the wave is skipped and the Planner gets the repo map alone. A git failure (zero tracked files) still surveys — that means size unknown, not small.
- An over-cap plan is retried, not fatal. The cap is now a schema refinement, so the Planner is asked to regroup through the existing corrective loop instead of the run dying on the first over-cap submission.
- Compressed planner prose, paid on every subagent spawn.
Fixes found while reviewing the wave loop
maxSessionshad become a per-wave bound — each wave built a fresh work loop seeded from the run-start snapshot, restarting the session counter. It now accumulates across waves.- The rolling PR context was likewise reset per wave, so a later wave's PR bodies were composed as though earlier PRs never happened.