The regression test for the pane-creation race (PR #4052 / issue #3505)
previously didn't enforce the readiness-then-spawn ordering: mocks
resolved synchronously and the assertion only checked the final
behavior, not the sequencing. A future code change reintroducing the
race could slip past this test silently.
Rewrites the test to explicitly assert call ordering:
waitForSessionReady must complete before executeActions is invoked.
A failure case is added where waitForSessionReady remains pending
when executeActions would otherwise fire; the test asserts the spawn
is correctly deferred.
Addresses cubic-dev-ai's review on PR #4052 (severity 5/10,
test quality).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`opencode attach` was invoked inside a freshly-split tmux pane before the
child session appeared in the opencode server's status map. The process
exited immediately (session not found), tmux auto-closed the pane, and the
subagent ran invisibly in the background — the race documented in #3505.
Fix: call `waitForSessionReady` *before* `executeActions` in
`session-created-handler.ts`, mirroring the guard already present in
`TmuxSessionManager.ensureSessionReadyBeforeSpawn()`. If the session does
not become attachable within the timeout the handler returns early without
spawning a pane at all, eliminating the transient-pane and silent-close
failure modes. The now-unreachable post-spawn readiness-check / pane-close
cleanup branch is removed.
Adds a regression test suite (session-created-handler.test.ts) covering:
- not-ready session → no pane spawned, no polling started
- duplicate session.created → idempotent
- non session.created event type → no action
- already-tracked session → idempotent
Closes#3505
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>