Skip to content

cmux NEXT agent chat: message hover rows like Claude's (check, age, Copy, Retry, Fork; just now; exact time above) - #23769

Merged
teamleaderleo merged 6 commits into
feat-cmux-nextfrom
tp/claude-hover-row
Oct 22, 2026
Merged

teamleaderleo merged 6 commits into
feat-cmux-nextfrom
tp/claude-hover-row

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Leo: "WE ALSO NEED EXACT HOVER THING JUST LIKE CLAUDE", then his exact spec for the row under a user message. This makes the hover rows under prompts and answers in the cmux NEXT agent pane match it.

Under a prompt (Leo's spec): read check ("Read by "), relative age, ·, Copy, Retry, Fork from here, each named in a tooltip on hover. No Pin. Retry now shows under every prompt, not only the last turn's; it resends that prompt. It's hidden while the prompt is still being sent, so a click can't send it twice. Fork stays hidden where the harness can't fork at that prompt. cmux's Edit (edit and resend through a fork) follows Fork on prompts the chat can fork before. Claude's Code tab has no Edit here, but it's the only way into that feature, so it stays.

Under an answer (Claude's order, unchanged): Copy, Fork, Pin, Read aloud, age.

Both rows: relative time is Claude's: "just now" under a minute, then minutes, hours, "yesterday", days, "last week", weeks, months, "last year". It never switches to a date. The tooltip on the time reads Oct 20, 2026, 10:16 PM (year, short month, day, hour, 2-digit minute, localised to the pane's language) and shows above the time, as Claude's does. Icons are 16 px in touching 24 px buttons. The row fades in over 120 ms after a 100 ms hover delay, and out over 80 ms, on Claude's cubic-bezier(.32,.72,0,1). Claude's fade-out is 60 ms, but our motion scale's shortest step is 80 ms.

The tooltip is the pane's shared glass title tooltip (frosted, never opaque). The only change to it is a new data-tooltip-side="top".

Comparison: Claude Code desktop vs main before this PR

Claude's values come from its installed app bundle (read-only), cross-checked against Claude captures in the design references repo.

Claude Code desktop (Code tab) main before this PR
Prompt row order age, read check, Copy, Rewind, Fork age, check, Copy, Edit, Retry (last turn only), Fork, Pin Leo's spec: check, age, ·, Copy, Retry (every prompt), Fork, then Edit; no Pin
Answer row order Copy, Fork, Pin, Read aloud, (rating), age Copy, Fork, Pin, Read aloud, age same (no rating in cmux)
Icon size / button 16 px glyph in 24 px (h-control) button, no gap 14 px glyph in 20 px button, 2 px gap 16 px in 24 px, no gap
Prompt age text caption, 6 px inline padding caption, 4 px margin caption, 2 px before it, · with 4 px each side
Answer age text body (13 px), 8 px padding 13 px raw, 8 px gap --text-body, 8 px gap
Under a minute "just now" (en), Intl's "now" word elsewhere "now" "just now" (en), Intl's word elsewhere
Units minute, hour, day, week, month, year; rounded; numeric: "auto" minute, hour, day, then a date ("Oct 13") past 7 days Claude's units
36 h / 7 d / 30 d / 400 d yesterday / last week / last month / last year yesterday / Oct 13 / Sep 20 / Sep 16 Claude's
Tooltip text Oct 20, 2026, 10:16 PM (year:"numeric", month:"short", day:"numeric", hour:"numeric", minute:"2-digit") dateStyle: medium, timeStyle: short (Oct 20, 2026, 10:16 PM in en-US, but other fields and order in other languages) Claude's options, pane language
Tooltip place above the time (tooltipSide: "top") below above (below only at the top edge)
Tooltip look dark rounded glass title tooltip unchanged glass title tooltip
Retry / Fork tooltip name + detail line Retry said "Send this prompt again" "Retry" + detail; "Fork from here" + detail
Fade in 120 ms, 100 ms delay, snap curve 120 ms ease-out, no delay 120 ms, 100 ms delay, snap curve
Fade out 60 ms, no delay 120 ms ease-out 80 ms (--cmux-motion-quick; 60 ms is off the motion scale)
Keyboard focus in, no delay in, 120 ms in, no delay

What main fixed since Leo's build (03960f5)

#22773 added Pin, Read aloud, the read receipt and the exact-time title. #23081 added check and time on hover. Both are on main. Leo's build had none of the time tooltip.

Visual proof

Gallery entry agent-pane.user-bubble: prompt-hover, answer-hover, and new prompt-time-tooltip and answer-time-tooltip (forced hover, tooltip shown). Before/after (gallery-compare, tailnet): https://cmux-lawrences-mac-mini.tail137216.ts.net:18796/compare/tp-claude-hover-row/?entry=agent-pane.user-bubble

Fleet compile-check (cmux-ci compile-check --app) passed on dbe3eb3 and on 71f32fe (the head after a base merge).

Test plan

  • webviews/test/user-message-actions.test.tsx: exact prompt-row order and tooltip text, Fork hidden when the chat can't fork, relative-time thresholds incl. just now, 1 minute, 59 minutes, 90 minutes, yesterday, last week, months, last year, future clock skew, German, and the exact-time format (Oct 20, 2026, 10:16 PM, Jan 5, 2026, 9:03 AM, German 20. Okt. 2026, 22:16).
  • webviews/src/ui/titleTooltips.test.ts: a top-side tooltip sits above, and goes below only at the edge.
  • webviews/test/thread-minimap-rail.test.tsx: bookmarks toggle from the rail dot and card; prompt rows have no Pin.
  • webviews/test/agent-pane-suggested-tasks.test.ts: reminder and notification turns still offer no Retry of their own. Only the person's prompt has one.
  • scripts/web-lint.sh passes.

Observed / Not run

  • Observed: web lint passes locally.
  • Not run locally: bun tests. cosmic-gray is Leo's Mac and its hook refuses bun test, so the tests run on CI (cmux-next-web).

Changelog

Changed: The hover row under agent chat messages matches Claude's: read check, age, Copy, Retry, Fork under prompts; "just now" and week/month/year ages; the exact date and time above the age on hover.

Takes back #22773: removes Pin from the row under prompts (Leo's spec, 2026-10-21). Bookmarks stay on the thread minimap's dot and card.

Leo-ask: ask-0033ce890a
Leo-ask: ask-4ea1e566ad
Leo-ask: ask-13f79420bd

Agent session: cosmic-gray

🤖 Generated with Claude Code

teamleaderleo and others added 3 commits October 21, 2026 14:10
…act time above, 24px buttons, fade)

