Repository navigation
Conversation
mwolson
force-pushed
the
contrib/ctm/execution-selection-admission
branch
from
October 1, 2026 12:38
189b969 to
32c37ae
Compare
mwolson
force-pushed
the
contrib/ctm/execution-selection-admission
branch
from
October 1, 2026 14:13
32c37ae to
a2bd3cf
Compare
mwolson
force-pushed
the
contrib/ctm/execution-selection-admission
branch
from
October 3, 2026 20:27
a2bd3cf to
77bc6cf
Compare
2 of 4 tasks
mwolson
force-pushed
the
contrib/ctm/execution-selection-admission
branch
from
October 4, 2026 03:12
77bc6cf to
aa97afa
Compare
mwolson
force-pushed
the
contrib/ctm/execution-selection-admission
branch
from
October 6, 2026 17:48
aa97afa to
f5e7184
Compare
mwolson
changed the base branch from
contrib/ctm/compatible-active-steering
to
contrib/main/provider-log-thread-files
October 17, 2026 14:24
2 of 4 tasks
mwolson
force-pushed
the
contrib/ctm/execution-selection-admission
branch
from
October 17, 2026 14:24
66a48ef to
ce865e4
Compare
mwolson
force-pushed
the
contrib/ctm/execution-selection-admission
branch
from
October 22, 2026 03:11
ce865e4 to
1386bac
Compare
mwolson
force-pushed
the
contrib/ctm/execution-selection-admission
branch
2 times, most recently
from
October 24, 2026 00:11
652fa48 to
fcd19df
Compare
mwolson
force-pushed
the
contrib/ctm/execution-selection-admission
branch
from
October 24, 2026 16:10
fcd19df to
878cfc8
Compare
mwolson
force-pushed
the
contrib/ctm/execution-selection-admission
branch
from
October 29, 2026 11:33
878cfc8 to
01e8ce1
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What Changed
When a provider start or a model change fails partway, T3 Code stops assuming the provider is running the selection it asked for. The thread's next message is admitted through a fresh session for that thread, following the existing steering policy for pooled providers, instead of reusing a binding whose model may be wrong. The failed prompt is not resubmitted, and other threads sharing the same provider process keep running.
Output a provider buffered for a thread is delivered before that thread's session changes and keeps its original selection. A refused dispatch offers a drain when the producing selection is known, even if no more provider frames arrive. The refusal remains while the output cannot be delivered safely. Delegated completion delivery retries after the drain; a direct message may still need to be sent again in this case.
Claude's replayed model-control replies no longer count as undelivered background output, so a live model switch followed by a normally completed or steered turn does not lock the thread out. A failed live model update invalidates its selection evidence, and draining output checks the still-acknowledged query rather than claiming the buffered frames configured it.
A change that would replace a provider process while the affected thread's binding still has running background work is refused with "This change would replace a provider process with running background work. Wait for it to finish or explicitly Stop it before trying again." Claude keeps its existing check for its own background agents and commands. A queued message whose start meets running background work stays queued until the work finishes. A queued start blocked by buffered output can fail so the wake that drains that output can advance. Non-destructive changes still go through, including Codex option changes while its own background commands run, and a CLI the user has stopped can be replaced while it exits.
OpenCode 2 reports the background wake-ups it holds for a thread as undelivered output, so those continuation turns are admitted and deliver the reply instead of being refused. When a Claude background command finishes after the turn ended, the wake-up turn Claude starts is admitted as soon as it begins, so its reply lands in a T3 continuation run instead of being refused.
A thread that a rollback reopened after an idle release, with nothing run on it yet, is admitted as a fresh attachment instead of forcing a provider restart, so a message sent during or after the rollback no longer interrupts it. Output a provider holds for a thread is still protected at admission even when T3 has not recorded which selection produced it.
Why
A start or selection change that partially applied left T3 trusting a selection the native session might not have, so later turns could run on the wrong model, restarts could kill a process that still owned background work, and buffered completions could be dropped or attributed to the new selection. A stale detach with an equal timestamp could also close a binding that had just been admitted. Execution evidence is now scoped to the actual runtime and binding, a failure invalidates it, and only a trustworthy start acknowledgment restores it.
Known Limitations
A genuinely incompatible buffered selection still causes a dispatch error while its drain runs. Delegated completion delivery retries automatically, but direct user messages, delegated questions and PR watch syncs can require a retry. Holding those dispatches behind a drain needs queue scheduling that lets the drain bypass the held message.
Switching a Claude thread's model or permission policy while a finished background command's notice is still waiting to be delivered drops that notice with the old process; output Claude produces after the switch is still delivered. If Claude's process dies after a background wake-up is offered but before T3 admits it, that wake-up's buffered output is kept until Stop instead of being dropped right away. A hung Claude CLI start fails after a 90-second initialization deadline. Output buffered while an ACP agent such as Grok has not reported its model can be cleared only with Stop. A Codex start with a different selection and no explicit service tier may still restart its session after a failed start. Switching a Claude thread's model before any intervening turn can drop an earlier opaque shell-completion notification.
Checklist