Repository navigation
Conversation
The server marks a run running before the provider opens its session. When the provider is slow to start (a loaded host, a long SessionStart hook, or Claude's MCP registration wait plus retry), the chat said "Thinking" for minutes while nothing was running. The run summary now carries a starting label until the provider reports a turn, and web and mobile show it in place of "Thinking".
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — Web and mobile show “Starting” with the provider name until a provider turn appears, then retain the existing activity presentation. This is a display-only change with no change to provider execution or stored data. You can add or adjust custom eligibility rules. Learn more. |
|
No actionable comments were generated in the recent review. Walkthrough
Merge Risk:
|
|
Note Written by Verified in a real dev environmentverified the web path on Linux with repo Playwright and
selected persisted server events (UTC), read from the isolated dev databases: matching prompt and chat crop, before on main: after on the PR: 24-second recording (GIF for GitHub compatibility) of submission, startup label, thinking, real command execution, and reply. inspected the recording and verified uploaded playback and seeking in T3's browser: Not verifiedClaude's actual startup/MCP-registration delay: Merged main (
|
# Conflicts: # apps/mobile/src/features/threads/thread-work-log.tsx # apps/mobile/src/lib/threadActivity.ts # apps/web/src/components/chat/TimelineWorkGroupRows.tsx
…tate # Conflicts: # apps/mobile/src/features/threads/thread-work-log.tsx





Problem
When a provider is slow to start, the chat says "Thinking" for as long as it takes, even though nothing is running yet. The server marks a run
runningbeforeClaudeAdapterV2.startTurnopens the Claude query, so on a loaded host or behind a longSessionStarthook the label stays wrong for minutes. A Claude registration timeout makes it worse:setMcpServerswaits 90s and a resumed session retries once, so "Thinking" can last about 3 minutes before the turn fails. I hit this on a fork whose Claude process never answered: the chat said "Thinking" for almost 2 minutes until I stopped it, and the server log showedorchestration-v2.claude-mcp-registration-timeoutwith no provider turn.Change
summarizeThreadRunin client-runtime already marksturnEndedfrom the run attempt's provider turn. Next to it, astartingorrunningrun with no provider turn yet now carriesproviderStartingLabel("Starting Claude", using the session driver's display name). Web and mobile show that label, with a terminal icon, in the live row that says "Thinking". Every adapter reports a provider turn once its turn starts, and Claude reports it afteropenreturns. So the label switches back to "Thinking" as soon as the provider is actually running.Mobile carries the label on the cached thinking feed entry, and on the
latestRunsEqualcomparison, so the virtualized feed updates when the provider starts.Scope and approval
Part of #14244, which Julius triaged as a real chat-surface bug. Its expected behavior is "the UI shows what it is doing (for example 'Starting Claude…')", and the triage notes there is no such string. This PR adds only that label. #23590 is separate: it makes the working row appear during startup at all. This PR changes what the row says once it does appear.
Verification
vp test run packages/client-runtime/src/state/threadExecution.test.ts apps/mobile/src/lib/threadActivity.test.ts: 72 passed. The new case covers a running run with no provider turn ("Starting Claude", or "Starting" with no session) and a running provider turn (no label). WiththreadExecution.tsreverted, it fails (1 failed, 24 passed).exec claudefor SDK sessions, so T3 waited onsetMcpServersexactly as in the report. In the same thread onmain, the row said "Thinking". On this branch it said "Starting Claude", then the turn ran normally once Claude started, and the reply "hi" replaced the row.main)Not checked: the mobile client in a simulator (the change there is the shared run summary plus the label prop), and providers other than Claude in a live run. Every adapter emits
provider_turn.updatedon turn start, and the label only appears while that turn is missing.Implementation: Claude Opus 5.5 in Claude Code, running in T3 Code.