diff --git a/src/resources/extensions/gsd/tests/crash-recovery.test.ts b/src/resources/extensions/gsd/tests/crash-recovery.test.ts index 4055a371b..7a8b858d0 100644 --- a/src/resources/extensions/gsd/tests/crash-recovery.test.ts +++ b/src/resources/extensions/gsd/tests/crash-recovery.test.ts @@ -103,12 +103,14 @@ function writePausedSession( milestoneId = "M001", stepMode = false, worktreePath?: string, + unitType?: string, + unitId?: string, ): void { const runtimeDir = join(base, ".gsd", "runtime"); mkdirSync(runtimeDir, { recursive: true }); writeFileSync( join(runtimeDir, "paused-session.json"), - JSON.stringify({ milestoneId, originalBasePath: base, stepMode, worktreePath }, null, 2), + JSON.stringify({ milestoneId, originalBasePath: base, stepMode, worktreePath, unitType, unitId }, null, 2), "utf-8", ); } @@ -168,6 +170,38 @@ test("readPausedSessionMetadata reads paused-session metadata when present", () } }); +test("readPausedSessionMetadata preserves unitType and unitId through round-trip", () => { + const base = makeTmpBase(); + try { + writePausedSession(base, "M001", false, undefined, "execute-task", "M001/S01/T02"); + const meta = readPausedSessionMetadata(base); + assert.equal(meta?.unitType, "execute-task"); + assert.equal(meta?.unitId, "M001/S01/T02"); + } finally { + cleanup(base); + } +}); + +test("readPausedSessionMetadata handles legacy metadata without unitType/unitId", () => { + const base = makeTmpBase(); + try { + // Write metadata without unitType/unitId (simulates older version) + const runtimeDir = join(base, ".gsd", "runtime"); + mkdirSync(runtimeDir, { recursive: true }); + writeFileSync( + join(runtimeDir, "paused-session.json"), + JSON.stringify({ milestoneId: "M001", originalBasePath: base }), + "utf-8", + ); + const meta = readPausedSessionMetadata(base); + assert.equal(meta?.milestoneId, "M001"); + assert.equal(meta?.unitType, undefined); + assert.equal(meta?.unitId, undefined); + } finally { + cleanup(base); + } +}); + test("assessInterruptedSession returns none when no lock and no paused session exist", async () => { const base = makeTmpBase(); try {