Agent Investigation Workflow
Interactive Snag Investigation
Blocking prompts became a guided choice between external agents, the internal assistant, shell access, and stop.
0 milestones 5 tasks 12 agents
2 plan 5 execute 5 review
244k peak context
230k median execute
2h 56m total 34m 11s per task
2m 34s plan 1h 50m execute 48m 55s review
126 edits 532 commands
codex harness
This run rebuilt Gantry's stopped-run recovery path around explicit investigation choices. The work starts with the prompt contract, adds an operator surface, teaches the harness layer how to expose installed coding agents, wires those actions through the TUI, and then removes the stale free-text recovery language from active code and docs.
How this walkthrough is structured
Feature
What did the run build and ship?
The current tree still carries fixed blocker choices, attach and history compatibility, installed-harness launch helpers, TUI pending actions, and documentation that frames blockers as assisted investigation work.
Build
How did Gantry structure the work?
The cut held the workflow as a clean sequence of contracts, surface, launcher services, action dispatch, and cleanup, with every sprint staying green and no repair pass reshaping the plan.
Milestone 1
Investigate Snags With an Interactive Coding Agent
The complete feature has evolved since this milestone landed. The current tree still treats blocker handling as an investigation path with explicit choices and assistant context, while later work moved the primary halted-run surface toward the in-run assistant pane and inline actions. That leaves this milestone visible as the contract and launcher foundation rather than as an unchanged modal-only experience.
The milestone gathered the full stopped-run experience under a single boundary. Its brief was broad, but each child sprint was scoped around an interface that the next piece could consume without holding the whole TUI in context. The run facts show no retries or review-driven replans, so the original decomposition was enough for the agents to compose the workflow without a mid-run recut.
Prompt Contract
The domain model now has a blocker prompt kind, parsed blocker choices, stable choice tokens, non-resolving launcher detection, and a safe stop default. Attach decoding still accepts legacy blocker prompt names while producing the current fixed-choice shape. Headless handling answers a blocker deterministically instead of waiting for editable recovery text.
This sprint carried the shared vocabulary before any front end tried to render it. The brief asked for fixed blocker choices, deterministic headless behavior, and wire-compatible history so later agents could rely on tokens instead of recovery prose. Its boundary stayed quiet: the extra gate pass recorded for this sprint was green, and review did not send the contract back for repair.
Investigation Modal
The exact blocker presentation has since been refit around transcript and inline assistant behavior, so this sprint's visible result is not preserved as a simple standalone modal story. The current state layer still builds button rows from the blocker contract, assigns shortcuts and default focus, and keeps launcher choices pending rather than answering the prompt. The render layer still maps blocker choices to operator labels used by inline actions.
This sprint isolated the operator surface from the later launch mechanics. The agent only had to render the prompt choices, manage focus, support shortcuts, and emit the chosen action, which kept the UI work testable without knowing how a harness would start. It passed through execute, gate, and review without recorded stress, so the modal boundary held as a self-contained presentation task.
Launch Contract
The harness module still exposes installed investigation options in default-first registry order and builds an interactive launch for a selected harness. A shared seed helper writes the stopped-run context in harness-neutral language. Those helpers sit beside the broader harness registry, so the TUI asks for a launch contract instead of hard-coding individual CLIs.
This sprint stayed below the UI and defined the harness-side service the buttons would consume. Its brief limited the work to option discovery, stable ordering, deterministic labels, interactive command construction, and a shared snag seed. With no recovery or replan in the facts, the service boundary gave the agent enough room to cover each supported harness without touching TUI dispatch.
TUI Action Wiring
The TUI still represents external harness launches and shell entry as pending local actions rather than prompt answers. Choosing an external harness prepares a suspended command from the harness launch contract and keeps the blocker unresolved; choosing the internal assistant seeds the chat context; choosing stop answers through the fixed choice path. Later assistant-pane work changed where the operator sees the blocker, but the non-resolving action model remains.
This sprint consumed both earlier contracts and joined them to real TUI behavior. The brief made the hard part explicit: launcher choices must suspend the interface, run in the stopped worktree, return to the same pending prompt, and share dispatch between menu and keyboard paths. The recorded run stayed green, which says the prior contracts had left a narrow enough action surface for this integration sprint.
Docs Cleanup
Active docs now describe blockers as assistant-backed investigation work rather than free-text recovery directives. Source comments and compatibility shims still mention legacy names only where old frames or historical behavior must decode. The feature has continued to move, but the cleanup sprint's main result stands: current code and docs no longer present editable recovery directives as the supported operator workflow.
The final sprint was an integration cleanup pass, not another feature layer. Its brief asked the agent to remove retired recovery-directive language from active surfaces, reconcile tests with the completed workflow, and update current documentation. Because earlier sprints had already carried the behavior, this piece could be checked by grep, focused tests, and docs inspection, and it finished without recorded repair.