Skip to content

Transcript: a reply's buttons come first at the prose edge, its time on hover; the last reply's show at rest - #31609

Merged
teamleaderleo merged 2 commits into
feat-cmux-nextfrom
leo/reply-footer-buttons-first
Nov 2, 2026
Merged

teamleaderleo merged 2 commits into
feat-cmux-nextfrom
leo/reply-footer-buttons-first

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator

Leo, 2026-11-02 00:28Z: "this should not be placed in front of the copy/whatever buttons. those buttons should always just be there left aligned"

Leo, 2026-11-02 00:29Z: "i should be able to see the copy buttons on your responses when your things end"

Leo, 2026-11-02 00:35Z: "compared to claude code our bottom thing looks bad is sized bad all around spaced bad + the useless text at the front + didn't i always say we can do it like chatgpt / i assume the x previous messages are when there's a mix and the worked for is if it's one contiguous thing. notice how on hover it reveals the exact timestamp. let's follow those."

What changes

The reply footer (TurnRows.tsx TurnFooter, MessageActions.tsx ReplyActions) now follows ChatGPT's row:

  1. The buttons come first, at the prose's left edge. "Worked for 13s · ↓ 359 out ↑ 328.8K in" is gone from the row. It is now the time's tooltip, so the numbers can still be read. The first glyph's ink sits exactly on col-left (design/grid.md 5.5). It used to sit 6px left, because the row's inset-inline overhang and the first button's margin both pulled it left. The row now starts on the column and overhangs only at its end.
  2. The time comes after the buttons, hidden at rest, shown on hover. It is ChatGPT's exact time ("Oct 18, 5:41 AM", with the year only when it isn't this year) instead of "3 minutes ago". It keeps its space, so nothing moves.
  3. The finished chat's last reply shows its buttons at rest. Agent chat: the last answer's Copy row shows once the turn ends #31503 landed that on base while this PR was open, and this PR now relies on its acpmux-row--final-footer and tests it. Earlier footers still show on hover.

Regressing PR: #30176 (e9f2496, "a finished Claude turn folds per run"). It set folded = false for Claude turns, so turns.ts footerSays() became true for every Claude turn, and TurnFooter drew the "Worked for · tokens" label ahead of the buttons on every Claude reply. The label was added in #16612 and its tokens in #24259; before #30176 it only showed for turns that had no fold. #31505 (merged while this PR was open) moved the label after the buttons. This PR takes it out of the row and puts it in the time's tooltip, as the ChatGPT reference does, and updates #31505's test to match.

Not in this PR. These follow separately:

Tool-row spacing and the composer are untouched.

Tests (red at base, green at head)

  • webviews/test/reply-footer.test.ts (new, Chromium, light and dark):
    • In every footer the first child is the button group, and the first glyph's ink is 0px from the prose edge, both for a footer with time and tokens and for one without. The time sits after the last button.
    • In a finished chat, the last reply's buttons have opacity 1 with no pointer and its time has opacity 0. On hover the time is 1 and the buttons don't move. Earlier footers stay hidden.
    • At base: 4 of 4 fail (ink at -6px, the label first, the last footer hidden).
  • webviews/test/transcript-row-alignment.test.ts: the "footer label" lead is removed, since footers have no label now. With base red: transcript status-row gaps and the empty footer on the grid #31475's test changes merged in, it passes at this head. At base it fails with footer actions "first glyph" starts at -6px and footer label "Worked for 5s" starts at 52px.
  • TurnFooter.test.tsx: the label is in the time's title and not in the row. A footer whose only content was its label is now empty.
  • Typecheck, check:design-tokens, vp fmt --check and vp lint pass (cmux-ci 32-vCPU Linux).

Gallery: agent-pane.transcript-row-alignment gets finished (rest) and finished-hover variants, and its footer variant points at the buttons. The design spec is updated in a separate leo-workspace PR (design/chat-transcript.md).

