From 0ff0b91907b1afd854492e72efc5a363f8d6d6cc Mon Sep 17 00:00:00 2001 From: Sawyer Cutler Date: Sun, 23 Aug 2026 13:14:17 -0700 Subject: [PATCH] Name the failing segment in extra-segment load errors parseSegmentTurns omitted fileName at the extra-segment call sites (loadTurnsWithoutMalformedToolSequence and readAt), so corruption in turns-0001.jsonl and later segments fell back to the generic "turns segment" label. Thread the segment name through both call sites. --- src/session/optimized-context-store.test.ts | 15 +++++++++++++++ src/session/optimized-context-store.ts | 8 ++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/session/optimized-context-store.test.ts b/src/session/optimized-context-store.test.ts index 7e02ed8e..7d0ce6f2 100644 --- a/src/session/optimized-context-store.test.ts +++ b/src/session/optimized-context-store.test.ts @@ -398,6 +398,21 @@ describe("loadRecentTurns", () => { await expect(store.load()).rejects.toThrow(TURNS_FILE); }); + + test("reactor's load() stays strict and names an unrecoverable extra segment", async () => { + const dir = tempDir(); + const store = await createOptimizedContextStore(dir); + const segmentName = segmentFileName(TURNS_FILE, 1); + + fs.writeFileSync(path.join(dir, TURNS_FILE), jsonl([turn("a")])); + // Mid-file garbage that is neither null padding nor a torn tail — unrecoverable. + fs.writeFileSync( + path.join(dir, segmentName), + jsonl([turn("b")]) + "THIS IS NOT JSON\n" + jsonl([turn("c")]), + ); + + await expect(store.load()).rejects.toThrow(segmentName); + }); }); describe("createOptimizedContextStore checkpoint", () => { diff --git a/src/session/optimized-context-store.ts b/src/session/optimized-context-store.ts index bc614376..3ab223d9 100644 --- a/src/session/optimized-context-store.ts +++ b/src/session/optimized-context-store.ts @@ -387,7 +387,11 @@ export async function createOptimizedContextStore(dir: string): Promise - parseSegmentTurns(text, index === extraTexts.length - 1), + parseSegmentTurns( + text, + index === extraTexts.length - 1, + segmentFileName(TURNS_FILE, index + 1), + ), ); const keepExtras = longestWellFormedExtraCount(baseTurns, parsedExtras); @@ -466,7 +470,7 @@ export async function createOptimizedContextStore(dir: string): Promise