Skip to content

Agent chat: no "Worked for 0s"; an empty turn footer takes no line - #24055

Merged
teamleaderleo merged 4 commits into
feat-cmux-nextfrom
tp/no-zero-second-footer
Oct 22, 2026
Merged

teamleaderleo merged 4 commits into
feat-cmux-nextfrom
tp/no-zero-second-footer

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Leo (2026-10-21) on a turn footer reading "Worked for 0s" with its Pin and age on a full line: "IF WE 0 SECONDS THEN IT DOESNT NEED TO TAKE UP SPACE!?"

  • A turn under a second says no "Worked for" in its footer (footerLabel, conversation/turns.ts). A turn stopped within a second still says "You stopped after 0s", and one whose work folds under "Worked for" says nothing there, as before. 5 s and up are unchanged ("Worked for 5s").
  • A footer with nothing to show at rest (no answer to Copy or Read aloud, no label, not failed: only Pin, Fork and its age, all hover-only) is now empty (isEmptyFooter) and takes no line: its row is the turn gap alone. When the pointer is on the turn, its controls show over that 24px gap (.cv-turn-actions--empty, absolute), so nothing moves. The chat's last footer has only the 8px message gap, too short for the line, so an empty one draws nothing there; the prompt's own hover row has the same Fork and age.
  • The virtualizer's first-layout estimate (model.ts fallbackRowHeight) matches: an empty footer is TURN_GAP (or MESSAGE_GAP when last), with no META_ROW.
  • Footers with an answer keep their reserved hover row, the same pattern as the prompt's hover row from cmux NEXT agent chat: message hover rows like Claude's (check, age, Copy, Retry, Fork; just now; exact time above) #23769.

Scope: the gap above a "Received message from" row is #23925's (another lane): this PR leaves that row and its alignment alone. It does shrink the empty footer between a prompt and that row by its 24px line. #23843 (merged) changed what folds into "Worked for", not the footer label; no conflict.

Before / after (Linux gallery, synthetic fixtures)