The hover row under prompts and answers now follows Claude Code desktop's
code (read from its bundle): "just now" under a minute and counts in weeks,
months and years past a week instead of switching to a date; the time's
tooltip reads "Oct 20, 2026, 10:16 PM" (year, short month, day, hour,
2-digit minute, in the pane's language) and shows above the time; icons are
16px in touching 24px buttons, the age in the body size; the row fades in
after 100ms over 120ms and out over 60ms on Claude's snap curve.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
… and Pin; receipt in a 24px square; prompt age stays caption

Claude's Code tab draws a prompt's row as age, read receipt, Copy, Rewind,
Fork; cmux's Edit sat between Copy and Fork. It now follows Fork, with Pin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
…o Pin

Leo (2026-10-21): under a user message, left to right: the read check
("Read by <harness>"), the relative time (its absolute date on hover), a
dot, Copy, Retry and Fork, each naming itself on hover; no Pin. Retry now
shows under every prompt (it resends that prompt) and names itself
"Retry" with "Send this prompt again" under it. Fork stays hidden where
the harness cannot fork. cmux's Edit follows Fork where the chat can fork
before the prompt. The Chief's prompt row matches.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 71f32fe: 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=pr23769 -f ref=tp/claude-hover-row -f platform=macos -f backend_mode=local

Probably yours: agent-pane-older-rows-fade.test.ts, agent-pane-older-rows-fade.test.ts fails here but not on main's latest full suite. This PR merged before its CI finished: fix forward on main.

CI failed on 71f32fe1de (run 39698739904 attempt 1): 1 code, 1 unknown.

Job Verdict Why
web / react-apps-check (1) 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-older-rows-fade.test.ts rows of an older page fade in once as they come into view; opened and live rows do not: failed (job)
  • new in this PR agent-pane-older-rows-fade.test.ts Reduce Motion draws rows of an older page in full ink at once: failed (job)
Matched log lines
web / react-apps-check (1): (fail) rows of an older page fade in once as they come into view; opened and live rows do not [4657.55ms]

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; base red: the same failure on the base 4313b23; does not block
red: web / react-apps-check; base red: the same failure on the base 4313b23; does not block
red: web / react-apps-check (1); NEW: green on the base 4313b23; do not merge until green; see lane-rules

CI fast guards failed on b2eb0673ca (https://github.com/manaflow-ai/cmux/actions/runs/39685839585). It does not block the merge; a red guard merged into main breaks it for every open PR.
The log named no failed step; see the run.

Agents: python3 scripts/ci/guard_attribution.py fix applies the mechanical fixes locally.

Gallery before/after for 71f32fe: 16 states rendered, 1 images differ, 1503 more touched states not rendered. Images are in the run's artifact, not on this public PR.

gh run download 39698739771 -R manaflow-ai/cmux -n gallery-advisory-23769-71f32fe1de24133fb2b9b3a8162e03dbe8c0ae41 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.chat-find-bar/empty Apple System Colors Light unchanged 0% own conversation.css
agent-pane.chat-find-bar/empty Apple System Colors unchanged 0% own conversation.css
agent-pane.chat-find-bar/matches Apple System Colors Light unchanged 0% own conversation.css
agent-pane.chat-find-bar/matches Apple System Colors unchanged 0% own conversation.css
agent-pane.chat-find-bar/next-match Apple System Colors Light unchanged 0% own conversation.css
agent-pane.chat-find-bar/next-match Apple System Colors unchanged 0% own conversation.css
agent-pane.chat-find-bar/no-results Apple System Colors Light unchanged 0% own conversation.css
agent-pane.chat-find-bar/no-results Apple System Colors unchanged 0% own conversation.css
agent-pane.composer/new-chat Apple System Colors Light unchanged 0% own composer.gallery.ts
agent-pane.composer/new-chat Apple System Colors unchanged 0% own composer.gallery.ts
agent-pane.composer/side-session Apple System Colors Light unchanged 0% own composer.gallery.ts
agent-pane.composer/side-session Apple System Colors unchanged 0% own composer.gallery.ts
agent-pane.composer/new-chat-suggest-open Apple System Colors Light unchanged 0% own composer.gallery.ts
agent-pane.composer/new-chat-suggest-open Apple System Colors unchanged 0% own composer.gallery.ts
agent-pane.composer/new-chat-suggest-failing Apple System Colors Light unchanged 0% own composer.gallery.ts
agent-pane.composer/new-chat-suggest-failing Apple System Colors unchanged 0% own composer.gallery.ts
agent-pane.composer/new-chat-suggest-draft Apple System Colors Light unchanged 0% own composer.gallery.ts
agent-pane.composer/new-chat-suggest-draft Apple System Colors unchanged 0% own composer.gallery.ts
agent-pane.composer/new-chat-reasoning Apple System Colors Light unchanged 0% own composer.gallery.ts
agent-pane.composer/new-chat-reasoning Apple System Colors unchanged 0% own composer.gallery.ts
agent-pane.composer/agent-home Apple System Colors Light unchanged 0% own composer.gallery.ts
agent-pane.composer/agent-home Apple System Colors unchanged 0% own composer.gallery.ts
agent-pane.composer/agent-home-path Apple System Colors changed 0% own composer.gallery.ts
agent-pane.composer/agent-home-path Apple System Colors Light unchanged 0% own composer.gallery.ts
agent-pane.diff-panel/last-turn Apple System Colors Light unchanged 0% own conversation.css
agent-pane.diff-panel/last-turn Apple System Colors unchanged 0% own conversation.css
agent-pane.diff-panel/toolbar Apple System Colors Light unchanged 0% own conversation.css
agent-pane.diff-panel/toolbar Apple System Colors unchanged 0% own conversation.css
agent-pane.diff-panel/tree-selection Apple System Colors Light unchanged 0% own conversation.css
agent-pane.diff-panel/tree-selection Apple System Colors unchanged 0% own conversation.css
agent-pane.diff-panel/open-file-error Apple System Colors Light unchanged 0% own conversation.css
agent-pane.diff-panel/open-file-error Apple System Colors unchanged 0% own conversation.css

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by transcript-parity on cosmic-gray · session

@teamleaderleo teamleaderleo added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 21, 2026
@blacksmith-sh

blacksmith-sh Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Found 5 test failures on Blacksmith runners:

Failures

Test View Logs
---/--- View Logs
nightly cmux-tui resolve/nightly cmux-tui resolve View Logs
test/agent-pane-older-rows-fade.test.ts/agent-pane-older-rows-fade.test View Logs
test/agent-pane-older-rows-fade.test.ts/agent-pane-older-rows-fade.test View Logs
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)/
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)
View Logs

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-ufeag created for this PR by the cmux coordinator.

