Skip to content

[Feature]: Preserve pending native user questions across server restarts #23597

Closed

Description

@hahasagined

Summary

A pending native Codex request_user_input question becomes permanently unanswerable after a normal server restart. Please preserve supported pending questions durably, and resume the original conversation only after the user answers.

This was reproduced with a real provider conversation on stock 0.1.2-nightly.20261022.3512 (Linux, headless T3 in a Coder workspace), using a single server and its existing data directory. The server was stopped and started on the same runtime and workspace template; this was not an upgrade or a shared-data-directory/two-writer setup.

Reproduction

  1. Start a Codex conversation in plan mode and ask it to call the native blocking request_user_input tool with a simple Alpha/Beta choice. Tell it to repeat the chosen answer after receiving it.
  2. Confirm that the request is pending and has responseCapability: { "type": "live" }. Leave it unanswered.
  3. Stop and start the server while retaining its data directory. Our test used the supported Coder workspace stop/start lifecycle on an unchanged template.
  4. Inspect the original question and attempt to answer that original request.

Actual result

After startup, the original request was:

{
  "kind": "user_input",
  "status": "expired",
  "responseCapability": {
    "type": "not_resumable",
    "reason": "The server restarted before this runtime request was resolved."
  }
}

The waiting run was cancelled. runtime-request.respond for the original request was rejected with Runtime request <id> is expired. No continuation run was created. All pre-existing conversation identities and message hashes were retained, as were settings and authentication/Connect state; the loss is specifically the ability to answer the pending question and continue it.

Expected behavior

For providers and native conversation identities that support safe resumption:

  • Keep the original question and request identity durably across shutdown/startup.
  • Keep it answerable after startup, without choosing an answer on the user's behalf.
  • Do not automatically continue the waiting conversation before an answer arrives.
  • After an answer, resume the correct native conversation exactly once, including if duplicate answer submissions race or recovery runs again.
  • Do not reopen answered questions or turn manually cancelled requests back into pending questions. Requests that cannot safely resume, including unsupported permission/secret requests, should keep explicit safe handling.

If preserving a process-bound native callback is unsupported, a durable answer/message continuation path would meet the user need. This may be a feature request rather than a regression; the current expiration appears intentional, but it prevents safely restarting otherwise idle servers with unanswered questions.

Impact

Routine maintenance must wait for every blocking question to be answered, or it loses the original question's answer path. An agent waiting for a human may remain parked for hours or days even though no work is actively executing.

Related issues

Validation limits

The real-provider restart and rejection above were observed directly. Correct-conversation/exactly-once resumption could not be tested on this stock build because the request expired first. No production question was answered for its owner.

Activity

  1. added a commit that references this issue on Oct 22, 2026
    2f36b6e
  2. locked and limited conversation to collaborators on Oct 24, 2026
  3. converted this issue into a discussion #24415 on Oct 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions