skip to content
Replays

Readable Stop Cards

Readable Run Stops

Structured stop reasons, durable records, and generated cards for live and cold run views.

Gantry milestones

2 milestones 10 tasks 20 agents

3 plan 7 execute 11 review 2 fix

199k peak context

166k median execute

Structured stop reasons, durable records, and generated cards for live and cold run views.

3h 21m total 19m 16s per task

1h 19m execute 47m 41s review

119 edits 934 commands

codex harness

This run made Gantry's stop surfaces carry the explanation the engine already had, then gave those stops a durable record and a shared generated card. The first half is deterministic plumbing: preserve the innermost reason, position detail, report references, and declared prose without invoking a model. The second half journals that structured stop and lets every reader show the same concise card while keeping the mechanical text as the fallback and source of truth.

How this walkthrough is structured

Feature

What did the run build and ship?

Current Gantry still carries structured stop reasons, mechanical rendering, durable stopped events, stop-summary prompts, best-effort card generation, and shared live and cold rendering paths.

Build

How did Gantry structure the work?

The run split stop legibility from stop generation, letting the deterministic reason contract land before card storage, prompting, and reader surfaces depended on it.

Milestone 1

Stop Reason Plumbing

5 tasks 11 agents 2h 18m wall time 166k peak context

The stop reason type in the current domain still stores the lead message apart from ordered position detail, report paths, resumability, operator pause state, and optional generated fields. Mechanical bodies still render through shared domain code, and old history decoding still tolerates records that lack the newer structure. Later stop-card work built on this layer instead of replacing it.

This milestone carried the non-model foundation for legible stops. Its briefs separated the stop data contract, nested pattern propagation, declared note prose, reviewer artifact prose, and mechanical rendering, so each worker consumed a narrow contract from the prior row. The recorded milestone stayed green throughout, which fits a cut whose risk was mostly contract preservation rather than late presentation.

Structured Stop Contract

1 agents 41m 19s wall time 146k peak context

The live `StopReason` struct still exposes message, position frames, task identity, report reference, and resumable state as separate fields. Pattern and history code still moves those fields through stopped events rather than requiring readers to parse nested message strings. The current mechanical renderer leads with the stored explanation and renders position as detail.

This sprint established the shape every later stop feature had to consume. It was asked to keep the innermost explanation separate from frame detail, carry task identity where available, and stop exposing disposition-style debug wording as the reason. Its gate and review stayed green, so the following workers could treat the structured reason boundary as available.

Terminate Propagation

2 agents 11m 49s wall time 105k peak context

Generic pattern termination still builds a `StopReason` from the recorded termination message, report reference, and collected position frames. Parent frames add context without overwriting the child reason. The behavior is now part of the general pattern interpreter path, so its contribution is folded into the broader stop contract rather than isolated as a separate surface.

This sprint focused on the sub-pattern edge after ordinary structured stops had a contract. Its brief was to preserve a terminate step's message and report when control returned to the parent, while allowing the parent to add context below it. The recorded run stayed green, which suggests the boundary was small enough: it only changed how an existing stop crossed a nested pattern edge.

Blocked Note Copy

2 agents 20m 31s wall time 127k peak context

The pattern language and bundled gated-task behavior still support declared prose for stopped values, and the executor and fixer prompts still tell agents where to write the reason. Pattern docs still describe the declaration field and the compatibility boundary for frozen patterns. Some original pattern config touched by this run has since moved, but the declared-prose path remains in the interpreter and tests.

This sprint added the first declared prose source for blocked stops. The worker had to extend pattern declarations and prompts so a stopped declaration could name a note channel, then fall back to recovered comment prose when the channel was unusable. It passed without a recorded repair, so the note-channel layer fit the structured contract already in place.

Stopping Unit Artifacts

1 agents 29m 2s wall time 142k peak context

The current pattern interpreter still reads declared prose artifacts for the stopping position and rejects stale or unrelated material. Note-channel prose keeps precedence, while recovered comment prose remains a fallback. The behavior is covered in pattern interpreter tests, and later generated cards receive this prose through the stop bundle rather than through a separate filesystem hunt.

This sprint completed the deterministic prose lookup order. Its brief kept the search scoped to artifacts declared by the stopping unit, with stale, oversized, unreadable, missing, or cross-unit prose ignored safely. The run facts show a clean boundary, which matches a worker that consumed the note contract and added only the artifact layer.

Mechanical Stop Rendering

2 agents 23m 32s wall time 166k peak context