…ctions test; steer-read-hover note says Fork, not Pin)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent, correctness first): BLOCK at b2eb067

This covers b6d6a77 plus the merge of feat-cmux-next (b2eb067). The merge itself is fine: the conflict in user-message-actions.test.tsx keeps the new label order and adds base's two assertions, and the composer.gallery.ts steer note is correct. All three blockers below are on both heads, and CI on b6d6a77 already shows them failing (react-apps-check shards 1, 3 and 4).

Blocking (tests that fail because of this PR):

  1. webviews/src/agent-session/acpmux/conversation/relativeTime.ts:25 has a hard-coded "just now", so test/pane-english.test.ts ("no user-visible English is written in the pane's sources") fails on exactly this literal (shard 4; I reproduced it by running the scanner locally). Fix: put the string in the pane's string table with every locale filled in, or add an l10n-allow: reason on that line if English-only wording really is the intent.
  2. conversation.css:61 sets --cv-actions-out: 60ms, which is off the motion scale, so test/motion-scale.test.ts fails (shard 3). The scale steps are 80/120/180/240. Use var(--cmux-motion-quick) (80ms), or add a motion-allow: reason if Claude's exact 60ms is a must. It's also worth pointing --cv-actions-in at var(--cmux-motion-micro).
  3. test/agent-pane-suggested-tasks.test.ts:868 and :912 fail (shard 1, both on the first run and the retry). The new rule .cv-user__actions .cv-message-retry { display: inline-flex } (conversation.css, Retry block) makes Retry show under the person's earlier prompt in those chats, so getByRole("button", { name: "Retry" }).count() returns 1 instead of 0. If Retry under every prompt is the spec, update those two tests so they assert that the reminder or notification turn offers no Retry of its own (scope the query to that turn's footer or row), not that the page has no Retry at all.