Viewed after image: yes. 2x captures of the last reply at rest and on hover, light and dark (synthetic gallery data): the copy glyph's ink lines up with the reply's first letter, nothing shows before the buttons, and "Oct 6, 9:25 AM" appears 8px after the last button only on hover.

Remaining reds are base reds: check:design-tokens (a pages/changelog baseline that can shrink), and the row-gap and footer-height assertions that #31475 updates.

Risk: low. CSS and markup in the reply footer only. A footer whose only content was "Worked for Ns" (no text to copy) now takes no line of its own, the same as one under a second.

Agent session: agent session

🤖 Generated with Claude Code

…he last reply's buttons show at rest

Leo, 2026-11-02: "this should not be placed in front of the copy/whatever buttons. those buttons
should always just be there left aligned" and "i should be able to see the copy buttons on your
responses when your things end".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-e9d08b9237cbd1067052
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Nov 2, 2026
…ooter-buttons-first

# Conflicts:
#	webviews/src/agent-session/acpmux/conversation/TranscriptRowAlignment.gallery.ts
#	webviews/src/agent-session/acpmux/conversation/TurnRows.tsx
#	webviews/src/agent-session/acpmux/conversation/conversation.css
@teamleaderleo
teamleaderleo merged commit de9d3bb into feat-cmux-next Nov 2, 2026
115 of 147 checks passed
@teamleaderleo
teamleaderleo deleted the leo/reply-footer-buttons-first branch November 2, 2026 01:48
@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 7ff48d4: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr31609 -f ref=leo/reply-footer-buttons-first -f platform=macos -f backend_mode=local

Gallery before/after for 7ff48d4: 6 states rendered, 6 images differ (picked by the Gallery: line in the PR body). Images are in the run's artifact, not on this public PR; the independent review of this head reads them on its own, so the PR needs no hand-made screenshots of these states.

gh run download 41374280919 -R manaflow-ai/cmux -n gallery-advisory-31609-7ff48d437565c56b573c0c640a0f1f3077de6513 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.transcript-row-alignment/finished Apple System Colors Light new 0% pr-body
agent-pane.transcript-row-alignment/finished Apple System Colors new 0% pr-body
agent-pane.transcript-row-alignment/finished-hover Apple System Colors Light new 0% pr-body
agent-pane.transcript-row-alignment/finished-hover Apple System Colors new 0% pr-body
agent-pane.transcript-row-alignment/mix Apple System Colors Light unchanged 0% pr-body
agent-pane.transcript-row-alignment/mix Apple System Colors unchanged 0% pr-body
agent-pane.transcript-row-alignment/roomy Apple System Colors Light unchanged 0% pr-body
agent-pane.transcript-row-alignment/roomy Apple System Colors unchanged 0% pr-body
agent-pane.transcript-row-alignment/off Apple System Colors Light unchanged 0% pr-body
agent-pane.transcript-row-alignment/off Apple System Colors unchanged 0% pr-body
agent-pane.transcript-row-alignment/footer Apple System Colors Light changed 0.304% pr-body
agent-pane.transcript-row-alignment/footer Apple System Colors changed 0.297% pr-body

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

Unclear: web / react-apps-check (1) failed: no known signature; failed step: Fail on the gate checks. This PR merged before its CI finished: fix forward on main.

CI failed on 7ff48d4375 (run 41374057710 attempt 1): 2 unknown.

Job Verdict Why
web / react-apps-check (1) unknown no known signature; failed step: Fail on the gate checks
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Not re-run automatically: web / react-apps-check (1), web / react-apps-check are not machine failures.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

red: web / Web status; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules
red: web / react-apps-check; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules
red: web / react-apps-check (1); NEW: check:popup-hover-reveals fails on the pull request merged with its base (+4 more) is not red on the base 6b63875; do not merge until green; see lane-rules

Shipped in:

@lawrencecchen

