skip to content
Jobs

Which Harness Ran This Card

Make every build-stage card name the harness and model behind it

Gantry milestones
Showing harness and model on every build stage.

Gantry draws a card for every stage of a build as it runs — execute, fix, review, the gate, the map workers. A stage is carried by a coding agent, and that agent runs under some harness (Claude, Codex, and others) on some model. But which one was hard to tell from the card. The model was tucked into a subtitle string, and it disappeared the moment a card grew a generated one-line blurb — so on a mixed run, where different roles can use different harnesses, you could not reliably read off what was actually running each piece of work.

This job made the harness and model first-class. It attaches a small structured descriptor — the harness id and the model — at every point where Gantry spawns an agent, carries it across the live connection a second screen attaches over and into the durable log the run replays from, and puts it on the card in a restructured footer where identity leads and the mechanical counters drop to a quieter second line. Nothing is smuggled into a subtitle anymore; the card names the harness and model outright.

Build

One optional descriptor threaded layer by layer in dependency order — event, wire, journal, card, footer — with the compiler enforcing that every spawn site got classified.

The feature is one piece of data that has to appear in one place, but it only appears there after passing through five layers, and the cut follows that dependency exactly: define the descriptor and populate it at the source; round-trip it through the attach wire codec; round-trip it through the history journal; store it on the card; render it. Each downstream sprint's definition of done is a round-trip test that presupposes the field already exists upstream — the footer can only draw what the card holds, the card can only hold what the event carries — so the order is not a convenience, it is the only order in which each piece can be proven before the next leans on it.

The foundation sprint carries the correctness of the whole feature. Its job was to add the descriptor to the stage-started event and then touch every single construction of that event, deciding at each whether an agent stands behind the stage (attach the harness and model) or it is mechanical (attach nothing). The safety net was the compiler: a missed spawn site is a build error, not a silently blank card. Getting the harness id from the role resolution — rather than a run-wide default — is what makes a mixed-harness run show the correct distinct harness on each card, and that decision lives entirely in this sprint.

Where the work asked for a second look shows in the timeline. The run never went red — no repair, no re-plan, no sprint retried. But the two sprints the plan marked high-effort, the source sweep and the footer restructure, each had the gate run a second time after review, while the three middle sprints — the wire and journal round-trips and the card-state store — passed review and moved on. The difficulty concentrated at the two ends, populating the source correctly and drawing the result, and dissolved into mechanical round-tripping in between. That is what a clean run of a well-ordered cut looks like: the hard parts were isolated into their own sprints, and the plumbing between them was routine.

Feature

A structured harness-and-model tag now rides from every agent spawn through the wire and the journal onto the card, replacing a model string that hid behind subtitles and blurbs.

Before this job, a card could not be trusted to tell you what ran it. The model lived inside a subtitle string that a generated blurb would hide, and the harness was not shown as its own thing at all — so on a run mixing harnesses across roles, the one fact you most wanted from a card was the one it would not reliably give.

What stands in the tree today is the `AgentTag` descriptor in the domain layer: a harness id and a model, attached to the stage-started event, present for agent stages and absent for mechanical ones. It is referenced right where the plan put it — the attach codec and the history journal both carry it, the build drivers populate it at spawn, and the card state and TUI renderer read it. The descriptor round-trips across the live connection and the durable journal, and the journal parse tolerates older logs that predate the field by treating it as absent.

Going and looking, the design has held while its surroundings moved on. The model is now optional rather than a plain string, so a run that lets the harness pick its own model is represented honestly instead of with a guess. The footer renderer that was the visible payoff has since been largely rewritten by later work on the card and chat layout — most of that original rendering code has been replaced — but it still draws the harness and model from the same descriptor rather than reviving the old subtitle trick, and one sprint-driver file the sweep touched has been removed as the drivers were consolidated. The data and its round-trips are intact; what changed is the surface that consumes them.

unavailable sessions
unavailable context
80,951 in / 183,636 out tokens
$36.80 cost
0 x 5 milestones x sprints
unavailable edits
unavailable commands
1h 20m duration
unavailable roles
0 x 0 fixes x replans
- harness