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