Checked and correct:

  • relativeTime boundaries: 59s is "just now", then 1 min, 59 min, 90 min is "1 hour ago", 23.6h is "24 hours ago", 36h is "yesterday", then 3 days, last week, 2 weeks, last month, 3 months, last year. A future time reads "just now". German gives "vor 3 Stunden", "gestern" and "jetzt", and exactTime gives "20. Okt. 2026, 22:16" and "Oct 20, 2026, 10:16 PM". An invalid locale tag falls back instead of throwing. I checked all of these against Node and Bun ICU.
  • The labels() helper handles the Retry wrapper span. With no route the receipt reads "Read by the agent". Fork is hidden when forkSeq doesn't match. PromptRetry renders nothing without retry.
  • tooltipPosition for side "top" (272 above, 40 below at the top edge, with GAP and EDGE both 6) matches its test.
  • CSS specificity: the hover rule (0,3,0) beats the base rule (0,1,0), so fade-in waits 100ms and fade-out takes the base 60ms. Focus-within beats the base rule with no delay. For turn actions the focus rules come after the hover rules at equal specificity, so they win. All transitions stay inside prefers-reduced-motion: no-preference. ReceivedActions (.cv-received-actions) is not affected by the new Retry rule.
  • The PR card (chips/PullRequestCard.tsx) still reads "updated 3 minutes ago" and "read 23 minutes ago", and it guards NaN before calling relativeTime. PinButton is still used by TurnRows and ReceivedActions. The type-scale ratchet passes.

Not blocking:

  • Retry now also shows under a prompt that is still being sent, or whose turn is still running, whenever the pane is connected. Clicking it sends a duplicate. Consider hiding it when row.pending is set or while the delivery is "sending".
  • In ReceivedActions, .cv-user__time lost its 4px end margin and the row gap is now 0, so the age touches Copy there.
  • The comment at PullRequestCard.tsx:76 still says relativeTime uses Intl.DateTimeFormat. It now uses RelativeTimeFormat, which also throws on NaN, so the guard is still needed.
  • Two other reds look unrelated to this PR: agent-pane-older-rows-fade (the PR adds no animations) and gallery health url-chip#pull-request-lines-by-kind (a play timeout). I have not checked them against base.

…on the motion scale; tests count only stray Retry

- relativeTime: mark Claude's English "just now" l10n-allow (other
  languages get Intl's own word).
- The row's fade uses the motion scale: in --cmux-motion-micro (120ms,
  Claude's), out --cmux-motion-quick (80ms; Claude's 60ms is off scale).
- Retry hides under a prompt still on its way (a second send would
  duplicate it).
- Another agent's message row keeps 6px between its age and Copy.
- suggested-tasks: the reminder and notification turns offer no Retry of
  their own; the person's prompt now has its own (Leo's row).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray
