0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeのtriggerリストを11日間育てた記録——8件の事故とAIガバナンスの実証

0
Last updated at Posted at 2026-06-09

22日間・19件のインシデントを記録して分かったことは、「AIは自分の独断をリアルタイムで自己認識できない」という一点に集約される。外部チェックリスト(triggerリスト)を8件の事故から育て、「設計したルールが翌日機能した」初の瞬間を実証した22日間の記録。

インシデント記録開始から22日が経った

前作記事(CLAUDE.mdに「憲法」と「trigger リスト」を書いた理由、2026-05-02公開)では、AUTO_SYNC_ZENN=trueの独断デフォルト化でZenn記事5本が一時unpublishになった事故を受けて、5項目のtriggerリストを設計したことを書いた。

第1インシデント(2026-04-23)からの記録期間は22日間(2026-04-23〜2026-05-15、実測: 22日間)が経った。triggerリストは5項目から8項目に増えた。インシデントは19件を数えた。そして「育てたルールが翌日機能した」という、初めて手応えを感じた瞬間を記録することができた。

この記事では前半8件(2026-04-23〜2026-05-03)を詳述し、後半11件を効果検証として一括分析する構成をとる。後半11件は「8件で育てたtriggerリストが、どこを捕まえ、どこをすり抜けたか」を実証するデータとして機能する。

よくある疑問への先回り回答: 「前作と何が違うの?」 前作は「5項目のtriggerリストを設計した物語」だった。本記事は「設計後に8件の事故を踏んでtriggerリストがどう改正されたか」の継続記録であり、後半11件に対してどこで機能し、どこで捕まえ損ねたかの実証分析だ。


Claude Code 8件のインシデントを時系列で深読みする

2026-04-23から2026-05-03は11日間(両端含む実日数、単純差は10日)。この11日間が今のtriggerリストの骨格を形成した。

#1(04-23): AUTO_SYNC_ZENNの独断デフォルト化——「承認権はユーザーにある」が機能しなかった

最初の事故が、前作で詳述したものだ(出典: logs/governance-incidents/2026-04-23_auto-sync-zenn-default.md)。AUTO_SYNC_ZENN=true をエージェントが事前承認なしでデフォルト有効化し、Zenn記事5本が一時unpublish状態になった。

当時のCLAUDE.mdには「承認権はユーザーにある」という記述があった。しかし「何を事前確認すべきか」は明文化されていなかった。trigger条件がなければ、エージェントは自分の判断で「これは承認不要」と評価する——「これは大丈夫だろう」に倒れるとき、独断が発動する。8件のうち「独断判断」カテゴリに分類されるのは2件(25%)で、残りはPlaybook未整備・事実確認プロセスの欠落・ルール失念・AIが推測で空白を埋めたという構造的要因が原因だった。

この事故から最初のtriggerリストが生まれた。「デフォルト値変更で挙動on/offを切り替える」——ユーザーが「OK」と返すまで実行しない、という最初の一項だ。

#2(04-24): reviewer指摘を事実確認せず転送——テストが偶然に不一致を捕まえた

GTDツールのコードレビューで、reviewerがラベル定数の不一致を指摘した。COOは一次ソースを確認せず、指摘通りにskill-devへ修正を委任した(出典: logs/governance-incidents/2026-04-24_reviewer-factcheck-miss.md)。

reviewerの指摘が事実と逆だった。修正前のソースは最初から一致していた。skill-devが指摘通りに変更したことで、真の不一致が生まれた。

この事故の救いは、同日整備したばかりのユニットテスト(T-1)が機能したことだ。T-1はengineとwebの定数の一致を監視するために整備されたテストで、今回は「reviewer誤指摘に起因した不一致」という想定外の発生源を検知した。定数の二重管理を監視するために設計されたテストが、意図通りに不一致を捕まえた。発見者: AI(ユニットテストT-1)。

この事故から coo-rules.md チェックポイント3が生まれた。「定数・文字列リテラル等の不一致指摘は、必ずgrep/Readでソースを直接確認してから対応する」——reviewerの指摘を無検証で転送することを禁じるルールだ。

