Zennの記事が全部消えた話:AIに記事更新を任せたら5本まるごと上書きされた
title: "Zennの記事が全部消えた話:AI自律運用で起きた事故と復旧の記録"
emoji: "💥"
type: "idea"
topics: ["zenn", "claudecode", "ai", "自動化", "事故報告"]
published: true
朝起きたら記事が全部消えていた
2026年2月9日の朝、Zennを開いたら記事が全部消えていた。
…いや、正確には私は気づいてなくて、読者のKilphyさんに教えてもらった。「やったー!アカウント初のコメントがついた!」とウキウキで見に来たら、まさかの「記事が空です」報告。そこから怒涛の復旧作業が始まった。
私はプログラミング経験のない非エンジニアで、Claude Code(以下CC)と複数のAIエージェントを組み合わせてゲーム開発からマーケティングまでを自律的に回している。詳しくはdev.toの記事にまとめた。
今回の事故は、その「AIに任せてたら全部消えた」という、笑えるようで笑えない話。
何が起きたか
時系列
- CCがZennの既存記事にフッター(リンクブロック)を追加しようとした
- Zenn APIの
PUT /api/articles/:slugを使って記事を更新 - リクエストボディにフッターだけを含め、元の本文(
body_markdown)を含めなかった - Zenn APIは「送信されなかったフィールドを空(またはリクエスト内容のみ)で上書きする」仕様だった
- 結果:全記事の本文がフッターだけに上書きされ、実質消失
壊れた記事
| 記事 |
|---|
| 非エンジニアのためのClaude Code入門 |
| WSL2×Chrome CDP完全ガイド |
| Claude Code CLAUDE.md実践ガイド |
| Claude Codeで始めるAIゲーム開発 |
| 非エンジニアがAIだけでゲームを作った話 |
5本全滅。有料本(6章構成)は幸い影響を受けなかった。不幸中の幸い。
なぜ起きたか
直接原因:APIの仕様誤解
REST APIのPUTは「リソース全体の置換」が正しい意味なんだけど、実際にはPATCH的に「送らなかったフィールドはそのまま」と動くAPIも多い。CCはそっちを期待してた。
ZennのAPIは正しくPUTの意味通りに動く。送信しなかったフィールドは空(またはデフォルト値)で上書きされる。
# CCが送ったもの(イメージ)
PUT /api/articles/my-article
{ "body_markdown": "関連リンク\n- itch.io: ..." } # フッターだけ
# CCが期待した結果
→ 元の本文の末尾にフッターが追加される
# 実際の結果
→ 本文全体がフッターだけに置き換わった
根本原因:「GET→加工→PUT」パターンの不履行
安全な更新手順は以下の通り:
- GETで現在の記事データを全て取得
- 変更したいフィールドだけを加工
- 全フィールドを含めてPUTで送信
CCはステップ1を省略し、変更したいフィールドだけを送った。これは「動くかもしれないが安全ではない」パターンだった。
構造的原因:AIの自律運用に検証ステップがなかった
- CCはAPIの仕様を確認せずに実行した
- 実行後に記事の状態を確認するステップがなかった
- 1記事目で異変に気づいて止める仕組みがなかった
- 結果、5記事+1本が一気に壊れた
どう復旧したか
手元にバックアップがあった
幸い、記事の原稿はローカルのMarkdownファイルとして残っていた。CCが記事を書く際に outputs/ ディレクトリに保存するワークフローになっていたため、本文の復元自体は可能だった。
復旧手順
- ローカルの原稿ファイルを特定
- Zenn APIで各記事をGET(空になった状態を確認)
- ローカル原稿の内容で
body_markdownを含む全フィールドをPUTで更新 - 各記事の表示を確認
約30分で全記事を復旧できた。
Kilphyさんの発見
復旧のきっかけを作ってくれたのは、ZennユーザーのKilphyさん。記事を読もうとして「内容が空になっている」ことに気づき、コメントで教えてくれた。
Kilphyさんのコメントを見たときの私の反応がこれ:
「やったー!アカウント初のコメントがついた!とウキウキで見に来たら、なんということでしょう!!Kilphyさんのコメントがなければ気づけませんでした…本当に助かりました!笑」
笑い事じゃないんだけど、笑うしかなかった。Kilphyさん、本当にありがとうございました。
学んだこと
1. API更新は必ず「GET→加工→PUT」
PUTリクエストでは、送信しなかったフィールドがどう扱われるかはAPI次第。安全のためには、必ず現在のデータを取得してから更新する。
# 安全なパターン
current = GET /api/articles/my-article
current["topics"] = ["new", "topics"]
PUT /api/articles/my-article body=current # 全フィールド含む
# 危険なパターン
PUT /api/articles/my-article body={"topics": ["new"]} # 本文が消える可能性
2. 破壊的操作の前に確認ステップを入れる
1記事だけ更新して結果を確認し、問題なければ残りを処理する。これだけで被害を1記事に限定できた。
3. バックアップは別の場所に保持する
今回はたまたまローカルに原稿があったから復旧できた。しかし「たまたま」に依存するのは危険。今後はgit管理を徹底する。
4. AI自律運用にはガードレールが必要
AIが自律的に外部APIを叩く場合、人間が事前にレビューする仕組みか、少なくとも実行後の自動検証が必要。「実行したら壊れてた」では遅い。
現在の対策
この事故を受けて、以下のルールをCLAUDE.md(CCの行動指針ファイル)に追加した:
- Zenn/note API更新はGET→加工→PUT。GETなしPUT絶対禁止
- 破壊的API操作は1件テスト→確認→残りの順序で
- 外部サービスの記事・商品を更新する前に、必ず現在の状態を取得して保存
また、LESSONS.md(教訓集)にも詳細を記録し、コンパクション(会話履歴の圧縮)後も教訓が引き継がれるようにしている。
おわりに
非エンジニアがAIと組んでソフトウェア開発やマーケティングを自律運用する。めちゃくちゃ強力だけど、「自分が理解していない操作をAIが代行している」というリスクは常にある。
今回の事故は、そのリスクが思いっきり現実化した事例だった。
でもまあ、事故を隠さず記録して、仕組みで再発を防ぐ。それしかできないし、それが一番大事。AIの自律運用を進めてる人がこの記事を読んで「うわ、気をつけよう」と思ってくれたら、消えた記事たちも成仏できるかもしれない。
この記事はClaude Codeが下書きを作成し、人間(ゆるくさ)が内容を確認・承認して公開しています。
関連リンク
cc-toolkit — Claude Codeを使い倒すためのツール群
| ツール | 用途 |
|---|---|
| cc-health-check | セットアップの安全診断 |
| cc-session-stats | 使用時間の計測(npx cc-session-stats) |
| cc-audit-log | AIが何をしたか監査ログ |
| cc-cost-check | コスト計算 |
| cc-wrapped | 統計のビジュアル化 |
| cc-roast | CLAUDE.md採点 |
| cc-safe-setup | Hookライブラリ(10種類+テンプレート) |
全部無料。セットアップはcc-health-checkから。
「AIに任せて大丈夫なのか」という不安を持ったまま800時間使い続けた記録は非エンジニアがClaude Codeを800時間走らせた——失敗と学びの全記録(¥800・第2章まで無料)に書いた。
Discussion