diff --git a/server/src/services/native-runtime/native-session-executor.test.ts b/server/src/services/native-runtime/native-session-executor.test.ts index 58eaaa7c44a..aff0735736e 100644 --- a/server/src/services/native-runtime/native-session-executor.test.ts +++ b/server/src/services/native-runtime/native-session-executor.test.ts @@ -12321,6 +12321,8 @@ describe("native warm session supervision", () => { terminalTurns: [], pendingRuntimeRequests: [], codexUsageBaseline: { baseline: {}, latest, ...(accounted ? { accounted } : {}) }, + dispositionOnlyRecoveryConsumed: true, + dispositionOnlyRecoveryTurnId: "turn-first-run-restart-continuation", }; const result = { result: { summary: "completed" }, @@ -12336,6 +12338,7 @@ describe("native warm session supervision", () => { }; const firstClose = vi.fn(async () => undefined); let resumedBaseline: unknown; + let resumedMarker: unknown; state.execute .mockReset() .mockImplementationOnce(async (options) => { @@ -12345,6 +12348,8 @@ describe("native warm session supervision", () => { }) .mockImplementationOnce(async (options) => { resumedBaseline = options.persistedSession?.codexUsageBaseline; + resumedMarker = { consumed: options.persistedSession?.dispositionOnlyRecoveryConsumed, + turnId: options.persistedSession?.dispositionOnlyRecoveryTurnId }; return result; }); @@ -12365,6 +12370,7 @@ describe("native warm session supervision", () => { latest, ...(accounted ? { accounted } : {}), }); + expect(resumedMarker).toEqual({ consumed: false, turnId: null }); } finally { if (previousPaperclipHome === undefined) { delete process.env.PAPERCLIP_HOME; diff --git a/server/src/services/native-runtime/native-session-executor.ts b/server/src/services/native-runtime/native-session-executor.ts index f4aacfdb298..5a3c30b02cd 100644 --- a/server/src/services/native-runtime/native-session-executor.ts +++ b/server/src/services/native-runtime/native-session-executor.ts @@ -7698,6 +7698,8 @@ function loadWarmNativeCheckpoint( activeTurnId: null, terminalTurns: [], pendingRuntimeRequests: [], + dispositionOnlyRecoveryConsumed: false, + dispositionOnlyRecoveryTurnId: null, governedWait: undefined, ...(envelope.snapshot.codexUsageBaseline ? { codexUsageBaseline: codexUsageBaselineForNextRun(envelope.snapshot.codexUsageBaseline) } diff --git a/server/src/services/native-runtime/native-session-resume.test.ts b/server/src/services/native-runtime/native-session-resume.test.ts index df3c17a2a2d..ce3f8314711 100644 --- a/server/src/services/native-runtime/native-session-resume.test.ts +++ b/server/src/services/native-runtime/native-session-resume.test.ts @@ -2020,6 +2020,8 @@ describe("rebindNativeSessionCheckpoint", () => { const profile = prior.runnerProfileJson as Record; const checkpoint = profile.sessionCheckpoint as Record; checkpoint.governedWait = { sourceEvent: { runId: previousRunId, turnId: "old-turn" }, result: { reportedWorkDisposition: "yielded" } }; + checkpoint.dispositionOnlyRecoveryConsumed = true; + checkpoint.dispositionOnlyRecoveryTurnId = "old-restart-continuation"; const before = structuredClone(prior); const rebound = rebindNativeSessionCheckpoint({ previousRun: prior, @@ -2037,6 +2039,8 @@ describe("rebindNativeSessionCheckpoint", () => { activeTurnId: null, terminalTurns: [], pendingRuntimeRequests: [], + dispositionOnlyRecoveryConsumed: false, + dispositionOnlyRecoveryTurnId: null, providerRecoveryPolicy: "allow_replacement_after_resume_failure", identity: { runId: currentRunId, diff --git a/server/src/services/native-runtime/native-session-resume.ts b/server/src/services/native-runtime/native-session-resume.ts index 2a2155d9d7a..7708c725ce2 100644 --- a/server/src/services/native-runtime/native-session-resume.ts +++ b/server/src/services/native-runtime/native-session-resume.ts @@ -717,6 +717,8 @@ export function rebindNativeSessionCheckpoint(input: { activeTurnId: null, terminalTurns: [], pendingRuntimeRequests: [], + dispositionOnlyRecoveryConsumed: false, + dispositionOnlyRecoveryTurnId: null, // Settlement evidence belongs to the prior heartbeat run, even when the // provider session is reused for the user's response. governedWait: undefined,