Claude Codeの定期タスクで確認する3点 ― 二重実行・文字コード・権限

Claude Codeには「決まった時刻・頻度でエージェントを自動起動する」スケジュールタスクの仕組みがある。本記事は2026年8月30日までの運用をもとに、Pythonデモで確認した二重実行の抑止と文字コードの問題、公式文書で確認した権限モードの注意点を整理した記録です。当ブログの定期運用は9月3日にCodexへ移管しており、Claudeで現在も動かしているという意味ではありません。
「毎回まっさらなセッションで始まる」という前提
まず公式ドキュメントで仕様を確認した(2026-08-30時点)。Claude Codeのスケジュール実行には大きく3種類あり、クラウド上で動く「ルーティン」、手元のマシンで動く「デスクトップのスケジュールタスク」、セッション内で使う/loopがある。このうちデスクトップのスケジュールタスクは、決まった時刻になると現在開いている手動セッションとは独立に、新しいセッションを起動する仕様になっている。つまり前回の実行内容を「覚えている」状態では始まらない。
これは一見当たり前に思えるが、「今日はもう実行したかどうか」を自分でどこかに記録しておかないと、同じ処理を何度も繰り返してしまうことを意味する。また公式ドキュメントには「未実行検知(Missed runs)」の挙動も明記されていた。アプリが閉じていた・PCがスリープしていた等で実行できなかった日があると、次にアプリが起動した時点で直近7日分のうち最も新しい未実行分を1回だけ「取り戻し実行」する仕様である。「9時に動くはずのタスクが、PCがスリープしていたせいで夜11時に動く」ことがある、と公式ドキュメント自身が注意喚起している。時刻に依存する処理を書く場合は、プロンプト側に「今日の分だけを対象にする」「17時を過ぎていたらレビューではなく要約だけ出す」といったガードを入れるよう推奨されている。
デモで検証した2点と、公式仕様で確認した1点
1. 「今日もう実行したか」を自分で管理しないと二重実行する
上記の仕様を踏まえ、最小限のスクリプトで再現した。状態ファイル(state.json)に最後に実行した日付を保存し、同じ日にもう一度呼ばれたらスキップする。以下は日付判定部分の抜粋です。datetime、JST、状態ファイルの読み書き関数は省略しており、このブロック単体では実行できません。
def main():
now = datetime.now(JST)
today = now.strftime("%Y-%m-%d")
state = load_state()
if state["last_run_date"] == today:
print(f"[skip] 本日({today})は実行済みのためスキップします。")
return
# ...ここで本来の処理...
state["last_run_date"] = today
save_state(state)
同日に2回実行した際の実際の出力は以下の通り。
=== PYTHONIOENCODING=utf-8 を付けて1回目 ===
[run] 2026-08-30 の実行を記録しました(ファイル数: 0件)。
=== 同じく2回目(同日) ===
[skip] 本日(2026-08-30)は実行済みのためスキップします。
「セッションは毎回まっさらに始まる」という公式の仕様説明を読んだだけでは、この判定ロジックを自分で書く必要があることに気づきにくい。ファイルへの記録を伴わない処理(通知だけ、集計だけ等)でも、この冪等性チェックは省略しない方がよい。
2. Windows環境ではコンソールの既定エンコーディングで落ちる
日本語や特殊文字を含む文字列をスクリプトから標準出力に書き出す処理は、Windows環境だと詰まりやすい。実際に、特殊文字(ñ)を含む文字列を素の状態で出力すると次のように落ちた。
$ python -c "print('Jalapeño チップ')"
Traceback (most recent call last):
...
UnicodeEncodeError: 'cp932' codec can't encode character '\xf1'
in position 6: illegal multibyte sequence
この実行ではPythonの標準出力エンコーディングがcp932だったことが原因です。Windowsでも端末やUTF-8モードにより挙動は変わるため、すべての環境で再現するわけではありません。PowerShellでは、次のように環境変数を指定できます。
$env:PYTHONIOENCODING = 'utf-8'
python -c "print('Jalapeño チップ')"
Jalapeño チップ
スケジュールタスクは人が画面を見ていない前提で動くため、こうしたエラーで処理全体が止まっていても気づくのが遅れる。外部コマンド(Pythonに限らずNode.js等でも起こりうる)を呼ぶ処理を書く際は、日本語だけでなく英数字以外の記号を含むテキストでも動作確認しておく方が安全というのが実際に踏んでみての教訓である。
3. 権限モードが「Manual」だと承認待ちになる
公式ドキュメントによれば、スケジュールタスクにも権限モード(Manual/Accept Edits等)を個別に設定できる。Manualモードで未許可のツールを呼ぶと承認待ちのまま停止し、そのセッションはサイドバーに残る。公式文書は、作成後に「Run now」で動作を確認し、必要なツールを「always allow」にする手順を案内している。ここまでが公式文書で確認した仕様である。無人運用でサイドバーを確認しなければ、停止の発見が遅れる可能性がある。
個人事業主・小規模チームへの実務影響
一人、あるいは少人数でスケジュールタスクを組む場合、上記の詰まりどころは「動いているつもりで実は止まっている/二重に動いている」という一番気づきにくい形で表面化する。日次の資料作成や定型メール下書きのようなタスクを任せている場合、二重実行に気づかないまま数日放置すると、同じ内容が重複して積み上がったり、外部サービスへの書き込みが複数回走ったりする恐れがある。監視する人手が薄い体制ほど、事故に気づくまでの時間が長引きやすい。
最低限、①同日の二重実行を防ぐ状態ファイルを最初から入れる、②非ASCII文字を含む出力の動作確認をしておく、③作成直後に一度手動実行して権限プロンプトを片付けておく、の3点は初回のセットアップ時点でやっておく方が、後から気づいて直すより明らかに安い(今回のように再現・修正に手間がかかる)。特に③は公式ドキュメントに明記されているにもかかわらず見落としやすい。タスクの内容によっては、④実行結果をファイルやログに残し、後から「その日動いたかどうか」を人間側でも確認できるようにしておくことも有効である。自動化の恩恵は「見なくても回る」ことだが、「見なくても壊れているのに気づける」仕組みとセットでないと、単に問題の発見が遅れるだけになりかねない。
まとめ
この記事で実行結果を提示したのは、Pythonデモの同日スキップと文字コードエラーの2点です。Claudeのセッション起動、取り戻し実行、権限モード自体をこのデモで再現したわけではなく、それらは公式文書を根拠にしています。単純な日付ファイルは同時起動の排他制御や、外部処理成功直後に異常終了した場合の重複までは防ぎません。実際の外部書き込みでは、処理側の一意な実行IDや結果照合も必要になります。
2026-09-05訂正:タイトルの「5つ」を本文に対応する3点へ訂正し、実測と公式仕様の区別、PowerShellのコマンド表記を修正しました。クラウド版への移行比較は未検証です。
関連する実践記録として、同じ文字コードエラーを公開前検査で踏んだ経緯と、静的サイトのビルド・サイトマップを追試した Astro + Cloudflare Pagesの公開前確認記事も参照できます。
2026-09-06訂正:独自証拠の表示を「実運用」から、本文で実際に提示している「Python実行結果」へ限定しました。Manualモードの説明は、公式文書で確認できる承認待ち・サイドバー表示と、無人運用時の発見遅延の可能性を区別しました。