fix: recover from interrupted session restores - #260
Merged
alecdotdev merged 4 commits intoJul 29, 2026
Merged
Conversation
PathGao
force-pushed
the
codex/recover-interrupted-session-restore
branch
2 times, most recently
from
July 28, 2026 05:46
69ebe22 to
5e44133
Compare
PathGao
force-pushed
the
codex/recover-interrupted-session-restore
branch
from
July 29, 2026 07:06
4fd6f46 to
dcfdeb9
Compare
Collaborator
Author
|
@alecdotdev This branch has been rebased onto the latest #258 branch and force-pushed; the merge conflict is resolved. Validation passed: |
This was referenced Jul 29, 2026
This was referenced Aug 2, 2026
PathGao
added a commit
that referenced
this pull request
Aug 2, 2026
…401) Three ways a restore lost documents, all of them permanent because the trimmed result was written straight back to the snapshot. - A single failed read evicted the tab. A network share not yet mounted, an external drive not plugged in, a file briefly locked - the tab was gone, and plugging the drive back in did not bring it back. The tab now stays, with its buffer marked through the existing `isTruncated` flag: every writer already refuses such a buffer, and `ensureFullContent` already re-reads and clears it, so the tab heals itself the next time it is opened. A dirty buffer is never marked - unsaved text outranks a failed read of its file. - An interrupted restore deleted the whole snapshot. The #260 breadcrumb recorded that a restore was running, not what it was running, so the only available response was collective punishment. It now records the document it was on, so the next launch defers that one and restores everything else. After three interruptions startup restores the tab list without reading any file, which is a stable end state that loses nothing. A deferred path is released once Markpad has read it successfully - a quarantine with no exit is a permanent loss on a longer timescale. - The `'HOME'` sentinel was written into the snapshot, because the filter tested `path !== ''` while `hasRealFilePath()` - used everywhere else - tests for both. Reading it back invoked `read_file_content('HOME')`, which threw, which took the first path above. Both sides now use `hasRealFilePath`; the read side is required because snapshots already on disk contain it. `restore()` no longer deletes the snapshot anywhere, including its outer catch. `discardPersistedState` survives for explicit exit only. Co-authored-by: PathGao <gaoyanbo@gaoyanbodeMacBook-Air.local> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #259.
Summary
Validation