docs(recovery): explain transcript restoration
- commit
- 6bbbdf6cde8e4f562a8eb3acda9679eb3df27c40
- author
- brice · · 2026-07-27 13:40 UTC
- parent
- 445b2ff
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
3 files · +15 -3
M README.md +1 -1
| @@ -36,7 +36,7 @@ vev ls list sessions | |||
| 36 | 36 | vev kill <name> kill a session (--all kills everything) | |
| 37 | 37 | ``` | |
| 38 | 38 | ||
| 39 | - | The daemon starts on first use and exits with the last session. Ephemeral sessions are numbered, survive detach, and disappear with the daemon. Named sessions persist across daemon restarts and come back with their layout, scrollback, and allowlisted processes. | |
| 39 | + | The daemon starts on first use and exits with the last session. Ephemeral sessions are numbered, survive detach, and disappear with the daemon. Named sessions persist across daemon restarts and come back with their layout, recovered terminal transcript, and allowlisted processes. | |
| 40 | 40 | ||
| 41 | 41 | ## Keys | |
| 42 | 42 | ||
| @@ -36,7 +36,7 @@ vev ls list sessions | |||||
| 36 | vev kill <name> kill a session (--all kills everything) | 36 | vev kill <name> kill a session (--all kills everything) | ||
| 37 | ``` | 37 | ``` | ||
| 38 | 38 | ||||
| 39 | - | The daemon starts on first use and exits with the last session. Ephemeral sessions are numbered, survive detach, and disappear with the daemon. Named sessions persist across daemon restarts and come back with their layout, scrollback, and allowlisted processes. | 39 | + | The daemon starts on first use and exits with the last session. Ephemeral sessions are numbered, survive detach, and disappear with the daemon. Named sessions persist across daemon restarts and come back with their layout, recovered terminal transcript, and allowlisted processes. |
| 40 | 40 | ||||
| 41 | ## Keys | 41 | ## Keys | ||
| 42 | 42 | ||||
M docs/durable-session-recovery.md +8 -2
| @@ -12,9 +12,15 @@ vev opens named-session state only while holding `$XDG_RUNTIME_DIR/vev/lifecycle | |||
| 12 | 12 | ||
| 13 | 13 | Discard creates a new incarnation and retains the old record and snapshots under `snapshots/quarantine/` until an explicit later purge. | |
| 14 | 14 | ||
| 15 | - | ## Migration and retention | |
| 15 | + | ## Incompatible checkpoints | |
| 16 | 16 | ||
| 17 | - | The v0.x migration is resumable, retains legacy sources, and validates each referenced HEAD. Healthy sessions retain the committed checkpoint and up to two direct fallbacks; degraded, deleting, migrating, and unresolved transactions remain pinned. | |
| 17 | + | After verifying a VEVM manifest's digest, vev treats any VEVM version mismatch as an incompatible healthy checkpoint. It atomically replaces only that named session's exact healthy checkpoint with a fresh incarnation. The replacement retains the session name and working directory, but has no checkpoint, tabs, terminal history, or recovery transcript. | |
| 18 | + | ||
| 19 | + | Digest mismatches, corruption, validation failures, I/O errors, and ambiguous failures are never reset or purged. The session remains degraded for explicit recovery. | |
| 20 | + | ||
| 21 | + | ## Retention | |
| 22 | + | ||
| 23 | + | Healthy sessions retain the committed checkpoint and up to two direct fallbacks. Degraded and unresolved state remains pinned. | |
| 18 | 24 | ||
| 19 | 25 | ## Fail-closed startup | |
| 20 | 26 | ||
| @@ -12,9 +12,15 @@ vev opens named-session state only while holding `$XDG_RUNTIME_DIR/vev/lifecycle | |||||
| 12 | 12 | ||||
| 13 | Discard creates a new incarnation and retains the old record and snapshots under `snapshots/quarantine/` until an explicit later purge. | 13 | Discard creates a new incarnation and retains the old record and snapshots under `snapshots/quarantine/` until an explicit later purge. | ||
| 14 | 14 | ||||
| 15 | - | ## Migration and retention | 15 | + | ## Incompatible checkpoints |
| 16 | 16 | ||||
| 17 | - | The v0.x migration is resumable, retains legacy sources, and validates each referenced HEAD. Healthy sessions retain the committed checkpoint and up to two direct fallbacks; degraded, deleting, migrating, and unresolved transactions remain pinned. | 17 | + | After verifying a VEVM manifest's digest, vev treats any VEVM version mismatch as an incompatible healthy checkpoint. It atomically replaces only that named session's exact healthy checkpoint with a fresh incarnation. The replacement retains the session name and working directory, but has no checkpoint, tabs, terminal history, or recovery transcript. |
| 18 | + | ||||
| 19 | + | Digest mismatches, corruption, validation failures, I/O errors, and ambiguous failures are never reset or purged. The session remains degraded for explicit recovery. | |||
| 20 | + | ||||
| 21 | + | ## Retention | |||
| 22 | + | ||||
| 23 | + | Healthy sessions retain the committed checkpoint and up to two direct fallbacks. Degraded and unresolved state remains pinned. | |||
| 18 | 24 | ||||
| 19 | ## Fail-closed startup | 25 | ## Fail-closed startup | ||
| 20 | 26 | ||||
M docs/terminal.md +6 -0
| @@ -14,6 +14,12 @@ For remote attaches, the remote proxy substitutes the remote host's exported env | |||
| 14 | 14 | ||
| 15 | 15 | vev keeps a server-side VT screen per pane: scroll regions (DECOM), insert mode, cursor and mode-query reports, alternate screen, bracketed paste, mouse tracking, synchronized updates, OSC 9/777 notifications, OSC 52 clipboard, and double-width cells. Resizes repair double-width cells so CJK and emoji halves are never left behind. | |
| 16 | 16 | ||
| 17 | + | ## Recovery | |
| 18 | + | ||
| 19 | + | Named-session checkpoints preserve bounded scrollback and a recovery transcript containing the primary viewport followed by the active alternate viewport, when present. Each viewport trims only trailing untouched blank rows; leading, internal, styled, and otherwise touched blank rows remain. | |
| 20 | + | ||
| 21 | + | On restore, vev appends the transcript after bounded scrollback as copy-mode history on a fresh blank VT screen. A resumed allowlisted process can redraw the live screen without erasing that recovered history. Recovery does not replay the PTY stream or restore the previous cursor or terminal modes. | |
| 22 | + | ||
| 17 | 23 | ## Alt+Space caveat | |
| 18 | 24 | ||
| 19 | 25 | Some terminals encode Alt+Space as a non-breaking space instead of `ESC Space`. If the palette does not open, rebind `open-palette`. | |
| @@ -14,6 +14,12 @@ For remote attaches, the remote proxy substitutes the remote host's exported env | |||||
| 14 | 14 | ||||
| 15 | vev keeps a server-side VT screen per pane: scroll regions (DECOM), insert mode, cursor and mode-query reports, alternate screen, bracketed paste, mouse tracking, synchronized updates, OSC 9/777 notifications, OSC 52 clipboard, and double-width cells. Resizes repair double-width cells so CJK and emoji halves are never left behind. | 15 | vev keeps a server-side VT screen per pane: scroll regions (DECOM), insert mode, cursor and mode-query reports, alternate screen, bracketed paste, mouse tracking, synchronized updates, OSC 9/777 notifications, OSC 52 clipboard, and double-width cells. Resizes repair double-width cells so CJK and emoji halves are never left behind. | ||
| 16 | 16 | ||||
| 17 | + | ## Recovery | |||
| 18 | + | ||||
| 19 | + | Named-session checkpoints preserve bounded scrollback and a recovery transcript containing the primary viewport followed by the active alternate viewport, when present. Each viewport trims only trailing untouched blank rows; leading, internal, styled, and otherwise touched blank rows remain. | |||
| 20 | + | ||||
| 21 | + | On restore, vev appends the transcript after bounded scrollback as copy-mode history on a fresh blank VT screen. A resumed allowlisted process can redraw the live screen without erasing that recovered history. Recovery does not replay the PTY stream or restore the previous cursor or terminal modes. | |||
| 22 | + | ||||
| 17 | ## Alt+Space caveat | 23 | ## Alt+Space caveat | ||
| 18 | 24 | ||||
| 19 | Some terminals encode Alt+Space as a non-breaking space instead of `ESC Space`. If the palette does not open, rebind `open-palette`. | 25 | Some terminals encode Alt+Space as a non-breaking space instead of `ESC Space`. If the palette does not open, rebind `open-palette`. | ||