@cursor

cursor Bot commented Oct 21, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot uses usage-based billing for this team and requires on-demand usage to be enabled.

A team admin can enable on-demand usage in the Cursor dashboard.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent, correctness first): SHIP at dbe3eb3

Blocking: none. All three earlier blockers are fixed. I checked each against its scanner or test, not against the commit message:

  • pane-english: "just now" (webviews/src/agent-session/acpmux/conversation/relativeTime.ts:45) is exempt. The // l10n-allow: comment sits on the line directly above it, which is the comment-line-above form that test/pane-english.ts report() accepts. I ran scan() over the whole pane and got 0 findings.
  • motion-scale: in conversation.css, --cv-actions-in and --cv-actions-out are var(--cmux-motion-micro, 120ms) and var(--cmux-motion-quick, 80ms). Both are steps of the scale and their fallbacks match. The scanner skips --cv-actions-in-delay: 100ms because its name matches WAIT_NAME (/delay/). In the transition shorthands the first time token is var(--cv-actions-in|out) with no fallback, which passes; the delay is the second time token, which the scanner does not read. Running scanText on conversation.css gives [].
  • suggested-tasks: Page is already imported as a type from playwright (line 29). getClientRects().length > 0 drops the display:none .cv-message-retry spans and keeps the prompt's Retry, which is hidden only by opacity. {prompts: 1, elsewhere: 0} is right. The reminder classifies as incoming.kind === "hidden" and renders null (incomingMessage.ts:209, App.tsx MessageRow). The task notification is "notice", an IncomingNotice with no actions. TurnFooter shows Retry only on a failed turn. That leaves only the person's "Fix the product grid layout shift" bubble, and it gets retry because connected is true. The cross-session test's .last() still clicks the received message's Retry, which comes later in the DOM.

Also checked:

  • relativeTime returns every case in user-message-actions.test.tsx, de included. exactTime returns Oct 20, 2026, 10:16 PM and 20. Okt. 2026, 22:16, and a bad tag falls back.
  • relativeTime.ts type-checks clean under strict.
  • check-type-scale.py passes with the 34 -> 33 baseline.
  • The tooltipPosition test numbers match GAP = EDGE = 6.
  • Every other test that asserts the prompt row still holds with the new order and the always-shown Retry: chat-icon-tooltips, retry-model, not-sent-retry, steer, transcript-spacing, turn-error-layout and thread-minimap.
  • UserBubble.tsx:317, !row.pending && row.delivery?.state !== "sending", closes the duplicate-send note. Failed and queued rows have no action row.
  • The other agent's age no longer touches Copy: .cv-received-actions .cv-user__time now has padding-inline-end: 6px.

Non-blocking:

  • Retry now also shows under the prompt of a turn that is still running. Pressing it sends the prompt again while that turn is in flight. That is in line with the spec, so it's a product call, not a bug.
  • The last gallery-health red I saw, at b6d6a77, is agent-pane.url-chip#pull-request-lines-by-kind. This PR doesn't touch it.

Not run: no browser or bun test on this host. I ran only the scanners and Intl checks directly.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent, correctness first): SHIP at 71f32fe

Reviewed the feat-cmux-next merge (second parent 4313b23) on top of the SHIP at dbe3eb3, using git diff 71f32fe1de24^2 71f32fe1de24.

Not run: bun test and bun run check (a read-only review on a Mac that refuses heavy work). CI on this head is the check. fast-gates was red on the previous head; I didn't look into it.

@github-actions

Copy link
Copy Markdown
Contributor

Shipped in:

