Skip to content

fix(next): stop transcript activity jolts and remove running pill - #29792

Merged
teamleaderleo merged 4 commits into
feat-cmux-nextfrom
lane/transcript-jolt-pill
Nov 1, 2026
Merged

teamleaderleo merged 4 commits into
feat-cmux-nextfrom
lane/transcript-jolt-pill

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

Leo called out that the transcript “keeps jolting every time there’s a new subagent or command,” looks terrible and misaligned, and asked why the bottom pill exists. This PR keeps live activity arrivals anchored and removes the duplicate running-activity pill above the composer.

Activity and running-tray rows now use opacity-only entry motion, so their measured space is reserved without translating the visible transcript. The old AgentsPill mount and its dock anchor are gone; the tray remains the single running-work surface. Coverage checks the activity-row fade, the reader anchor after an appended activity row, and that a running chat has no second pill. The chat-transcript design spec records the settled rule.

Validation: git diff --check; fleet webview tests will run on the PR head.

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

Stops the transcript from jolting whenever a subagent or command arrives, and removes the duplicate running-activity pill above the composer.

  • Activity rows and running-tray arrivals now use opacity-only entry motion, so the visible transcript stays put when new work appears.
  • Removed the AgentsPill and its dock anchor; the running tray is the single running-work surface, including when the tray debug setting is off.
  • Coverage checks the activity-row fade, that an appended activity row keeps the reader anchored, and that no second pill ever renders.

Written for commit 2d96db1. Summary will update on new commits.

View guided diff Turn on auto-fix

@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 2d96db1: 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=pr29792 -f ref=lane/transcript-jolt-pill -f platform=macos -f backend_mode=local

Gallery before/after for 2d96db1: 16 states rendered, 0 images differ, 1762 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 41255049303 -R manaflow-ai/cmux -n gallery-advisory-29792-2d96db19fd162bf1168c26097917d35b6c34a2e7 (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.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
agent-pane.background-activity/pinned-live-tail-dark Apple System Colors Light unchanged 0% own conversation.css
agent-pane.background-activity/pinned-live-tail-dark Apple System Colors unchanged 0% own conversation.css
agent-pane.background-activity/after-latest-message-light Apple System Colors Light unchanged 0% own conversation.css
agent-pane.background-activity/after-latest-message-light Apple System Colors unchanged 0% own conversation.css
agent-pane.background-activity/after-latest-message-dark Apple System Colors Light unchanged 0% own conversation.css
agent-pane.background-activity/after-latest-message-dark Apple System Colors unchanged 0% own conversation.css
agent-pane.background-activity/compact-pill-light Apple System Colors Light unchanged 0% own conversation.css
agent-pane.background-activity/compact-pill-light Apple System Colors unchanged 0% own conversation.css
agent-pane.background-activity/compact-pill-dark Apple System Colors Light unchanged 0% own conversation.css
agent-pane.background-activity/compact-pill-dark Apple System Colors unchanged 0% own conversation.css

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

Shipped in:

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

Copy link
Copy Markdown
Collaborator Author

Review (subagent): SHIP at 78eb279

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent): SHIP at 26f4dc2

2 similar comments
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent): SHIP at 26f4dc2

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent): SHIP at 26f4dc2

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent): SHIP at f6cf659

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent): SHIP at 2d96db1

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5 issues found across 10 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="webviews/src/agent-session/acpmux/subagents/subagents.css">

<violation number="1" location="webviews/src/agent-session/acpmux/subagents/subagents.css:1018">
P3: The tick keyframes no longer translate, but the comment above `.acpmux-tick` still says the old words 'leave up' and the new ones 'rise in'. Update that comment to describe the opacity-only crossfade. The `Tick` doc in trayMotion.tsx has the same stale wording.</violation>
</file>

<file name="webviews/test/subagent-tray-line-motion.test.ts">

<violation number="1" location="webviews/test/subagent-tray-line-motion.test.ts:66">
P2: This test title says the arrival does not move the transcript, but the assertions only compare the animation name, duration and easing. A `translate` added to `@keyframes cv-enter-fade` would still pass. Assert the keyframe content, for example through `document.getAnimations()` keyframes or the stylesheet's `cv-enter-fade` rule, so the no-movement guarantee is actually tested.</violation>
</file>

<file name="webviews/src/agent-session/acpmux/conversation/conversation.css">

<violation number="1" location="webviews/src/agent-session/acpmux/conversation/conversation.css:3522">
P2: The `:not(.acpmux-user)` guard leaves live notice rows on the 4px rise (`cv-enter`), while other activity rows fade only. Message rows never get `acpmux-row--enter` (they get `acpmux-row--message-enter`), so the guard only excludes these notices. Drop the guard so all live `acpmux-row--enter` rows use the opacity-only entrance, and update the comment.</violation>
</file>

