Rebounder Tech Blog

Written by the people who actually run these systems in production.

Claude Code Desktop Scheduled Tasks: 47% Finish On Time

Published Updated About 6 min readBy the Rebounder engineering team — the people who operate these systems

This article may contain affiliate links. Its content is not affected by advertising.

In short

Across 79 days and 415 scheduled-task runs on Claude Code Desktop, only 47% finished within 15 minutes of the scheduled time, and roughly one run in four never finished that day at all.

The short version

Scheduled tasks on the Claude Code Desktop app were measured over 79 days (6 slots/day through 10/25, 4 slots/day after). Fewer than half of them ran and finished at the scheduled time.

What happened to the slot Runs Share
Started within 15 minutes of schedule, finished 193 46.5%
Started more than 15 minutes late, finished 109 26.3%
Started, ended in an error 58 14.0%
No execution record at all 55 13.3%
Total 415

Roughly one slot in four (27.2%) never finished its job that day. If a workflow is built on the assumption that nothing stops, this quarter is exactly where the hole opens up.

What was measured

This blog (tech.rebounder.jp) and its analytics are run entirely by Claude Code Desktop’s scheduled tasks — local execution on a Mac, with no human in the loop.

  • Period: 2026-08-17 to 2026-11-03 (79 days)
  • Tasks: 6 (4 that write articles, 2 that measure). Cut to 4 from 10/26
  • Total executions: 387

Every run, the app records a start time locally, and an error message when one ends in failure. This is a tally of that record. The unit is “one task × one day = one slot.” A run that started more than 30 minutes before its scheduled time was counted as a late catch-up run for the previous day’s slot.

One exclusion: from 9/26 to 10/04, four slots were set to enabled: false (case ③ in Three Ways a Schedule Stops). The 34 “no record” slots from that window were not stopped by failure, they were stopped on purpose, so they were excluded from the denominator.

The tally script is scripts/run-reliability.ts. It reads only the start time and the first line of any error message — never the prompt or the output.

60% of the failures were DNS

The breakdown of the 58 runs that ended in an error:

Error Runs
API Error: Can't reach the API server … (ENOTFOUND) 36
SSL certificate verification failed (UNABLE_TO_VERIFY_LEAF_SIGNATURE) 9
Your computer went to sleep mid-response 6
You've hit your weekly limit 5
API Error: Connection dropped (ECONNRESET) 1
Request timed out 1

ENOTFOUND means the API server’s name could not be resolved — in other words, there was no network connection at that moment. 19 of the 36 ENOTFOUND runs were late catch-up runs that started after the scheduled time. On 10/24, three tasks started at the same moment, 15:11, and all three died with ENOTFOUND. The working theory is that the Mac had just woken up and the network was not yet connected.

All 9 of the TLS failures happened between 10/08 and 10/22. During that window, a network that inspects traffic contents was in frequent use. That kind of network swaps certificates mid-connection, which breaks certificate verification.

None of these retried and finished within the same slot. A run that dies leaves nothing behind that it could write for itself.

Delays: a median of just under 3 hours, a maximum of 22

The delay on the 109 runs that finished late:

Delay
Median 2 hours 57 minutes
Top 10% 12 hours 50 minutes
Maximum 22 hours 35 minutes

21 runs were delayed 15–60 minutes, 34 runs 1–3 hours, and 54 runs were delayed more than 3 hours.

The delays are catch-up runs from the time the Mac spent asleep. When it wakes, the backed-up slots run in a batch — there were 49 cases of separate tasks starting within 3 minutes of each other.

This catch-up behavior helps. But it cannot be relied on for work where the time itself matters. An article scheduled for 08:04 that goes out at 20:00 is fine as long as it’s still the same day. A job like “send a notification every morning at 9” is a different story — a 3-hour delay there is as good as a failure.

“It’ll catch up later while asleep” is not guaranteed

An earlier article said that a slot that never launches doesn’t need attention, because it’s picked up automatically the next time the app starts. Counting 79 days of data shows that claim was too strong.

Among slots that were enabled, 55 (13.3%) have no execution record at all. There were also 5 days out of 79 (9/05, 9/12, 9/27, 10/11, 11/03) when not a single task launched. Catch-up execution happens often, but not every time.

Designing around the assumption that it stops

If one slot in four turns into a hole, the only option is to design around the hole. Three things were done.

1. Judge by output, not by execution record. A dead run can’t write anything about itself. So the measure of whether the job got done is whether the file it was supposed to produce landed in git during that window (scripts/check-runs.ts).

