fix(core): [Unhandled Sessions 2] Make session cache writes session-id aware - #5920
Draft
buenaflor wants to merge 8 commits into
Draft
fix(core): [Unhandled Sessions 2] Make session cache writes session-id aware#5920buenaflor wants to merge 8 commits into
buenaflor wants to merge 8 commits into
Conversation
SessionEnd previously deleted session.json unconditionally and SessionStart always rotated it. A delayed end or start could therefore drop a newer session snapshot. Both paths now compare session ids and start times before deleting or rotating, and a new persistCurrentSession lets callers flush the active session to disk. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
This was referenced Aug 10, 2026
Draft
Contributor
Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 6b019b7 | 343.31 ms | 417.23 ms | 73.91 ms |
| d15471f | 286.65 ms | 314.68 ms | 28.03 ms |
| d217708 | 409.83 ms | 474.72 ms | 64.89 ms |
| d500866 | 326.13 ms | 378.70 ms | 52.58 ms |
| fcec2f2 | 314.96 ms | 373.66 ms | 58.70 ms |
| d501a7e | 314.55 ms | 343.34 ms | 28.79 ms |
| 7414e9b | 322.49 ms | 378.88 ms | 56.39 ms |
| fcec2f2 | 357.47 ms | 447.32 ms | 89.85 ms |
| a416a65 | 316.52 ms | 359.67 ms | 43.15 ms |
| 983e0f0 | 350.64 ms | 386.44 ms | 35.79 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 6b019b7 | 0 B | 0 B | 0 B |
| d15471f | 1.58 MiB | 2.13 MiB | 559.54 KiB |
| d217708 | 1.58 MiB | 2.10 MiB | 532.97 KiB |
| d500866 | 0 B | 0 B | 0 B |
| fcec2f2 | 1.58 MiB | 2.12 MiB | 551.50 KiB |
| d501a7e | 0 B | 0 B | 0 B |
| 7414e9b | 0 B | 0 B | 0 B |
| fcec2f2 | 1.58 MiB | 2.12 MiB | 551.50 KiB |
| a416a65 | 1.58 MiB | 2.12 MiB | 555.26 KiB |
| 983e0f0 | 0 B | 0 B | 0 B |
Co-authored-by: Cursor <cursoragent@cursor.com>
📲 Install BuildsAndroid
|
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.
PR Stack (Unhandled Sessions)
📜 Description
Makes the session file cache aware of which session it is acting on.
Two paths in
EnvelopeCache.storeInternalpreviously ignored session identity:SessionEnddeletedsession.jsonunconditionally. A delayedEnd(A)arriving after a newer session B was persisted would delete B's file.SessionStartalways rotatedsession.jsonintoprevious_session.jsonand overwrote it. A delayedStart(A)arriving after A's own state had already advanced on disk would overwrite the newer snapshot.Both now compare session ids (and, for
SessionEnd, start times) before deleting or rotating. A stale end only preserves the current file when the current session is genuinely newer — a different id and a later start time. Everything else keeps the existing behaviour, including malformed envelopes and unreadable session files, which still delete as before.Also adds
EnvelopeCache.persistCurrentSession(Session)so a caller can flush the active session to disk outside the envelope-store path, and extractsreadSessionFromEnvelope/readSessionFromDiskhelpers.💡 Motivation and Context
Needed by the next PR in the stack, which mutates the live session in place (flagging a non-terminating unhandled error) and persists it so the flag survives process death. Without session-id awareness, an unrelated in-flight
SessionEndorSessionStartcould clobber that snapshot.In practice this only changes observable behaviour for sessions carrying the flag from PR 1 — the preserve branch requires
hasNonTerminatingUnhandledError()— so existing SDK flows are unaffected.💚 How did you test it?
EnvelopeCacheTestgrew coverage for delayed same-idSessionStartpreserving a newer unhandled or higher-error snapshot, different-id starts still rotating, matching and mismatchingSessionEnd, null session ids on both paths, malformed envelopes, and unreadable session files. Also verified the pre-existingAbnormalExitandNativeCrashExitrecovery paths still win over the flag. 36 tests, all passing.📝 Checklist
sendDefaultPIIis enabled.🔮 Next steps
The capture API that sets the flag, in the next PR in this stack.
#skip-changelog