Copy link
Copy Markdown
Contributor

For Leo (teamleaderleo): this PR made check:popup-hover-reveals red on feat-cmux-next (conversation.css:3828). The two new .cv-turn-time hover reveals have no :has([data-popup-open]) twin, so the time hides while a menu from that reply is open. Fix: #31640 (reviewed SHIP, ready-to-land). Found by agent tip-fix-0200.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol high, sweep, via the review router; full diff from merge base 6b63875 to this head): SHIP at 7ff48d4

[P2] [follow-up] webviews/src/agent-session/acpmux/conversation/turns.ts:109 - Summaries with no answer text but metadata such as “previous messages,” tool counts, or duration are now classified as empty. On a final footer, .cv-turn-actions--empty is hidden, so the only content carrying that metadata is removed and users lose the context entirely. Preserve metadata-only labels in the final footer or keep their tooltip-bearing element rendered.

lawrencecchen added a commit that referenced this pull request Nov 2, 2026
…1609) (#31640)

#31609 (de9d3bb) shows a reply's time on :hover of .acpmux-turnSummary and
.acpmux-assistant, without the :has([data-popup-open]) twin that every hover reveal has,
so check:popup-hover-reveals is red on every webviews push. When the pointer goes from
the reply into its menu, the time hid while the buttons stayed. Both selectors now
match an open popup too, as .cv-turn-actions already does.

check:popup-hover-reveals: red at origin/feat-cmux-next 8e630df (2 lines,
conversation.css:3828), green here.
teamleaderleo added a commit that referenced this pull request Nov 2, 2026
…31932)

* test(webviews): turn footer test follows the reply footer of #31503 and #31609

The last reply's footer now shows at rest and .cv-turn-summary is gone.
Rewrite the at-rest/hover test against that; drop the summary layout test,
which reply-footer.test.ts now covers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0

* test(webviews): drop a stray closer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Nov 2, 2026
…r gaps, sent rows, reply time) (#32269)

* base red: gallery plays wait for what the transcript draws now

- gutter-select gap pairs: the drag starts on the upper row's gap target. Since #27580 rows have
  no bottom padding (the stack places the gap under the row), so the old start point
  (row bottom - padding/2) landed on the row's content and selected nothing.
- sent-message-rows: a turn's run of sends folds into one "Sent N messages" line (#31398);
  the plays open it after "Worked for".
- transcript#agent-messages: opens the message-run line (#31398), then the shell call.
- transcript#grid-rhythm-hover: a reply mid-turn draws no action row since #29740 (Copy once
  per turn); the play hovers the reply and checks none is drawn.
- user-bubble#answer-time-tooltip: since #31609 a reply's time is its exact time at the row's
  end, shown on hover, and its tooltip is the turn's time and tokens; the play waits for the
  time to show instead of a tooltip with a year.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0

* base red: batch-raw and message-runs#open open the folds their rows sit in now; sent rows' shift rows count the run they open

- acpmux-batch-send: openTurn opens the "Sent N messages" line (#31398) after Worked for.
- message-runs#open: opens a finished turn's Worked for first when the run's line is inside it.
- shift-baseline: sent-message-rows sent, look-arrow, look-quote and recorded-file now open one
  more fold (the run line), which moves the reply and footer below it down 154px, as every fold
  opening does; their rows take the measured score (PR run 41446958864).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0

* base red: batch-raw shows a file-read message's call without Raw; batches' shift row counts its run

A batch message whose text the transcript never held opens straight to its call (SentMessageLine.tsx),
so batch-raw waits for the call itself and clicks Raw only when one is drawn. batches now opens the
run line (#31398), which moves the reply below it, so its row takes the measured 0.04078
(PR run 41449180896).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-ac5053f7854c8635a4d0

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 7ff48d43 Deployed Nov 2, 2026 by teamleaderleo via wait for same-key tree publisher #98413
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants