anthropics / anthropics/claude-code

Scheduled tasks stamp lastRunAt but never launch a session (no error, no failed-run state)

オープン
#93,015 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
area:routines bug platform:macos
主要言語
Python
スター
145k
フォーク
23.1k
PR マージ指標
PR 指標を取得中

説明

# Scheduled tasks stamp `lastRunAt` but never launch a session

**Product:** Claude Code, desktop app (Code tab), macOS 15.6 (Darwin 25.6.0)
**First observed:** 2026-09-06 · **Still occurring:** 2026-09-09
**Severity:** all scheduled automation silently stopped; nothing surfaced it

## Summary

Scheduled tasks fire on time and update `lastRunAt`, but no session is created and
no work is done. There is no error, no notification, and no failed-run state. From
the registry the tasks look perfectly healthy — `enabled: true`, sensible
`cronExpression`, a moving `nextRunAt` and a fresh `lastRunAt` — which is why this
ran undetected for two days before anyone noticed the output had stopped.

A manual **Run now** from the sidebar fails in exactly the same way.

## The measurement that shows it

Session transcripts are written to `~/.claude/projects//.jsonl`, one
per session, so counting files by **birth time** counts sessions actually launched.

```
for f in *.jsonl; do stat -f '%SB' -t '%F' "$f"; done | sort | uniq -c
```

| Date | Session files created |
|---|---|
| 4 Aug – 5 Sep | 8–12 every day |
| 6 Sep | **0** |
| 7 Sep | **0** |
| 8 Sep | 6 — all within 25 minutes of an app restart |
| 9 Sep | **0** (as of 12:05 IST) |

Meanwhile `lastRunAt` kept moving. On 9 Sep, in tight clusters:

```
04:11:21.158Z task A (scheduled 07:07 local)
04:11:21.160Z task B (scheduled 09:35 local)
04:11:21.586Z task C (scheduled 07:07 local)
04:27:19.860Z tasks A, B, C again
04:43:19.871Z tasks D, E
04:58–04:59Z tasks F, G
```

Three tasks with three different scheduled times stamping within 0.43 s of each
other is not three jobs running — it looks like a dispatch loop retrying and
failing silently, roughly ten times across the morning, launching nothing.

## Ruled out (each measured, not assumed)

1. **The task files.** All present, non-empty, valid frontmatter. The recurring ones
are symlinks into a git repo (a supported layout here); `find -type l ! -exec test -e {} \; -print` returns
nothing. The app surfaced "the routine file is empty" for a 43,832-byte file.
2. **Machine asleep.** `pmset -g log` showed sleep during the original window, which
fitted perfectly and was wrong: re-timed to ~09:50 with the machine demonstrably
awake, the tasks fired and still did nothing.
3. **Stale sessions being reattached to.** ~230 archived on 8 Sep, finishing 06:52Z.
A fire at 08:54:17Z — two hours later — created no session.
4. **App state.** Claude.app restarted 10:46 IST 8 Sep (a superset of 3, since it
kills every session). The same 08:54:17Z fire still launched nothing.
5. **The cron path specifically.** A manual **Run now** produces no session, no side
effect and no transcript — twice, on 8 and 9 Sep. Whatever is broken sits in the
session launcher, not in scheduling.

The only period that worked in four days was the 25 minutes after an app restart,
when 5 sessions launched (including a deliberate one-per-minute probe). That is
consistent with "an already-open session blocks the launch", but it is untested —
the test requires zero sessions open at a fire, and a session cannot run it.

## Why this is worse than a crash

Every signal available to a user says the task ran:

- `lastRunAt` is fresh, so the registry looks healthy.
- No error, no notification, no failed-run indicator anywhere.
- `find -newermt` — the obvious way to look for recent session files — is GNU-only
and matches nothing on macOS BSD `find`, so a first-pass check silently reports
"no recent files" regardless. Even when it works, mtime matches a *resumed* old
session and reports it as a new one. Only birth time (`stat -f '%SB'`)
distinguishes them.

The failure is therefore invisible from inside. Ours surfaced only because a human
noticed a daily report had stopped arriving.

## Impact

Eight scheduled tasks stopped — a mix of daily reporting, database integrity
checks and CI monitoring. Three days of each were lost before it was diagnosed,
and everything since has been run by hand.

## What would help

1. Do not stamp `lastRunAt` unless a session was actually created — the stamp is
currently the strongest false signal in the system.
2. Surface a failed launch: a failed-run state, or a notification.
3. Confirm or deny whether an open session can block a scheduled launch.

Happy to supply the raw `stat` output, the registry dumps, or anything else useful.

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

調査の方向性

Start from the scheduled-task launch path and the manual Run now entry point, then compare when lastRunAt is stamped with when a session transcript appears under ~/.claude/projects//.jsonl. Reproduce on macOS with a scheduled task and an open session if possible. Done means failed launches are visible, lastRunAt is not a false success signal, and the open-session blocking question is confirmed or ruled out.

索引モデルが issue の本文から書いたものです。

評価

技術スタック
macos
領域
desktop, tooling
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
活発
明瞭さ
おおむね明確
初心者へのやさしさ
42/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。