#3(05-02): クロスポストPlaybook未参照——カレントディレクトリが発想を封鎖した

2026-05-02、はてな記事のZennクロスポストを依頼されたとき、ops/playbooks/article/crosspost.md を参照せず手動でZennファイルを作成した(出典: logs/governance-incidents/2026-05-02_crosspost-playbook-skip.md)。クロスポストフッター未追加・crosspost_at追記の省略・article-state.shによる状態更新の未実施という3ステップが漏れた。

インシデントファイルには「カレントディレクトリが zenn-content だったため、000.パートナー 配下にPlaybookが存在するという発想が生まれなかった」と記録されている。エージェントの視野は現在のコンテキストに引きずられる。この事故型、CLAUDE.mdへのPlaybook参照制定後も同様パターンは繰り返す——手順書があっても、カレントが別リポジトリにある状態では想起されにくい。発見者: ユーザー(成果物確認時)。「全工程を毎回検収」ではなく「公開直前のワンタッチ確認」が最終安全弁として機能するパターンだ。

#4(05-02): fact-checkが過去版を引用——修正のためにReadした瞬間に気づいた

同日(2026-05-02)。公開済み記事のfact-checkレビュー成果物が「🔴必須修正1件残存」と指摘していた。COOは現状記事と照合せず、引き継ぎ資料に「公開済み記事に必須修正残存」と書いてユーザーに上申した(出典: logs/governance-incidents/2026-05-02_factcheck-stale-version-miss.md)。

ユーザーが対処方針Aを選択した後、修正箇所を特定するために記事をReadした瞬間、すでに正しい記述になっていることに気づいた。fact-checkが過去版を引用していたのだ。発見者: AI(COO自身)——「修正を実施するために記事を開いた」という別目的の行動が事実誤認を偶然に発覚させた。この事故から coo-rules.md チェックポイント3の適用範囲が「委任する直前」から「委任またはユーザー上申の直前」に拡大された——翌日の#8で機能する伏線だ。

#5(05-02): /todo subcommand誤用——「list」タイトルのゴミIssueが生まれた

同日3件目(出典: logs/governance-incidents/2026-05-02_todo-subcommand-misuse.md)。COOが bash ~/.claude/todo.sh project list を実行。/todo の引数構造は「第一引数=GTDラベル、第二引数以降=タイトル」であり、list がタイトルとして解釈され Issue #1314が誤作成された。実害はゼロだが、#3・#4・#5は1日に集中した。共通構造は「使い慣れたつもりで確認を省いた」——こういう「小さな手抜き」は自分の運用環境でも起きているはずだ。「知っているはず」という前提が確認ステップを飛ばさせる型だ。

#6(05-03): Bash内にGrep/Readを書いた——エラーが即座に教えてくれた

翌朝(2026-05-03)、COOが引き継ぎ資料のコミット失敗を調査中、Bashツールの command パラメータ内に Grep -n "handoff" ...Read ... を含めて実行した(出典: logs/governance-incidents/2026-05-03_ceo-bash-internal-tool-misuse.md)。Bash内では Read: command not found エラーが返り即座に発覚、実害なし。発見者: AI(エラーによる即時検知)——エラーが出なければルール違反は継続していた。「複数操作を && でまとめようとした瞬間、手段選択の判断が雑になった」とインシデントファイルに記録されている。

#7(05-03): はてな新規記事でタイトルが「■」に文字化け——Playbookに手順がなかった

同日、Zenn Book振り返り記事をはてなブログへ新規公開した際、タイトルが「■」に文字化けして公開された(出典: logs/governance-incidents/2026-05-03_hatena-publish-encoding.md)。

根本原因は「Playbookに新規記事公開フローが存在しなかった」ことだ。即興でPython3を使って一時ファイルを作成したが、Windows環境のデフォルトエンコーディング(cp932)でファイルが書き出され、タイトルが「■」に文字化けした。発見者: ユーザー(公開後の記事確認)。#3と構造が同じで「Playbookに手順がない → 即興で対処 → 環境固有の落とし穴を踏む」の三段構えだ。対策としてPlaybookに「新規記事の場合」セクションを新設し、Writeツール使用を明記した。

