Skip to content

CLI async questions remain pending after answers in normal chat; expose resolve/withdraw lifecycle #44648

Open

Description

@jlindley

Problem

A structured async question can remain pending in the CLI after the user has answered it through the ordinary conversation and the assistant has understood and used that answer. The concern is lifecycle reconciliation, not how to manually skip the question.

The assistant also has no exposed operation in the affected session to mark that specific question answered or withdraw it when it becomes obsolete. Conversation state and the visible pending-question state can therefore disagree.

Environment

  • Observed September 10, 2026.
  • Installed CLI reports codex-cli 0.154.0.
  • macOS 15.7.7, build 24G720.
  • Default collaboration mode; GPT-6-Astra.
  • User screenshots show the CLI/TUI, specifically Queued follow-up inputs, ? 1 question, and its expandable question editor. This is not the desktop app's pending Steer message card.
  • The installed CLI version was checked locally; no independent process-to-executable mapping was collected for the running session.

Observed sequence

  1. During a task, the assistant called functions.request_user_input_async to ask for a documentation style preference, with two suggested options.
  2. The tool returned {"accepted":true}.
  3. The user answered via an ordinary conversation message, explaining the desired style and experience level, rather than submitting through the special question UI.
  4. The assistant received the answer, used it, and completed the requested document.
  5. Several subsequent normal conversation exchanges occurred.
  6. The CLI still displayed Queued follow-up inputs / ? 1 question.
  7. Expanding it showed the original documentation-style question and original options. The footer offered Enter to submit and Ctrl+] to skip.

The assistant's tool invocation and receipt/use of the ordinary answer are directly observable in the conversation. The stale CLI state is shown in user-provided screenshots. This is an observed incident, not a clean-room deterministic reproduction; the exact input-delivery path and queue/state transitions have not been instrumented.

Screenshots and the full conversation are not attached to avoid publishing unrelated task content. The UI labels and sequence above capture the relevant evidence.

Expected behavior

A question answered elsewhere in the same conversation should be reconciled with the original pending question. The user should not need to answer twice or manually clean up a question the assistant already considers resolved.

Please provide a reliable lifecycle for these questions, for example:

  • Stable question/request identifiers and agent-visible pending/resolved state.
  • An agent-facing operation to resolve a particular question using a received user answer, or withdraw it when it is no longer relevant.
  • UI updates that remove resolved/withdrawn questions from the pending list while preserving an appropriate transcript record.
  • Automatic reconciliation where the answer association is clear; ambiguous or unrelated follow-up input must not be treated as an answer or authorization.
  • Consistent state across later turns, reconnect, and replay, without resurrecting resolved questions.

The specific mechanism is up to maintainers. The requirement is that the assistant can track and close the question lifecycle when answers arrive outside the special UI. A manual Skip shortcut alone does not address this.

Agent-facing limitation observed

In this session, request_user_input_async accepts question titles/options and returns only {"accepted":true}. No question ID is returned by that tool result, and the available tools expose no resolve/cancel/withdraw operation for an existing question. This describes the model-facing capability in this session, not a claim that the backend has no internal IDs or lifecycle APIs.

Relevant upstream code

Current main already contains ordinary_follow_up_clears_unanswered_questions_after_accepted_input in:

https://github.com/openai/codex/blob/e25bedc166b54acadb505b587a387091097b2393/codex-rs/tui/src/chatwidget/tests/questions_tests.rs

That test appears to cover normal composer delivery clearing existing questions and suppressing the same question when added again. The observed session did not exhibit the expected cleanup. This could be a release/path discrepancy or an uncovered delivery/replay case; no root cause is established here. Clearing every question on arbitrary follow-up input also differs from explicitly resolving the question that was actually answered.

Suggested acceptance cases

  • Ask Q, receive its answer in the normal composer, incorporate it: Q is no longer pending.
  • Ask Q, later user input makes Q obsolete: the assistant can withdraw Q.
  • Ask Q1 and Q2, receive an answer only to Q1: resolve Q1 while preserving Q2.
  • Receive an unrelated status question: do not silently mark pending questions answered.
  • Reconnect/replay after resolution: Q does not reappear.
  • Resolving a question records actual user input; elapsed time or an unrelated message does not create user approval.

