Triage
Confirmed as a bug on current main. Cmd+Shift+N (chat.newLocal) can hang with no action-specific feedback while the selected remote environment is still retrying.
What happens
chat.newLocal is the contextual “new in this project” command (the shift-click twin of New Thread). Despite the settings label Chat: New Local, it does not target the local computer. _chat.tsx calls startNewThreadFromContext, which inherits the active thread’s project and environment.
useHandleNewThread then waits on the project’s t3.json when that project has no explicit defaultThreadEnvMode. That read goes through readT3ProjectFileDefaultThreadEnvMode → executeAtomQuery (suspendOnWaiting: true) with no abort or timeout. The environment query factory returns Effect.never during supervisor connecting / backoff (UI phase reconnecting). A physically offline host that is still being retried therefore never settles the query, so draft registration and navigation never run.
That matches the report: the shortcut looks dead on the reconnecting remote thread, and works again after selecting a local thread. The existing reconnecting banner (“Trying again”) does not explain the wait. Explicit runtime phase offline fails the query instead of hanging; the retrying/reconnecting case is the important distinction.
The remaining evidence gap in the original report still stands: we did not capture whether that file query was pending at the keypress. The source path is enough to accept the bug.
Related
- #6358 is the same hang (New Thread blocked on
t3.jsonagainst a down host) via a different entry path (auto-open of an unsettled remote thread). Related, not a duplicate of this shortcut/reconnecting case. - #7195 already implements the right guard: skip the
t3.jsonread unlessconnection.phase === "connected", and retarget to a reachable sibling when one exists.canCreateProjectInEnvironmentalready treatsconnecting/reconnectingas unreachable. The PR is open and stale against currentmain. - #8924 is about settling/dismissing cached offline threads, not this new-chat wait.
Suggested fix
- Rebase or re-implement #7195 so
chat.newLocalnever awaits an environment file query while the target is notconnected. - Add a regression: selected remote thread in
reconnecting/backoff, no projectdefaultThreadEnvMode, pendingt3.jsonquery → a draft opens or the user gets a toast; the action must not wait indefinitely. - Optional defense in depth: pass an abort/timeout through
readT3ProjectFileDefaultThreadEnvMode.
Until that lands, the workaround stands: select a thread on an available local computer, then press Cmd+Shift+N.