From 34fe60004d39da185a4f9eba6ac0f9a5ac279e13 Mon Sep 17 00:00:00 2001 From: Jinwoo-H Date: Sun, 23 Aug 2026 06:24:10 -0400 Subject: [PATCH] fix(native-chat): reject coarse-mtime rewrites --- .../native-chat/ssh-transcript-range-fs.test.ts | 13 +++++++++++++ src/main/native-chat/ssh-transcript-range-fs.ts | 4 +++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/native-chat/ssh-transcript-range-fs.test.ts b/src/main/native-chat/ssh-transcript-range-fs.test.ts index d0113912d76..13e981a2972 100644 --- a/src/main/native-chat/ssh-transcript-range-fs.test.ts +++ b/src/main/native-chat/ssh-transcript-range-fs.test.ts @@ -93,4 +93,17 @@ describe('SSH transcript range stability', () => { TranscriptRangeReadInvalidatedError ) }) + + it('rejects a same-length rewrite even when remote mtime is coarse', async () => { + const remote = mutableProvider('old generation') + mocks.provider = remote.provider + const rangeFs = await createSshTranscriptRangeFs('ssh-owner') + const openingStamp = await rangeFs.stat(TRANSCRIPT_PATH, undefined, true) + + remote.replace('new generation', false) + + await expect(rangeFs.assertStable(TRANSCRIPT_PATH, openingStamp)).rejects.toBeInstanceOf( + TranscriptRangeReadInvalidatedError + ) + }) }) diff --git a/src/main/native-chat/ssh-transcript-range-fs.ts b/src/main/native-chat/ssh-transcript-range-fs.ts index 92bb5e33cc2..de5027d9578 100644 --- a/src/main/native-chat/ssh-transcript-range-fs.ts +++ b/src/main/native-chat/ssh-transcript-range-fs.ts @@ -109,7 +109,9 @@ export async function createSshTranscriptRangeFs( if (versionChanged) { throw new TranscriptRangeReadInvalidatedError() } - return + if (openingStamp.size === 0) { + return + } } if (!openingStamp.boundaryFingerprint) { throw new TranscriptRangeReadInvalidatedError()