Merge pull request #2860 from deepseek-harness/turtle/warn-torn-jsonl-recovery

fix(jsonl): warn when repairing torn tails
This commit is contained in:
Turtle
2026-08-24 11:15:05 +08:00
committed by GitHub
2 changed files with 3 additions and 0 deletions
@@ -450,6 +450,7 @@ export class JsonlSessionPersistence extends SessionPersistence implements Persi
if (tornMarker !== undefined) await this.repair(meta, tornMarker.truncateTo)
const repairedEvents = [...(tornMarker?.recoveredEvents ?? []), ...closers]
if (repairedEvents.length > 0) await this.appendLines(meta, repairedEvents)
if (tornMarker !== undefined) this.ctx.logger.warn(`${this.name}: session "${meta.id}" recovered from a torn tail; incomplete tail bytes were discarded`)
}
/** List valid unique stored sessions' metadata (header line only — no full-log parse). */
@@ -552,6 +552,7 @@ describe('JsonlSessionPersistence: default Zstandard encoding', () => {
const root = await freshRoot()
const ctx = await mount(root)
const header = meta('recover-torn', '/proj')
const warn = vi.spyOn(ctx.logger, 'warn').mockImplementation(() => undefined)
await ctx.sessionPersistence.create(header)
await ctx.sessionPersistence.append(header.id, oneTurnLog())
const path = logPath(root, header.cwd, header.id, 'zstd')
@@ -575,6 +576,7 @@ describe('JsonlSessionPersistence: default Zstandard encoding', () => {
expect(loaded.events.some(event => event.type === 'assistant/chunk' && event.seq === 8)).toBe(false)
expect(loaded.events[8]?.type).toBe('step/end')
expect(loaded.events[9]?.type).toBe('turn/end')
expect(warn).toHaveBeenCalledWith('session-persistence-jsonl: session "recover-torn" recovered from a torn tail; incomplete tail bytes were discarded')
const repaired = await readFile(path)
expect(repaired.subarray(0, committed.length)).toEqual(committed)