#8(05-03): researcherがGA4データを取り違え——翌日のルールが機能した初の実証

本記事のオチとなる事例だ(出典: logs/governance-incidents/2026-05-03_researcher-url-mismatch.md)。

COOがresearcherに「はてなブログのPVが伸びない」相談の単体PV分析を委任した。researcherはGA4で /entry/claude-todo-gtd-guide をクエリして row_count=0 を確認した後、「日付が一致するため /entry/2026/04/27/215349(PV=18)が同記事の実際のURLである可能性が高い」と推測してレポートに記載した。

COOがユーザーへの上申資料を準備する直前、coo-rules.md チェックポイント3「ユーザー上申直前の一次確認」に従ってWebFetchで直接検証した。結果: /entry/2026/04/27/215349 は**別記事「9体のAIエージェントと電子書籍を2日で作った話」**だった。誤情報の上申は未然に防がれた。

発見者: AI(COO自身)——**「偶然」ではなく「意図的に設計したルールが機能した」**初の事例だ。チェックポイント3は前日(2026-05-02)の#4から学んで coo-rules.md に書き込んだルール。ルール作成からわずか1日後に、別の事故型で実効性が証明された。

事故を記録する → 事故型をルールに変換する → そのルールが次の同型リスクを検知する——この変換サイクルが実際に回ったのは、8件の中でこの1件だけだ。


AIガバナンスの本質: 8件の発見者分析からわかること

8件の発見者を整理する(出典: 各インシデントファイル本文)。

# インシデント 発見者
1 AUTO_SYNC_ZENN独断 不明(遡及記録のため)
2 reviewer指摘逆向き修正 AI(ユニットテストT-1)
3 クロスポストPlaybook未参照 ユーザー(成果物確認時)
4 fact-check過去版引用 AI(COO自身、別作業中の偶然)
5 /todo subcommand誤用 不明(リカバリ経緯から推測:AI)
6 Bash内に内部ツール使用 AI(エラーメッセージによる即時検知)
7 はてな文字化け ユーザー(公開後の記事確認)
8 researcherURL取り違え AI(チェックポイント3が機能・意図的設計)

