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 (Steer, or a finished delegate's result), 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 with a
-32603error and then apply the steer anyway; the adapter failed the steer effect on that error and the server retried it, 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.Scope
Bug fix: a slow acknowledgement from a healthy Muse host kills the user's active run. There is no prior issue; this is a small, focused fix for an obvious bug, limited to the Muse adapter's steer path and its tests.
Verification
To see it on Linux web (needs a Muse login): 1. start a Muse turn that runs
sleep 150; 2. delay Muse'sfsync/fdatasyncby 40 s withstracefault injection; 3. click Steer: on main the run fails at 30 s.Signed in, Muse Code 1.4.15, T3 dev servers on Linux;
main0f13d2c against this head bd788bd.mainWith Muse's
-32603answer injected by a stdio relay (maineceeab4, this head, merge 11d1ef40b9):mainmainturn/steeragain 139 ms laterturn/steerRe-checked against
main476fc9b on 2026-11-12: its two steer tests fail there without the change and pass with it; the branch merges cleanly.Not checked: macOS and Windows, desktop and mobile, and a server restart between a steer and its admission.
Method, why "delivered", Stop runs, more captures, trace lines, relay log, Muse's events and tests
No other provider, contract or client code changes. Every click ran in T3's Browser panel. The injected answer is Muse's own acknowledgement-timeout answer; this head was also merged locally with that main. Steer sources: a user clicks Steer, or a delegated task finishes and T3 steers its result in. Muse 1.4.12's answer in full:
-32603internal, "runtime submit failed: runtime command acknowledgement timed out after 30s"; the server retried with a fresh command id.Stop while the ack is held:
mainmain5d28843: Stop waits, the steer fails at 30 s, run failsmain5d28843 (948a1137fa): Stop waits for the steer, shows "Agent not responding to Stop", then ends "Stopped by user" when Muse answersWhy "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.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 and this head bd788bd for the first two rows. I re-ran the Stop row onmain5d28843, on this head, and on this head merged locally into thatmain(948a1137fa, a local merge, never pushed). On this head as pushed, Stop still fails the run: the steer is reported delivered at 30 s, thenturn/interrupttimes out after another 30 s and the host is closed, because this head's base predatesmain's 15 s Stop change. The Stop result in the right column is from the merge. 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.On 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.
Muse's own acknowledgement-timeout answer. Same setup on
maineceeab4, this head bd788bd, and this head merged locally with thatmain(11d1ef40b9, never pushed), with a stdio relay between T3 and the real Muse host. It passes every frame unchanged except one: Muse gets the firstturn/steerand acks it, and the relay answers T3 with Muse's own-32603"runtime submit failed: runtime command acknowledgement timed out after 30s" instead. That answer is injected; Muse sends it only after its own 30 s wait.Trace lines, relay log, Muse's events and tests
Slow ack:
T3 trace,
main0f13d2c (second line: that build's Stop run; the Stop re-run on today'smainis below):This head (lines 2 and 3: its own Stop run; its base predates
main's Stop change):Muse's events,
main(no steer):This head:
main, strace (the test host's local clock, six hours behind the UTC lines above):Injected answer, relay log, T3 trace and Muse's events,
main:This head:
This head merged with
main:Stop re-run with the held steer,
main5d28843 (strace lines: the test host's local clock, six hours behind UTC):This head:
This head merged with
main5d28843:Tests,
mainwith this PR's test file, then this head:Full logs and test output: transcript
Prior PRs
sittingmongoosegavesession/resumeandsession/reada longer deadline, a separate cause in the samerequesthelper. It was closed without merging.ddonathan), merged, 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