Neil
a5d6114baf
fix(ssh): stop pane adoption certifying a death from the relay's not-found union ( #18531 )
...
* fix(ssh): stop pane adoption certifying a death from the relay's not-found union
`attachStablePaneOwner` was the last reader that synthesised a runtime exit
from a reattach refusal, and it published code `0` — which
`orca-runtime-on-pty-exit` records as `rememberPtyLivenessVerdict(exited)`, a
death certificate whose only legitimate writer is a host-delivered exit frame.
The refusal it acted on is a union. `pty.attach` answers `PTY "<id>" not found`
both for a pid the relay probed with `isProcessAlive` and for an id its session
map simply never had — which, because ids carry a per-start mint epoch, is every
id minted before a relay restart, checked against nothing. So a relay restart
plus a reconnect certified a shell that was still running under the old daemon's
orphaned process tree, retired the pane binding, and cold-started a second agent
onto the same transcript. The sibling `handlePtyReattachFailure` has always
refused to certify from that union; this path did not.
- The relay marks the one refusal it backed with a liveness check
(`PTY_ATTACH_PROVEN_EXITED_MARKER`). The marker is additive, so an unmarked
answer — including an older relay's — stays ambiguous, which is the safe
direction.
- The client mints that half as `SshPtyProvenExitedOnRelayError`, a subclass so
every existing `isSshPtyAbsentFromRelayError` consumer is unchanged.
- Pane adoption publishes `UNVERIFIED_PROCESS_EXIT_CODE` (-1), the sentinel its
sibling publishes, and passes `hostExitConfirmed` only for evidence that
observed the process: the marked relay refusal, or `SessionNotFoundError` from
the registry that owns the PTY. The ambiguous half now records `unverifiable`
instead of `exited`.
- The gone-branch keys on the error type rather than the bare `PTY ".+" not
found` text, so an untyped string can no longer authorise abandoning a
binding — the discriminator `pty-connect-limits.ts` already documented.
Refs docs/reference/ssh-execution-boundary.md
* test(pty): make the pane-adoption fixtures throw what real providers throw
These four fixtures rejected with bare `new Error('Session not found: ...')` and
`new Error('PTY "..." not found')`. No provider produces either untyped:
`local-pty-spawn` and `decodeDaemonResponseError` both mint
`SessionNotFoundError`, and the SSH reattach path types the relay's wire text
before any pane sees it. Fixtures that skip the type were the reason a
message-shaped gate looked adequate.
The exit-code expectations move with it: the pane path now publishes the -1
stop sentinel plus `hostExitConfirmed`, so a certificate follows the evidence
rather than a synthesized zero.
2026-09-03 16:13:03 -07:00
..
2026-06-29 22:38:29 -07:00
2026-06-29 22:38:29 -07:00
2026-08-13 21:51:55 -07:00
2026-07-23 18:35:31 -07:00
2026-08-28 04:17:45 -07:00
2026-08-27 12:32:29 -07:00
2026-08-24 20:45:38 -07:00
2026-08-01 14:27:16 -07:00
2026-08-01 14:27:16 -07:00
2026-08-17 11:10:38 -07:00
2026-08-30 21:20:53 -07:00
2026-08-28 04:17:45 -07:00
2026-07-27 23:50:25 -07:00
2026-08-27 12:32:29 -07:00
2026-08-28 04:17:45 -07:00
2026-08-10 15:52:59 -07:00
2026-08-10 15:52:59 -07:00
2026-08-10 15:52:59 -07:00
2026-08-10 15:52:59 -07:00
2026-08-11 18:19:43 -07:00
2026-08-10 15:52:59 -07:00
2026-08-10 15:52:59 -07:00
2026-08-10 15:52:59 -07:00
2026-08-10 15:52:59 -07:00
2026-08-10 15:52:59 -07:00
2026-08-10 15:52:59 -07:00
2026-08-10 15:52:59 -07:00
2026-08-10 15:52:59 -07:00
2026-07-23 18:35:31 -07:00
2026-06-29 22:38:29 -07:00
2026-06-29 22:38:29 -07:00
2026-09-02 01:29:26 -07:00
2026-08-29 20:15:10 -07:00
2026-08-05 02:56:07 -07:00
2026-09-02 15:14:33 -07:00
2026-08-29 20:15:10 -07:00
2026-08-11 18:19:43 -07:00
2026-08-05 10:30:04 -07:00
2026-09-02 15:14:33 -07:00
2026-09-02 15:14:33 -07:00
2026-08-10 05:56:39 -07:00
2026-08-10 01:17:14 -07:00
2026-08-18 12:37:39 -07:00
2026-08-29 20:15:10 -07:00
2026-08-29 20:15:10 -07:00
2026-08-29 20:15:10 -07:00
2026-08-29 20:15:10 -07:00
2026-09-02 01:29:26 -07:00
2026-09-02 15:14:33 -07:00
2026-09-01 22:38:07 -07:00
2026-08-07 23:02:29 -07:00
2026-08-10 00:59:51 -07:00
2026-08-10 00:59:51 -07:00
2026-08-05 10:30:04 -07:00
2026-07-29 17:03:15 -07:00
2026-07-29 17:03:15 -07:00
2026-08-10 01:17:14 -07:00
2026-08-29 20:15:10 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-08-27 23:27:39 -07:00
2026-08-19 16:45:42 -07:00
2026-09-02 01:29:26 -07:00
2026-08-19 16:45:42 -07:00
2026-08-19 16:45:42 -07:00
2026-07-23 18:35:31 -07:00
2026-06-29 22:38:29 -07:00
2026-06-19 17:14:55 -07:00
2026-08-18 13:32:48 -07:00
2026-08-10 17:25:26 -07:00
2026-08-22 13:06:38 -07:00
2026-09-02 15:42:08 -07:00
2026-08-22 13:06:38 -07:00
2026-07-16 13:26:15 -07:00
2026-07-16 13:26:15 -07:00
2026-08-18 13:32:48 -07:00
2026-08-01 14:27:16 -07:00
2026-07-23 18:35:31 -07:00
2026-08-13 22:48:24 -07:00
2026-09-02 15:14:21 -07:00
2026-09-02 15:42:08 -07:00
2026-08-10 17:25:26 -07:00
2026-08-18 13:32:48 -07:00
2026-09-02 05:36:54 -07:00
2026-07-08 12:01:06 -07:00
2026-07-08 12:01:06 -07:00
2026-08-30 23:04:08 -07:00
2026-08-30 23:04:08 -07:00
2026-08-15 18:25:37 -07:00
2026-07-29 17:03:15 -07:00
2026-07-23 18:35:31 -07:00
2026-09-03 14:42:54 -07:00
2026-06-15 22:13:46 -07:00
2026-06-29 22:38:29 -07:00
2026-08-31 16:27:28 -07:00
2026-08-21 14:44:08 -07:00
2026-07-16 18:21:08 -07:00
2026-08-01 21:59:41 -07:00
2026-09-03 02:11:55 -07:00
2026-08-25 22:19:04 -07:00
2026-08-11 02:18:29 -07:00
2026-08-11 02:18:29 -07:00
2026-08-11 02:18:29 -07:00
2026-07-10 19:10:01 -07:00
2026-07-10 19:10:01 -07:00
2026-08-29 20:19:09 -07:00
2026-06-19 17:14:55 -07:00
2026-08-29 20:19:09 -07:00
2026-08-15 00:54:20 -07:00
2026-08-29 20:19:09 -07:00
2026-09-01 22:44:05 -07:00
2026-08-29 20:19:09 -07:00
2026-08-15 00:54:20 -07:00
2026-08-21 14:44:08 -07:00
2026-07-10 18:19:36 -07:00
2026-08-29 20:19:09 -07:00
2026-08-29 20:19:09 -07:00
2026-08-29 20:19:09 -07:00
2026-08-25 22:19:04 -07:00
2026-07-13 12:42:55 -07:00
2026-09-02 12:53:48 -07:00
2026-09-03 14:42:58 -07:00
2026-08-29 20:19:09 -07:00
2026-09-01 22:44:05 -07:00
2026-08-24 12:11:55 -07:00
2026-07-12 21:04:13 -07:00
2026-08-30 14:19:05 -07:00
2026-09-03 02:11:55 -07:00
2026-07-11 01:30:19 -07:00
2026-07-23 18:35:31 -07:00
2026-07-23 18:35:31 -07:00
2026-07-20 14:50:12 -07:00
2026-08-29 20:19:09 -07:00
2026-08-24 12:11:55 -07:00
2026-08-15 00:54:20 -07:00
2026-06-29 22:38:29 -07:00
2026-09-03 02:11:55 -07:00
2026-09-03 02:11:55 -07:00
2026-08-15 00:54:20 -07:00
2026-08-29 20:19:09 -07:00
2026-05-31 01:50:16 -07:00
2026-07-10 18:19:36 -07:00
2026-08-30 16:36:14 -07:00
2026-09-01 22:05:30 -07:00
2026-09-03 02:11:55 -07:00
2026-09-03 02:11:55 -07:00
2026-09-03 02:11:55 -07:00
2026-08-22 23:00:31 -07:00
2026-08-22 23:00:31 -07:00
2026-07-10 18:19:36 -07:00
2026-08-15 00:54:20 -07:00
2026-09-03 14:42:54 -07:00
2026-09-01 22:44:05 -07:00
2026-09-02 05:36:54 -07:00
2026-09-03 02:11:55 -07:00
2026-09-03 14:42:58 -07:00
2026-07-29 17:03:15 -07:00
2026-07-29 17:03:15 -07:00
2026-09-02 05:36:54 -07:00
2026-08-07 09:55:54 -07:00
2026-08-05 14:46:00 -07:00
2026-07-23 18:35:31 -07:00
2026-08-13 22:48:24 -07:00
2026-07-20 14:50:12 -07:00
2026-07-20 14:50:12 -07:00
2026-07-23 18:35:31 -07:00
2026-07-23 18:35:31 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-07-23 18:35:31 -07:00
2026-07-29 17:03:15 -07:00
2026-07-29 17:03:15 -07:00
2026-07-29 20:19:18 -07:00
2026-07-29 20:19:18 -07:00
2026-09-01 22:38:07 -07:00
2026-09-01 22:38:07 -07:00
2026-09-01 22:38:07 -07:00
2026-09-01 22:38:07 -07:00
2026-07-27 01:14:33 -07:00
2026-08-11 21:16:36 -07:00
2026-08-11 21:16:36 -07:00
2026-08-09 16:45:27 -07:00
2026-08-11 22:13:35 -07:00
2026-05-14 16:06:23 -07:00
2026-05-14 16:06:23 -07:00
2026-09-02 21:33:34 -07:00
2026-09-02 21:33:34 -07:00
2026-08-07 21:59:24 -07:00
2026-08-07 21:59:24 -07:00
2026-07-29 17:03:15 -07:00
2026-07-23 18:35:31 -07:00
2026-08-10 01:17:14 -07:00
2026-08-10 01:17:14 -07:00
2026-09-03 16:13:03 -07:00
2026-08-30 14:49:18 -07:00
2026-08-15 00:54:20 -07:00
2026-09-02 23:32:41 -07:00
2026-08-30 14:49:18 -07:00
2026-08-31 01:28:29 -07:00
2026-09-02 23:32:41 -07:00
2026-09-02 15:14:44 -07:00
2026-08-31 08:17:40 -07:00
2026-09-02 22:57:27 -07:00
2026-08-15 00:54:20 -07:00
2026-08-30 14:49:18 -07:00
2026-08-30 14:49:18 -07:00
2026-09-02 23:32:41 -07:00
2026-09-02 21:33:41 -07:00
2026-08-30 14:49:18 -07:00
2026-08-30 14:49:18 -07:00
2026-08-30 14:49:18 -07:00
2026-09-03 16:13:03 -07:00
2026-07-27 16:40:59 -07:00
2026-08-19 22:37:42 -07:00
2026-08-19 22:37:42 -07:00
2026-08-30 18:13:36 -07:00
2026-09-02 23:32:41 -07:00
2026-09-02 23:32:41 -07:00
2026-07-29 17:03:15 -07:00
2026-07-30 18:42:10 -07:00
2026-08-31 03:10:44 -07:00
2026-08-31 02:41:15 -07:00
2026-07-29 17:03:15 -07:00
2026-08-31 03:10:44 -07:00
2026-08-31 02:41:15 -07:00
2026-07-29 17:03:15 -07:00
2026-07-29 17:03:15 -07:00
2026-08-31 03:10:44 -07:00
2026-07-29 17:03:15 -07:00
2026-08-31 03:10:44 -07:00
2026-08-31 03:10:44 -07:00
2026-09-02 21:33:41 -07:00
2026-08-28 04:17:45 -07:00
2026-09-02 15:42:08 -07:00
2026-07-14 15:23:06 -07:00
2026-07-14 15:23:06 -07:00
2026-08-24 19:55:57 -07:00
2026-08-30 12:36:23 -07:00
2026-08-30 12:36:23 -07:00
2026-07-08 13:06:39 -07:00
2026-07-08 13:06:39 -07:00
2026-08-01 22:21:37 -07:00
2026-09-02 15:14:21 -07:00
2026-08-02 00:58:10 -07:00
2026-09-02 15:14:21 -07:00
2026-08-01 15:45:45 -07:00
2026-08-01 15:45:45 -07:00
2026-08-24 19:55:57 -07:00
2026-07-29 17:03:15 -07:00
2026-08-01 14:24:31 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-08-24 19:55:57 -07:00
2026-08-01 14:27:16 -07:00
2026-08-24 19:55:57 -07:00
2026-08-05 10:30:04 -07:00
2026-08-05 10:30:04 -07:00
2026-07-29 17:03:15 -07:00
2026-07-31 05:44:53 -07:00
2026-07-31 05:44:53 -07:00
2026-07-31 05:44:53 -07:00
2026-08-05 10:30:04 -07:00
2026-08-05 10:30:04 -07:00
2026-09-01 23:35:38 -07:00
2026-07-29 17:03:15 -07:00
2026-07-29 17:03:15 -07:00
2026-07-29 17:03:15 -07:00
2026-07-29 17:03:15 -07:00
2026-07-30 18:42:10 -07:00
2026-07-30 18:42:10 -07:00
2026-09-01 23:35:38 -07:00
2026-08-24 19:55:57 -07:00
2026-09-02 15:14:14 -07:00
2026-08-24 19:55:57 -07:00
2026-06-29 22:38:29 -07:00
2026-09-02 15:14:21 -07:00
2026-09-02 15:14:21 -07:00
2026-08-11 18:19:43 -07:00
2026-09-02 15:42:08 -07:00
2026-08-01 14:27:16 -07:00
2026-08-01 02:56:52 -07:00
2026-07-15 15:23:35 -07:00
2026-08-01 02:56:52 -07:00
2026-07-13 05:32:31 -07:00
2026-07-23 18:35:31 -07:00
2026-09-02 15:14:21 -07:00
2026-07-15 15:23:35 -07:00
2026-07-15 15:23:35 -07:00
2026-07-15 15:23:35 -07:00
2026-07-15 15:23:35 -07:00
2026-07-15 15:23:35 -07:00
2026-09-02 15:14:21 -07:00
2026-07-15 15:23:35 -07:00
2026-08-24 19:55:57 -07:00
2026-08-07 23:02:29 -07:00
2026-08-07 23:02:29 -07:00
2026-08-07 23:02:29 -07:00
2026-07-29 11:31:35 -07:00
2026-07-29 11:31:35 -07:00
2026-07-08 13:59:42 -07:00
2026-07-08 13:59:42 -07:00
2026-07-26 12:50:05 -07:00
2026-07-26 12:50:05 -07:00
2026-08-28 04:17:45 -07:00
2026-08-28 04:17:45 -07:00
2026-07-10 12:56:17 -07:00
2026-07-10 12:56:17 -07:00
2026-08-17 00:55:04 -07:00
2026-08-21 13:15:46 -07:00
2026-08-21 13:15:46 -07:00
2026-08-05 02:56:07 -07:00
2026-09-02 15:14:14 -07:00
2026-08-05 10:30:04 -07:00
2026-08-05 10:30:04 -07:00
2026-07-30 18:42:10 -07:00
2026-07-31 05:44:53 -07:00
2026-07-16 21:32:13 -07:00
2026-07-20 14:50:12 -07:00
2026-07-20 14:50:12 -07:00
2026-08-30 14:49:18 -07:00
2026-08-17 22:39:02 -07:00
2026-08-18 03:12:47 -07:00
2026-08-18 03:12:47 -07:00
2026-08-18 18:55:56 -07:00
2026-07-05 23:56:37 -07:00
2026-07-23 18:35:31 -07:00
2026-09-02 15:42:08 -07:00
2026-09-02 15:42:08 -07:00
2026-09-02 15:42:08 -07:00
2026-07-27 18:50:52 -07:00
2026-07-27 18:50:52 -07:00
2026-08-29 20:06:41 -07:00
2026-07-10 00:19:45 -07:00
2026-08-01 14:27:16 -07:00
2026-08-25 15:36:51 -07:00
2026-07-23 18:35:31 -07:00
2026-07-23 18:35:31 -07:00
2026-07-25 02:30:59 -07:00
2026-08-09 16:45:27 -07:00