skip to content
Replays

Fresh Assessment Resume

Fresh Resume Verdicts

A stopped run is reassessed from present durable state before Gantry tries recovery again.

Gantry milestones

1 milestones 4 tasks 9 agents

2 plan 4 execute 5 review

154k peak context

141k median execute

A stopped run is reassessed from present durable state before Gantry tries recovery again.

51m 30s total 7m 23s per task

21m 8s execute 17m 23s review

36 edits 348 commands

codex harness

This run fixes a resume failure where an old stop could keep speaking as the current state after the run had already moved on. The work tied together the reader model, durable stop journaling, automatic recovery on resumed launchers, and stash ownership, because all of those paths feed the same operator question: what is the run blocked on now?

The decomposition is useful because each slice made one source of truth sharper before the next slice leaned on it. First the projection model learned to separate current and historical stops. Then stop surfacing became durable early enough to survive owner death. Only after that did headless and detached resumes attempt bounded recovery from the current stop, and the final slice removed a stash false positive that could prevent a fresh assessment from reaching the real problem.

How this walkthrough is structured

Feature

What did the run build and ship?

Gantry now projects old stops as history, records newly surfaced stops before an owner can disappear, retries recoverable resume stops through the normal verifier, and scopes stash refusal to the current worktree.

Build

How did Gantry structure the work?

The cut made resume state a sequence of durable facts, then put recovery and stash rollback behind that same assessment contract without needing a re-plan or repair pass.

Milestone 1

Fresh Assessment Resume

4 tasks 11 agents 45m 37s wall time 154k peak context

The live tree still shows this milestone as an integrated resume-state change rather than a set of isolated patches. The projection module owns current versus historical stop state, headless and TUI readers consume that model, support handling journals surfaced stops before prompt resolution, resume recovery has bounded automatic retry behavior, and worktree rollback checks stash ownership from branch and commit evidence. The touched files all remain present, with later work mostly extending the same run and worktree modules.

The milestone carried the whole resume contract as one coherent slab because the visible verdict, journal timing, launcher recovery, and stash guard were different ways for resume to answer the wrong question. Its internal split kept each fresh agent on a single boundary: readers first, durable evidence next, launcher behavior after that, and repository evidence last. The run facts show every child sprint reached review and its follow-up gate without repair or re-planning, so the decomposition held even though the problem crossed display, engine, and git code.

Current Stop Contract

2 agents 12m 52s wall time 154k peak context

`RunView` now carries separate current and historical stop fields, and the projection fold moves an older stop aside when later run progress supersedes it. Headless rendering keeps a stop pending until the stream proves whether it is terminal or historical, then prints a fresh-assessment line instead of ending on the old record. TUI state also reads the shared projection, so status-like surfaces draw from the same stop model rather than each inventing its own interpretation.

This sprint established the reader contract the later recovery work would depend on. Its brief was narrow enough for one agent because it did not need to invent a new resume path; it only had to make cold and live run-state consumers stop treating any durable stop as current after later durable progress. The boundary stayed green, which fits a foundational projection change where tests could model a stop followed by progress and assert the resulting control flow.

Surface Durable Stop

2 agents 7m 23s wall time 95k peak context

Support handling now records the surfaced stop before the investigation or operator choice resolves. If the owner disappears at that point, a cold projection can still see the newly surfaced stop as current; if the run later proceeds, the same projection marks it historical. The regression coverage in the run tests keeps the owner-dies-before-selection and selected-stop paths distinct, so the current tree preserves both the audit trail and the later supersession behavior.

With the projection rule in place, this sprint supplied the evidence the rule needs when a new stop is reached. Its scope was the support boundary around stop surfacing and prompt selection, a small but timing-sensitive cut because owner death can happen between showing the stop and receiving an answer. The gate stayed green after review, so the change fit as a journaling contract rather than a broader rewrite of prompt handling.

Agent-First Resume

2 agents 10m 10s wall time 141k peak context

Recoverable stops now enter the `on_stop` path before they become a terminal recorded stop. The current tests show the self-healing path re-enters execution, the failing path records the new stop as current, repeated recurrence prevents an endless loop, abort wins before recovery starts, and a recorded stop still exposes interactive investigation choices after admission. That behavior is implemented in the engine stop path and reflected in headless output rather than being a separate recovery mechanism.

This was the sprint where the state model had to do work rather than only report it. The brief asked every launcher, including non-interactive resumes, to make a bounded recovery attempt for recoverable stops and then trust only Gantry's own verification result. The run still did not need a repair loop, but the build record shows an extra review attempt inside this slice, locating the most scrutiny at the automatic-recovery boundary.

Stash Ownership Rule

2 agents 6m 18s wall time 81k peak context

Worktree rollback no longer refuses merely because the shared stash ref contains an unparseable subject from another checkout. The guard first reads parseable branch ownership, then falls back to the stash base commit for unparseable subjects and refuses only when that evidence ties the stash to the current worktree's history. The tests keep unrelated stash entries intact, keep same-worktree stashes protective, and retain the fail-closed diagnostic when the current checkout cannot be classified.

The final sprint was deliberately outside the stop journal, but it protected resume from a repository-wide false positive that could prevent rollback before the fresh assessment mattered. Its brief was small enough for one agent because the target was a single guard in worktree reset behavior: classify shared stash entries by ownership and preserve the fail-closed cases. It passed through the same clean boundary as the earlier slices, with no recorded repair or re-plan.