Michael Grundberg and Claude Opus 5
e0d4477edc
fix(terminal): keep the geometry replay to the pass that can converge
...
Three follow-ups to the source gate, each one measured rather than reasoned.
A pane already drawing at the size the client just requested is left alone. The
replay runs at `dimsAfterLoad`, so it can only change what is on screen if the
pane was drawing at some other size; when the reported geometry already IS that
size, the second pass captures the identical frame and pays a full reload to do
it, including a visible re-flash, a dropped and reopened WebSocket and a deleted
xterm snapshot. That equality is the signature of a clamp rather than a race:
`getTerminalDimensions()` floors at 40x10 while `fitAddon.fit()` does not, so a
terminal narrower than 40 columns or shorter than 10 rows reports a pane
permanently bigger than itself and replayed on every tab switch without ever
converging. A race never produces the equality, since its premise is that the
pane was still at the size it was asked to leave. The declined-resize case does
not produce it either, so that one still costs the single capped attempt and
needs the pane-ownership question this does not touch.
The full-history re-arm is unreachable and now says so. A pass that consumed the
flag sent `full=1`, and the route answers `full=1` with `mux-full-history` or
`history`, never `mux-visible`, so the source gate already rules out every such
pass. The line stays for the invariant, but its comment no longer reads as if a
page load retries, and the suite pins that it does not.
The response no longer reports geometry for a body that carries no capture. The
full-history path writes `capturedGeometry` from the cursor query and then
returns '' for a pane holding nothing visible, which drops the source to
`history` with the geometry already recorded: a `full=1` request whose capture
reported 100x50 and returned nothing answered `source: "history"` with both
fields set. Nothing acted on it, because the client ignores geometry on any
other source, but the field said a frame had been drawn at a size when none had.
The browser stub now derives `source` from the request the way the route does,
rather than answering `full=1` with `mux-visible`, which the route cannot
produce. Each case reaches a visible-frame response the way production does, by
not being the first select of the page. Three cases pin the new behaviour and
each fails without its guard: the clamp case sees two fetches instead of one,
the scope case and the full-history case both see a replay the gate forbids, and
the width case sees one fetch instead of two.
The changeset now describes the change from 1.29.x rather than the difference
between the two commits on this branch.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-19 10:44:35 +02:00
..
2026-08-22 14:13:57 +02:00
2026-09-14 23:46:28 +02:00
2026-09-14 23:30:14 +02:00
2026-09-19 10:44:35 +02:00
2026-09-19 10:44:35 +02:00
2026-09-06 21:53:38 +02:00
2026-08-22 14:13:58 +02:00
2026-06-10 01:38:40 +02:00
2026-07-20 17:35:40 +02:00
2026-08-10 12:29:00 +02:00
2026-09-07 19:09:24 +02:00
2026-09-13 17:43:14 +08:00
2026-08-12 02:30:08 +02:00
2026-09-02 08:26:45 +08:00
2026-09-07 19:09:24 +02:00
2026-08-08 22:30:39 +03:00
2026-08-21 02:37:58 +02:00
2026-08-05 01:40:37 +02:00
2026-01-27 23:15:25 +01:00
2026-06-09 20:02:15 +02:00
2026-09-02 10:48:51 +02:00
2026-08-20 12:18:16 +02:00
2026-07-12 17:50:21 +02:00
2026-06-14 12:46:58 -04:00
2026-06-19 17:58:06 -04:00
2026-06-19 17:58:06 -04:00
2026-09-06 23:11:01 +02:00
2026-09-04 16:08:57 -04:00
2026-02-12 13:44:07 +01:00
2026-03-07 07:33:44 +01:00
2026-02-26 16:44:34 +01:00
2026-09-19 10:44:35 +02:00
2026-09-18 16:43:04 +02:00
2026-08-07 16:41:39 +02:00
2026-08-10 11:19:51 +02:00
2026-07-20 02:48:14 +02:00
2026-08-20 11:21:29 +02:00
2026-03-01 16:50:23 +01:00
2026-09-02 08:26:45 +08:00
2026-09-13 17:43:13 +08:00
2026-08-22 14:36:23 +02:00
2026-08-21 02:37:58 +02:00
2026-09-02 08:26:45 +08:00
2026-09-07 21:30:31 -05:00
2026-09-14 23:46:28 +02:00
2026-09-02 08:26:45 +08:00
2026-09-04 14:20:11 +02:00
2026-08-22 14:13:57 +02:00
2026-06-14 12:46:58 -04:00
2026-08-26 18:43:52 +08:00
2026-08-09 05:02:14 +02:00
2026-09-06 21:53:38 +02:00
2026-08-21 08:23:31 -04:00
2026-06-10 22:47:02 +02:00
2026-09-06 21:53:38 +02:00
2026-09-06 19:45:36 +02:00
2026-07-12 18:42:36 +02:00
2026-08-09 15:56:44 +02:00
2026-09-06 23:05:26 +02:00
2026-08-23 14:46:10 -04:00
2026-06-29 11:35:56 +05:30
2026-09-14 23:46:28 +02:00
2026-09-14 23:46:28 +02:00
2026-09-04 16:08:57 -04:00
2026-03-01 16:50:23 +01:00
2026-08-24 18:00:52 +02:00
2026-09-13 17:42:35 +08:00
2026-08-24 18:00:52 +02:00
2026-08-25 18:30:41 +02:00
2026-08-25 03:08:15 +02:00
2026-09-02 08:26:45 +08:00
2026-08-22 14:13:57 +02:00
2026-08-18 23:24:22 +02:00
2026-09-09 15:24:55 +02:00
2026-09-16 16:51:00 +02:00
2026-09-14 23:56:19 +02:00
2026-09-14 23:56:19 +02:00
2026-09-13 17:43:14 +08:00
2026-09-02 19:33:32 +08:00
2026-09-14 23:37:04 +02:00
2026-08-27 19:38:38 +08:00
2026-07-20 02:36:02 +02:00
2026-09-01 11:32:03 +02:00
2026-09-04 14:36:35 +02:00
2026-06-14 08:43:57 +02:00
2026-06-14 08:43:57 +02:00
2026-06-12 09:09:14 -04:00
2026-07-12 17:50:21 +02:00
2026-09-02 20:41:24 -05:00
2026-06-07 04:33:11 +02:00
2026-09-10 02:57:40 +02:00
2026-08-09 22:39:07 +02:00
2026-08-23 21:40:10 -04:00
2026-09-04 16:08:57 -04:00
2026-08-05 08:44:47 +02:00
2026-06-10 01:30:43 +02:00
2026-08-29 23:31:28 -07:00
2026-09-04 16:08:57 -04:00
2026-09-04 16:08:57 -04:00
2026-08-19 23:35:45 +02:00
2026-06-09 20:02:15 +02:00
2026-09-14 16:02:02 +02:00
2026-09-01 12:30:48 +08:00
2026-06-19 13:10:17 -04:00
2026-07-12 17:50:21 +02:00
2026-08-10 00:07:01 +02:00
2026-08-23 08:39:03 +02:00
2026-08-23 08:39:03 +02:00
2026-07-12 18:06:59 +02:00
2026-08-05 02:38:57 +02:00
2026-08-10 03:15:13 +02:00
2026-08-22 01:55:50 +08:00
2026-08-10 11:16:58 +02:00
2026-09-08 00:56:39 -04:00
2026-08-09 14:04:34 +02:00
2026-09-14 15:59:00 +02:00
2026-08-23 14:46:10 -04:00
2026-08-14 00:14:21 +02:00
2026-07-21 02:49:25 +08:00
2026-09-08 16:49:50 +02:00
2026-06-12 09:09:14 -04:00
2026-08-25 19:41:48 +02:00
2026-09-14 23:56:19 +02:00
2026-08-17 01:46:48 +02:00
2026-09-13 17:43:13 +08:00
2026-09-15 09:10:37 +08:00
2026-09-02 20:41:24 -05:00
2026-08-09 18:03:13 +02:00
2026-08-05 02:38:57 +02:00
2026-08-16 20:34:34 +02:00
2026-08-23 08:39:03 +02:00
2026-09-02 08:26:45 +08:00
2026-03-07 07:33:44 +01:00
2026-06-14 22:21:13 +02:00
2026-08-16 20:34:34 +02:00
2026-02-26 16:44:34 +01:00
2026-09-08 00:56:39 -04:00
2026-08-19 19:14:52 +00:00
2026-09-08 00:56:39 -04:00
2026-09-14 23:30:14 +02:00
2026-09-08 00:56:39 -04:00
2026-07-20 12:33:12 +02:00
2026-02-18 12:51:35 +01:00
2026-08-09 13:23:24 +02:00
2026-06-08 11:01:34 -04:00
2026-07-19 15:32:45 +02:00
2026-02-12 13:44:07 +01:00
2026-08-04 15:02:46 +02:00
2026-07-28 23:20:01 +03:00
2026-08-28 11:32:30 -05:00
2026-09-12 05:15:41 +02:00
2026-08-28 13:45:12 -05:00
2026-09-07 22:11:54 -05:00
2026-08-24 19:06:50 +08:00
2026-09-02 20:41:24 -05:00
2026-03-21 19:23:37 +01:00
2026-03-21 07:20:18 +01:00
2026-09-14 23:56:19 +02:00
2026-07-20 04:02:46 +02:00
2026-08-09 16:16:54 +02:00
2026-09-10 12:42:33 +08:00
2026-08-09 17:32:24 +02:00
2026-06-08 10:27:18 -04:00
2026-02-26 16:44:34 +01:00
2026-08-21 02:37:58 +02:00
2026-08-13 17:23:27 +02:00
2026-09-01 11:32:18 +02:00
2026-09-14 15:59:00 +02:00
2026-08-26 18:43:52 +08:00
2026-09-14 14:28:57 +02:00
2026-08-07 01:34:47 +02:00
2026-02-12 18:26:16 +01:00
2026-06-09 20:02:17 +02:00
2026-08-09 16:03:27 +02:00
2026-07-28 04:15:30 +02:00
2026-08-09 03:30:15 +02:00
2026-01-21 22:36:45 +01:00
2026-09-02 20:41:24 -05:00
2026-02-19 14:00:10 +01:00
2026-08-20 12:58:17 -04:00
2026-06-10 18:06:45 +02:00
2026-03-01 16:50:23 +01:00
2026-08-09 23:05:11 +02:00
2026-08-09 23:05:11 +02:00
2026-09-08 00:56:39 -04:00
2026-08-09 23:05:11 +02:00
2026-09-17 19:49:06 +02:00
2026-09-14 23:56:19 +02:00
2026-09-14 23:56:19 +02:00
2026-09-04 13:50:22 +02:00
2026-07-17 16:03:03 -04:00
2026-09-14 23:42:06 +02:00
2026-08-05 01:40:37 +02:00
2026-07-17 15:54:32 -04:00
2026-09-07 21:30:31 -05:00
2026-09-14 23:42:06 +02:00
2026-08-07 05:05:41 +02:00
2026-09-04 16:08:57 -04:00
2026-08-21 02:25:43 +02:00
2026-03-07 07:33:44 +01:00
2026-02-26 16:44:34 +01:00
2026-06-10 20:41:34 +02:00
2026-03-07 07:33:44 +01:00
2026-03-07 07:33:44 +01:00
2026-08-09 15:31:02 +02:00
2026-07-12 18:21:42 +02:00
2026-01-25 07:52:40 +01:00
2026-08-18 10:59:44 -04:00
2026-03-01 14:33:18 +01:00
2026-02-26 16:44:34 +01:00
2026-08-19 19:14:52 +00:00
2026-08-16 20:34:34 +02:00
2026-09-12 05:15:41 +02:00
2026-08-21 02:25:43 +02:00
2026-09-01 12:30:48 +08:00
2026-09-06 21:53:38 +02:00
2026-07-17 16:26:28 -04:00
2026-08-18 10:46:21 -04:00
2026-08-26 20:05:48 -05:00
2026-08-23 14:46:10 -04:00
2026-06-10 03:41:04 +02:00
2026-02-18 18:14:13 +01:00
2026-08-10 03:15:13 +02:00
2026-06-09 20:02:15 +02:00
2026-06-10 17:08:36 +02:00
2026-08-16 20:34:34 +02:00
2026-08-05 01:53:43 +02:00
2026-08-09 01:34:55 +02:00
2026-09-07 22:42:20 +02:00
2026-07-12 19:49:58 +02:00
2026-09-15 17:59:16 +02:00
2026-06-10 20:41:34 +02:00
2026-09-07 08:48:31 +02:00
2026-09-02 20:41:24 -05:00
2026-08-09 01:18:03 +02:00
2026-08-17 22:54:46 +02:00
2026-09-14 23:46:28 +02:00
2026-08-10 03:15:13 +02:00
2026-08-23 12:21:02 -04:00
2026-08-24 22:58:28 +02:00
2026-09-15 17:59:16 +02:00
2026-09-14 23:46:28 +02:00
2026-08-23 12:21:02 -04:00
2026-08-23 12:21:02 -04:00
2026-08-23 14:46:10 -04:00
2026-07-17 16:21:16 -04:00
2026-08-16 05:11:00 +02:00
2026-07-17 16:25:29 -04:00
2026-06-17 23:41:47 +08:00
2026-08-17 21:42:25 +02:00
2026-08-23 12:21:02 -04:00
2026-08-24 00:59:48 +02:00
2026-02-26 16:44:34 +01:00
2026-09-15 17:59:16 +02:00
2026-09-01 02:31:26 +02:00
2026-08-09 01:18:03 +02:00
2026-08-09 21:32:04 -04:00
2026-06-10 01:30:43 +02:00
2026-09-06 23:11:01 +02:00
2026-08-05 01:40:37 +02:00
2026-08-10 03:59:43 +02:00
2026-09-14 23:33:36 +02:00
2026-08-07 01:31:50 +02:00
2026-09-02 20:41:24 -05:00
2026-08-13 17:28:35 +02:00
2026-06-09 20:02:15 +02:00
2026-08-13 17:28:35 +02:00
2026-09-02 20:41:24 -05:00
2026-03-07 07:33:44 +01:00
2026-08-23 14:46:10 -04:00
2026-08-23 14:46:10 -04:00
2026-08-18 23:24:22 +02:00
2026-09-14 15:59:00 +02:00
2026-01-22 11:30:10 +01:00
2026-05-12 10:11:47 +02:00
2026-06-15 01:43:15 +02:00
2026-08-23 14:46:10 -04:00
2026-08-23 14:46:10 -04:00
2026-08-23 14:46:10 -04:00
2026-08-24 00:59:48 +02:00
2026-08-23 14:46:10 -04:00
2026-08-23 14:46:10 -04:00
2026-08-23 12:21:02 -04:00
2026-08-10 03:06:23 +02:00
2026-09-12 06:09:28 +02:00
2026-08-23 12:21:02 -04:00
2026-08-25 18:26:07 +02:00
2026-02-28 17:39:44 +01:00
2026-02-28 17:39:44 +01:00
2026-01-21 07:19:49 +01:00
2026-02-26 16:44:34 +01:00
2026-06-10 18:06:45 +02:00
2026-08-20 10:46:11 +02:00
2026-09-18 21:38:40 +02:00
2026-08-05 02:38:57 +02:00
2026-09-07 19:11:20 -04:00
2026-09-18 21:34:42 +02:00
2026-09-09 16:57:42 +02:00
2026-09-14 14:09:13 +02:00
2026-09-14 14:09:13 +02:00
2026-06-30 19:52:49 -04:00
2026-07-12 12:39:46 +02:00
2026-09-18 13:42:44 +02:00
2026-09-16 09:26:30 +08:00
2026-06-09 15:39:03 -04:00
2026-08-19 19:41:43 +00:00
2026-02-26 16:44:34 +01:00
2026-08-24 19:06:50 +08:00
2026-08-14 00:00:59 +02:00
2026-09-14 23:56:19 +02:00
2026-08-20 11:21:29 +02:00
2026-09-06 23:11:01 +02:00
2026-08-18 19:55:23 +02:00
2026-06-09 15:39:03 -04:00
2026-09-19 10:44:35 +02:00
2026-09-14 23:46:28 +02:00
2026-07-12 19:49:58 +02:00
2026-07-10 11:14:26 -04:00
2026-05-25 23:28:58 +02:00
2026-08-09 18:03:13 +02:00
2026-07-20 03:26:21 +02:00
2026-06-10 20:41:34 +02:00
2026-09-14 15:59:00 +02:00
2026-07-20 02:58:51 +02:00
2026-01-22 11:30:10 +01:00
2026-09-14 15:57:08 +02:00
2026-08-10 11:19:51 +02:00
2026-07-12 12:42:36 +02:00
2026-09-14 23:38:54 +02:00
2026-09-04 15:21:13 +02:00
2026-09-04 15:21:12 +02:00
2026-09-04 15:21:12 +02:00
2026-09-14 23:38:54 +02:00
2026-09-14 23:38:54 +02:00
2026-07-29 09:01:18 +02:00
2026-08-09 04:06:23 +02:00
2026-09-14 23:38:54 +02:00
2026-08-23 14:12:38 -04:00
2026-07-21 00:04:40 +08:00
2026-07-12 18:42:36 +02:00
2026-07-12 18:42:36 +02:00
2026-07-12 18:42:36 +02:00