Skip to content

fix: recover from interrupted session restores - #260

Merged
alecdotdev merged 4 commits into
sftwrdotdev:masterfrom
PathGao:codex/recover-interrupted-session-restore
Jul 29, 2026
Merged

fix: recover from interrupted session restores#260
alecdotdev merged 4 commits into
sftwrdotdev:masterfrom
PathGao:codex/recover-interrupted-session-restore

Conversation

@PathGao

@PathGao PathGao commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator

Fixes #259.

Summary

  • Mark automatic session restoration as in progress before restored tabs are read and rendered.
  • Clear the marker after normal completion or a handled restore failure.
  • On the next startup after an interruption, discard only the saved-tab snapshot and start normally; user documents are untouched.

Validation

  • node --test --import tsx scripts/interruptedSessionRestore.test.ts
  • npm run check

@PathGao
PathGao force-pushed the codex/recover-interrupted-session-restore branch 2 times, most recently from 69ebe22 to 5e44133 Compare July 28, 2026 05:46
@PathGao
PathGao force-pushed the codex/recover-interrupted-session-restore branch from 4fd6f46 to dcfdeb9 Compare July 29, 2026 07:06
@PathGao

PathGao commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator Author

@alecdotdev This branch has been rebased onto the latest #258 branch and force-pushed; the merge conflict is resolved. Validation passed: node --test --import tsx scripts/interruptedSessionRestore.test.ts scripts/windowStateRestore.test.ts and npm run check. Please merge in this order: #254#258#260#266.

@alecdotdev
alecdotdev merged commit c70a3f2 into sftwrdotdev:master Jul 29, 2026
5 checks passed
@PathGao
PathGao deleted the codex/recover-interrupted-session-restore branch July 30, 2026 06:28
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix: recover from an interrupted restored session

2 participants