Rebounder Tech Blog

運用している当事者が書く、本番システムの記録。

Claude Code Desktopのスケジュールタスク、予定どおり完走は48%(395枠の実測・ENOTFOUND)

公開 読了時間 約5分執筆: Rebounder 開発チーム(当該システムの運用当事者)

※本記事にはアフィリエイトリンクを含む場合があります。内容は広告の有無に影響されません。

結論

Claude Codeデスクトップアプリのスケジュールタスクを74日・395枠回した実測では、予定から15分以内に完走したのは48%で、約4枠に1枠はその日のうちに仕事を終えられなかった。

結論から

Claude Code のデスクトップアプリのスケジュールタスクを、1日6枠・74日回した。予定の時刻に動いて完走したのは半分以下だった。

その枠がどうなったか 枠数 割合
予定から15分以内に始まり、完走した 189 47.8%
15分より遅れて始まり、完走した 107 27.1%
始まったが、エラーで終わった 52 13.2%
実行記録が1件も無い 47 11.9%
合計 395

その日のうちに仕事を終えられなかった枠は、4枠に1枠(25.1%)。止まらない前提で手順を組むと、この4分の1がそのまま穴になる。

何を測ったか

このブログ(tech.rebounder.jp)の記事と計測は、Claude Code デスクトップアプリのスケジュールタスクが回している。Mac の上で動くローカル実行で、人は入らない。

  • 期間:2026-08-17〜2026-10-29(74日)
  • タスク:6本(記事を書く4本+計測2本)。10/26 から4本に減らした
  • 実行の総数:373回

アプリは実行のたびに、開始時刻と、エラーで終わったときのエラー文を手元に記録している。これを集計した。単位は「1タスク×1日=1枠」。予定の30分前より前に始まった実行は、前日の枠の遅れとして数えた。

1つ除外がある。9/26〜10/04 に、4つの枠が enabled: false になっていた(止まる3つの形の③)。この間の記録なし34枠は「止まった」のではなく「止められていた」ので、分母から外した。

集計に使ったスクリプトは scripts/run-reliability.ts。読むのは開始時刻とエラー文の先頭だけで、プロンプトや出力は読まない。

失敗の7割は DNS だった

エラーで終わった52枠の内訳:

エラー 枠数
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
Request timed out 1

ENOTFOUND は API サーバの名前が引けなかった、つまりその瞬間に回線が無かったということ。36枠のうち19枠は、予定より遅れて始まった追いかけ実行だった。10/24 は 15:11 に3つのタスクが同時に始まり、3つとも ENOTFOUND で死んだ。Mac が起きた直後で、まだ回線が繋がっていなかったのだと考えている。

TLS の9枠は、すべて 10/08〜10/22 に出た。この時期は、通信の中身を検査する回線をよく使っていた。そうした回線は途中で証明書を差し替えるので、証明書の検証が通らなくなる。

どれも**同じ枠の中で再実行はされなかった。**死んだ実行は自分で何も書き残せないまま終わる。

遅れは中央値3時間、最大22時間

遅れて完走した107枠の遅れ:

遅れ
中央値 3時間5分
上位10% 12時間50分
最大 22時間35分

15〜60分の遅れが21枠、1〜3時間が32枠、3時間を超えたのが54枠。

遅れの正体は、Mac が寝ていた時間の追いかけ実行。起きると、溜まっていた枠がまとめて走る。別々のタスクが3分以内に続けて始まった例が46回あった。

この追いかけ実行は助けになる。だが、**時刻に意味がある仕事には使えない。**08:04 の記事が 20:00 に出ても、その日のうちなら困らない。一方で「毎朝9時の通知」のような仕事には、3時間の遅れは失敗と同じになる。

「寝ていても後で走る」は保証されない

以前の記事で「起動しない枠は、次にアプリが起動したとき自動で走るので放っておいてよい」と書いた。74日分を数えると、これは言い過ぎだった。

枠が有効だったのに、実行記録が1件も無い枠が47枠(11.9%)ある。どのタスクも1回も起動しなかった日も、74日中4日(9/05・9/12・9/27・10/11)あった。追いかけ実行は多くの場合に起きるが、起きない日もある。

止まる前提でどう組んだか

