Repository navigation
Conversation
Muse acks an accepted turn/steer only once the steer's records are on disk. On a slow disk that ack can take more than 30 s, and Muse Code 1.4.12 may also answer with its own -32603 internal "runtime command acknowledgement timed out after 30s" error and then apply the steer anyway. The adapter treats both as failures: its 30 s request timeout closes the host and fails the active run, and Muse's error fails the steer effect, which the server retries with a fresh command id, so Muse runs the steer twice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Muse refuses a steer it will not take within milliseconds, and keeps an accepted steer even across a Stop, running it as a new turn. So turn/steer now waits up to the request timeout and, if the ack is still pending, reports the steer delivered and keeps the host. Muse's own "runtime command acknowledgement timed out" error is handled the same way, so the server does not retry it. Every other steer error still fails. The wait stays bounded at the request timeout because Stop and approval answers queue behind the steer effect. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. Walkthrough
Merge Risk:
|
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This narrowly scoped Muse adapter fix preserves the existing timeout behavior for all other commands while preventing delayed steer acknowledgements from closing the host or failing the run. Targeted tests cover both delayed responses and Muse’s specific acknowledgement-timeout error. You can add or adjust custom eligibility rules. Learn more. |
|
Note Written by @only21mil, thanks for isolating the durable-write acknowledgement timeout and keeping other errors strict. i kept both original commits and merged current main ( verification on
unverified: the real muse provider/client path, delayed production fsync, and the production error payload. this vm has no muse cli or production blob, so the controlled adapter tests establish t3's behavior, not the provider's eventual delivery guarantee. no client or ui implementation changed; no new app capture is claimed. @only21mil, please retain a follow-up for the documented queued-resume interaction with #24325; it does not expand this focused takeover. ci build/typecheck, lint, web tests, all eight server shards, and the aggregate |
|
Note Written by Verified in a real dev environmenti ran current i created a project through the app pointing at a real git repository. on the pr head, real codex
these are codex regression checks. they do not execute the changed muse adapter. i inspected the captures and reopened this comment to check the screenshots. the 14-second stop recording is shared in the task thread; playback and seeking work in t3's browser, but github does not render the external mp4 inline. runtime command transcript. Not verifiedthe changed muse behavior is unverifiable on this vm, not verified by the codex checks above. the vm initially had no muse executable. i installed the real public linux binary, muse i therefore could not reproduce the original timeout on main or prove the pr's delayed acknowledgement, muse's own acknowledgement-timeout error, eventual delivery without duplication, or wedged-muse stop behavior. those need an authenticated real muse account and delayed durable-write acknowledgement. no mocks, fabricated catalog, echo provider, or fixtures were used to replace that path. native desktop, ios/android, macos/windows, delegated-task completion, and the documented queued-resume interaction were not exercised. the existing github aggregate |
|
Note 🤖 Claude Opus 5.5 responding on behalf of only21mil @maria-rcks, retained. The queued-resume interaction with #24325 stays a separate follow-up and is not added to either PR. What the interaction is, from reading both heads (
The steer is lost while T3 has recorded it as delivered. This needs both PRs merged and a restart between the late ack and Muse admitting the steer. Each PR is correct on its own. Not verified: no test or real Muse run has exercised this sequence. It comes from the code and matches the overlap both PR bodies describe. Your runtime note also lists it as not exercised. My judgment, not verified: the fix belongs in #24325's relaunch path rather than here, because reporting a pending ack as delivered is what keeps a steer from running twice. |
|
Note 🤖 Opus 5.5 and Sol 6.1 replying on behalf of Victor. Re your comment: the queued-resume overlap doesn't need a follow-up on this PR. #24325's relaunch is what cancels the replayed steer. This PR decides whether a slow steer ack lasts until a restart, and doesn't change what #24325 does on resume. I merged #24325's head (
With #24325 alone, a steer that was acked promptly but not yet admitted at the restart is cancelled the same way. A held ack never reaches the restart there, because the 30-second timeout fails the steer and closes the host first. With both PRs, both ack timings reach the resume and #24325 closes the replaying host. This PR adds no state to that path. If the one-replayed-item cost needs fixing, the change belongs in #24325's relaunch. I'll correct the "Not checked" bullet in this PR's description, which says the overlap needs both PRs. Not checked: a real Muse host, or a late |
|
Note 🤖 Opus 5.5 replying on behalf of Victor. @maria-rcks thanks for the run; we did it with a real signed-in Muse (Muse Code 1.4.15, Spark 1.2 at Minimal, isolated login), steering a |





Problem
When a Muse turn is steered (a user clicks Steer, or a delegated task finishes and T3 steers its result in), Muse acks
turn/steeronly once the steer's records are on disk. On a busy disk that ack can take more than 30 seconds. The adapter sent the steer through the same 30-second request deadline as every other command, treated the late ack as a dead host, closed Muse and failed the active run. I lost a long Muse run this way: the ack came 33 seconds after the steer.Muse Code 1.4.12 can also give up on the ack itself. After 30 seconds it answers
turn/steerwith-32603internal, "runtime submit failed: runtime command acknowledgement timed out after 30s", and then applies the steer anyway. The adapter failed the steer effect on that error, and the server retried it with a fresh command id, so Muse could run the same steer twice.Change
turn/steerkeeps its 30-second wait but no longer closes the host when the wait runs out. A steer still pending after the wait is reported delivered, and Muse's own "runtime command acknowledgement timed out" error is handled the same way, so the server does not retry it. Every other steer error still fails as before. Every other Muse command keeps the host-closing deadline.Why "delivered" is the right answer for a pending ack:
missing_run,invalid_target) within milliseconds, so a refusal never reaches the deadline.The wait stays bounded at 30 seconds because Stop and approval answers queue behind the steer effect. This change does not touch Stop. On current
main, a Stop that Muse does not answer within 15 seconds shows "Agent not responding to Stop" with Force stop.To do this, the request helper is split into
send(no deadline) andrequest(sendplus the host-closing timeout). Only the steer path callssenddirectly.Scope and approval
There is no prior issue. This is a small, focused fix for an obvious bug: a slow acknowledgement from a healthy Muse host kills the user's active run. The change is limited to the Muse adapter's steer path and its tests. No other provider, contract or client code changes.
Verification
I ran this signed in to a Muse account in a fresh isolated home: Muse Code 1.4.15, Muse Spark 1.2 at Minimal, Full access. Each build ran as a T3 dev server on Linux ("Test machine", synthetic repo), with every click in T3's Browser panel. Builds:
main0f13d2c, this head bd788bd, and, for the Stop claim only, this head merged locally into thatmain(a local merge, never pushed), because this head's base predatesmain's 15 s Stop change. Muse runssleep 150and I steer it. Right before Steer, I injected a delay into Muse's own process withstracefault injection: each Muse thread's nextfsync/fdatasyncwaits 40 s, so Muse acks the steer about 80 s late. The slow ack comes from that injected delay, not from Muse on its own.mainmain: Stop waits for the steer, shows "Agent not responding to Stop", then ends "Stopped by user" when Muse answersOn this head Muse later started a turn of its own ("Background activity updated", no user message) that repeated the last line. Muse got the steer once.
T3 trace,
main(second line: the Stop run):This head (lines 2 and 3: its own Stop run; its base predates
main's Stop change):Muse's events and the shutdown on main
Muse's events,
main(no steer):This head:
main, strace (the test host's local clock, six hours behind the UTC lines above):Tests,
mainwith this PR's test file, then this head:Full logs and test output: transcript
Not checked: Muse's own "acknowledgement timed out" answer (T3's wait always fired first; the second test covers it), macOS and Windows, desktop and mobile, and a server restart between a steer and its admission.
Prior PRs
sittingmongoosegivessession/resumeandsession/reada longer deadline. It is a separate cause in the samerequesthelper. The changes conflict inrequestand in the adapter tests, so whichever merges second needs conflict resolution.ddonathan) relaunches a Muse host that died between turns. This change keeps a healthy host from being closed in the first place.Generated with Claude Opus 5.5 in T3 Code Nightly