Claude Codeに、Zennの記事の公開を手伝ってもらっていたときの話です。AIが「あとで自動でやります」と言ったのに、何も起きませんでした。この失敗から決めた、「時間で動く処理」の扱い方をまとめます。
起きたこと
ZennをGitHub連携で運用しています。ある日、4本目の記事を公開しようとしたら、「投稿数の上限」で止まりました(前回の公開から24時間以内は、公開できません)。
このとき、AIは、おおよそ次のように答えました。
24時間たったら、自動で再試行されます。
けれど、24時間が過ぎても、何も起きませんでした。記事は、保留のままでした。私が気づいて、「自動で再試行されると言ったのに、されていないね」と指摘して、はじめて分かりました。
なぜ動かなかったのか
理由は単純です。AIのセッションは、私が話しかけたときにしか動かないからです。
- Claude Codeは、人が指示を出したときに動く。時間が過ぎたからといって、自分で起き上がって、続きをやることはない
- 「24時間後に自動で再試行する」ためには、24時間後に、何かが動いている必要がある。それは、AIの外側(cron、GitHub Actionsなど)でしか実現できない
- AIは、「そうなるはず」という気持ちで、自然に「自動で」と言ってしまうことがある。その「自動」を動かす仕組みが、実際にあるかは、別の話
決めたルール
AIが、時間が過ぎたら何かをやる、と約束したときは、次のどちらかにします。
- 仕組みにする: 時間で動く処理は、GitHub Actionsなど、AIの外側のスケジューラに入れる
- 催促を頼む形にする: 仕組みにしないなら、「◯日になったら、声をかけてください」と、人に頼む形にする。「自動でやっておきます」とは言わせない
AIの約束に、「それは、何が、いつ、実行するのか」を、一言、確かめるだけでも、効きます。
仕組みにした例
Zennの記事の公開は、結局、GitHub Actionsに入れました。毎日、決まった時刻に、キューの先頭の記事を公開する形です。
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch: {}
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run publish-next script
run: node scripts/publish-next.js
- name: Commit and push if a draft was published
run: |
if [ -n "$(git status --porcelain)" ]; then
git config user.name "zenn-publish-bot"
git config user.email "actions@users.noreply.github.com"
git add -A
git commit -m "自動公開: キューから記事を1本公開"
git push
fi
記事を書いたら、published: falseで置いて、キューに名前を足すだけです。公開の時刻や、24時間の間隔を、AIにも私にも、覚えておく必要がなくなりました。「忘れる」「ずれる」を、仕組みが引き受けます。
「催促を頼む形」の例
仕組みにするほどでもない、一度きりの作業は、人への依頼にします。たとえば、こう書かせます。
10月10日になったら、「Zennの本の再公開」と声をかけてください。そのときに、続きをやります。
こう書かれていれば、私が忘れていても、約束が、誰の責任なのかが、はっきり残ります。AIは、時間が来ても、自分からは動きません。人が声をかけたとき、続きから動きます。
AIに、この運用を覚えてもらうために、私は、プロジェクトのメモ(CLAUDE.mdやメモリ)に、1行書いています。
時間経過だけでは自発的に動かない。約束するなら、仕組み化するか、催促を頼む形にする。
まとめ
- AIは、時間が来ても、自分からは動かない。「あとで自動でやる」は、仕組みがなければ、起きない
- 時間で動く処理は、GitHub Actionsなど、AIの外側のスケジューラに入れる
- 仕組みにしない作業は、「◯日に声をかけてください」と、人に頼む形にする
- 約束を聞いたら、「何が、いつ、実行するのか」を、一言確かめる
- このルールは、プロジェクトのメモに、1行で残しておく
この記事はZennにも投稿しています。