<file name="webviews/src/agent-session/acpmux/bottomStack.css">

<violation number="1" location="webviews/src/agent-session/acpmux/bottomStack.css:189">
P3: This comment says the running tray uses the shared entry tokens, but subagents.css overrides the tray to an opacity-only `cv-enter-fade` arrival. Drop the tray from this list, or say it is handled in subagents.css.</violation>
</file>

<file name="webviews/src/agent-session/acpmux/subagents/runningTray.ts">

<violation number="1" location="webviews/src/agent-session/acpmux/subagents/runningTray.ts:13">
P3: Removing the pill leaves the subagents gallery claiming that its `agents-pill` variant renders it, although `App.tsx` no longer mounts `AgentsPill`. Update or remove that variant and coverage entry; if the component is deleted, move the shared `nestAgents` helper first.</violation>
</file>

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

const line = await motionOf(p, ".acpmux-running-tray__list > li");
await p.close();
expect(row).toBe("cv-enter 0.12s cubic-bezier(0, 0, 0.58, 1)");
expect(row).toBe("cv-enter-fade 0.12s cubic-bezier(0, 0, 0.58, 1)");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: This test title says the arrival does not move the transcript, but the assertions only compare the animation name, duration and easing. A translate added to @keyframes cv-enter-fade would still pass. Assert the keyframe content, for example through document.getAnimations() keyframes or the stylesheet's cv-enter-fade rule, so the no-movement guarantee is actually tested.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/test/subagent-tray-line-motion.test.ts, line 66:

<comment>This test title says the arrival does not move the transcript, but the assertions only compare the animation name, duration and easing. A `translate` added to `@keyframes cv-enter-fade` would still pass. Assert the keyframe content, for example through `document.getAnimations()` keyframes or the stylesheet's `cv-enter-fade` rule, so the no-movement guarantee is actually tested.</comment>