teamleaderleo added a commit that referenced this pull request Oct 22, 2026
…d time fade like the message row (#24049)

* Agent chat tests: a failed tool call's red mark at rest, a running one's spinner, the hover fade

Leo (2026-10-21): "let's only show the green/red checkmark + time on hover for ours".
Red before the fix: a failed call that is not a shell says "failed" in the dim
detail color, and the hover check and time snap in with no fade. Gallery states
tool-hover-meta-lone(-hovered) show a finished, a failed and a running call.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray

* Agent chat: a failed tool call says failed in red at rest; the hover check and time fade like the message row

Leo (2026-10-21): "let's only show the green/red checkmark + time on hover for ours".
#23081 already hides a finished call's check and time until hover or focus. Two
gaps remained: a failed call that is not a shell (a fetch, a read, an MCP call)
said "failed" in the dim detail color, so its failure blended in at rest; it now
uses the red failure color, as a command's "exit 1" and a group's "1 failed" do.
And the check and time snapped in; they now fade as a message's hover row does
(#23769): in after 100ms over 120ms, at once from the keyboard, out in 80ms,
none under Reduce Motion. Running rows keep their spinner.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray

* Gallery: the lone-call hover states open the ended turn's Worked for first

The running turn's finished calls sat folded, so the plays never found a check
(gallery health: waitFor did not hold). The fixture is now an ended turn, as
tool-hover-meta's is; the running spinner stays covered by the unit test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray

* Gallery: the lone-call plays open the folded run too (Searched the web)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16030-bf28-7072-b1f6-b83bbd0beacc&host=cosmic-gray

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 23, 2026
- IncomingMessageCard measured its text with the global getComputedStyle
  (#23932), which a jsdom test does not install; any transcript with
  another agent's message threw. It now reads the box's own window, as
  PromptText does. (regression; fixes transcript-copy's sent-prompt test)
- transcript-range-content's button variant clicked the prompt's floating
  Copy, which #24267 removed on purpose. It now selects a range that starts
  at another agent's message (a line that keeps its floating Copy) and
  clicks that. (stale test)
- agent-pane-older-rows-fade read a row's turn from its textContent, and
  #23769's message age ("3 weeks ago") runs straight on from "Question 130",
  so opened rows read as turns 1113..1303. The recorder now drops <time>.
  (stale test)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 23, 2026
- IncomingMessageCard measured its text with the global getComputedStyle
  (#23932), which a jsdom test does not install; any transcript with
  another agent's message threw. It now reads the box's own window, as
  PromptText does. (regression; fixes transcript-copy's sent-prompt test)
- transcript-range-content's button variant clicked the prompt's floating
  Copy, which #24267 removed on purpose. It now selects a range that starts
  at another agent's message (a line that keeps its floating Copy) and
  clicks that. (stale test)
- agent-pane-older-rows-fade read a row's turn from its textContent, and
  #23769's message age ("3 weeks ago") runs straight on from "Question 130",
  so opened rows read as turns 1113..1303. The recorder now drops <time>.
  (stale test)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 29, 2026
Leo (2026-10-28): "there should be, like, a fast fade-in fade-out. Right
now they're just appearing and disappearing. Like they're just blinking
in and out of existence, and it's a bit jarring".

Every control the transcript shows only on hover now takes the message
hover row's fade (#23769, --cv-actions-in/-in-delay/-out): out quickly at
rest, in after a beat under the pointer, at once from the keyboard.

- No fade before: another agent's message line's Reply and "Read after
  this step" tag, and a tool output's corner actions (Wrap lines).
- One-off timings before, now the shared fade: table Open/Copy, a sent
  message's Copy, Open chat on a disclosure line, media Open/Expand, a
  finished subagent line's actions, the live line's background hint.

test/transcript-hover-fade.test.ts fails when a transcript stylesheet
reveals a class on hover or focus without that fade.

Agent-Session: https://cmux.com/deeplink/agent?id=aid-fb75b7af9902231028aa
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 29, 2026
…d of blinking (#27560)

* gallery: hover-revealed transcript controls, settled and caught mid-fade

A new gallery entry (agent-pane.hover-fade) points at another agent's
waiting message line and at a finished call's output, each settled and
caught partway into its fade in, so the fade (or its absence) shows in a
still capture.

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

* agent chat: hover-revealed transcript controls fade instead of blinking

Leo (2026-10-28): "there should be, like, a fast fade-in fade-out. Right
now they're just appearing and disappearing. Like they're just blinking
in and out of existence, and it's a bit jarring".

Every control the transcript shows only on hover now takes the message
hover row's fade (#23769, --cv-actions-in/-in-delay/-out): out quickly at
rest, in after a beat under the pointer, at once from the keyboard.

- No fade before: another agent's message line's Reply and "Read after
  this step" tag, and a tool output's corner actions (Wrap lines).
- One-off timings before, now the shared fade: table Open/Copy, a sent
  message's Copy, Open chat on a disclosure line, media Open/Expand, a
  finished subagent line's actions, the live line's background hint.

test/transcript-hover-fade.test.ts fails when a transcript stylesheet
reveals a class on hover or focus without that fade.

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

* test: trailing-plates reads the tool output actions under the frame's Reduce Motion

The page asked Playwright for reduced motion, but the gallery frame
emulates its own media from its URL, so the actions' new fade in had
just started when their opacity was read ("0", not "1"). The frame now
gets reducedMotion=1 as well.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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