`StopReason::mechanical_body` and its report and trailer variants still render the explanation first and attach position, report, and footer detail below it. Headless output, TUI state, command status output, and engine support prompts still call that shared rendering rather than assembling separate messages. Generated cards now wrap this text, but they still keep it as mechanical detail.

This sprint waited until reason, position, report, and prose data were all present, then made current stop surfaces share the same deterministic body. Its brief kept generated cards and journaling out of scope, which let the worker focus on ordering, footnotes, clamping, and surface adoption. The recorded gate stayed green, so the rendering layer became the authoritative fallback for the next milestone.

Milestone 2

Durable Stop Cards

5 tasks 13 agents 1h 44m wall time 199k peak context

The current tree still stores stopped events with optional generated title and body fields, resolves the stop-summary prompt through the prompt catalog, generates cards at the stop boundary, and renders them through live and cold readers. The old mechanical behavior remains available when a card is absent or rejected. Later reader work has extended the area, but the durable card contract is still present.

This milestone added persistence and generated presentation on top of the deterministic stop contract. It split storage, prompt cataloging, generation, live surfaces, and cold readers, which kept the model-facing card work from owning the journal schema and every renderer at once. The live and cold surface rows both hit red gates and were repaired, locating the stress in broad reader integration rather than in the storage or prompt contracts.

Durable Records

2 agents 18m 56s wall time 190k peak context

History decoding and encoding still round-trip stopped events with structured position data, report paths, resumability, operator pause state, and generated-card fields. Projection, replay, tape, attach, headless, and TUI paths still tolerate both old mechanical stops and records with generated fields. The durable stop record is therefore a current cold-read contract, not just a live display detail.

This sprint created the storage boundary before any generated prose existed. It had to journal a stopped run with the structured mechanical reason, position, task context, report reference, and empty card fields while leaving legacy histories unchanged. Its gate and review stayed green, giving later card generation a place to attach accepted prose without another schema turn.

Prompt Catalog

0 agents 12m 39s wall time

The prompt catalog still includes `stop-summary.md` and `reader-preamble.md`, and the reference docs list both placeholders and contracts. The parser for stop summaries still accepts only the compact title-and-body shape and rejects malformed output so callers can fall back. Existing reader-facing prompt paths still receive the shared vocabulary primer without changing their own result shapes.

This sprint isolated the model-facing wording from the generator itself. Its brief added a stop summary prompt, a shared reader-facing preamble, parser expectations, and normal override behavior while preserving the output contracts of existing reader-facing one-shots. The row stayed green, so the later generator could consume a resolved prompt rather than embed prompt policy.

Card Generation

2 agents 15m 27s wall time 199k peak context

`src/engine/run/stop_card.rs` still decorates eligible stops by building a bounded bundle, resolving the reader preamble and stop-summary prompt, invoking a utility one-shot, and storing accepted title and body fields. Missing utility configuration, empty prompts, launch failures, malformed output, and operator pauses all leave the original mechanical stop unchanged. Surface code reads the fields from the stop rather than calling the model itself.

This sprint connected the durable record and prompt catalog at a single stop boundary. Its worker had to build a bounded bundle from structured stop data, call the utility path once for eligible stops, reject unusable responses, and exclude operator aborts. The recorded run stayed green, so generation landed before any surface was allowed to create cards on demand.

Live Surfaces

3 agents 19m 36s wall time 185k peak context 1 fix

Live stop surfaces still prefer the generated card when both fields are present and append the mechanical detail underneath. Headless output, status-style command output, TUI stop state, recorded-stop investigation actions, and merge-conflict prompts all use the same generated-or-mechanical decision. If a stop lacks a complete card, those paths fall back to the mechanical body instead of displaying a partial result.

This was the first stressed card-rendering cut. It had to wire the same generated title and body into event-stream, investigation, modal, headless, and conflict outputs while preserving exact mechanical fallback and avoiding surface-level generation. The gate went red after review and a fix pass repaired it, showing the hard boundary was consistency across live consumers rather than the generation contract.

Cold Readers

3 agents 29m 7s wall time 149k peak context 1 fix

Status output still renders a generated stop card from the durable record when one is present and otherwise prints the mechanical stop. The registry stores a cold stop alongside run metadata, and maintenance, repair, replay, and projection paths still decode generated and mechanical stop records. Histories without durable stop cards continue to load through the compatibility path.

This sprint closed the feature by making stopped records useful after the run process exits. Its brief covered status, replay, archive, registry, and maintenance readers without synthesizing cards for old histories. The gate failed and then passed after a fix, which places the integration difficulty in cold projection and command readers rather than in live stop construction.