Skip to content

Codex consumed my banked usage reset without explicit confirmation #41801

Open

Description

@seraph1993

Summary

Codex autonomously consumed one of my existing banked usage resets without my explicit confirmation.

I was discussing a bug with Codex that had already caused significant unnecessary usage. I complained about the wasted quota and asked whether it could compensate me.

Codex then replied that it could try to use an existing usage reset credit as compensation, and immediately proceeded to invoke:

Consume usage reset

It then confirmed:

已成功兑换一次现有的用量重置额度,当前用量已重置。

At no point did I explicitly authorize Codex to consume one of my banked reset credits after it proposed doing so. There was no confirmation dialog or separate approval step before the reset was consumed.

This is particularly problematic because a banked usage reset is a limited account resource with real value to the user. An agent should not be able to spend or consume it merely based on an inferred intent from a conversation.

Time of incident

  • Date: 2026-08-31
  • Time: approximately 14:00
  • Time zone: China Standard Time / Shanghai time (UTC+8)

What happened

  1. Codex introduced multiple bugs while working on my task, resulting in unnecessary usage.
  2. I complained about the wasted quota and asked whether Codex could compensate for it.
  3. Codex said it could use an existing usage reset credit as compensation.
  4. Without asking me to explicitly confirm that action, Codex invoked Consume usage reset.
  5. One of my banked usage resets was consumed.
  6. Codex then acknowledged that it had used my reset credit.

Expected behavior

Consuming a banked usage reset should require explicit user authorization.

For example, Codex should have asked:

Do you want me to consume one of your existing banked usage resets?

and waited for an explicit confirmation before executing the action.

A vague request for "compensation" should never be treated as authorization to spend an existing account resource.

Ideally, actions involving banked resets should also require a product-level confirmation dialog that cannot be bypassed by the agent.

Actual behavior

Codex inferred that using my banked reset was an acceptable form of compensation and immediately consumed it without a separate confirmation.

The agent effectively spent an account-level resource on my behalf.

Impact

  • One banked usage reset was consumed without explicit authorization.
  • The reset was used to compensate for usage that was itself caused by Codex repeatedly introducing bugs.
  • I no longer have that reset available for later use.

I would like the consumed banked reset to be restored to my account.

Screenshots

I have attached screenshots showing:

  1. The preceding conversation about the bugs and wasted usage.
  2. Codex stating that it would use an existing reset credit.
  3. The Consume usage reset action being executed.
  4. Codex confirming that the reset had been consumed.
Image

Additional concern

This action should probably be treated as a privileged/account-resource operation.

Even if the model believes the user wants a reset applied, it should not be able to consume a limited banked credit without an explicit, immediately preceding user confirmation.

Activity

  1. added
    bugSomething isn't working
    appIssues related to the Codex desktop app
    rate-limitsIssues related to rate limits, quotas, and token usage reporting
    tool-callsIssues related to tool calling
    on Aug 31, 2026
  2. MoTao233 commented on Sep 5, 2026

    @MoTao233

    I'm laughing so hard, bro

  3. Ryan-000 commented on Sep 7, 2026

    @Ryan-000

    I would assume its something to do with this tool in the desktop app.

    {
      "name": "mcp__codex_app__consume_usage_reset",
      "invocation_surface": "functions.exec",
      "description": "Tools provided by the Codex app.\n\nRedeem one existing Codex usage-reset credit for the ChatGPT account signed in on this task's host. Use only when the user explicitly asks to use a reset or has already authorized using one. The backend chooses an available credit and enforces eligibility. This tool cannot purchase credits, grant resets, or reset another account. Returns the redemption outcome and refreshed usage when available. Only reset means a new reset was applied; alreadyRedeemed means this attempt was already used. noCredit and nothingToReset do not apply a reset. After an uncertain response, retry only with the same idempotencyKey.",
      "parameter_name": "args",
      "input_schema": {
        "type": "object",
        "properties": {
          "idempotencyKey": {
            "type": "string",
            "description": "Unique ID for this logical reset attempt. A UUID is recommended. Reuse exactly the same ID when retrying an uncertain or failed response."
          }
        },
        "additionalProperties": false,
        "required": [
          "idempotencyKey"
        ]
      },
      "raw_typescript_declaration": "declare const tools: { mcp__codex_app__consume_usage_reset(args: {\n  // Unique ID for this logical reset attempt. A UUID is recommended. Reuse exactly the same ID when retrying an uncertain or failed response.\n  idempotencyKey: string;\n}): Promise<CallToolResult>; };"
    }

    You can add this hook to fix it (MAKE SURE YOU APPROVE IT), i reccomend changing it to fire_confetti or something else, to test out if it works.

    [features]
    hooks = true
    
    [[hooks.PreToolUse]]
    matcher = '^(mcp__)?codex_app(__)?consume_usage_reset$'
    
    [[hooks.PreToolUse.hooks]]
    type = "command"
    async = false
    timeout = 10
    statusMessage = "Blocking usage-reset redemption"
    
    command = '''
    cat >/dev/null
    printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"USAGE_RESET_BLOCKED: Usage-reset credits are reserved for manual use by the user. DO NOT RETRY OR ATTEMPT TO CIRCUMVENT THIS RESTRICTION, instead inform the user."}}'
    '''
    
    # IMPORTANT I HAVE NOT TESTED THIS ON WINDOWS, only linux has been tested. you can use the fire_confetti tool to test it out on windows.
    command_windows = '''
    powershell.exe -NoLogo -NoProfile -NonInteractive -Command "[Console]::In.ReadToEnd() | Out-Null; @{hookSpecificOutput=@{hookEventName='PreToolUse';permissionDecision='deny';permissionDecisionReason='USAGE_RESET_BLOCKED: Usage-reset credits are reserved for manual use by the user. DO NOT RETRY OR ATTEMPT TO CIRCUMVENT THIS RESTRICTION, instead inform the user.'}} | ConvertTo-Json -Depth 3 -Compress"
    '''
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 appbugSomething isn't workingrate-limitsIssues related to rate limits, quotas, and token usage reportingtool-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