Card Headline Truth
Truthful Event Cards
Card headlines, qualifiers, plan-change labels, and review summaries now come from declared runtime facts.
3 milestones 0 tasks
7 plan 11 execute 15 review
1h 36m total
87.1M tokens in 339.6k tokens out
$66.07 nominal cost
This run changed the event-card surface from stage-derived fallbacks toward authored and runtime-derived facts. The cut started with step titles, then removed false position and plan-change wording, then added generated review summaries and audited a fresh build against the card-truth runbook.
The current tree still carries the result in the pattern language, bundled pattern files, runtime card selection, pattern reference, website copies, and the recorded card-truth audit. The run itself came under stress at the position and merge boundary: the second milestone was aborted once and retried, and final integration needed resolution before a clean merge landed.
How this walkthrough is structured
Feature
What did the run build and ship?
Gantry now renders step-backed cards from declared titles, derives task-position qualifiers from runtime paths, treats plan-change review as review, summarizes review cards through the existing summarizer, and records an audit of that surface.
Build
How did Gantry structure the work?
The build split card truth into source selection, runtime qualifier truth, and review summary verification, with the hardest stress falling after the position and merge semantics entered shared runtime code.
Milestone 1
Step-Authored Headlines
The tree now documents `title` as literal display text on pattern steps, and the runtime chooses that value before falling back to older headline sources. Bundled executable steps declare titles in the shipped pattern files, so normal build cards no longer need a stage constant to name ordinary step-backed work. The pattern reference and website copy carry the same key.
This milestone gave the first worker group one source-of-truth problem: make a pattern step able to name the card it opens. The acceptance criteria kept position, plan-change, and review-summary work out of scope, so each sprint could move one layer of the title path. The milestone stayed green through implementation, gate, and review, which fits a cut that separated data loading, runtime selection, bundled data, and published reference updates.
Accept Step Titles
Pattern data can now carry a `title` field through the loader and into the reference dataset. The specification names that key for the relevant step tables, and tests cover the accepted and rejected shapes. Later rendering work can read a declared title instead of inferring one.
This sprint was the loader slice. It had to extend the pattern format and reference dataset without changing live card rendering yet, which made the boundary narrow enough for a fresh worker. Its proof was structural: accepted step kinds preserve a non-empty literal title, and invalid title data fails before execution.
Use Step Titles In Card Headlines
`step_headline` now prefers a declared title when an agent, gate, or command step starts a card. Execute steps without a declared title still use the task title, and older generated-headline input remains supported outside the production path. The behavior is covered where the card headline is resolved.
This sprint connected the new pattern field to card creation. The scope was deliberately runtime-local: choose among declared title, task title, declared prompt or command, generated headline input, and the stage fallback. That kept it independent from the broader pattern-file sweep that followed.
Title Bundled Executable Steps
The bundled `build`, `map`, `milestone`, `sprint`, and `until` patterns now declare titles on their executable steps. Review and gate cards therefore show authored work names such as task build, task gate, and plan-file review. The check asserts title presence rather than freezing the wording.
This sprint was the data propagation pass for the title contract. It did not need to change engine behavior, because the previous sprint had already made titles effective. Its risk was omission, so the useful boundary was a check that fails when a bundled executable step leaves the title empty.
Sync Pattern Reference For Titles
The repository reference card and the website copy both state that every step may declare `title`. That gives readers the compact key-level rule alongside the fuller pattern specification. The current file is still present in both locations named by the git facts.
This was the publication closeout for the first milestone. The work was thin by design: carry the title-key contract into the reference-card documents after implementation and pattern data had passed. Its boundary was docs synchronization, so no runtime stress belongs to this sprint.
Milestone 2
Position and Stage Truth
Gate cards now combine their selected headline with a runtime task position rather than a hardcoded unit prefix. Plan-change reviewers run as review-stage steps, while `Stage::Replan` remains available for gap planning and old records. The pattern docs describe handler review, explicit no-op acceptance, and unwatched omission for plan-file edits.
This milestone moved from source selection to runtime truth. It had to remove inferred qualifiers, correct plan-change review staging, and document plan-change policy without renaming recorded stage vocabulary. The ledger records an aborted first milestone attempt and a green retry, and the later integration failures point to this shared runtime area as the difficult boundary.
Position Qualified Gate Cards
`runtime_position_qualifier` now derives parenthetical positions from runtime task paths. Gate cards at nested depth use that composed path, while `until.toml` keeps its own iteration rendering. Tests assert behavior rather than pinning the exact authored prose.
This sprint isolated the qualifier problem from the rest of the card text. The worker only had to make gate cards use composed task paths and remove stale hardcoded prefixes, while preserving explicit pre-merge and post-merge facts from their callers. It passed at the sprint level, but the milestone later needed a retry, so this slice fed a harder shared-runtime integration.
Make Plan Change Reviews Review Stage
Bundled plan-change handlers now declare review stage and display the review title when they inspect plan-file diffs. Generic start and finish text no longer claims re-planning unless `Stage::Replan` is actually selected. New stats still keep `Replans` for gap planning rather than plan-change review.
This sprint corrected a false stage label without deleting the historical stage value. The worker had to separate bundled plan-change review steps from real replan work, then keep role, harness, and effort selection aligned with review. That made the slice semantic rather than mechanical, but narrow enough to prove through pattern execution paths.
Document Plan Change Policies
The pattern reference now names the three plan-change policies: handler review, `nothing`, and omitted unwatched behavior. Bundled planner steps that write plan files declare `on_plan_change = "nothing"`, while executor, reviewer, and recovery steps keep a handler when their plan-file edits must be reviewed. Snapshot documents reflect that vocabulary.
This sprint closed the milestone by making the policy vocabulary visible in the generated pattern material. The implementation work it depended on had already landed, so the boundary was synchronization across reference snapshots. It remained green because it did not reopen runtime behavior.
Milestone 3
Review Summaries And Audit
Review steps can now opt into generated card summaries through `summarize`, and bundled review steps declare it. Gate steps can use the existing gate summarizer when enabled, while missing or empty summarizer output remains non-fatal. The analysis document records the audit, the fixes, and the re-audit result that no in-scope card-truth finding remained.
This milestone added the last card-truth source and then checked the whole surface against the runbook. It was sequenced after titles and stage truth so the audit would test the corrected card model rather than known-false output. The final sprint also found engine-emitted card problems outside ordinary step-backed cards and carried the fixes into the same milestone.
Accept Step Summarize
The pattern language accepts `summarize` on the supported step kinds, and the tests cover resolved values. That field is now available to agent and gate execution requests. The reference work later made the same key visible to operators.
This sprint was the format admission step for card summaries. It did not need to run summarizers; it only had to make `summarize` legal where the later runtime could consume it. The isolated parser and test boundary let the worker prove the key without taking on finish-card behavior.
Generate Live Card Summaries
`card_finish_summary` now selects a generated review or gate summary only when the step asks for one and the summarizer returns usable text. Review-stage agent steps use `summarize-review.md`, and gate steps use `summarize-gate.md`. Old history, replay, and repair reconstruction continue to use the existing summary field.
This sprint attached the accepted key to the existing summarizer path. The hard requirement was failure tolerance: a missing, failed, or empty generated summary must leave the ordinary finish summary in place. That gave the worker a precise runtime contract and avoided a new history schema.
Sync Pattern Reference For Summarize
The pattern specification and reference card now describe `summarize` for agent and gate steps. The website document copies carry the same wording. Operators can see that empty summarizer output is non-fatal and that only review-stage agent steps have a matching review summarizer.
This was the documentation and publication pass for the summary key. The runtime contract already existed, so the worker only needed to make the repository and website documents agree. The run facts show no local stress for this docs-sized slice.
Audit A Fresh Build For Card Truth
`docs/analysis/card-truth-audit` records the audit against the card-truth runbook and the correction pass that followed it. Engine-emitted gate cards now name before-merge, after-reconciliation, and red-gate recheck occasions through `WorktreeGateOccasion`. The merge close path was corrected so a merge card is not closed as a resolve card when no resolver ran.
This sprint turned the plan's verification requirement into a fresh run audit. Unlike the earlier sprints, it had to inspect the rendered record rather than add one isolated key. The audit found card-truth problems in engine-emitted cards, and the sprint closed only after fixes and re-audits showed the in-scope findings gone.