[Windows Desktop] Scheduled tasks wake, acknowledge or report status, then stop without completing assigned work
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 125k
- Forks
- 19.4k
- PR merge metrics
- PR metrics pending
Description
Primary user-reported failure: scheduled execution stops prematurely
The user's primary complaint is that scheduled tasks repeatedly wake briefly, acknowledge or provide a status response, stop without doing the assigned work, and wait for the next scheduled run.
The original issue focused too heavily on timer cadence. Please triage the execution/completion behavior as the primary concern. A timer firing successfully is not enough if the requested work is left unperformed. The user reports this as a recurring pattern across scheduled tasks; this statement describes the user's experience, not a measured failure rate or a proven universal runtime limit.
Two independent acceptance tracks
A — Execution: a delivered wake must perform its assigned operation or establish a genuine blocked/failed outcome.
B — Cadence: the completion-relative delays and unexplained gap remain open even if execution improves. Passing one track must not be treated as resolving the other.
The previously published timing evidence is reproduced here for visibility. Times are UTC; the recurrence was 30 minutes.
| Scheduled start | Immediately preceding completion | Delay |
|---|---|---|
| Sep 11 22:35:49.702 | Sep 11 22:05:32.943 | 1,816.759 s |
| Sep 11 23:39:50.634 | Sep 11 23:09:21.892 — owner turn | 1,828.742 s |
| Sep 12 00:10:51.304 | Sep 11 23:40:23.121 | 1,828.183 s |
| Sep 12 00:41:21.885 | Sep 12 00:11:14.106 | 1,807.779 s |
| Sep 12 01:12:22.415 | Sep 12 00:42:13.314 | 1,809.101 s |
The first start-to-start interval is 64m 0.932s, with no target-task start between 22:49:48.055 and 23:09:08.447. Completion/activity anchoring remains a hypothesis. The analytical fixed-rate deadline is not a recovered due record.
For track B, retain due occurrences across busy admission, record deferral/retry/coalescing, and fence by schedule revision. Update last_run_at only after accepted start, with a correlated turn ID; use a separate attempted-at field for attempted admission. Test rejected and ambiguous submissions so they cannot masquerade as a successful run or cause duplicate execution.
Requested action from OpenAI
Please investigate the scheduled execution and completion path, provide a supported mitigation, and identify the release containing a verified fix when available.
Expected behavior:
- Perform the required check or authorized assignment before completing the scheduled invocation.
- Distinguish an actual no-change result from a check that was never performed.
- Keep notification suppression separate from execution success: a quiet result must not substitute for doing the work.
- For an execution assignment, continue beyond acknowledgment or preliminary status checks until it is complete or a real blocker is established.
- Surface unavailable access, approval requirements, skipped work and failures explicitly. Preserve approval boundaries, newer owner instructions and protection against duplicate actions.
Required regression tests and before/after evaluation
These are proposed tests, not claimed as executed.
- Schedule a harmless local fixture read, with notification only when its value changes. Change the fixture before a wake and verify that the invocation actually reads and observes it.
- Assert the required postcondition, not response text. For monitoring, independently verify the observation and comparison against the fixture version. For a multi-step execution task, assert the required durable state transition/artifact or an independently substantiated blocked/failed outcome tied to the operation. “Done,” “no change,” or “blocked” text alone must not pass.
- Keep the fixture unchanged: the read/comparison still occurs while notification remains quiet.
- Make access unavailable: require an explicit failed/blocked outcome rather than a successful no-change claim. Distinguish actual approval denial, reviewer timeout, cancellation and absence of an answerer.
- Test an authorized multi-step assignment to catch acknowledgment-only completion and termination after a preliminary status check. Preserve newer owner instructions, approval boundaries and duplicate-work protection.
- Exercise long existing conversations before and after applicable local/remote compaction, and both supported automation input paths. Refresh mutable priorities and ensure the latest applicable objective survives; do not assume every compaction mode uses the same history limit.
- For cadence separately, test idle delivery, owner input before due, sustained sub-interval activity, busy deferral, restart, coalescing, concurrent dispatchers, pause/edit races, rejected admission and lost submission acknowledgment.
Repeated evaluation is required: measure execution-failure rate before and after the change across repeated, comparable scheduled invocations. Define failure as missing the independently verified required postcondition within the test bound, without a substantiated permitted blocked outcome. Publish sample size, model/build, prompt/state controls and counts for success, justified block, skipped/unattempted work, error and timeout. Compare matched manual controls that require the same work; ordinary conversational owner turns are not an equivalent baseline. Record due-but-not-started failures separately for cadence.
Zero tool calls and DONT_NOTIFY are useful diagnostics, not standalone failure labels. A history projection can omit tool wrappers; validate call counts against original execution records. A small observed difference between scheduled and manual samples is not causal proof.
Approval and context paths requiring targeted coverage
The public source provides specific test targets, but not a confirmed cause of every incomplete wake:
- Exec policy returns Forbidden for certain approval-requiring cases under
Never, while other commands can still run within the sandbox. MCP approval can return an explicit denial under that policy. Verify that scheduled outcome reporting retains the actual reason. The examined September turns instead usedon-requestwith an automatic reviewer. - A dropped approval waiter can resolve to Abort. Turn handoff intentionally clears process-local waiters. However, approval handling distinguishes Abort/TurnAborted from timeout and user denial, and cancellation ordering already tries to prevent a spurious rejection. Test the full unattended lifecycle and preserve reason/provenance; do not assume a human must answer when an automatic reviewer is configured.
- Test a legitimately authorized self-pause under each applicable review policy, including unavailable reviewer and cancellation. A tool's prompting declaration alone does not establish that self-pause always fails unattended.
- Local compaction has a 20,000-token user-message budget in that path. It is not a universal description of every remote compaction mode or proof of lost instructions in this incident. Treat compaction and stale-priority reinjection as companion regression cases, not established independent causes.
Relation to the duplicate suggestion
The bot suggested #44123, which concerns a timing gap after a schedule update. The primary complaint here concerns failure to carry out work after waking. Please keep that distinction during triage; correcting recurrence timing alone would not address the user's reported behavior.
The previously published evidence and its limitations are preserved below. No new private-log excerpts or private-task details are added in this update.
Previously published timing evidence, source references and limitations
Summary
A thread-attached 30-minute heartbeat showed a 64-minute start-to-start gap. Across five examined wakes, each start occurred approximately 30 minutes after the immediately preceding task turn completed—including an intervening owner turn.
This is an observed incident with independently recomputed timestamps, not a deterministic reproduction of a dropped occurrence. Completion/activity anchoring is the leading explanation; intentional fixed-delay semantics, deadline reset, and other deferral mechanisms cannot be distinguished from the available records.
Please clarify the intended interval semantics and expose occurrence-level delivery outcomes. If “every 30 minutes” is fixed-rate, unrelated task activity should not continually postpone the deadline.
Environment
- Windows 11, OS version
10.0.26200.0. - Installed/running package at submission-time inspection:
OpenAI.Codex_26.903.9818.0_x64. This is not independently established as the exact package revision at every incident timestamp. - Model in examined turns:
gpt-6-astra. - Local heartbeat attached to an existing long-running task.
- Saved recurrence:
RRULE:FREQ=MINUTELY;INTERVAL=30. - Examined execution policy:
on-request, reviewerauto_review, workspace-write, restricted network. - Local time zone: America/New_York. All timestamps below are UTC.
- Public source reviewed at
944d6fd1ba4baab69dbedd205282dc72ec20abb5; this source revision is not asserted to match the installed binary.
Expected behavior
An interval automation should have understandable, stable scheduling semantics. If due while its task is busy, it should retain pending work and report the deferral, then run within a documented bound after admission becomes possible. If multiple checks are coalesced, that disposition should be visible.
The user should be able to distinguish a planned deadline, an attempted submission, an accepted turn, a completed turn, and an actionable result. A last-run timestamp alone is insufficient.
Actual timing
These are lifecycle timestamps from the original task rollout, not estimates from the UI.
| Scheduled start (UTC) | Immediately preceding turn completion (UTC) | Delay from completion |
|---|---|---|
| Sep 11 22:35:49.702 | Sep 11 22:05:32.943 | 1,816.759 s |
| Sep 11 23:39:50.634 | Sep 11 23:09:21.892 — owner turn | 1,828.742 s |
| Sep 12 00:10:51.304 | Sep 11 23:40:23.121 | 1,828.183 s |
| Sep 12 00:41:21.885 | Sep 12 00:11:14.106 | 1,807.779 s |
| Sep 12 01:12:22.415 | Sep 12 00:42:13.314 | 1,809.101 s |
The interval from 22:35:49.702 to 23:39:50.634 is 64m 0.932s.
For a fixed-rate interpretation, 23:05:49.702 would be the next analytical deadline after the first start. That is not a recovered persisted due timestamp.
The Governor task completed a turn at 22:49:48.055 and had no intervening task start until an owner turn at 23:09:08.447. Therefore continuous execution of that task does not explain the entire interval containing the analytical deadline.
Local logs contain activity in every five-minute bucket from 22:30 through 23:45. The 23:05–23:10 bucket contains 89 records from four processes. This weakens a simple whole-host outage explanation, but does not prove uninterrupted uptime or exclude a short dispatcher stall. No usage-cap error was identified as the cause of this gap.
What the retained state can and cannot establish
Read-only inspection found:
- Actual heartbeat starts in the rollout and canonical task history.
- Zero rows for this automation in the inspected
automation_runstable. This does not mean the heartbeat never ran; it means that table did not provide its occurrence history. - Submission logs under general session logging targets, including incoming heartbeat payloads. No matched planned-due/admission/deferral/disposition chain was recovered.
- No occurrence ID or planned-due field identified in the inspected incoming payloads.
- The final saved
last_run_atwas 70 ms before the final recorded lifecycle start. That sample cannot prove whether a failed attempt would also advance it. - The automation was later paused and remains paused. Current
next_run_at = nulland an empty queue snapshot are not evidence of historical delivery loss.
The investigation did not unpause the production automation or alter permissions to reproduce the incident.
Workflow leading to the observation
- Use a recurring 30-minute heartbeat attached to a persistent local task.
- Continue ordinary owner interactions between scheduled checks.
- Compare scheduled starts with both previous scheduled starts and the most recent turn completions.
- Observe the timing above and the lack of an occurrence-level reason for the longer interval.
This sequence documents what happened. A controlled minimal reproduction is still needed; it has not been demonstrated that every owner message resets the timer.
Suggested maintainer test: use a fake clock around the actual dispatcher, send owner input shortly before due time, then repeat with sustained sub-interval activity. Compare behavior against a fully idle control. Include busy admission, restart, coalescing and pause/edit races.
Public source boundary and narrow investigation direction
The public core already exposes start-if-idle and typed admission outcomes:
These mechanisms do not prove that the Desktop dispatcher drops refused work. The recurrence dispatcher was not located in the inspected public checkout.
Please investigate whether next due is anchored to scheduled time, last completion, or last activity, and how NotIdle/PendingTriggerTurn are retained or retried. If fixed-rate delivery is intended, a narrow repair would preserve due-occurrence identity across admission attempts, fence by schedule revision, and avoid resetting the deadline on unrelated input. After an ambiguous submission timeout, reconcile the occurrence with its turn before replaying it to avoid duplicate actions.
Useful diagnostic fields: automation and occurrence identity, schedule revision, planned due, attempted/accepted/start/completion timestamps, turn identity, admission outcome, retry reason and coalesced count.
Related observations: not asserted as the timer's cause
The same task also exhibited these separately evidenced behaviors:
- Two owner instructions ended with acknowledgment-only responses and zero tool calls. These were owner turns, so they do not establish a scheduler-only model failure.
- Subsequent scheduled checks read usage and room state without advancing dependent work. Some quiet monitoring was consistent with the saved instructions; no-tool/no-edit counts are not a failure-rate metric.
- All 96 indexed automation inputs were
automation_updatefunction outputs without a call ID. The public toolOutput branch constructs that shape. No strict-provider HTTP 400 was observed in this native-Astra incident. - Scheduled filesystem profiles contained 18 entries versus 11 for manual turns, but both resolved to the same 11 unique entries, including project write access. A specific automatic-review rejection was recorded; lost human approval or a blanket permission downgrade was not proved.
- A later compaction rewrite occurred after the examined no-op checks. It does not prove that earlier instructions were erased.
These observations explain why the user experiences unreliable unattended progress, but should not be collapsed into one unverified root cause. No patch, end-to-end fix, or zero-regression guarantee is claimed.
Related issues / duplicate check
- #44123: macOS 25-minute heartbeat with an unexplained next-run gap after a schedule update. This adds a Windows completion-relative sequence and an identified idle interval; please consolidate if the same underlying behavior is already tracked.
- #44723 and #44519: separate unpaired-tool-output/provider failures.
- #41995: scheduled NOTIFY result visibility after reload.
- #29610: permission snapshot/default fallback report; this incident did not reproduce effective access loss.
- #37556: background task-management calls hanging; no pending call explains the zero-call owner acknowledgments here.
- #43632: scheduled task answers an older request; related symptom, not a demonstrated common cause.
Prepared with GPT-6 Astra from read-only original-record inspection and public-source review. Only sanitized timestamps, settings and aggregate observations are included. Raw conversations, private project prompts and paths, credentials, account details, and task/automation identifiers are omitted.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the scheduled execution path and the referenced targets: exec_policy.rs, mcp_tool_call.rs, session/mod.rs, turn_suspension.rs, tools/approvals.rs, tasks/mod.rs, and compact.rs. Trace an unattended invocation through admission, approval, execution, completion, and outcome reporting, then add focused regression coverage for execution, blocked outcomes, and cadence. Done means independently verified postconditions and explicit failure or deferral reasons, with before/after measurements.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- cli, desktop, testing-qa
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100