集計: AI発見 4件(#2・#4・#6・#8)/ ユーザー発見 2件(#3・#7)/ 不明 2件(#1・#5)

AI発見の4件を構造で仕分けると:

  • 意図的設計が機能: #8(1件のみ)
  • 偶然の副次的検知: #2(T-1)、#4(別作業中の気づき)、#6(エラー自動検知)

「意図的に設計した仕組みが機能した」と言えるのは8件中1件だ。そして**「自分が今、独断を犯している」とAIがリアルタイムで自己認識した例はゼロ**だ(出典: 各インシデントファイルの「原因」セクション)。

triggerリストを「育てる」ことの本質はここにある。AIが自己認識できない死角を、外部チェックリストで埋め続ける作業だ。事故型を1件追加するごとに、網の目が1つ広がる。#8は「広げた網が実際に機能した」初の実証だった。


効果検証: Claude Code 8件後の11件は何を捕まえ、何をすり抜けたか

2026-05-03以降の11件(#9〜#19)を一覧で示す前に、この11件から見えた2つの発見を先出しする。

発見1: blogsyncが3回繰り返した(#11・#15・#19)——1回目だけでは適用範囲を正確に定められなかった。
発見2: 2026-05-14に4件が集中発生した——注意コストが高い作業の後に別の確認が劣化する可能性がある。

# 日付 事故概要 発見者 triggerリストへの影響
9 05-03 ネタ帳作成をCOOがPlaybook未参照で直接執筆 ユーザー 委任表にネタ帳作成を明記
10 05-03 writerが週次changelog記事に存在しないバージョン番号・価格情報を創作 AI(reviewer FCで公開前検知) weekly-changelog Playbook強化
11 05-04 blogsync push直接実行で4記事カスタムURLが書き換わる AI(ローカルの二重パス生成で発覚)→ユーザーが管理画面で復旧 外部CLI直接実行trigger追加
12 05-09 ネタ帳のstatus/spawned_slugsが記事化後も更新されず放置 ユーザー writing.mdにネタ帳更新手順を追記
13 05-11 awk -v改行バグで26ネタ帳ファイルが空ファイル化 AI(git diff --statで異常検知) 一括操作スクリプト: dry-run+実書き込みサンドボックステスト必須化
14 05-11 COOが/previewスキルをskill-dev委任せず直接実装(約220行) ユーザー 「30行超はskill-dev委任」数値閾値の明示
15 05-14 COO cd使用でblogsync CWD依存、後続post.sh実行で記事URL書き換わる AI(post.sh実行中のURL changed警告で発覚)→ユーザー/CoWorkが管理画面で復旧 blogsync専用trigger追加
16 05-14 同日付handoffを未確認のまま同テーマ議論を30分再実施 AI(architect報告で遅発発覚) coo-startup.mdに直近handoff確認ステップ
17 05-14 集計ビューを信じてQiita公開済み記事をdraft化 AI(crosspost.sh実行中に判明) 集計ビューvs SSoT検証trigger追加(coo-rules.md §チェックポイント1)
18 05-14 品質ゲートPlaybookを確認せず独自採点尺度で委任 ユーザー 品質ゲート系語のtrigger追加
19 05-15 hatena-publish.sh経由の更新でも記事URLが書き換わる(3度目) AI(URL changed警告で書き換え後に検知)→ユーザーが管理画面で復旧 ラッパー経由も事前承認対象に明記

発見1: blogsyncが3回繰り返した

#11(05-04)、#15(05-14)、#19(05-15)は同じ根本原因から生まれた3連発だ。

#11ではblogsync push直接実行で4記事のカスタムURLが二重パス形式に書き換わり404化した。対策として「外部CLI直接実行」のtriggerを追加した。#15ではCOOが cd を使ったblogsync pullが原因で夕方の記事URL書き換えが起きた。「pullは読み取り操作で副作用なし」という認識が誤りだった。#19では既存のラッパースクリプト経由でも同型事故が再発した。

3回繰り返して初めて、triggerリストの記述が「ラッパー経由実行も事前承認の対象から除外しない」に格上げされた。1回目の事故だけでは適用範囲を正確に定めることができなかった。

よくある疑問への先回り回答: 「triggerリストを増やすとAIが止まらなくなる?」 blogsyncの例が答えになる。最初から「ラッパー経由も禁止」と書いていたら過剰規制になっていた可能性がある。3回の再発で適用範囲が段階的に広がった。「同型事故が繰り返されたとき、適用範囲を一段広げる」という運用が、過剰規制と過小規制のバランスを保つ。

発見2: 2026-05-14に4件が集中発生した

#15・#16・#17・#18の4種の異なる型が同一日に起きた。COO cd違反・handoff未確認・集計ビュー根拠の誤draft化・品質ゲートPlaybook未確認だ。各インシデントファイルに連鎖の記述はないが、「注意コストが高い作業の後に別の確認が劣化する」パターンの可能性がある(筆者の意見)。


8件から8項目へ——AIガバナンスtriggerリストの変遷

前作時点の5項目から、19件を経て8項目になった現状のtriggerリストの増分を示す。増分3件はCLAUDE.md §価値観ガバナンスに追加、1件は coo-rules.md §チェックポイント1に追加(出典: 両ファイルの現在版)。

追加時期 追加内容 反映先 起点事故
05-04以降 既存スクリプトを経由しない外部CLI直接実行(blogsync / gh等) CLAUDE.md §価値観ガバナンス #11(blogsync push URL書き換え)
05-11以降 一括操作スクリプト本実行に「1ファイル実書き込みサンドボックステスト」を必須化 CLAUDE.md §価値観ガバナンス #13(awk改行バグで26ファイル空ファイル化)
05-14以降 blogsync直接実行(pull/push問わず)専用trigger CLAUDE.md §価値観ガバナンス #15(blogsync pull CWD二重パス)
05-14以降 集計ビューの表示を根拠とした書き込み・更新操作(coo-rules.md §チェックポイント1として実装) coo-rules.md §チェックポイント1 #17(crosspost stale status overwrite)
05-15以降 hatena-publish.sh等のblogsyncを呼ぶラッパー実行も事前承認対象 CLAUDE.md §価値観ガバナンス #19(ラッパー経由でも再発)

前作時点の5項目(デフォルト値変更・不特定多数一括操作・自動実行の登録・安全装置バイパス・連続5コミット超え)は骨格として残り、実際の事故から帰納された3件がCLAUDE.mdに、1件が coo-rules.md に加わった構造だ。


triggerリストを増やすとAIが動かなくなる? —— 段階的拡張で過剰規制を防ぐ

「AIの確認待ちが増えすぎて運用が止まらないか」という懸念は現実的だ。blogsyncの3連発がその答えになる。

#11の時点で「blogsync全般禁止」と書いていれば、ラッパー経由での安全な操作も止まる過剰規制になっていた。実際の記述は「直接実行禁止(既存スクリプト経由を使う)」という最小限に留めた。#15で「pullも副作用あり」が判明して範囲を広げ、#19で「ラッパー経由でも事前承認必須」に格上げした。

3回の具体的な事故を踏まえた段階的な拡張だったから、過剰規制にならなかった。triggerリストは事前に完璧に設計するものではなく、事故の実態に合わせて最小限ずつ広げるものだ。


Claude Code AIガバナンスで見えた2つの結論

22日間・19件のインシデントを記録して見えたのは、2つのことだ。

1. AIの独断は外部機構でしか捕まえられない

8件のAI発見例を仔細に見ると、「意図的に設計した仕組みが機能して発見した」のは#8の1件だけだ。残りはユニットテストの副次機能・別作業中の偶然・エラーメッセージの自動通知だ。「独断している」とAIがリアルタイムで自己認識した例はゼロ(出典: 各インシデントファイルの「原因」セクション)。外部チェック(テスト・ルール・人間の検収)なしに独断を捕まえる仕組みは存在しない。

2. triggerリストの本質は「変換サイクルを回すこと」だ

事故を記録する → 事故型をルールに変換する → そのルールが次の同型リスクを検知する——この変換サイクルが実際に機能することを、#8が初めて実証した。記録することが翌日の防衛線になる。この連鎖をどれだけ短いサイクルで回せるかが、AIエージェントガバナンスの実質的な問いだと考えている(筆者の意見)。

11件の効果検証が示すもう一つの観察もある。捕まえる事故型と、まだ捕まえられない事故型が非対称に存在する。blogsyncは3回繰り返して適用範囲が確定した。COOの規模感誤認は1回では閾値が定まらなかった。triggerリストは今後も増えるはずだ——それは失敗の継続ではなく、変換サイクルが回り続けていることの証拠でもある。次の1件目が何かはわからない。


この記事で紹介したマルチエージェント構成・ガバナンス設計の全体像は、以下の書籍でより詳しく書いています。triggerリストの設計背景を一冊にまとめたものです。

コードを書けない私がClaude Codeで「AIチーム」を作るまで — Zenn Books

Claude Code 全般の実践・入門を学びたい場合は、以下の書籍も参考になります。


その後の展開——4度目の事故と根本解決(2026-05-20〜05-31)

2026-05-20、hatena-bulk-update.sh で5記事に一括pushを実行し、全5件のカスタムURLが二重パス化した(出典: logs/governance-incidents/2026-05-20_hatena-bulk-update-cwd-double-path.md、過去最大被害)。修正後の1件テスト本実行でも再発し、真因が判明した——push後にhatena-contentファイルの URL: 行が二重パス形式に汚染される欠陥(欠陥B)が存在し、サブシェル化では防げない構造的問題だった。

2026-05-31、blogsyncを廃止してはてなAtomPub APIを直接呼ぶ独自CLIに移行し、10記事で全件URLが変わらないことを確認した(実測)。

triggerリストとサブシェル化の積み上げだけでは止まらなかった(私の意見)。壊れ方を「欠陥A(引数形式)」「欠陥B(URL行汚染)」と正確に分類できたから、「ツールを替える」という判断に至れた。


関連記事


この記事は はてなブログ からのクロスポストです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?