diff --git a/packages/paperclip-runner/runner/crates/runner-core/src/acpx_provider_backend.rs b/packages/paperclip-runner/runner/crates/runner-core/src/acpx_provider_backend.rs index 37fd89a2c2..93e7e4005c 100644 --- a/packages/paperclip-runner/runner/crates/runner-core/src/acpx_provider_backend.rs +++ b/packages/paperclip-runner/runner/crates/runner-core/src/acpx_provider_backend.rs @@ -971,7 +971,11 @@ impl AcpxCommandExecutor { .as_mut() .expect("ACPX state remains available after provider termination"); state.active_turn_id = None; - state.lifecycle = "suspended".to_owned(); + // Keep the provider checkpoint closed while runnerd drains the + // already-persisted event suffix. `suspended` is a recoverable ACPX + // lifecycle and would make the following runner.drain command restart + // the provider generation that turn.stop just proved terminated. + state.lifecycle = "prepared".to_owned(); self.save_state()?; Ok(CommandExecution::result(json!({ "status": "stopped", diff --git a/packages/paperclip-runner/runner/crates/runner-core/src/provider_backend.rs b/packages/paperclip-runner/runner/crates/runner-core/src/provider_backend.rs index 1a55db8c06..d2b634c015 100644 --- a/packages/paperclip-runner/runner/crates/runner-core/src/provider_backend.rs +++ b/packages/paperclip-runner/runner/crates/runner-core/src/provider_backend.rs @@ -2183,7 +2183,10 @@ impl CodexCommandExecutor { state.active_provider_result_fingerprint = None; state.active_provider_result_disposition = None; state.last_agent_message = None; - state.lifecycle = "provider_exited".to_owned(); + // Do not let the runner.drain command that follows turn.stop restore a + // fresh provider process. `prepared` retains the durable thread while + // deferring the only authorized restart to the successor run.attach. + state.lifecycle = "prepared".to_owned(); self.save_state()?; Ok(CommandExecution::result(json!({ "status": "stopped", diff --git a/packages/paperclip-runner/src/live/runnerd-codex-transport.test.ts b/packages/paperclip-runner/src/live/runnerd-codex-transport.test.ts index bcbd052b55..dc7cf8a319 100644 --- a/packages/paperclip-runner/src/live/runnerd-codex-transport.test.ts +++ b/packages/paperclip-runner/src/live/runnerd-codex-transport.test.ts @@ -2129,7 +2129,7 @@ it("persists an active provider as settled before bounded suspension", async () ), ) as Record; expect(providerState).toMatchObject({ - lifecycle: "provider_exited", + lifecycle: "prepared", activeProviderTurnId: null, }); } finally {