Skip to content

Agent chat: the last answer's Copy row shows once the turn ends - #31503

Merged
teamleaderleo merged 1 commit into
feat-cmux-nextfrom
lane/copy-buttons-turn-end
Nov 2, 2026
Merged

teamleaderleo merged 1 commit into
feat-cmux-nextfrom
lane/copy-buttons-turn-end

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator

Leo-ask: ask-c92cd7a205

Leo: "i should be able to see the copy buttons on your responses when your things end"

Once the agent finishes, the chat's last turn footer (Copy, Fork, Pin, Read aloud, age) now shows without hovering, as in Claude and ChatGPT. Earlier turns' footers stay hover-only. While a turn is running there is no footer for it, so nothing shows mid-turn; once a new prompt follows, the previous footer goes back to hover-only.

  • App.tsx: RowFrame marks the turnSummary row with nothing drawn after it acpmux-row--final-footer.
  • conversation.css: that row's .cv-turn-actions is at opacity 1. The footer is absolutely placed with its space already kept, so nothing moves.

Spec: design/chat-transcript.md ("one action footer per turn ... revealed on hover"); the spec gets a line about the last turn's footer showing at rest.

Risk: one CSS rule and one class; small and contained.

Agent session: agent session

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Shows the last turn's action footer (Copy, Fork, Pin, Read aloud) without hovering once the agent finishes, matching Claude and ChatGPT. Earlier turns' footers stay hover-only, running turns show no footer, and the footer returns to hover-only once a new prompt follows. The change is small and contained: one CSS rule and one class.

Written for commit 36362ac. Summary will update on new commits.

View guided diff Turn on auto-fix

…s without a hover once the turn ends

Leo, 2026-11-02: "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-71440d91e22e80b54684
@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 36362ac: 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=pr31503 -f ref=lane/copy-buttons-turn-end -f platform=macos -f backend_mode=local

Gallery before/after for 36362ac: 16 states rendered, 0 images differ, 1925 more touched states not rendered. 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 41368486852 -R manaflow-ai/cmux -n gallery-advisory-31503-36362ac9bc4840e5f302527f941770f85e5740c5 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.access-offer/turn-no-credits Apple System Colors Light unchanged 0% own conversation.css
agent-pane.access-offer/turn-no-credits Apple System Colors unchanged 0% own conversation.css
agent-pane.access-offer/turn-low-credits Apple System Colors Light unchanged 0% own conversation.css
agent-pane.access-offer/turn-low-credits Apple System Colors unchanged 0% own conversation.css
agent-pane.access-offer/turn-no-offer Apple System Colors Light unchanged 0% own conversation.css
agent-pane.access-offer/turn-no-offer Apple System Colors unchanged 0% own conversation.css
agent-pane.approval-edits/single Apple System Colors Light unchanged 0% own conversation.css
agent-pane.approval-edits/single Apple System Colors unchanged 0% own conversation.css
agent-pane.approval-edits/grouped Apple System Colors Light unchanged 0% own conversation.css
agent-pane.approval-edits/grouped Apple System Colors unchanged 0% own conversation.css
agent-pane.approval-edits/single-multiedit Apple System Colors Light unchanged 0% own conversation.css
agent-pane.approval-edits/single-multiedit Apple System Colors unchanged 0% own conversation.css
agent-pane.approval-edits/grouped-multiedit Apple System Colors Light unchanged 0% own conversation.css
agent-pane.approval-edits/grouped-multiedit Apple System Colors unchanged 0% own conversation.css
agent-pane.approval-edits/single-long Apple System Colors Light unchanged 0% own conversation.css
agent-pane.approval-edits/single-long Apple System Colors unchanged 0% own conversation.css
agent-pane.approval-edits/grouped-long Apple System Colors Light unchanged 0% own conversation.css
agent-pane.approval-edits/grouped-long Apple System Colors unchanged 0% own conversation.css
agent-pane.attachment-source/before Apple System Colors Light unchanged 0% own conversation.css
agent-pane.attachment-source/before Apple System Colors unchanged 0% own conversation.css
agent-pane.attachment-source/corner Apple System Colors Light unchanged 0% own conversation.css
agent-pane.attachment-source/corner Apple System Colors unchanged 0% own conversation.css
agent-pane.attachment-source/small Apple System Colors Light unchanged 0% own conversation.css
agent-pane.attachment-source/small Apple System Colors unchanged 0% own conversation.css
agent-pane.attachment-source/labelled Apple System Colors Light unchanged 0% own conversation.css
agent-pane.attachment-source/labelled Apple System Colors unchanged 0% own conversation.css
agent-pane.attachment-source/outside Apple System Colors Light unchanged 0% own conversation.css
agent-pane.attachment-source/outside Apple System Colors unchanged 0% own conversation.css
agent-pane.background-activity/duration-columns Apple System Colors Light unchanged 0% own conversation.css
agent-pane.background-activity/duration-columns Apple System Colors unchanged 0% own conversation.css
agent-pane.background-activity/pinned-live-tail-light Apple System Colors Light unchanged 0% own conversation.css
agent-pane.background-activity/pinned-live-tail-light Apple System Colors unchanged 0% own conversation.css

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

