# fix\(server\): release workers when providers stop answering · PR \#23854 · pingdotgg/t3code

[View on GitCafe](https://git.cafe/pingdotgg/t3code/pull/23854)

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code)

Visibility: public

State: open

Source repository: pingdotgg/t3code

Source branch: fix/issue-16636

Target branch: main

Head commit: 6349b26ccc5d676b9bcfa77f567845355f6f3485

[Discussion and reviews](https://git.cafe/pingdotgg/t3code/pull/23854)

[Commits](https://git.cafe/pingdotgg/t3code/pull/23854/commits?format=markdown)

[Files changed](https://git.cafe/pingdotgg/t3code/pull/23854/diffs?format=markdown)

## Description

---

## Problem

Four unanswered provider control requests could occupy all four effect workers indefinitely. Sending a message to Claude then left its start and checkpoints queued behind the stalled Codex provider.

## Change

Bound provider control calls to two minutes, with a twelve-minute executor backstop for provider turn effects. Exhausted starts and restarts settle their runs through the existing ownership-checked failure path, including when the backstop fires. An unanswered turn start releases its session before failure is published. Steering with uncertain acceptance fails without retry or follow-up delivery. OpenCode compaction runs in its session scope so the control deadline does not limit healthy compaction duration.

## Scope and approval

Fixes #16636

Triaged bug via the automated issue flow; [GitCafe report #16636](https://git.cafe/pingdotgg/t3code/issues/16636).

## Verification

- `vp test run apps/server/src/orchestration-v2/EffectWorker.test.ts apps/server/src/orchestration-v2/ProviderTurnStartService.test.ts apps/server/src/orchestration-v2/RunExecutionService.test.ts`: **94 passed** on the final revision.
- The unchanged OpenCode adapter passed all 32 adapter tests, including delayed compaction; control-service and recovery coverage passed in the earlier 138-test focused run.
- Server and OpenCode package TypeScript checks passed. Targeted lint has only existing unused-variable warnings; `git diff --check` passed.
- Two independent reviews of the full fix and a fresh audit of the backstop settlement fix returned MERGE.
- Server-only change: visual fixture matrix is empty. No client rendering paths changed.

[Backstop regression red/green output, exact commands, typecheck and lint](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/714f58d6197378bf/fresh-red-green-proof.txt).

Evidence

| Before | After |
| --- | --- |
| [Main runtime transcript](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5635a8dd2b57a670/before-transcript.txt), main [22840ab943](https://git.cafe/pingdotgg/t3code/commit/22840ab943b8418744b48223411e46ba4fdcef1a): four Codex starts running beyond their leases, Claude pending | [Final runtime transcript](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/32d5cf13c90bcccf/fresh-runtime.txt), [6349b26ccc](https://github.com/pingdotgg/t3code/commit/6349b26ccc5d676b9bcfa77f567845355f6f3485): Claude started at two minutes and completed with its checkpoint; all four Codex runs failed after five bounded attempts. Backend process identity stayed unchanged. |

[Executed starvation regression](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0f5430bf5918bd3a/red-transcript.txt): Claude never starts after fifteen simulated minutes on main. The fixed test passes. Both final-attempt backstop settlement cases and the OpenCode delayed-compaction case also failed before their fixes and pass afterward.

[Final evidence index and reproduction environment](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/603044918e630cf2/fresh-proof-index.md).

Verified on Linux using a real Codex CLI with a request-dropping proxy and real Claude. The original Windows app-server resource exhaustion was not induced.

Models and harnesses: GPT-6.1 Sol via Codex; Claude Opus 5.5 via Claude Code, orchestrated in T3 Code.

