docs(remote): describe actual replay guarantees and connection states
In-flight keys at a drop may be lost; degraded and probing states are not emitted yet. Link mosh upstream in the resilience plan.
- commit
- 27f03fe6b51426bec84829756714a7090e3d749f
- author
- brice · · 2026-10-07 07:01 UTC
- parent
- 1e5d59c
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
2 files · +9 -11
M docs/plans/quic-resilience.md +3 -3
| @@ -4,10 +4,10 @@ Goal: on a lossy or intermittent link (4G, roaming, sleep), the UI never | |||
| 4 | 4 | freezes, typed input is kept and delivered when the link returns, and SSH is | |
| 5 | 5 | used only to authenticate the first QUIC handshake. | |
| 6 | 6 | ||
| 7 | - | Reference: mosh (`/tmp/mosh`, `src/network/transportsender-impl.h`, | |
| 8 | - | `src/frontend/terminaloverlay.cc`). | |
| 7 | + | Reference: [mosh](https://github.com/mobile-shell/mosh) | |
| 8 | + | (`src/network/transportsender-impl.h`, `src/frontend/terminaloverlay.cc`). | |
| 9 | 9 | ||
| 10 | - | ## Diagnosis (current main) | |
| 10 | + | ## Diagnosis (before Phases 1 and 2) | |
| 11 | 11 | ||
| 12 | 12 | 1. Input path blocks on the network: `sessionAttachmentWorker.send` waits for | |
| 13 | 13 | `SendClient`, which waits for the carriage write. While QUIC stalls, the | |
| @@ -4,10 +4,10 @@ Goal: on a lossy or intermittent link (4G, roaming, sleep), the UI never | |||||
| 4 | freezes, typed input is kept and delivered when the link returns, and SSH is | 4 | freezes, typed input is kept and delivered when the link returns, and SSH is | ||
| 5 | used only to authenticate the first QUIC handshake. | 5 | used only to authenticate the first QUIC handshake. | ||
| 6 | 6 | ||||
| 7 | - | Reference: mosh (`/tmp/mosh`, `src/network/transportsender-impl.h`, | 7 | + | Reference: [mosh](https://github.com/mobile-shell/mosh) |
| 8 | - | `src/frontend/terminaloverlay.cc`). | 8 | + | (`src/network/transportsender-impl.h`, `src/frontend/terminaloverlay.cc`). |
| 9 | 9 | ||||
| 10 | - | ## Diagnosis (current main) | 10 | + | ## Diagnosis (before Phases 1 and 2) |
| 11 | 11 | ||||
| 12 | 1. Input path blocks on the network: `sessionAttachmentWorker.send` waits for | 12 | 1. Input path blocks on the network: `sessionAttachmentWorker.send` waits for | ||
| 13 | `SendClient`, which waits for the carriage write. While QUIC stalls, the | 13 | `SendClient`, which waits for the carriage write. While QUIC stalls, the | ||
M docs/remote-resilience.md +6 -8
| @@ -26,7 +26,7 @@ The transport is fixed when the host is added (`quic` by default). To switch, ru | |||
| 26 | 26 | ||
| 27 | 27 | - The remote session and its shells keep running while you are offline. | |
| 28 | 28 | - The client reconnects by itself after a network change, a VPN switch, or a laptop sleep, and keeps retrying for up to 15 minutes of outage before it returns to the picker. Press Ctrl-C or Esc while it reconnects to give up and return to the picker. | |
| 29 | - | - A stalled link does not block the client loop. Keys typed while the link stalls or reconnects are kept and sent in order once it recovers; keys that never reached the remote before a reconnect are replayed to the resumed session. | |
| 29 | + | - A stalled link does not block the client loop. Keys typed while the link stalls or reconnects are kept and sent in order once it recovers. Keys vev had not yet sent when the link dropped are replayed to the resumed session; keys already in flight at the drop may be lost. | |
| 30 | 30 | - If the reconnect window has expired but the session still exists, the client opens a fresh attachment to it. | |
| 31 | 31 | - Several clients can attach to the same session. Each keeps its own window, tab, focus, and copy mode. | |
| 32 | 32 | ||
| @@ -34,15 +34,13 @@ The command palette is rendered by the remote daemon, so opening it needs a work | |||
| 34 | 34 | ||
| 35 | 35 | ## Connection states | |
| 36 | 36 | ||
| 37 | - | | State | Meaning | | |
| 37 | + | | What you see | Meaning | | |
| 38 | 38 | |---|---| | |
| 39 | - | | `connected` | Everything works. | | |
| 40 | - | | `degraded` | Packets arrive, but updates are slow. | | |
| 41 | - | | `probing` | No contact; vev is looking for a working path. | | |
| 42 | - | | `offline` | No contact for a while; vev is reconnecting. | | |
| 43 | - | | `dead` | The connection is gone for good. | | |
| 39 | + | | The session | The link works. | | |
| 40 | + | | `Connecting to session…` | The link dropped; vev is reconnecting and keeps your keys. | | |
| 41 | + | | The picker with an error | The session could not be reached again, or you cancelled. | | |
| 44 | 42 | ||
| 45 | - | States appear in the vev status bar, never inside your shell output. | |
| 43 | + | vev does not yet report a slow (`degraded`) link separately. Connection notices never appear inside your shell output. | |
| 46 | 44 | ||
| 47 | 45 | ## Hybrid mode: local and remote together | |
| 48 | 46 | ||
| @@ -26,7 +26,7 @@ The transport is fixed when the host is added (`quic` by default). To switch, ru | |||||
| 26 | 26 | ||||
| 27 | - The remote session and its shells keep running while you are offline. | 27 | - The remote session and its shells keep running while you are offline. | ||
| 28 | - The client reconnects by itself after a network change, a VPN switch, or a laptop sleep, and keeps retrying for up to 15 minutes of outage before it returns to the picker. Press Ctrl-C or Esc while it reconnects to give up and return to the picker. | 28 | - The client reconnects by itself after a network change, a VPN switch, or a laptop sleep, and keeps retrying for up to 15 minutes of outage before it returns to the picker. Press Ctrl-C or Esc while it reconnects to give up and return to the picker. | ||
| 29 | - | - A stalled link does not block the client loop. Keys typed while the link stalls or reconnects are kept and sent in order once it recovers; keys that never reached the remote before a reconnect are replayed to the resumed session. | 29 | + | - A stalled link does not block the client loop. Keys typed while the link stalls or reconnects are kept and sent in order once it recovers. Keys vev had not yet sent when the link dropped are replayed to the resumed session; keys already in flight at the drop may be lost. |
| 30 | - If the reconnect window has expired but the session still exists, the client opens a fresh attachment to it. | 30 | - If the reconnect window has expired but the session still exists, the client opens a fresh attachment to it. | ||
| 31 | - Several clients can attach to the same session. Each keeps its own window, tab, focus, and copy mode. | 31 | - Several clients can attach to the same session. Each keeps its own window, tab, focus, and copy mode. | ||
| 32 | 32 | ||||
| @@ -34,15 +34,13 @@ The command palette is rendered by the remote daemon, so opening it needs a work | |||||
| 34 | 34 | ||||
| 35 | ## Connection states | 35 | ## Connection states | ||
| 36 | 36 | ||||
| 37 | - | | State | Meaning | | 37 | + | | What you see | Meaning | |
| 38 | |---|---| | 38 | |---|---| | ||
| 39 | - | | `connected` | Everything works. | | 39 | + | | The session | The link works. | |
| 40 | - | | `degraded` | Packets arrive, but updates are slow. | | 40 | + | | `Connecting to session…` | The link dropped; vev is reconnecting and keeps your keys. | |
| 41 | - | | `probing` | No contact; vev is looking for a working path. | | 41 | + | | The picker with an error | The session could not be reached again, or you cancelled. | |
| 42 | - | | `offline` | No contact for a while; vev is reconnecting. | | |||
| 43 | - | | `dead` | The connection is gone for good. | | |||
| 44 | 42 | ||||
| 45 | - | States appear in the vev status bar, never inside your shell output. | 43 | + | vev does not yet report a slow (`degraded`) link separately. Connection notices never appear inside your shell output. |
| 46 | 44 | ||||
| 47 | ## Hybrid mode: local and remote together | 45 | ## Hybrid mode: local and remote together | ||
| 48 | 46 | ||||