Repository navigation
cmux NEXT agent pane: a message the person types always goes, queued or as a steer - #24039
teamleaderleo wants to merge 10 commits into
Conversation
…eer keeps its own gesture Red on base: two Enters before the relay checks either frame leave the second with no gesture (a newer session/prompt ticket revokes the older, and the first prompt going out clears the rest), and the page sends no per-prompt ticket. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d41-f5e8-7631-b4aa-a544e3ef96a8&host=cosmic-gray
…a steer The host counted one gesture at a time and checked a prompt's frame only when its serial relay got to it. Two sends before the first frame was checked (a steer typed right after another, a prompt queued behind a running turn) left the second with nothing: "Not sent: it needs your own key press or click". Each send into a shown chat now binds its own gesture to its promptId at once (transport.gesture); the frame carries that ticket however late the relay checks it. A prompt's ticket has its own slot (a newer Enter no longer revokes it) and survives another prompt going out. A ticket still sends only its own promptId, once; a prompt with no gesture of the person's is refused as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d41-f5e8-7631-b4aa-a544e3ef96a8&host=cosmic-gray
|
Owned by nx-chat on big-red · took over from session 01a15d41 |
|
Found 31 test failures on Blacksmith runners: Failures
...and 21 more test failures. View all on Blacksmith: run 39865687662, run 39865687704, run 39865687691
|
|
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)
Probably yours: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on 84d5d32 to compare; do not merge until green; see lane-rules Gallery before/after for
States
Pick other states with a |
Review: with a slot per prompt, a page could bank one ticket per key press for ten minutes. Keep the newest eight per connection (issue order), name the clear for what it keeps, and say in direct.ts where a send can wait first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d41-f5e8-7631-b4aa-a544e3ef96a8&host=cosmic-gray
|
Bead |
Codex review: with a hard cap of eight, a ninth fast Enter revoked the first prompt's ticket before the relay got to it. The cap now drops only tickets older than a live gesture (a banked one, or one waiting on a trust answer), so any number of prompts typed in a burst all go. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d41-f5e8-7631-b4aa-a544e3ef96a8&host=cosmic-gray
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. |
|
|
Codex review: a page that reserves on every key press and never sends kept every fresh ticket. A connection now holds at most 64 prompt tickets in all (the oldest go first); the cap of 8 on stale ones stays. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d41-f5e8-7631-b4aa-a544e3ef96a8&host=cosmic-gray
Codex review: App.tsx's send awaits the chat's start and persistence before client.send, and the composer is free meanwhile, so two Enters could still share one gesture. The send now binds its gesture first (bindSendGesture) and passes the pending ticket on. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d41-f5e8-7631-b4aa-a544e3ef96a8&host=cosmic-gray
|
Review (codex xhigh via acpmux, correctness first): SHIP at 23f1405 A Codex reviewer (gpt-6.1-sol, xhigh, read-only, via acpmux on cmux16) did four rounds. Each CHANGES finding was fixed before the next round:
An earlier Claude subagent review also said SHIP, at ee52d42 and at ebf50b4. Evidence:
|
…r-send-is-person # Conflicts: # webviews/src/agent-session/acpmux/direct.ts
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 (codex xhigh via acpmux, correctness first): SHIP at 6afa7a2 Codex (xhigh, acpmux on cmux16, read-only from Person-proof still holds. One gesture gives one ticket, scoped to its promptId and connection, single use, with a lifetime, and the tickets per connection are capped. A script or agent with no key press or click gets no ticket, same as on base. Evidence at this head:
|
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. |
|
Orphaned: no activity for 14 h, and no lane holds a lease on it. Adopted by the orphan sweep: merged |
|
Stale (13d, conflicts); rebuild fresh from feat-cmux-next if still wanted |
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
What broke
Leo typed a message into a Claude chat's composer while a turn ran, and it came back under its bubble as "Not sent: it needs your own key press or click", with the earlier steer's "Send now" above it. His own typed message was refused as if a script had sent it.
Root cause: the host relay (
AgentPaneTransport) counts the person's gesture as one slot. Every key press or click in the pane refreshes that slot, and asession/promptframe uses it up when the relay decides the frame. The relay decides page frames one at a time, after an off-main parse and a hop back to the main actor. The composer frees itself at once (#22742), so a fast typist can send a second steer, or queue a prompt behind the turn, before the relay has decided the first frame. Then the first frame spends the only gesture, and the second frame finds none and is refused withtransport.gesture_required. Steers and queued prompts are not replayed by the page or the host. acpmux runs the frame it was given, so nothing later adds a gesture back.The existing per-prompt ticket (
transport.gesturewith{method: "session/prompt", params: {promptId}}, used for prompts held for the trust answer) could not cover this case:Fix
direct.tssend): a send into a shown chat reserves a ticket for its own promptId right away, before anyawait, while the person's key press is still fresh. The frame carries it as_meta.cmuxGesture.session/newstill gets the Enter's gesture.session/promptticket gets its own slot per promptId (AgentPaneGestureIntent.slot);clearTicketsKeepingPrompts), so other prompts' tickets stay;The person proof is not weakened:
AgentPaneUserGestures.reserve).heldPromptLifetime.Tests
AgentPaneTypedPromptTicketTests(CmuxNextAgentPaneTests), at the relay:typedPromptGesture.test.ts(webviews): a running prompt, a queued prompt and a steer each reserve their own ticket at send time and carry it. A kept ticket is used as is. Input that is not the person's goes without a ticket.Fleet evidence: see the review comment (red on the test commit b8c1115, green at the head).
Observed / Not run
prepush-gate.pyhas no new violations.No capture: no visible UI change. The fix is in the relay's gesture check and the page's send path, and the tests cover it at those layers.
Changelog
Fixed: A message you type in an agent chat while a turn runs, queued or sent as a steer, is no longer refused as "Not sent: it needs your own key press or click".
Agent session: cosmic-gray
🤖 Generated with Claude Code