Repository navigation
fix(next): stop transcript activity jolts and remove running pill - #29792
Conversation
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Gallery before/after for
States
Pick other states with a Shipped in:
|
|
Review (subagent): SHIP at 78eb279 |
|
Review (subagent): SHIP at 26f4dc2 |
2 similar comments
|
Review (subagent): SHIP at 26f4dc2 |
|
Review (subagent): SHIP at 26f4dc2 |
|
Review (subagent): SHIP at f6cf659 |
|
Review (subagent): SHIP at 2d96db1 |
There was a problem hiding this comment.
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)"); |
There was a problem hiding this comment.
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) { |
There was a problem hiding this comment.
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>
| .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; |
There was a problem hiding this comment.
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. |
There was a problem hiding this comment.
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>
| 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 |
There was a problem hiding this comment.
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>
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
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
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
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
AgentsPillmount 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
Need help on this PR? Tag
@codesmith-botwith 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.
AgentsPilland its dock anchor; the running tray is the single running-work surface, including when the tray debug setting is off.Written for commit 2d96db1. Summary will update on new commits.