<file context>
@@ -55,13 +54,16 @@ await requireBrowserLane("subagent-tray-line-motion.test.ts", async () => {
     const line = await motionOf(p, ".acpmux-running-tray__list > li");
     await p.close();
-    expect(row).toBe("cv-enter 0.12s cubic-bezier(0, 0, 0.58, 1)");
+    expect(row).toBe("cv-enter-fade 0.12s cubic-bezier(0, 0, 0.58, 1)");
     expect(card).toBe(row);
     expect(line).toBe(row);
</file context>

/* Live activity is absolutely placed by VirtualTranscript. Its first paint must not slide the
visible transcript when a subagent or command arrives; the row's measured box is already in
the layout, so only its ink fades in. Message rows keep their dedicated presentation motion. */
.acpmux-row.acpmux-row--enter:not(.acpmux-user):not(.acpmux-assistant) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The :not(.acpmux-user) guard leaves live notice rows on the 4px rise (cv-enter), while other activity rows fade only. Message rows never get acpmux-row--enter (they get acpmux-row--message-enter), so the guard only excludes these notices. Drop the guard so all live acpmux-row--enter rows use the opacity-only entrance, and update the comment.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/conversation/conversation.css, line 3522:

<comment>The `:not(.acpmux-user)` guard leaves live notice rows on the 4px rise (`cv-enter`), while other activity rows fade only. Message rows never get `acpmux-row--enter` (they get `acpmux-row--message-enter`), so the guard only excludes these notices. Drop the guard so all live `acpmux-row--enter` rows use the opacity-only entrance, and update the comment.</comment>

<file context>
@@ -3516,6 +3516,12 @@ a.cv-sha:focus-visible {
+  /* Live activity is absolutely placed by VirtualTranscript. Its first paint must not slide the
+     visible transcript when a subagent or command arrives; the row's measured box is already in
+     the layout, so only its ink fades in. Message rows keep their dedicated presentation motion. */
+  .acpmux-row.acpmux-row--enter:not(.acpmux-user):not(.acpmux-assistant) {
+    animation: cv-enter-fade var(--agent-motion-in, 180ms) var(--agent-ease-out, ease-out) both;
+  }
</file context>
Suggested change
.acpmux-row.acpmux-row--enter:not(.acpmux-user):not(.acpmux-assistant) {
.acpmux-row.acpmux-row--enter {

@keyframes acpmux-tick-out {
to {
opacity: 0;
translate: 0 -0.4em;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: The tick keyframes no longer translate, but the comment above .acpmux-tick still says the old words 'leave up' and the new ones 'rise in'. Update that comment to describe the opacity-only crossfade. The Tick doc in trayMotion.tsx has the same stale wording.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/subagents/subagents.css, line 1018:

<comment>The tick keyframes no longer translate, but the comment above `.acpmux-tick` still says the old words 'leave up' and the new ones 'rise in'. Update that comment to describe the opacity-only crossfade. The `Tick` doc in trayMotion.tsx has the same stale wording.</comment>

<file context>
@@ -1009,13 +1010,11 @@ button.cv-subagent > :last-child {
   to {
     opacity: 0;
-    translate: 0 -0.4em;
   }
 }
 
</file context>

from a few points below where they land (ui-enter, ui/popupSurface.css). Their space opens in one
frame, as the stack's flow takes it; only the drawing travels. */
/* What joins the bottom stack enters from the composer as it appears (Leo 2026-10-20): a question,
a notice, the pull request dock, the running tray and a queued prompt use the shared entry tokens.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: This comment says the running tray uses the shared entry tokens, but subagents.css overrides the tray to an opacity-only cv-enter-fade arrival. Drop the tray from this list, or say it is handled in subagents.css.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/bottomStack.css, line 189:

<comment>This comment says the running tray uses the shared entry tokens, but subagents.css overrides the tray to an opacity-only `cv-enter-fade` arrival. Drop the tray from this list, or say it is handled in subagents.css.</comment>

<file context>
@@ -191,10 +185,9 @@
-   from a few points below where they land (ui-enter, ui/popupSurface.css). Their space opens in one
-   frame, as the stack's flow takes it; only the drawing travels. */
+/* What joins the bottom stack enters from the composer as it appears (Leo 2026-10-20): a question,
+   a notice, the pull request dock, the running tray and a queued prompt use the shared entry tokens.
+   Their space opens in one frame, as the stack's flow takes it; only the drawing travels. */
 .acpmux-dock > :not(.acpmux-composer, .acpmux-home-area, .acpmux-asks-stack),
</file context>
Suggested change
a notice, the pull request dock, the running tray and a queued prompt use the shared entry tokens.
a notice, the pull request dock and a queued prompt use the shared entry tokens; the running tray has its own (subagents.css).

// means on.
// the transcript then draws the old group card where the subagents started (SubagentGroup.tsx) and
// the running turn's line counts the work (conversation/WorkingFor.tsx). The separate running
// activity pill above the composer is intentionally not rendered. The host sends the setting with

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: Removing the pill leaves the subagents gallery claiming that its agents-pill variant renders it, although App.tsx no longer mounts AgentsPill. Update or remove that variant and coverage entry; if the component is deleted, move the shared nestAgents helper first.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/subagents/runningTray.ts, line 13:

<comment>Removing the pill leaves the subagents gallery claiming that its `agents-pill` variant renders it, although `App.tsx` no longer mounts `AgentsPill`. Update or remove that variant and coverage entry; if the component is deleted, move the shared `nestAgents` helper first.</comment>

<file context>
@@ -8,10 +8,10 @@
-// means on.
+// the transcript then draws the old group card where the subagents started (SubagentGroup.tsx) and
+// the running turn's line counts the work (conversation/WorkingFor.tsx). The separate running
+// activity pill above the composer is intentionally not rendered. The host sends the setting with
+// the theme (`subagentTray`); absent means on.
 import { useSyncExternalStore } from "react";
</file context>

@teamleaderleo
teamleaderleo merged commit c1d6442 into feat-cmux-next Nov 1, 2026
170 of 175 checks passed
@teamleaderleo
teamleaderleo deleted the lane/transcript-jolt-pill branch November 1, 2026 00:09
teamleaderleo added a commit that referenced this pull request Nov 1, 2026
Base now leaves usage out of every subagent list, the Inspector's
included; only Context says tokens. So useAgentProgress always reads
without usage, and the usage option and progressUsage prop go away. The
agents pill is gone from base (#29792), so the progress store's comment no
longer names it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-63b9964940c20354b639
teamleaderleo added a commit that referenced this pull request Nov 1, 2026
Conflicts:
- App.tsx: base removed the per-message PR chip row (#29614) and the
  agents pill (#29792). Keep both removals; keep this PR's N PRs stack
  (PullRequestStackProvider, PullRequestList, PullRequestCountInStack).
  useTranscriptPullRequests moves into summary/PullRequestStack.tsx
  (without the removed legacy modes), and its three strings
  (prDock.label, prDock.count, prDock.countOne) come back.
- bottomStack.css: keep the stack edge tokens; drop the agents-pill
  anchor, pr-dock and pr-comparison selectors base removed.
- summary.css: take base (the pr-dock and pr-comparison rules are gone).
- design-tokens-baseline.jsonl: base's, regenerated with
  --update-baseline (one entry shrinks: the recap's old padding).
- Tests and gallery: drop the legacy-bars variant, the agent-pane.pr-dock
  frames and the agents-pill part; the per-message pills now count 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-f71664ebfb6cf5206479
teamleaderleo added a commit that referenced this pull request Nov 1, 2026
App.tsx: base removed the running agents pill (#29792); the PR's opened-PR
chips and the above-composer count stay where the pill was.

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

This branch was previously deployed

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