Which Harness Ran This Card
Make every build-stage card name the harness and model behind it
0 milestones 5 sprints
1h 25m total 5m 43s per sprint
38.8M tokens in 183.6k tokens out
$36.80 nominal cost
Gantry already knew which harness and model each agent stage used, but the activity card did not carry that identity as data. The model was part of a subtitle string, and that string could disappear behind a generated blurb, leaving mixed-harness runs without a reliable per-card label.
This job made the identity structured. It added an agent descriptor to stage-start events, carried it through live attach and durable history, stored it on TUI cards, and then changed the card footer to read from that field instead of from subtitle text.
How this walkthrough is structured
Feature
What did the run build and ship?
A structured agent tag still moves through the event, attach, journal, and card-state paths, while later TUI work has changed how much of that tag the footer displays.
Build
How did Gantry structure the work?
The run split one display feature into a source-to-screen chain, so each fresh agent could prove one boundary before the next layer depended on it.
Agent Tag Foundation
0 agents 34m 39s wall time 91k tokens out $19.11 nominal cost
The domain still has `AgentTag`, and `RunEvent::StageStarted` still carries it as an optional field. The live build code still resolves the tag from the role-selected harness and model for agent stages, while mechanical stages carry no tag. The field has since been adjusted so the model can be absent when Gantry defers model choice to the harness, but the original distinction between present agent identity and no agent identity remains.
This sprint carried the broadest source change: define the descriptor and classify every stage-start site as agent-backed or mechanical. The brief made it compiler-guided work, because adding a required field to the event forced each constructor to be touched instead of relying on a remembered search list. Its boundary was green, with an additional passing gate after review, so the run did not need a repair pass even though the sweep was the riskiest place to miss a site.
Wire Protocol Support
0 agents 4m 21s wall time 8.7k tokens out $1.98 nominal cost
The attach codec still imports `AgentTag`, mirrors the stage-start field, and reconstructs it when an attached front-end reads the stream. Its tests cover a populated tag, an unpinned model, and the mechanical absence case. That means a second front-end or MCP attachment can still receive the structured identity, even though the current card footer no longer renders the model string.
Once the event carried the data in-process, this sprint had a narrow contract: make attach encode and decode the same field. That was a good memoryless cut because the agent could stay inside the wire mirror and its tests, without re-opening spawn classification or renderer layout. The sprint passed without recorded recovery, which fits a boundary that was deliberately a round-trip rather than a new policy decision.
History Persistence
0 agents 4m 56s wall time 8.7k tokens out $2.14 nominal cost
The history journal still serializes the `agent` object on stage-start records and decodes missing or null values as no tag. Tests still assert both preservation of a populated descriptor and backward-compatible parsing of records that predate the field. Replay and cold re-orientation therefore keep the same agent identity data that live events carry.
This piece matched the attach sprint but changed the persistence boundary instead of the live stream. The brief kept the task small and exact: write the tag into stage-start journal records, read it back, and keep older records readable when the field is missing. It completed without a fix or retry, so the durable compatibility requirement stayed contained in one codec.
Card State Integration
0 agents 5m 43s wall time 10.7k tokens out $2.41 nominal cost
TUI `Card` still has an optional `agent` field, and `on_stage_started` stores the event value directly. The standing test checks that the field is populated independently of whether the card has a generated blurb, and that mechanical cards leave it absent. That keeps display identity out of the description fallback path that used to hide the model.
With both transports settled, this sprint only had to store the field where rendering could reach it. The brief explicitly separated card state from blurb and detail behavior, which made the unit small enough for a fresh agent to verify with one event-flow test. The run record shows no stress here; the cut had already removed the hard source and persistence questions.
Model Footer Display
0 agents 18m 36s wall time 46.2k tokens out $6.46 nominal cost
The exact footer this sprint introduced is no longer isolated in today's tree. Later TUI work replaced the two-line footer with a single metadata line and artifact-tag handling, and the current renderer shows the display-cased harness from `card.agent` rather than the original harness-and-model span. The old `model=` subtitle is still only present in tests and compatibility surfaces, so the feature's structured source of truth survived even though the visible layout changed.
The final sprint was the visible payoff and another high-effort boundary: restructure the footer and remove the old subtitle duplication. It was sequenced last because it needed the card field to exist before layout rules could be tested honestly. Like the foundation sprint, it received an extra passing gate after review, but no red gate, repair, or re-plan was recorded.