Probably yours: agent-pane-locale.test.ts, agent-pane-locale.test.ts, agent-pane-locale.test.ts and 52 more fails here but not on main's latest full suite. Seen on other PRs too (likely flaky): agent-pane-locale.test.ts, glyph-alignment.test.ts, agent-pane-chat-column.test.ts and 3 more. This PR merged before its CI finished: fix forward on main.

CI failed on 36362ac9bc (run 41368486935 attempt 1): 8 code, 1 unknown.

Job Verdict Why
web / react-apps-check (1) code a Python test failed
web / react-apps-check (4) code a web test failed
web / react-apps-check (7) code a web test failed
web / react-apps-check (3) code a web test failed
web / react-apps-check (5) code a web test failed
web / react-apps-check (2) code a web test failed
web / react-apps-check (8) code a web test failed
web / react-apps-check (6) code a web test failed
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • new in this PR agent-pane-locale.test.ts agent pane first paint > chromium: under its own meta CSP (cmux-agent://pane), a German app paints G...: failed (job)
  • new in this PR agent-pane-locale.test.ts agent pane first paint > chromium: under the page host's CSP header, a German app paints German from...: failed (job)
  • new in this PR agent-pane-locale.test.ts agent pane first paint > chromium: a policy without 'self' blocks the pane's scripts, so the checks ...: failed (job)
  • new in this PR agent-pane-locale.test.ts agent pane first paint > webkit: under its own meta CSP (cmux-agent://pane), a German app paints Ger...: failed (job)
  • new in this PR agent-pane-locale.test.ts agent pane first paint > webkit: under the page host's CSP header, a German app paints German from t...: failed (job)
  • seen on other PRs agent-pane-locale.test.ts agent pane first paint > webkit: a policy without 'self' blocks the pane's scripts, so the checks ab...: failed (job)
  • seen on other PRs glyph-alignment.test.ts glyphs use shared row geometry in light and dark: failed (job)
  • new in this PR new-tab-headline-place.test.ts (unnamed): failed (job)
  • new in this PR forkPending.test.ts a Fork Conversation shows Forking… while acpmux forks, and removes it when the fork answers: failed (job)
  • new in this PR heldPromptGesture.test.ts a prompt refused for want of a gesture says to send it again: failed (job)
  • ... 51 more in the job logs
Matched log lines
web / react-apps-check (1): FAIL: test_coverage_base_gap_warns_on_a_pr_changing_the_gallery_format (__main__.ScopedChecksTests.test_coverage_base_gap_warns_on_a_pr_changing_the_gallery_format)
web / react-apps-check (4): (fail) a Fork Conversation shows Forking… while acpmux forks, and removes it when the fork answers [76.41ms]
web / react-apps-check (7): (fail) the transcript and the composer share one column, inset by the page edge, wider in wide panes [3903.63ms]
web / react-apps-check (3): (fail) a long mock chat opens on its newest page and pages back to its first message [24.71ms]
web / react-apps-check (5): (fail) a chat's menu keeps its key hints and More models submenu [121.55ms]
web / react-apps-check (2): (fail) a new file (Write, nothing before it) with a diff in its content opens inline as all added lines [103.25ms]
web / react-apps-check (8): (fail) a chat's first frame waits on the handshake and one round trip [57.85ms]
web / react-apps-check (6): (fail) (unnamed) [7196.41ms]

Not re-run automatically: web / react-apps-check (1), web / react-apps-check (4), web / react-apps-check (7), web / react-apps-check (3), web / react-apps-check (5) 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: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: red check: Web bundle key inputs (+4 more) is not red on the base 1d9e66e; do not merge until green; see lane-rules
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); base red: the same failure on the base 1d9e66e; does not block
red: web / react-apps-check (2); NEW: TypeError: Failed to fetch dynamically imported module: http://127.0.0.1:41243/gallery/src/gallery/agent-pane.virtual.css at warmGalleryFrame (/home/runner/_wor (+1 more) is not red on the base 1d9e66e; do not merge until green; see lane-rules
red: web / react-apps-check (3); NEW: [ "0", - "0", + "1", ] - Expected - 1 + Received + 1 at <anonymous> (/home/runner/_work/cmux/cmux/webviews/test/agent-pane-turn-footer.test.ts:167:33) (+1 more) is not red on the base 1d9e66e; do not merge until green; see lane-rules
red: web / react-apps-check (4); NEW: { "atEnd": true, - "drops": [], + "drops": [ + "5999ms: -393.6 -> -383.3", + ], } - Expected - 1 + Received + 3 at <anonymous> (/home/runner/_work/cmux/cmux/web (+4 more) is not red on the base 1d9e66e; do not merge until green; see lane-rules
red: web / react-apps-check (5); NEW: TypeError: Failed to fetch dynamically imported module: http://127.0.0.1:41273/gallery/src/gallery/agent-pane.virtual.css at warmGalleryFrame (/home/runner/_wor (+1 more) is not red on the base 1d9e66e; do not merge until green; see lane-rules
red: web / react-apps-check (6); NEW: TypeError: Failed to fetch dynamically imported module: http://127.0.0.1:34603/gallery/src/gallery/agent-pane.virtual.css at warmGalleryFrame (/home/runner/_wor (+1 more) is not red on the base 1d9e66e; do not merge until green; see lane-rules
red: web / react-apps-check (7); NEW: TypeError: Failed to fetch dynamically imported module: http://127.0.0.1:46553/gallery/src/gallery/agent-pane.virtual.css at warmGalleryFrame (/home/runner/_wor (+1 more) is not red on the base 1d9e66e; do not merge until green; see lane-rules
red: web / react-apps-check (8); NEW: TypeError: Failed to fetch dynamically imported module: http://127.0.0.1:45687/gallery/src/gallery/agent-pane.virtual.css at warmGalleryFrame (/home/runner/_wor (+1 more) is not red on the base 1d9e66e; do not merge until green; see lane-rules

Shipped in:

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent claude-opus-5-5 medium): SHIP at 36362ac

The CSS order wins: same specificity, and the new rule comes after the opacity 0 rule. A footer gets the class only when nothing drawn follows it, so nothing shows mid-turn. The memo comparator takes the new boolean. Nothing shifts in layout, and the empty last footer stays hidden.
Follow-ups: the final footer appears at once when the turn ends, without the hover fade-in (intended).

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

blacksmith-sh Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Found 1599 test failures on Blacksmith runners:

Failures

Test View Logs
---/--- View Logs
---/--- View Logs
---/--- View Logs
---/--- View Logs
---/--- View Logs
---/--- View Logs
---/--- View Logs
---/--- View Logs
---/--- View Logs
---/--- View Logs

...and 1589 more test failures. View all on Blacksmith: run 41368486935, run 41368486943

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

@teamleaderleo
teamleaderleo merged commit b3571f2 into feat-cmux-next Nov 2, 2026
160 of 183 checks passed
@teamleaderleo
teamleaderleo deleted the lane/copy-buttons-turn-end branch November 2, 2026 00:47
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
…ork, 8 under the run (#32574)

Leo, 2026-11-02: "this spacing would be good + the latest copy buttons auto
showing when the turn is done like chatgpt... my current nightly has it different"

The chat's last turn that spoke and then ended on a run of commands, with no
reply after it, drew an empty footer (turns.ts isEmptyFooter: no answer text),
which the last footer hides (display: none): no buttons, only a blank band over
the composer. That footer is now a real 32 row (Copy of the turn, Fork, Pin),
shown at rest by #31503's final-footer rule, 8 (--grid-gap-footer) under the
run's last line, as under a reply. Earlier such turns keep their hover-only
footer.


Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Nov 4, 2026
…e chat (#34805)

* Agent pane: the last turn's footer stays shown at rest until the person's next prompt

Leo, 2026-11-04, comparing ChatGPT's last reply with ours: "we don't have the time worked for nor
the thing always showing at hte bottom (excl. thumb up/down)".

The final footer (Copy, Fork, Pin, Read aloud at rest, #31503) was only the turnSummary with no
drawn row after it, so another agent's message, a notice, a recap or a background line under the
last turn hid it again. model.ts finalFooterId picks the chat's last ended turn's footer and keeps
it until the person's own next prompt opens a turn.

Leo-ask: ask-2a8f22e04a

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

* Agent pane: a later turn's work ends the final footer's hold

Review follow-up: a turn another agent's message started kept the turn above it lit while it ran.

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

* Agent pane: an empty bookkeeping footer never takes the final footer from the answer above it

Leo's screenshot (claude-sr2-coord's chat): nothing under the last reply. A turn of bookkeeping
after it ends in an empty footer, which drew nothing yet was the chat's last.

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

---------

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

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 36362ac9 Deployed Nov 2, 2026 by teamleaderleo via cmux-tui tree preflight #98020
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.

1 participant