New entries agent-pane.transcript sub-second-turns (at rest) and sub-second-turns-pointed (pointer on the quiet turn's prompt). The before column is the same entry on the base (branch tp/no-zero-second-footer-before, base + this gallery entry only, not for merge):

Measured in the gallery frames (headless Chromium, row heights): before, both sub-second footers were 48 px and read "Worked for 0s"; after, the quiet turn's footer is 24 px (the turn gap alone) with no label, the sub-second answer's footer is 48 px with no label (it keeps its line for Copy), and the 5 s turn still reads "Worked for 5s".

Tests

webviews/src/agent-session/acpmux/conversation/TurnFooter.test.tsx (commit 42384d7 before the fix):

  • 0, 1 and 999 ms turns: no label and no "Worked for" in the rendered footer.
  • A 5 s turn: "Worked for 5s".
  • A stopped sub-second turn still says it stopped; a folded turn's footer says nothing.
  • isEmptyFooter: only hover controls is empty; an answer, a label or a failure is not; the rendered footer carries cv-turn-actions--empty only when empty.
  • Layout: an empty footer between prompts is 24 px (the turn gap), 8 px when last; a footer with an answer stays 48 px.

On the base the new test fails (it imports footerLabel and isEmptyFooter, which do not exist there).

Observed / Not run

Changelog

  • Fixed: the agent chat no longer shows "Worked for 0s" under a turn that took under a second, and a turn with nothing to copy no longer leaves an empty footer line.

No capture: webview-only change; before/after are the Linux gallery entries above.

Agent session: cosmic-gray

🤖 Generated with Claude Code

teamleaderleo and others added 3 commits October 21, 2026 18:12
…akes no line

Leo (2026-10-21) on a footer reading "Worked for 0s" with its pin and age taking a full line:
"IF WE 0 SECONDS THEN IT DOESNT NEED TO TAKE UP SPACE". These cases fail on the base.

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
…no line

A turn's footer said "Worked for 0s" for a turn under a second, and a footer with nothing to
show at rest (no answer to copy, no label, only Pin, Fork and its age, all hover-only) still
took its 24px line. A turn under a second now says nothing there (a stopped one still says it
stopped), and an empty footer's row is its turn gap alone: pointed at, its controls show over
that gap, so nothing moves. The virtualizer's estimate 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
A quiet turn under a second with no answer, a sub-second answer and a 5s one, for the
before/after of the footer that said "Worked for 0s" and took a line.

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

Owned by transcript-parity on cosmic-gray · session

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

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

Review f4d823c: 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=pr24055 -f ref=tp/no-zero-second-footer -f platform=macos -f backend_mode=local

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

gh run download 39712480012 -R manaflow-ai/cmux -n gallery-advisory-24055-f4d823cb405da05d7a049364511cd5f78160c657 (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.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
agent-pane.diff-panel/escape Apple System Colors Light unchanged 0% own conversation.css
agent-pane.diff-panel/escape Apple System Colors unchanged 0% own conversation.css
agent-pane.diff-panel/review-file Apple System Colors Light unchanged 0% own conversation.css
agent-pane.diff-panel/review-file Apple System Colors unchanged 0% own conversation.css
agent-pane.diff-panel/stage-hunk Apple System Colors Light unchanged 0% own conversation.css
agent-pane.diff-panel/stage-hunk Apple System Colors unchanged 0% own conversation.css
agent-pane.diff-panel/more-lines Apple System Colors Light unchanged 0% own conversation.css
agent-pane.diff-panel/more-lines Apple System Colors unchanged 0% own conversation.css
agent-pane.path-chip/file Apple System Colors Light unchanged 0% own conversation.css
agent-pane.path-chip/file Apple System Colors unchanged 0% own conversation.css
agent-pane.path-chip/folder Apple System Colors Light unchanged 0% own conversation.css
agent-pane.path-chip/folder Apple System Colors unchanged 0% own conversation.css
agent-pane.path-chip/outside-lock Apple System Colors Light unchanged 0% own conversation.css
agent-pane.path-chip/outside-lock Apple System Colors unchanged 0% own conversation.css
agent-pane.path-chip/outside-text Apple System Colors Light unchanged 0% own conversation.css
agent-pane.path-chip/outside-text Apple System Colors unchanged 0% own conversation.css

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

Unclear: web / react-apps-check failed: no known signature; failed step: Check webview test shards.

CI failed on f4d823cb40 (run 39712480260 attempt 1): 1 code, 1 unknown.

Job Verdict Why
web / react-apps-check (1) code a Python test failed
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • seen on other PRs agent-pane-peer-chat.test.ts a chat on an SSH machine > counts its running turn from the prompt and offers no machine switch mid-...: failed (job)
Matched log lines
web / react-apps-check (1): ERROR: test_real_vp_formats_an_edited_webviews_file (__main__.FormatPostEditTests.test_real_vp_formats_an_edited_webviews_file)

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: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: red check: Tier routing is not red on the base 9d1f7e6; do not merge until green; see lane-rules
red: web / Web status; base red: the same failure on the base 9d1f7e6; does not block
red: web / react-apps-check; base red: the same failure on the base 9d1f7e6; does not block
red: web / react-apps-check (1); NEW: green on the base 9d1f7e6; do not merge until green; see lane-rules

Tour of f4d823cb40 (run): no media. The tour did not run: only webview code changed (6 path(s)), which the gallery advisory run checks in Linux Chromium on the pull request (its artifact holds any captures); add the media-tour-mac label, then re-add media-tour, to tour it on a Mac.

@blacksmith-sh

blacksmith-sh Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Found 17 test failures on Blacksmith runners:

Failures

Test View Logs
---/--- View Logs
/tmp/tmp5wyeu1rj/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpnuovffpe/summary-missing.json (live):/summary-missing.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs
[new_workspaces] the window draws no frames/[new_workspaces] the window draws no frames View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
convention violations found (ERROR lines above)./
convention violations found (ERROR lines above).
View Logs
nightly cmux-tui resolve/nightly cmux-tui resolve View Logs
test/agent-pane-peer-chat.test.ts/agent-pane-peer-chat.test View Logs

...and 7 more test failures. View all on Blacksmith: run 39712480260, run 39712480090, run 39712480216

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

@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 22, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › Checks job structure is red on 8 of 8 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › Tier routing is red on 7 of 8 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent, correctness first): SHIP at f4d823c

Reviewed the diff against feat-cmux-next, plus the delta from 9638f93 (gallery hover moved to .acpmux-turnSummary), and how it interacts with #23925's wider isLastFooter.

Correctness

  • isEmptyFooter matches what TurnFooter draws. It is empty only when there is no label (folded, or under 1 s, not cancelled, with a previous/durationMs defined), no text (so no Copy or Read aloud), and the turn is not failed/error (so no Retry, retry menu, sign-in or failure note). What remains is Fork, Pin and the time, all inside the opacity-0 container. I found no case that is classed empty but shows something at rest, or classed full but shows nothing. (A row with text but no label still keeps its line, as intended.)
  • CSS between turns: the row is position:absolute with min-height:0 and padding-bottom:24px, and its in-flow content is now empty, so it draws at 24px. The overlay sits at inset:0 0 auto with min-height:24px, so it fills exactly the row's padding box. contain: paint clips nothing, it overlaps no other row, and its pointer area is the row's own gap, which was already the footer row's hit area. Hovering the row and data-turn-revealed reveal it as before, and nothing shifts.
  • Last footer: the row is 8px, so a 24px overlay would be clipped to a sliver. display:none is the right call. The prompt's own Fork forks through the same turn (UserBubble promptTurns), so no fork entry is lost.
  • Estimates: fallbackRowHeight gives 0+24 and 0+8, which match the drawn 24 and 8 (and the author's headless measurements: 24/48/32). This also holds for Agent pane: a task's "Received message from" line sits at the left with the agent's text, no gap above #23925's received/incoming last footers, which get 8 in both the CSS and the estimate.
  • Existing tests: rowEstimates.test.ts footers all carry text, so 48/32 are unchanged. The browser tests (agent-pane-turn-footer, transcript-spacing, turn-error-layout, chat-icon-tooltips) use turns that have answers or failures, so their footers stay non-empty, and turn-footer's .cv-turn-summary lookup still finds a label (an unfolded turn over 1 s, or no duration). I didn't run them (bun test is blocked here); this is from reading the code.
  • New test: the types check (Translate, Partial<AcpmuxRow>). Every hook TurnFooter uses has a server snapshot, so renderToStaticMarkup is safe. The assertions fail without the change (the label, the --empty class, and the 24/8 heights).

Non-blocking

  • When a turn with no answer ends (for example, tools only), the live below line (32px) gives way to an 8px last footer, so the bottom moves up 24px at turn end. The fold reshapes that turn anyway, but it is a small shift.
  • A keyboard-focused last empty footer reveals nothing (display:none), so its Pin/Fork can't be reached from the keyboard there. The prompt row still offers Fork.

@teamleaderleo
teamleaderleo merged commit 2c600a4 into feat-cmux-next Oct 22, 2026
@teamleaderleo
teamleaderleo deleted the tp/no-zero-second-footer branch October 22, 2026 03:14
@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

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