Codex Desktop automation_update schema is cron-only, blocking same-thread heartbeat creation
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 atarget_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
- Open a local Codex task in Desktop.
- Ask Codex to create a recurring task every 15 minutes that returns each run to this same task.
- Have Codex discover and inspect
codex_app.automation_update. - Observe that the create/update schema allows only
kind: "cron"and provides no current-task or explicit target-task field. - Repeat from inside the intended persistent owner task itself.
- 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_updateis 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.
5 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Confirmed manual UI workaround on the same build:
After this sequence, the persisted automation is correctly converted to
kind = "heartbeat", has the intended 15-minute cadence, and contains the owner task astarget_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_updateschema exposes only detachedcroncreation and cannot perform the same attachment/conversion directly. The workaround restores Tend operation but requires manual UI steps.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
/goalinvokes immediate idle continuation with no interval pacing, so it cannot serve as a recurring timer.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
onIdlecontinuation 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_updateschema, 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?
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.