金曜9時、いつも通り自動投稿が走るはずの時間に何も投稿されていないことに気づいた。ログを見ると「notes/log.mdが前回投稿時から更新されていないため、投稿をスキップします」の一文。バグではなく、意図して仕込んだ安全弁がちゃんと働いた結果だった。
なぜスキップされたのか
このパイプラインでは、記事のネタ元であるnotes/log.mdの中身をSHA256でハッシュ化し、前回投稿時のハッシュと比較している。中身が変わっていなければ「新しいネタがない」とみなして投稿をスキップする、という単純だが効果的な重複投稿防止の仕組みだ。
notes/log.md の中身
↓
SHA256でハッシュ化
↓
前回投稿時のハッシュと比較
↓ 一致(=ネタ切れ)
投稿をスキップ ⏭️
ここで手を止めて「じゃあ月曜まで待つか」でもよかったのだが、せっかくなので今すぐ何か出したくなった。ただ手元にあったのはスマホだけで、PCもVSCodeも開ける状況ではなかった。
スマホだけで記事を出す
そこで、記事の「生成」と「公開」を切り離すことにした。生成はClaude(Cowork)にその場でやらせ、公開はもともと持っていたGitHub Actionsの手動実行(workflow_dispatch)に任せる構成に変更した。具体的には、生成済みの記事JSONをファイルとして渡せる--from-fileオプションをスクリプトに追加し、GitHub Actions側の入力欄からもそのパスを指定できるようにした。
📱 Claudeに記事の下書きJSONを作らせる
↓
GitHubにdraft JSONをpush
↓
GitHubのActionsタブ→Run workflowでfrom_fileを指定
↓
WordPressに公開 + Zennへクロス投稿
↓
notes/posted/ へ自動退避(二重投稿防止)
これで、ブラウザさえあればスマホからでも「今すぐ1本出す」が完結するようになった。GitHub Actions側のSecretsに全部の認証情報を寄せてあるので、手元の端末に鍵を持ち歩く必要がないのも地味に嬉しいポイントだった。
次にやりたいこと
今回は手動でJSONを作ったが、そもそも「スキップされたらClaudeに1本自動生成させて、下書きとしてPRを立てる」くらいまで自動化できそうな気がしている。安全弁で止まった先の「回復」まで自動化するのが次の目標だ。
👉 関連商品をAmazonで探す(smartphone automation)