Related but distinct

This report is about an already-answered async question remaining pending in the CLI and the missing model-facing way to reconcile or withdraw it. Filed at the affected user's request.

Activity

  1. added
    bugSomething isn't working
    CLIIssues related to the Codex CLI
    TUIIssues related to the terminal user interface: text input, menus and dialogs, and terminal display
    tool-callsIssues related to tool calling
    on Sep 10, 2026
  2. Opti78 commented on Sep 13, 2026

    @Opti78

    Additional user report, submitted at the affected user's explicit request on September 13, 2026.

    In a long-running Codex development conversation, several follow-up questions had become obsolete because their decisions were already settled earlier in the same conversation and recorded in project documents. The user quoted the old questions and answered them again through normal chat. The assistant received those answers, acknowledged the decisions as settled, and reconciled the project records. The user nevertheless reports that the old questions continue to accumulate in the visible follow-up list.

    The problem is cumulative: telling the user to ignore obsolete questions leaves an increasingly cluttered queue and makes it harder to distinguish real decisions from already-completed ones. The user specifically asked why the assistant does not clean up the list and requested that OpenAI be informed.

    The model-facing tools available in this session expose question creation but no operation to list, resolve, or withdraw previously created question cards. Updating repository records cannot reconcile the UI queue. This is a report of the visible user experience and available session tools, not an independently instrumented root-cause diagnosis or a claim that the backend has no internal lifecycle APIs.

    Locally installed CLI reports codex-cli 0.154.0 on Linux. The exact executable behind the visible question UI was not independently mapped, and no clean-room reproduction was performed. Private project details, session transcripts and screenshots are omitted.

    Requested outcome: reconcile questions answered in ordinary chat; let the assistant withdraw specific obsolete questions; offer a clear user action to dismiss/archive obsolete questions, including several at once; preserve genuinely unanswered questions and an auditable history. Ignoring stale questions should not be the only practical way forward. In particular, neither unrelated chat input nor dismissal should invent an answer or approval.

  3. imac-oai commented on Sep 24, 2026

    @imac-oai
    Contributor

    This should be (mostly) fixed as of 0.156.0 (pending questions clear when you start a new turn of the conversation). But I'd love confirmation of that, if you can!


    We hear you re: having the model track which questions have been answered (e.g. via regular responses or other routes); looking into that.

  4. RationaleDesignHanson commented on Oct 2, 2026

    @RationaleDesignHanson

    I am seeing a related failure on macOS with Codex CLI 0.160.0 in iTerm2. During Radio setup on October 2, 2026, an agent sent a request_user_input_async question about operating mode at about 2:18 PM EDT. The tool returned {"accepted":true}. I answered “at-computer” in ordinary chat, and Radio recorded that choice, but its receiver still reports the Codex session as waiting for user input.

    The original Codex TUI now shows 0 “Needs you” tasks and no “Queued follow-up inputs” indicator. At its live prompt, Shift+Left opens no question; Ctrl+] only changes the composer. The older question text is visible in transcript history, but there is no answer card. Further ordinary chat replies do not clear the outstanding request.

    Radio reports waiting_human, waitKind: user_input, and outstanding: true for that session. It will not hand over or confirm its setup probe while the session appears to be waiting, so the registered agent is not verified as reachable. A fresh Codex session could not take over the existing Radio profile under Radio's safe handoff rules. No probe was manually confirmed, and the existing profile and keys were preserved.

    Please advise a supported way to resolve or withdraw the specific lost async request, or repair the session state, without losing the existing agent identity. This differs from a merely collapsed question: the original TUI has no queued-question indicator or accessible card. I can provide redacted screenshots and the thread ID privately. I also observed hook returned invalid stop hook JSON output after some turns; its relationship to this issue is unknown.

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

    CLIIssues related to the Codex CLITUIIssues related to the terminal user interface: text input, menus and dialogs, and terminal displaybugSomething isn't workingtool-callsIssues related to tool calling

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions