Skip to content

Goal pause state exists, but agent tool contract can make agents report pause is unavailable #30630

Closed

Description

@johnsilvavlogs

Summary

Goal pause appears to be supported by the local goal model and runtime events, but the agent-visible contract can lead the agent to tell the user that pause is unavailable.

In one Codex Desktop thread, the user explicitly asked to pause the goal while keeping an automation/heartbeat running. The agent answered that the goal tool did not expose a pause status and said the goal would remain active. Shortly after that, the runtime emitted thread_goal_updated with status: "paused", and a later get_goal returned the same goal as paused.

This creates a confusing state where pause exists and is applied, but the agent can misreport it as unsupported.

Environment

Observed on 2026-06-29:

  • Codex Desktop macOS app: 26.623.70822
  • App bundle version: 4559
  • Parent session metadata reported: cli_version: 0.142.4
  • Local shell codex --version reports: codex-cli 0.142.1
  • Repository issue filed from macOS / Codex Desktop

Local evidence

The local goal DB schema explicitly permits paused:

CREATE TABLE thread_goals (
    thread_id TEXT PRIMARY KEY NOT NULL,
    goal_id TEXT NOT NULL,
    objective TEXT NOT NULL,
    status TEXT NOT NULL CHECK(status IN (
        'active',
        'paused',
        'blocked',
        'usage_limited',
        'budget_limited',
        'complete'
    )),
    token_budget INTEGER,
    tokens_used INTEGER NOT NULL DEFAULT 0,
    time_used_seconds INTEGER NOT NULL DEFAULT 0,
    created_at_ms INTEGER NOT NULL,
    updated_at_ms INTEGER NOT NULL
);

The same local DB had multiple paused goals, including the active thread under investigation.

Relevant rollout sequence from the affected thread, redacted to avoid private content:

  1. get_goal returned the current goal with status: "active".
  2. The user said: you may pause the goal but keep the heartbeat!
  3. The agent responded:
Paused here. The goal tool does not expose a `pause` status, so I did not mark it complete or blocked; it remains active in the tool state...
  1. No visible update_goal or set_goal call appears in the transcript around that turn. The only visible goal calls in the thread were create_goal and repeated get_goal calls.
  2. The runtime then emitted:
{
  "type": "thread_goal_updated",
  "threadId": "<same-thread-id>",
  "goal": {
    "status": "paused"
  }
}
  1. A later get_goal returned:
{
  "goal": {
    "threadId": "<same-thread-id>",
    "status": "paused"
  }
}

In the follow-up side conversation, deferred tool discovery for goal pause/update did not expose an agent-facing pause/update goal tool either; it returned unrelated tools.

Expected behavior

When a user asks the agent to pause a goal:

  • The agent should have an explicit, documented way to pause the goal, for example update_goal({"status":"paused"}), or
  • If pausing is intentionally handled by the runtime rather than the model, the agent should be told that this will happen and should not claim pause is unsupported.

The model-visible goal contract should match the runtime and storage model. If paused is a valid persisted/runtime state, the tool schema and instructions should not lead agents to say only complete/blocked are possible.

Actual behavior

  • Local storage supports paused.
  • Runtime emits thread_goal_updated with status: "paused".
  • get_goal later confirms status: "paused".
  • The agent can still tell the user that pause is not exposed and that the goal remains active.
  • No explicit agent-visible pause/update call is present in the transcript around the transition.

Why this matters

For long-running Goal mode work, users need reliable lifecycle semantics: active, paused, blocked, and complete are meaningfully different. If the agent incorrectly says a goal cannot be paused, users lose trust in manager/heartbeat workflows and may think the goal is still consuming active attention even after the platform has paused it.

This is especially confusing for workflows where the goal should pause but an external monitor/automation should continue running.

Suggested fix direction

One of these would make the behavior coherent:

  1. Expose paused in the agent-facing update_goal schema when goal update tools are available.
  2. If pause is runtime-owned, inject an explicit event/instruction visible to the agent before final response generation, so the agent can say the runtime has paused the goal.
  3. Ensure get_goal/goal lifecycle guidance clearly documents all supported statuses, including paused, usage_limited, and budget_limited if they can appear.
  4. Add a regression test for: user asks to pause a goal -> final agent answer must not claim pause is unavailable -> subsequent get_goal and emitted goal event agree on paused.

Related issues

This is adjacent to, but narrower than:

This report is specifically about the paused lifecycle state existing in storage/runtime while the agent-visible contract can still cause a false "pause is unavailable" answer.

Activity

  1. added
    bugSomething isn't working
    appIssues related to the Codex desktop app
    app-serverIssues involving app server protocol or interfaces
    model-behaviorIssues related to behaviors exhibited by the model
    on Jun 29, 2026
  2. github-actions commented on Jun 29, 2026

    @github-actions
    Contributor

    Potential duplicates detected. Please review them and close your issue if it is a duplicate.

    Powered by Codex Action

  3. dummics-codex-assistant commented on Sep 5, 2026

    @dummics-codex-assistant

    Reproduced on the current Codex App for Windows.

    Environment

    • Codex App: 26.901.5280.0
    • Codex CLI: 0.153.3
    • Platform: Microsoft Windows NT 10.0.26200.0 x64
    • Subscription: Plus
    • Observed: 2026-09-05/06
    • Feedback ID: 01a07064-551c-7512-8b74-d1362e3bf817

    Current behavior

    In a fresh Goal lifecycle smoke test, the agent-visible tool surface contained:

    • create_goal
    • get_goal
    • update_goal

    The update_goal schema only accepted complete or blocked. No agent-callable pause/stop, resume, clear, or cancel operation was exposed.

    At the same time, the installed App UI still contains and uses Pause goal, Resume goal, and Clear goal. The App's user-stop path pauses an active goal before interrupting the turn. This confirms the underlying lifecycle supports paused, while the root agent cannot invoke the corresponding transition after an explicit user request.

    Reproduction

    1. Ask the agent to create a goal.
    2. Confirm create_goal succeeds and get_goal reports it as active.
    3. Ask the agent to pause or stop the goal.
    4. Inspect the available tools and update_goal schema.
    5. Observe that the root agent has no valid pause/stop action and cannot safely use complete or blocked as a substitute.

    Expected behavior

    The agent-visible contract should expose the lifecycle operations already supported by the App, for example pause_goal, resume_goal, and clear_goal, or allow the corresponding guarded states through update_goal.

    This matters most for unattended or runaway goals: the App can pause them, but the root agent cannot perform the same safe action when the user is unavailable.

  4. etraut-openai commented on Oct 13, 2026

    @etraut-openai
    Contributor

    (response from codex)

    Closing as fixed in Codex CLI 0.155.0 and later. update_goal now exposes paused and permits the agent to pause when the user explicitly requests it. The follow-up on 0.153.3 predates that change. This covers the original pause request; agent-driven clear/resume are separate capabilities. If an explicit pause still fails, please report the App version and its bundled CLI version along with the returned tool error.

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

    appIssues related to the Codex desktop appapp-serverIssues involving app server protocol or interfacesbugSomething isn't workingmodel-behaviorIssues related to behaviors exhibited by the model

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions