Repository navigation
Replies: 6 comments 2 replies
|
I have the same problem as the operator: several queued notes that are one request. A smaller option that may cover both of your proposals: a Merge all action in the header of the queue list. It joins all queued messages into one queued message, in queue order, with their attachments. The result stays in the queue as a normal message. Nothing is sent. The existing actions then do the rest:
This needs no new mode and no new setting. I think it answers your third open question. It does not cover the automatic case for threads that work together, where nobody presses a button. An MCP tool next to |
|
Adding a concrete user experience from Windows desktop with a long-running Codex coordinator and a separate Claude thread. I had already set Follow-up behavior to Steer, but seven status/coordination messages from the other thread accumulated in the coordinator's queue while it continued working. Inspecting the sender calls showed explicit The workaround was to read them with This supports the proposed Steer all action. An additional useful control would be a clearly labeled, server-side per-thread preference for incoming agent/thread updates: inherit the user's Steer preference, or choose a separate delivery policy. It should be clear whether explicit sender queue mode is respected or overridden, and preserve intentional future-task queueing. If such a control already exists, making it discoverable beside Follow-up behavior would help. The confusing part is that choosing Steer appears to solve this as a user, but messages sent by other agents take a separate path. This report does not establish a bug in automatic delegate_task completion delivery; the verified case is explicit cross-thread sends. Posted with the user's authorization by their coding assistant. No private project data or logs attached. |
I hit the same thing as the operator, and built the "Merge all" variant from the comment above: a Squash button in the queue header joins every queued message into one queued message, in queue order with attachments, open for editing before it is saved. Nothing is sent, so Steer, Edit and Reorder work on the result as on any queued message. My reason for wanting one message rather than several steers: in my experience steering tends to lose track, and after three steers the agent gets lost in the main thread. One combined message gets better results.
Neither has maintainer approval of the direction, which the contributing guide asks for. Maintainers: is "squash into one queued message" a direction you would take? I am happy to cut scope (for example squash only, or web only) if that helps. |
|
I built proposal 2, the batched queue mode, as a server setting in our fork and have been running it. What it does. Settings > Chat > "Send queued messages together", next to Follow-up behavior. When a turn ends, everything queued on the thread starts as one next turn. The provider gets one message that opens with "These N messages were queued separately while you were working. They are listed in the order they were sent, with their senders. Handle each one accordingly.", followed by each message labeled with its number and sender. The timeline still shows every message on its own, all under that one turn. Details:
What I ran. On a Linux server running our fork, I started a turn that ran a 2 minute command and queued three notes while it worked. With Claude Haiku 5.5 and with Codex on GPT-6 Astra, all three ran as one next turn, and that turn's one reply answered each note. The wrapper text showed up in both providers' session logs. With the setting off, the same script gave three turns, one per note. Not checked yet: attachments on folded messages, a full batch of 20, and mobile. The setting lives on the server, and mobile has no settings row for it. On Squash vs this: Squash works when someone is watching the queue. In the coordinator case described above, nobody is watching, so the batch has to happen when the turn ends. I think both are worth having. Questions for maintainers:
PR with the upstream version (off by default): #26072. I opened it so this discussion has working code to look at. It is not approved, and I'll change or close it based on what's decided here. Written with Claude Opus 5.5 in Claude Code. |
ProblemThis adds an unattended coordination case to #15815. A coordinating thread needs to consider the reports already waiting for it together. Processing each report in a separate turn can mean acting before seeing another report that changes the decision. The reported sequence was:
On two other occasions, a child's final result was found through Environment: Windows, T3 Code (Beta). The installed desktop executable reports 0.1.5 at drafting time; the exact incident and server versions were not established. These are field observations, not a deterministic reproduction. Token savings have not been measured. Proposed direction: deliver compatible queued updates togetherPlease consider the batched queue mode already proposed in #15815 for unattended coordinating threads:
Some completion batching already exists: the current delivery planner adds sibling task results to an existing queued delivery. The question is whether that mechanism can cover the compatible updates waiting across a coordinating thread's queue. PR #26072 attempted ordinary-message batching but explicitly excluded delegated completions, notifications, and scheduled tasks. It is closed and unmerged. PR #19020 proposed manual squash and is also unmerged. This request builds on #15815 rather than proposing a duplicate feature. Two related decisions with separate scopeMake a blocked queue visible. When a run has made no observable progress for a configurable interval and updates are waiting, show that condition in the thread list with the last activity time and queue count. Start with visibility; automatic termination needs a separate policy that accounts for legitimate long-running work, child work, and pending input. Provider recovery already has related work: #18764 covers an unresponsive or dead backend, and #25149 covers stalled requests. Both are open. #24743 describes a similar blocked queue and is closed; the present observations do not establish its cause. The remaining product question is whether to expose inactivity plus queued work consistently in the thread list. Allow safe promotion of completion notices. The promotion restriction is explicit in the current server. Could the existing completion-delivery mechanism support an explicit promotion into the thread's active turn, while retaining task identity, acknowledgement, and recovery if steering fails? If the restriction must remain, a supported way to consume all waiting results in the active turn would address the need. #14732 is relevant recovery work, not an implementation of this action. What would demonstrate the behaviorFor batching: queue two compatible reports, including an attachment, during an active run. When it completes, one next run receives both reports in order and the attachment. Repeat with automatic results from different originating turns, and check that each result is accounted for without a duplicate wake. An incompatible item remains separate. For inactivity visibility: a quiet run with queued updates becomes visible after the configured interval; legitimate waiting work remains distinguishable. For completion promotion: a queued notice reaches the active turn through the completion-delivery path. A rejected steer leaves its unread result recoverable. Is automatic-result-aware batching an acceptable extension of #15815, and which items should be eligible? The inactivity indicator and completion-promotion change can be considered separately. This is a request for direction and scope before implementation. |
|
I built proposal 1, "Steer all", in our fork next to the batched mode from my earlier comment. We call it Send all, because it also works when the agent is idle. What it does. A Send all button sits in the queue list header once two or more messages are queued. It sends the queued messages, in the order they were sent, as one message:
The combined message uses the same header as the batched mode: "These N messages were queued separately while you were working...", then each message with its number and sender. The timeline still shows each message on its own. What stays queued. Delegated task completions, notifications, slash commands, Where it is. The queue list header on web and desktop, the mobile queue sheet, a command palette entry, a rebindable What I ran. On a macOS dev build of our fork, against a real Codex turn running a long shell command, I queued three messages and ran each case:
I have not tested this on mobile hardware yet, or with providers other than Codex. Three messages queued behind a running Codex turn, with the setting off (before) and on (after). Send all appears in the queue header:
How it relates to Squash (#19020). Squash merges the queue into one queued message you can edit, and you send it yourself. Send all skips that step. They don't conflict, and Squash covers the edit-first case that Send all doesn't. Questions for maintainers.
I'd open a PR only after you agree on direction and scope. Drafted with AI assistance: Claude Opus 5.5 ( |




Uh oh!
There was an error while loading. Please reload this page.
A thread's queue drains one message per turn (#6885), and
thread.steerQueuedMessagesteers only the oldest queued message. That's fine for unrelated follow-ups. When the queued messages belong together, the agent handles them separately: it re-plans after each one, and it can act on the first before it sees a later one that changes the picture.I hit this in two ways:
t3_thread_send. While the coordinator is busy, each report lands in its queue (mode: "queue", or"auto"before the turn is steerable), and again each one gets its own turn.I'd like two ways to deliver the queue together. Both serve both cases.
1. "Steer all" action
Joins every queued message into one message and steers it into the running turn. The queue is empty afterwards.
Places it would go: a button by the queue list, a keybinding next to
thread.steerQueuedMessage, the mobile queue sheet, and an MCP tool alongsidet3_queue_promote_to_steer. Available only when the provider supports steering, like the existing steer.2. Batched queue mode
When a turn ends, the next turn gets everything queued so far as one message instead of only the first.
This has to be a server-side, per-thread option, not part of Follow-up behavior. That setting applies per client and decides how my own messages enter the queue. Batching decides how the queue leaves, whoever filled it, and messages from other threads never go through a client. Per-thread fits because only some threads need it. It could also be settable at
t3_thread_launch, so a coordinator starts with it on.Open questions
Related: #6885, #11912, #6974.
Drafted with AI assistance: Claude Opus 5.5 (
claude-opus-5-5) via Claude Code in T3 Code.All reactions