Repository navigation
Transcript: a finished Claude turn folds per run, as Claude desktop does (Codex unchanged) - #30176
Conversation
Leo (2026-11-01): "separate it per harness/model family. claude gets claude behaviour, codex gets codex". Codex and ChatGPT keep today's fold: the whole turn's work and chatter under one Worked for, the answer below it. A Claude chat ends as Claude desktop draws it: no Worked for; each run of calls, with the short notes inside it (an edit run too), folds into its own summary line that opens on a click, and a longer message between runs stays in place. Steers and the reply before each stay in sight in both (#29740), and that reply never joins a run. Keyed on the session family App.tsx passes since #29802. transcript-claude-turn-groups.test.ts replays one real Claude Code turn as acpmux recorded it (81 calls, 17 messages; words and commands replaced), plus a steered turn, for both families. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ccd47120b442de37f367
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ccd47120b442de37f367
|
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 red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: Shipped in:
|
|
Owned by an agent session · session |
|
Review (subagent claude-opus-5-5 medium): SHIP at a4692e7 Codex/ChatGPT output unchanged (every new branch is gated on the Claude family; mergeShortNotes keeps its defaults). Claude: no duplicate ids from edit runs, render cards and permission rows drawn as in today's opened fold, cache keyed on family, Find/toggle harmless without a Worked-for row. Fixture holds only neutral text. 183ff65..a4692e7 is formatting only. Follow-ups:
|
|
Found 4 test failures on Blacksmith runners: Failures
|
A finished Claude turn has no Worked for (turns.ts claudeGroups), so the browser tests that opened it to reach its calls or a subagent's done line read them where a Claude chat draws them: the run's own line, or in sight. The spacing test measures the first run line under the prompt. The history paging tests read Worked for's label and its folded compaction, the Codex family's fold, so their chats say family codex. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-ccd47120b442de37f367
Bugbot needs on-demand usage enabledBugbot 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. |
|
Review (subagent claude-opus-5-5 medium): SHIP at 36b5517 a4692e7..36b5517 is test-only: the browser tests that opened a Claude turn's Worked for now open its run line or read the line in sight (subagent done, spacing); history paging asserts Codex's fold, so its chats say family codex. Each keeps its intent. Follow-ups:
|
There was a problem hiding this comment.
1 issue found across 4 files (changes from recent commits).
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/test/agent-pane-transcript-spacing.test.ts">
<violation number="1" location="webviews/test/agent-pane-transcript-spacing.test.ts:196">
P2: This selector also accepts an individual tool row, so the test can pass when Claude renders calls directly instead of a run summary. Select the run-summary shape explicitly so this regression remains covered.</violation>
</file>
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
| const firstContent = afterFirst.querySelector(".cv-md, .cv-worked") ?? afterFirst; | ||
| const worked = rowAfter(userRow("Ship it when green.")).querySelector(".cv-worked"); | ||
| // A Claude turn's first run line, where a Codex turn draws Worked for (turns.ts claudeGroups). | ||
| const worked = rowAfter(userRow("Ship it when green.")).querySelector(".cv-worked, .cv-tool"); |
There was a problem hiding this comment.
P2: This selector also accepts an individual tool row, so the test can pass when Claude renders calls directly instead of a run summary. Select the run-summary shape explicitly so this regression remains covered.
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/agent-pane-transcript-spacing.test.ts, line 196:
<comment>This selector also accepts an individual tool row, so the test can pass when Claude renders calls directly instead of a run summary. Select the run-summary shape explicitly so this regression remains covered.</comment>
<file context>
@@ -192,7 +192,8 @@ await requireBrowserLane("agent-pane-transcript-spacing.test.ts", async () => {
const firstContent = afterFirst.querySelector(".cv-md, .cv-worked") ?? afterFirst;
- const worked = rowAfter(userRow("Ship it when green.")).querySelector(".cv-worked");
+ // A Claude turn's first run line, where a Codex turn draws Worked for (turns.ts claudeGroups).
+ const worked = rowAfter(userRow("Ship it when green.")).querySelector(".cv-worked, .cv-tool");
// Turn footers only: a reply's own row (cv-reply-actions) reuses their look.
const footers = [...document.querySelectorAll<HTMLElement>(".cv-turn-actions:not(.cv-reply-actions)")];
</file context>
| const worked = rowAfter(userRow("Ship it when green.")).querySelector(".cv-worked, .cv-tool"); | |
| const worked = rowAfter(userRow("Ship it when green.")).querySelector(".cv-worked, .cv-tool[aria-expanded]:not([data-tool-id])"); |
…ays) (#30265) * gallery health: gate layout shift on load and every play step (element boxes per frame) WIP: baseline seeded in a following commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: shift scenarios play Codex folds and the debug load_seed history; document the shift gate Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery health: check the design specs' geometry rules from the DOM of every state Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: real-shaped recorded Claude and Codex chats (anonymized replays) Leo, 2026-11-01: "how about like the apparatuses for improving ui verification? let's examine what we can do better for our workflows". anonymize-recording.ts turns an acpmux session recording into a fixture with none of its words (same lengths, line breaks and punctuation; fake ids, fixed epoch). agent-pane.recorded-chats replays the #30176 Claude turn and a real Codex turn steered by agent inbox messages through the pane's own client, so gallery health's shift and geometry checks see real-shaped chats. Tests: bun test test/gallery-anonymize-recording.test.ts (2 pass). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery-matrix: write shift rows from the worst seeding run A state that shifts in some runs got a 0 row when rows were written from the least run, and would then fail unrelated PRs on its flaky runs. Review follow-ups 2 and 3 on #30250. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: older-history waits on a boolean (typecheck) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery-matrix: seed shift-baseline.json from two gallery-health runs Rows from the worst of #30250's two full gallery-health runs (0ac1691 and a17daa5): 2763 states, 561 with a non-zero row. A state at 0 now fails on any shift; the rest fail past their row by a quarter. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: a wait step never fails a play; gallery health scores its shift The webview suite found that measuring waitFor as a step made existing plays fail on what they wait for: the header PR button arriving (header-tools), the mention list opening (composer-mention), the composer controls settling (narrow-layouts). A wait now goes unjudged in judgeStep, for shift, anchor moves, long frames and settle. Its shift is still measured and scored against the state's row in gallery health's shift baseline. Test: bun test test/gallery-shift.test.ts. The new case fails on the previous head and passes here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: say a wait step still gets the popup-layer check Review follow-up on #30250. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery: smooth zero-row shift limit, copy-proof violation keys, listboxes only in popups Three review follow-ups on #30256, fixed before the geometry baseline is seeded so its keys do not bake them in: - Every shift row's limit now adds LIMIT_SLACK (0.0005), a 0 row's included. A 0 row was ten times stricter than a tiny row, at the level where frame timing alone scores. - Violation keys use the row id, data-id, data-value, value or aria-label before an element's text, so a copy-only PR does not rename a listed violation. Plain generated ids are never used. - A listbox counts as a menu only inside a popover or dialog, so pane-wide list panels do not trip menu-fit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * gallery-matrix: reseed shift rows from three runs, seed geometry rows Shift rows are rebuilt from the worst of three full gallery-health runs: the two on #30250 and this PR's run at 92c5bb5 on base 593b25f. That gives 2843 states, 608 of them non-zero. Base moved after the first seed, and one flaky state, model-picker#quick-search-field-opencode (0.0024 to 0.0081 across renders), came out as this PR's own red. Geometry rows come from that run: 2841 states, 345 with listed violations. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * Gallery geometry baseline: add the violations base gained since the seed run Base 762fda7 (after #30652 and #30194) adds center-line violations to the folded-run, queued-from-agent, hover-fade and incoming-message states; the base replay cannot excuse them until base has the checker, so they join the baseline rows from gallery-health run 41322226213. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * Shift baseline: motion.sync-list#inserts-from-second-client row 0.0059 The insert from a second client animates the list rows into place; three seed runs scored 0, gallery-health run 41327725064 scored 0.0059 on the Replay click. A real insert moves rows, so its row is that run's score. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * Gallery baselines: seed shift rows from the worst of five full runs Full renders (this PR changes scripts/gallery-matrix) kept turning up states that shift in some runs and in every attempt of that run (guest-page.waiting#decided, artifact-panel#svg, settings-menus#customized), so three seed runs were not enough. Shift rows are rebuilt from scratch as the worst score of the three seed runs plus gallery-health runs 41322226213 and 41335560293; geometry rows gain the 3 keys the last run saw. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a * anonymize-recording: keep each event's kind in its typed output The scrubbed rest is typed through Omit of an index-signature type, which drops the required kind, so the merge with base failed the webviews type check (TS2741). The kind is a protocol word the scrubber keeps; set it from the event. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e1bbe8a486fbacd68f4a --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… Worked for over one stretch (#31825) * Transcript: a Codex turn header reads N previous messages over a mix Codex folds a turn with the agent messages between its work under N previous messages, and one stretch of work under Worked for. Claude turns keep their per-run folding (#30176). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e9d08b9237cbd1067052 * Transcript: codexHeader test labels type-clean Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-e9d08b9237cbd1067052 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo, 2026-11-01: "do we have the claude style tool call/interim chatter collapse restored yet the 7:11 nightly didnt' seem to have that nor the expanding tool calls doesn't push chats up yet"
Then, on how: "separate it per harness/model family. claude gets claude behaviour, codex gets codex".
Why Claude lost it. Replaying a real Claude Code turn through the pane's client and
turnViewshowed the calls folding under Worked for but every interim note left outside it. #29802 turned the interim fold off for Claude chats (preserveAssistantText). Leo wants #29802 kept for Codex, so this keeps it and gives Claude its own behaviour.What changes, keyed on the session family App.tsx already passes (
snapshot.summary?.family):hasReplyActionsis off app-wide; the footer copies the turn).Tests
transcript-claude-turn-groups.test.tsreplays one real Claude Code turn as acpmux recorded it (fixtures/claude-turn-groups.ndjson: 81 calls, 17 messages, every word and command replaced with neutral text of the same short or long kind). For Claude it checks: no Worked for, every run folded, no short note left between runs, the 3 long messages in place, the answer last. For Codex it checks that the same events still give one Worked for and the answer.u, run(b1+note), r1, run(b3), s1, run(b4+note), answer, summary. For Codex,u, Worked for, r1, s1, answer, summary(today's output, pinned).transcript-steer-continuous.test.tsx: the two Transcript: fold assistant prose only for Codex sessions #29802 Claude expectations move to the new behaviour, and the one-fold steer test runs as Codex.tscis clean apart fromtest/latency/probe.ts, which this PR doesn't touch.vp fmtandvp lintare clean.Risk: transcript shaping only (
turns.tsshapeTurnandmergeShortNotes), and every new branch is gated on the Claude family. No Swift, no persistence.Agent session: agent session
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
A finished Claude chat turn now folds per run, as Claude desktop draws it, while Codex and ChatGPT keep today's behavior of folding the whole turn under one "Worked for".
Behavior
Tests
transcript-claude-turn-groups.test.ts, which replays one real Claude Code turn (81 calls, 17 messages) and a steered turn for both families, checking the per-run fold for Claude and the single "Worked for" for Codex.transcript-steer-continuous.test.tsxto the new per-run behavior.Written for commit 36b5517. Summary will update on new commits.