composer-redo (W-93/W-94): with #390's draft-startup gate the host got no startup, but the same
startup went to the pane (windowStartupAfterCreate → createNewTerminalForStartup → web-host terminal
create) and Claude still started into /login. Port #395's choke point: createWebRuntimeSessionTerminalResult
holds an Orca Cloud Claude/Codex launch (not set up or expired, no key) before creating anything, so
every caller (new tab, create's pane startup, post-wake relaunch) is held once; the per-caller wrappers
are gone. The guard asserts only the choke point (plus the pane spawn gate and local-runtime paths)
call the host create RPCs; an exactly-once test: one create with a queued prompt → one strip → one
agent create after Start.
'Set up once in Settings → Agent accounts' / 'Renew in Settings → Agent accounts' become
'Set up once for Orca Cloud' / 'Renew once for Orca Cloud', matching the strip.
While a Restart runs the strip no longer promises 'Picking up where you left off.' (the recorded session
may have no conversation). When the backstop starts the agent fresh, the strip says 'Started a new
conversation.' for 3 s, then clears. An end-to-end test drives resume → 'No conversation found' → one
fresh relaunch → the line once; catalog synced (restartingResume removed).
#349 (JA-04) made every Orca Cloud 'Set up once' open the focused 'Agents in Orca Cloud' sheet, so
worktree-card-compact-agent-row.cloud-sign-in.test.tsx's 4 'opens Settings' cases failed on integration.
The cases now assert the sheet opens and the view stays put (new isOrcaCloudSignInSheetOpen getter).
#390 creates with the agent, so a not-set-up (or loading/expired) Claude/Codex on
Orca Cloud made the create hand the host a draft startup with the queued prompt,
and the host started the agent into /login (real m4air run, startupTerminal
spawned). resolveBackendDraftStartup now withholds it then; the launch is planned
in the pane, held behind the Set up once strip, and runs with the prompt on Start.
m4air (RA-11c run): a pane whose Claude recorded a session but never ran a turn was restarted with
--resume <id>; Claude printed 'No conversation found with session ID' and exited, leaving a bare
shell. After a paired pane's resume relaunch, the runner now watches the new terminal (up to 10 s,
terminal.read); if the resume found no conversation it sends the agent's fresh launch command (with
the Orca Cloud session-env refresh) into that same shell, once. A resume that works is left alone,
and the old terminal is never read.
Startup reads the VM records main keeps on disk before hydrating the session. A selected Orca Cloud workspace whose record is suspended gets sleep intent and the view-only hold before any pane mounts, so its panes wait for Wake instead of reattaching (which woke the sandbox). Running records are untouched. Main now notifies phase 'suspending' when it passes its last reopen check; the view then offers Wake to continue instead of a Keep awake that can no longer work.
composer-redo's #390 run: creating on Orca Cloud with Claude not set up and a first prompt started
Claude straight into 'Not logged in'. A create with a prompt is host-planned (createWorktree's
hostAgentLaunch): the host starts the agent during creation and the desktop hold never runs; its
guard only asked the per-workspace sign-in. Two more host-tab launches called the raw launcher
directly: the background-declined create terminal and the post-wake relaunch.
- signedInHostLaunch plans the launch in the pane (held behind the strip, prompt kept) when the
creation's host is Orca Cloud and the account decision is 'hold'; account-ready creates keep the
host-planned launch.
- Both direct sites use launchAgentInWebHostTabWithCloudHold.
- A choke-point test fails if anything but the hold wrapper imports the raw host-tab launcher.
After a wake or app start the first Source read answers not_found (main hasn't reattached the
sandbox record it resolves through yet), and the strip waited for the next minute's account read.
A failed read now also retries when main reports its sandbox records changed (ephemeralVm
onRuntimesChanged), watched only while a strip needs it; good answers are not re-read.
Main checks for a reopen just before suspending; with a Blank terminal that is a few seconds after Sleep, so Keep awake usually landed too late and the sandbox slept anyway (real app, local harness). When a kept-awake sleep settles, open the workspace the ordinary way: it re-activates it and wakes the sandbox only if it is suspended.
An account-switch restart on a paired (remote-runtime) pane was a no-op: the desktop reconnect asked
the host to ensure the pane's session, and the host handed back its live terminal still running the
old account. Every restart there now takes #330's path: put exactly that host terminal to sleep
(stopExact keepHistory + targetOnly, exit suppressed), ensure the agent on its own session in the same
tab and leaf, then reconnect. On Orca Cloud it is tracked like the strip's Restart (Restarting…, then
proof of a new PTY or Couldn't restart at 10 s); a Codex switch whose host stop fails asks again.
Also wires the 'hostUnresponsive' reason from the runner (#330's edit never applied), so a host that
does not stop or relaunch shows 'The workspace didn't respond.'
Main reads its reopen baseline when the sleep starts, after saving the offline copy; a Keep awake pressed during that save was lost and the VM suspended anyway (seen on the real app). The follower tells main again on the started notice.