Skip to content

Commit 2e2ec5f

Browse files
committed
fix(mobile,docs): drop the pointless retry on a wire skew and stop exempting desktop from the advisory
1 parent 08235ce commit 2e2ec5f

3 files changed

Lines changed: 22 additions & 12 deletions

File tree

apps/mobile/src/components/host/host-connection-state.tsx

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,20 @@ export function HostConnectionState({
6161
<Text modifiers={[TITLE, CENTERED]}>{title}</Text>
6262
<Text modifiers={[SECONDARY, CENTERED, textSelection(true)]}>{body}</Text>
6363
</VStack>
64-
<Button
65-
label={t('retry')}
66-
systemImage="arrow.clockwise"
67-
modifiers={[buttonStyle('borderedProminent')]}
68-
onPress={onRetry}
69-
/>
70-
{failure ? (
64+
{/* An app below the host's floor has nothing to retry: redialing only flashes
65+
"connecting" and lands back here. Updating the host is a real action, so that
66+
skew keeps the button. */}
67+
{wireRemedy === 'update-app' ? null : (
68+
<Button
69+
label={t('retry')}
70+
systemImage="arrow.clockwise"
71+
modifiers={[buttonStyle('borderedProminent')]}
72+
onPress={onRetry}
73+
/>
74+
)}
75+
{/* The technical line distinguishes causes on an ordinary failure; under a named skew
76+
it only repeats the copy above in triage voice. */}
77+
{failure && wireRemedy === undefined ? (
7178
<Text modifiers={[FOOTNOTE, SECONDARY, CENTERED, textSelection(true)]}>
7279
{failure}
7380
</Text>

docs/ARCHITECTURE.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -332,10 +332,12 @@ host reads the older pong and reports that the host must update. The tunnel need
332332
wire-version surface of its own (it versions only its subprotocol and peer frames) — the relay
333333
carries `WireMessage` frames opaquely and the pong returns on the same peer connection. Moving
334334
`MIN_COMPATIBLE_WIRE_VERSION` waits until the clients it will refuse can render that advisory:
335-
at least two shipped mobile releases carrying the update-required screen. The handshake exchange
336-
itself has been in clients since wire v64 (2026-07-31, first released in v0.13.0), but those
337-
builds only surface the technical message after their retry budget — the procedure is in
338-
`docs/RELEASE.md`.
335+
at least two shipped mobile releases carrying the update-required screen, and a desktop release
336+
carrying it too — desktop's bundled daemon is lockstep with its renderer, but that renderer also
337+
dials a daemon it did not ship (a `runtime.json` advertisement, or the Developer-tab override).
338+
The handshake exchange itself has been in clients since wire v64 (2026-07-31, first released in
339+
v0.13.0), but those builds only surface the technical message after their retry budget — the
340+
procedure is in `docs/RELEASE.md`.
339341

340342
Who receives a host frame is declared in `wire/delivery.ts`, not decided in the transport: a
341343
correlated reply follows its `replyTo` to the connection that asked, and everything else fans out

docs/RELEASE.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ How to cut, sign, notarize, and publish the Electron desktop app, plus the packa
3636

3737
A release that bumps `MIN_COMPATIBLE_WIRE_VERSION` (root `AGENTS.md`, Invariant 1) refuses every client below it, so it ships only once those clients can say so themselves:
3838

39-
- The below-floor handshake advisory (`ping`/`pong` accepted at any version; the client renders an update-required state from the pong's `minCompatible`) must be in at least **two shipped mobile releases** before the floor moves — count from the first store build that contains the update screen, not from the handshake exchange itself (in clients since wire v64, 2026-07-31, first released in v0.13.0: those builds only show the technical message after their retry budget). Desktop ships lockstep with its daemon and needs no window; the webview deploys on its own schedule with no store lag, so it needs none either.
39+
- The below-floor handshake advisory (`ping`/`pong` accepted at any version; the client renders an update-required state from the pong's `minCompatible`) must be in at least **two shipped mobile releases** before the floor moves — count from the first store build that contains the update screen, not from the handshake exchange itself (in clients since wire v64, 2026-07-31, first released in v0.13.0: those builds only show the technical message after their retry budget).
40+
- **Desktop is not exempt, only unbounded.** Its bundled daemon is lockstep with its own renderer, but the renderer does not always dial that daemon: `resolveDaemonUrl()` prefers the Developer-tab `daemonUrl` override, then any daemon already advertising itself in `runtime.json` — and the supervisor deliberately stands down when another install's daemon already serves the machine. So a pre-advisory desktop build does meet a newer daemon, and the advisory must have shipped in a desktop release before the floor moves. Auto-update adoption bounds that wait; there is no store-review count to hold it to, so the trigger is a judgement call rather than a number. The webview has no store lag, but a cached bundle or a long-lived tab can be just as old and is covered by the same rule.
4041
- Bump `WIRE_PROTOCOL_VERSION` and `MIN_COMPATIBLE_WIRE_VERSION` in the same commit, retire the frames and fields the floor makes unreachable, and delete the client's `peerWireVersion` gates that can no longer be false.
4142
- Before tagging, check both rendered states by hand: an older client build against the new daemon shows the update-app state, and the new client against an older daemon the update-host state. The transport and client-core tests cover the mechanics; the release check is the screen.
4243

0 commit comments

Comments
 (0)