fix(chat): align transcript glyphs and message footer controls
The sent-message footer used a 12px retry chevron beside 16px Copy and Retry glyphs. MessageFooterRow now gives sent, received and answer actions one centered 24px control row with equal slots and 16px glyphs, including version arrows and the retry chevron. It is exported for queued-message controls to share. Transcript and Session Info status/disclosure slots use shared glyph tokens; Environment and section labels retain one text column. Narrow authentication actions keep normal text wrapping.
Leo: "this is still not aligned? :(" and "i feel like this is misaligned checkmark :( can we all audit the checkmarks and whatnot".
Reference: Leo's private sent-footer and completed-tool screenshots; matched aspects are glyph centering and a consistent icon column. Colours and glass are retained. Private reference pixels are not published.
Validation: 40846385275 passed the full web check and 38 focused tests / 331 assertions at cd72b5efae8566251bfc3c0aff112100e0f78a06, including sent actions, disclosure-grid assertions, and real server/task column geometry in both themes. This repairs the two own failures identified in the previous automatic CI run: stale static disclosure expectations and a server dot still centered in the former 14px column.
Independent Astra high/fast whole-diff source review: SHIP at cd72b5efae8566251bfc3c0aff112100e0f78a06 across all 16 changed files. Review did not execute tests locally; fleet receipts below provide runtime evidence.
Capture validation: fleet 40835571777 passed the full web check (format, lint, typecheck and ratchets) and 12 focused tests / 223 assertions. Its snapshot tree 12e905924a3bd9e353a9cb2711f00d8cec962b28 contains the captured footer and transcript production code. Final cd72b5ef preserves those captured components; its additional production change derives the Session Info server dot spacing from the shared 16px column, verified by the two-theme browser regression above. Dark/light × 28/40px real-component cases measure every audited glyph within 0.5px of the text line center; maximum observed error is 0px. Both normal and versioned footers use 16px glyphs. Additional cases keep both authentication recovery actions within a 320px pane, and verify historical received rows hide Retry while the retryable row shows it. Session Info and Environment text columns differ by 0px.
The identical fixture on actual production base 698b3ef64cf05a7cd842132901c88b52e7bfdb89 fails all four glyph cases on the 12px retry/version chevrons: 40835578938. Both base and repair already center SVG boxes vertically; the regression enforces consistent footer glyph size alongside the center-line invariant.
The audit covers tool and shell completion marks, Worked for, thoughts, plan checks, sent/read marks, Session Info and sent-message footers. It adds no timers, observers, animation loops or per-token work.
Prior named base failures were independently reproduced against that run's CI base a56da52e3152: 40840073249 reproduces the quiet-row 4px spacing failure and both Settings summary-length failures; 40840632945 reproduces the SwiftUI import guard, phone-field freshness guard and install-hook lock-holder test; 40838951076 reproduces the release digest failure. The computer-search gallery timeout passes an unchanged-budget replay on both CI merge 40839312968 and CI base 40838951076.
On the subsequent CI base 4cbe9520ab7167f051e2bcf1abf909aced17eceb, 40844898042 independently reproduces the same SwiftUI import guard, stale phone-field export and release digest errors. The previous run's eight web failure files match base by assertion payload: Settings summary lengths, quiet-row spacing, Chief Bubble Style placement, pending-steer markup, clickable cursors, motion-scale literals, running-strip hover markup and WebKit table selection. 40847971029 is the bounded same-error base replay for the five payloads omitted from the original log. All three prior head timeouts complete at final cd72b5ef under their original 120-second per-file limits in 40848333771: short-pane composer 8/8, Session Info push motion 6/6, transcript gap selection 50/50. The two own glyph/disclosure failures pass in the final focused run above.
Final automatic CI 40846391764 ran merge 2c26c3a95fc767adcacb5eb9d512d2ad840cde6b over base 3d89c41ab4578e9a10ee4533a6dcd2509861355f. All four head shard wrappers and three base comparators pass. The remaining comparator lists four browser file timeouts at 120 seconds, with no assertion failure: dock gutters, environment scroll stability, left rail persistence and gap selection. Gap selection passes 50/50 at the exact frozen head in the replay above. The other three pass in 40852360452, using the identical source tree and original 120-second file limits: dock gutters 4/4 (44.86s), environment scroll stability 12/12 (32.98s), and left rail persistence 16/16 (44.13s), with 172 assertions total. No source or timeout limit changed for this recovery. The only native source-guard failure names the same two Home Chat Colors SwiftUI imports reproduced in run40844898042; both source blobs, the guard and its allowlist are identical on that proof base and current CI base. Phone-field freshness now passes.
Before/after captures below are actual production base and final tested tree from those two runs, with the same synthetic content and 760×740 viewport at 2× scale. The live relative timestamp can differ by one minute. All eight images were manually inspected and checked for private content.
| Row size / theme | Before | After |
|---|---|---|
| 28px dark | ![]() | ![]() |
| 28px light | ![]() | ![]() |
| 40px dark | ![]() | ![]() |
| 40px light | ![]() | ![]() |
Risk: shared footer wrappers and CSS cascade affect sent, received and answer actions; Retry visibility, Continue sizing and authentication recovery are covered. Web-only change.
Agent session: agent session







