Codex Desktop automation_update schema is cron-only, blocking same-thread heartbeat creation

Open 💬 5 comments Opened Jul 27, 2026 by Countermarch
💡 Likely answer: A maintainer (github-actions[bot], contributor) responded on this thread — see the highlighted reply below.

Codex Desktop automation_update schema is cron-only, blocking same-thread heartbeat creation

What version of the Codex App are you using?

ChatGPT/Codex desktop 26.721.41059 (bundle 5848).

What platform is your computer?

macOS 27.0 (26A5388g), Apple Silicon (arm64).

What issue are you seeing?

In a local Codex Desktop task, codex_app.automation_update is available, but its create schema permits only:

kind: "cron"
executionEnvironment: "local"
destination: "local"

It exposes neither kind: "heartbeat" nor a target_thread_id/current-task delivery option. As a result, Codex can create a detached recurring cron automation, but it cannot create a recurring automation that wakes and continues the existing task.

This is a creation-path regression or tool-schema exposure mismatch rather than a general removal of heartbeats:

  • Existing task-bound heartbeat automations continue to work.
  • Existing heartbeat definitions contain kind = "heartbeat" and a target_thread_id.
  • Current official Scheduled Tasks documentation still distinguishes standalone scheduled tasks from scheduled tasks in a chat that return to that chat with its existing context.

Steps to reproduce

  1. Open a local Codex task in Desktop.
  2. Ask Codex to create a recurring task every 15 minutes that returns each run to this same task.
  3. Have Codex discover and inspect codex_app.automation_update.
  4. Observe that the create/update schema allows only kind: "cron" and provides no current-task or explicit target-task field.
  5. Repeat from inside the intended persistent owner task itself.
  6. Observe that the task still cannot create a same-task heartbeat; the only supported creation path is a detached cron job.

In the reproduced case, the owner task first checked for a matching automation, found none, and stopped without creating a standalone cron job or editing automation files by hand.

Expected behavior

When invoked from an existing task, automation_update should support creating or updating one task-bound heartbeat by either:

  • implicitly targeting the current task; or
  • accepting an explicit target_thread_id.

Each scheduled run should append to and continue that persistent task instead of creating a new task per run.

Actual behavior

Only detached cron creation is exposed. The requested same-task heartbeat cannot be created through the supported tool surface.

Concrete product impact: Tend

This blocks a core operating contract of EveryInc/tend:

  • Tend's README says each feed's dedicated Codex task binds itself to the feed and installs or updates one heartbeat.
  • The current Tend Manual defines a heartbeat as the recurring wake-up for that same task.
  • Tend's current runner contract explicitly requires creating or updating one same-task heartbeat automation.
  • Tend's changelog contains no compatibility change or removal of this requirement.

Without same-task heartbeat creation, a newly configured Tend feed can be bound and refreshed manually but cannot perform its intended recurring operation.

Related issues

  • #29184 documents that detached cron creates a separate task per run while heartbeat continues in one persistent task, and requests clearer delivery controls.
  • #26489 documents missing heartbeat automation tooling in Remote Control. This report reproduces in a local task where automation_update is present but its schema is cron-only.
  • #32294 documents a different Desktop automation tool failure: the tool is advertised but has no handler.

Additional information

No raw automation file was written or modified as a workaround, and no duplicate automation was created.

View original on GitHub ↗

5 Comments

github-actions[bot] contributor · 1 month ago

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

  • #35145

Powered by Codex Action

Countermarch · 1 month ago

Confirmed manual UI workaround on the same build:

  1. Have the intended owner task create the recurring automation in a paused state.
  2. Pin that owner task.
  3. In the Desktop automation UI, attach the paused automation to the pinned task and activate it.

After this sequence, the persisted automation is correctly converted to kind = "heartbeat", has the intended 15-minute cadence, and contains the owner task as target_thread_id. No duplicate automation was created.

This confirms that the Desktop backend/UI still supports task-bound heartbeats. The regression is narrower: the agent-facing automation_update schema exposes only detached cron creation and cannot perform the same attachment/conversion directly. The workaround restores Tend operation but requires manual UI steps.

DarriEy · 17 days ago

Correction: this reproduction occurred in Codex CLI, not Codex Desktop. Please disregard it as independent evidence for this Desktop-specific issue. The observed CLI behavior is relevant instead to #35565: an active /goal invokes immediate idle continuation with no interval pacing, so it cannot serve as a recurring timer.

vincenthcui · 3 days ago

I prepared the Goal-side handoff primitive needed for same-thread heartbeat scheduling:

https://github.com/vincenthcui/codex/pull/1

After a heartbeat is durably created, the trusted automation host can replace Goal onIdle continuation with a timer-owned trigger. This suppresses immediate Goal turns until the heartbeat delivers an explicit turn. It does not grant the agent direct Goal authority.

This PR does not change the currently shipped cron-only automation_update schema, so it does not by itself resolve this issue. It defines the Goal/API side that the Desktop handler—or a future Rust automation extension—must call once same-thread heartbeat creation is available.

@Countermarch, could you review whether the proposed host-owned handoff matches the current-thread heartbeat behavior and failure cases you documented?

vincenthcui · 3 days ago

I added a concrete Desktop/tool-protocol migration section here:

https://github.com/vincenthcui/codex/pull/1#issuecomment-5407480051

The proposed first migration is additive: preserve legacy detached cron requests, add an explicit same-thread heartbeat target, keep Goal binding metadata host-owned, and fail closed for active-Goal handoff when the bundled app-server does not support the continuation RPC.