Sentence Case for Engine Status Text
Make card detail and finish messages read as prose, without disturbing the tokens inside them
Gantry's build engine narrates itself through a stream of activity cards: a line of detail text for each thing it does, and a closing message when a run finishes or fails. That text had grown inconsistent — some detail strings opened with a capital letter, some did not — because each string was written by hand at the point it was emitted, with no shared convention. This job settled the convention: every human-facing detail and finish message that begins with an ordinary word now starts in sentence case, capitalized at the source where the string is written rather than corrected as it is displayed.
The hard part is what must be left alone. Many of these strings carry machine-facing fragments — file paths, commit identifiers, branch names, gate verdicts like RED and GREEN — and those had to survive the change byte-for-byte, along with any message that opens with such a token instead of a prose word.
Build
The casing cleanup was cut as a single sprint driven by a grep-based inventory of every emitted detail and finish string, with acceptance criteria written almost entirely as things the change must not touch.
A uniform sweep over one category of string is not work you break into pieces: there is no sequencing to get right and no interface between parts. The plan treated it that way — one milestone, one sprint — and made the discovery method explicit. Grep the source for the emitted strings, and let that list be the authoritative scope, so no card is silently missed.
Where a casing sweep goes wrong is not in the capitalizing but in the exceptions, and the sprint brief is mostly exceptions. Capitalize only the opening prose word. Preserve embedded paths, filenames, SHAs, branch literals, and verdict tokens exactly. Leave any string that starts with a machine token alone. Add no capitalization at display time as a fallback, and do not touch serialized values, journal output, or parser inputs that happen to share the wording. The real content of the cut is this boundary between the human-facing prose and everything machine-facing that sits beside it in the same string.
The sprint held that line: it passed its gate and its review without a repair, which for constraint-heavy work is the signal that the constraints were respected rather than approximated. The one place the run met friction was later, at the merge into master — the integrate-and-land step errored and needed a further pass before the work landed clean. The difficulty here lived at integration, not in the decomposition of the casing work itself.
Feature
Engine detail and finish text now reads in sentence case at the point each string is authored, with embedded machine tokens preserved, and that convention still holds across the build engine in the tree today.
Before this job, the engine's status text carried no single rule for its opening letter; capitalization depended on whichever hand wrote each string. The fix put the rule where the string is created: each emitter capitalizes its own first prose word, so the displayed text is correct by construction and nothing downstream has to reason about casing. There is deliberately no render-time correction — the display shows what the source produced.
The change reached across the build engine's driver and finish modules and their tests. Standing in the tree today, the convention is intact: the finish emitters still open with capitalized prose — a completed run, a removed worktree, a gate that came back red — while the tokens beside them, the verdict words and branch names, stay as written. Strings that begin with a machine fragment are still left uncapitalized, as intended.
The code around these strings has moved on since. Much of the engine's driver code has been rewritten in the work that followed, and one of the per-driver source files the job edited no longer exists — its role was folded into the surrounding driver structure. Even so, the casing convention survived those rewrites rather than being reverted, which is the stronger evidence that it was adopted as a rule and not merely applied once.