Third live-run lesson: the headless session opened a clean, well-documented PR — then crossed its budget on the final wrap-up turn and reported exit 2, failing a run whose deliverable exists and is reviewable.
Headless exit codes now mean what CI needs them to mean: stopped before the work was done. If the pull request is already open when a budget or step cap trips, the run reports completed_over_budget / completed_at_step_ceiling with exit 0 — the outcome label stays honest about the cap. A cap that fires before delivery still fails the run with exit 2/4.