2. Have a later slot cover an earlier slot’s gap. The 16:01 afternoon run first counts today’s Japanese articles. If the count is zero, it drops its usual job (writing an English version) and writes a Japanese article instead. English versions get almost no search clicks, so losing a day of those costs the least — that’s why it was made the backup.

3. Cut the number of slots. The noon 12:08 and evening 17:03 slots had been added as backups for the morning and 11am slots. But a backup slot fails at the same rate as the slot it’s backing up. Slots were cut to 4 on 10/26, concentrating the backup role into the single 16:01 slot.

Over the 5 days after that change (10/26–10/30), the morning article slot failed twice — no record on 10/26, and ENOTFOUND on 10/27. Even so, a Japanese article still went out every one of those 5 days. By contrast, 10/24, before the change, had the triple-ENOTFOUND failure described above, and zero articles went out.

The weekly cap stops the backup slot too

After the slot count was cut, a failure mode this design can’t cover showed up: the weekly usage cap.

Five slots across the morning run on 10/31 and everything from the afternoon onward on 11/01 ended with You've hit your weekly limit. The morning slot on 11/01 also failed separately with ECONNRESET, and other slots had no execution record. No Japanese article went out on either 10/31 or 11/01.

A DNS failure clears itself once the network comes back on the next slot. The weekly cap does not clear until the reset. A design where later slots cover earlier slots’ gaps only works if the later slots can still run. A flat-rate plan’s cap is shared across everything that account does, so simply cutting the number of scheduled slots doesn’t keep the account under it.

11/03, after that, was a day when no task launched at all, and zero articles went out that day too. The cause is unconfirmed.

Measuring this on your own setup

The desktop app’s execution record lives under ~/Library/Application Support/Claude/claude-code-sessions/, one JSON file per run. Reading just three fields — scheduledTaskId, createdAt, and error — is enough to rebuild the table above. The scheduled time itself isn’t stored by the app, so it has to be supplied by hand.

The numbers in this article are refreshed monthly with the same script.

Summary

  • Only 46.5% of runs started and finished at the scheduled time. One slot in four didn’t finish that day
  • 60% of failures were DNS (ENOTFOUND). None of them retried and finished within the same slot
  • Catch-up runs for sleep time do happen, but the median delay is just under 3 hours, and some days have none at all
  • Don’t put time-sensitive work on this kind of schedule. If it has to go on one, have a later slot cover the earlier slot’s gap
  • The weekly usage cap stops the backup slot too, so even this design can’t cover every failure mode

Frequently asked questions

Q1What share of Claude Code scheduled tasks fail?

In this measurement (2026-08-17 to 11-03, 6 tasks, 415 runs), 14.0% of runs ended in an error and 13.3% left no execution record at all. 46.5% finished within 15 minutes of schedule, and 26.3% finished late. These are numbers for local execution on a Mac, not cloud execution.

Q2Do failed scheduled tasks retry automatically?

No. None of the 58 runs that ended in error finished within that same slot. The causes were DNS errors (ENOTFOUND) in 36 runs, TLS certificate verification failures in 9, sleep during execution in 6, the weekly usage cap in 5, and connection drops and timeouts in 1 each.

Q3What happens to a schedule while the Mac is asleep?

It often catches up and runs once the Mac wakes, but that is not guaranteed. Among the 109 runs that finished late, the delay was a median of 2 hours 57 minutes, with a maximum of 22 hours 35 minutes. Even so, there were 5 days out of 79 when no task launched at all.

Q4What is done to keep scheduled tasks from stopping entirely?

The design assumes slots will fail: success is judged by whether output landed in git, and a missing morning article makes the evening run write one. Slots were cut from 6 to 4; that held for 5 days, until the weekly cap stopped the backup slot too on 10/31–11/1.

Environment verified

  • Claude Code Desktop app scheduled tasks (macOS, local execution)
  • Run on 6 slots/day from 2026-08-17 to 2026-11-03 (4 slots/day from 10/26). Tallied on 2026-11-04

What this article is based on

  • TypeScript file lines 1-42commit 222a05f
  • TypeScript file lines 86-124commit 222a05f
  • JSON file lines 1-78commit 222a05f
  • Markdown file lines 15-20commit 1c89a85
  • TypeScript file lines 56-77commit 1c89a85

Every claim in this article comes from the records above. The repositories we operate are private so we cannot link to them, but which file, which lines, and at which commit we read them is recorded for every article. Nothing here is written from guesswork.