4枠に1枠が穴になるなら、穴を前提に組むしかない。やったことは3つ。

**1. 実行記録ではなく成果物で判定する。**死んだ実行は何も書き残せない。だから「その枠が出すはずのファイルが、その時間帯に git に入ったか」で、仕事をしたかを見ている(scripts/check-runs.ts)。

**2. 後の回が前の回の穴を埋める。**夕方 16:01 の回は、まず今日の日本語記事の本数を数える。0本なら、本来の仕事(英語版づくり)をやめて日本語の記事を書く。英語版は検索からのクリックがほぼ無く、1日抜けても損が最も小さい。だから予備に回した。

**3. 枠を減らした。**昼 12:08 と夕方 17:03 の2枠は、朝と11時の回の予備として足したものだった。だが予備の枠も同じ割合で死ぬ。10/26 に4枠へ減らし、予備の役は夕方 16:01 の1枠に寄せた。

変更後の5日間(10/26〜10/30)、朝の記事の枠は2回、仕事をしなかった。10/26 は記録なし、10/27 は ENOTFOUND。それでも**日本語の記事は5日とも1本ずつ出ている。**変更前の 10/24 は、上に書いた3つ同時の ENOTFOUND で、記事は0本だった。

自分の環境で数えるには

デスクトップアプリの実行記録は ~/Library/Application Support/Claude/claude-code-sessions/ の下に、1実行1ファイルの JSON で残っている。scheduledTaskId・createdAt・error の3つを読めば、上と同じ表が作れる。予定時刻はアプリに残っていないので、手で与える。

この記事の数字は、同じスクリプトで毎月1日に更新する。

まとめ

  • 予定の時刻に動いて完走したのは 47.8%。4枠に1枠はその日のうちに終わらなかった
  • 失敗の7割は DNS(ENOTFOUND)。同じ枠の中での再実行は無い
  • 寝ていた分の追いかけ実行は起きるが、遅れの中央値は3時間で、起きない日もある
  • 時刻に意味がある仕事は載せない。載せるなら、後の回が前の回の穴を埋める形にする

よくある質問

Q1Claude Codeのスケジュールタスクはどのくらいの割合で失敗しますか?

こちらの実測(2026-08-17〜10-29、6タスク・395枠)では、エラーで終わった枠が13.2%、実行記録すら無い枠が11.9%でした。予定から15分以内に完走したのは47.8%、遅れて完走したのが27.1%です。Macで動かすローカル実行の数字で、クラウド実行の数字ではありません。

Q2失敗したスケジュールタスクは自動で再実行されますか?

されませんでした。エラーで終わった52枠は、どれも同じ枠の中で再実行されていません。失敗の原因はDNSエラー(ENOTFOUND)が36枠、TLSの証明書検証エラーが9枠、実行中のスリープが6枠、タイムアウトが1枠です。

Q3Macがスリープしている間の予定はどうなりますか?

起きたときに追いかけて走ることが多いですが、保証はされませんでした。遅れて完走した107枠の遅れは中央値で3時間5分、最大22時間35分です。一方で、どのタスクも1回も起動しなかった日が74日中4日ありました。

Q4スケジュールタスクを止めないためにどうしていますか?

止まる前提で設計しています。成果物がgitに入ったかで判定し、朝の記事が無ければ夕方の回が代わりに書きます。また枠を6つから4つに減らしました。変更後の5日間、朝の枠は2回動きませんでしたが、日本語の記事は毎日1本出ています。

確認した環境

  • Claude Code デスクトップアプリのスケジュールタスク(macOS・ローカル実行)
  • 2026-08-17〜2026-10-29 に1日6枠で運用(10/26 から4枠)。集計は 2026-10-30

この記事の根拠

  • TypeScriptファイル 1〜42行目コミット da49c54
  • TypeScriptファイル 84〜122行目コミット da49c54
  • JSONファイル 1〜65行目コミット da49c54
  • Markdownファイル 15〜20行目コミット 1c89a85
  • TypeScriptファイル 56〜77行目コミット 1c89a85

本文の主張は、上の記録に書かれていることだけです。運用しているリポジトリは非公開のため リンクは張れませんが、どのファイルの何行目を、どのコミット時点で見て書いたかは 記事ごとに残しています。推測で書いた箇所はありません。