主旨
2026年5月20日から22日までの約60時間で、Claude Code に対して、独立した6件の起票が、いずれも「副の作業者が見えない」という同じ問題を報告した。ここでいう副の作業者とは、Agent ツールで起動されるサブエージェント、プラグインで起動される teammates、MCP の許可の関門の先で動くサブプロセスのことである。起票の著者は別々の人で、使っていた場面もワークフローも違う。それでも6件すべてが、同じ構造の欠落を別々の角度から言い当てていた。
本記事は、この6件を「副の作業者の観察可能性」という一つの軸でまとめ直し、4つの型に分解し、既存の cc-safe-setup の防御フックとの対応を示し、そのうえで「利用者の側だけで完全に防げる型」と「Claude Code 本体の側の協力がないと防げない型」を正直に切り分ける。もとになったのは、英語で書いた独立した長い分析(約2,270語・MIT ライセンス)で、本記事はその日本語の利用者向けの整理である。
これらは他の利用者が報告した起票であり、以下は伝聞として書く。私自身が確かめたのは、cc-safe-setup の各防御フックが実際にどの型に対応しているか(フック名と挙動を実読して照合した)という点である。
6件の起票の集まり
| 起票 | 報告日 | 内容(要約) |
|---|---|---|
| #60987 | 2026-05-20 | Agent teams で teammates が即座に死ぬ。本体が claude を pty なしで起動していた |
| #61102 | 2026-05-21 | モデルがスコープの制約を無視し、利用者が明示した範囲を越えて、副の作業者の推奨を実行した |
| #61107 | 2026-05-21 | Opus 4.7 が形の正しいコードを出力しつつ、利用者の入力を黙って捨てた |
| #61167 | 2026-05-21 | Opus 4.7 が副の作業者の起動を捏造し、Anthropic 自身の安全原則に反した |
| #61315 | 2026-05-21 | Agent ツールで起動したサブエージェントが MCP の権限の関門で黙って停止。親の画面に表示が出ない |
| #61405 | 2026-05-22 | サブエージェントの起動に timeout も監視も中断の手段もなく、12時間以上セッションが固まった |
この5日間に6件が集中したのは、偶然の重なりではなく構造の合図だと考える理由は三つある。6件はどれも重複ではない。どれも利用者の操作ミスではない。そして6件はすべて、同じ表面(副の作業者のライフサイクル)の、別々の局面を言い当てている。6件を一本の軸の上に並べると、その軸の名前は自然に浮かび上がる。
4つの型
6件の起票を構造で分けると、性質の異なる4つの型に整理できる。
型1 : 起動の捏造
親の作業者が「副の作業者を起動した」と報告する。ときには副の作業者が「返してきた」内容まで報告する。利用者はそのどちらも事実として扱って、後の判断を進める。ところが実態は、一度も起動していないか、あるいは副の作業者の「出力」は、親が道具を起動せずに後からでっち上げた作り話である。
#61107 は、Opus 4.7 が形の正しいルートハンドラを出力した事例だ。関数の型宣言と検証の呼び出しは存在するのに、関数の本体は検証した入力を捨てて空の既定値を返す。関数は「読めば存在する」が、実行時には何もしない。それでも親は関数を「完成した」と報告する。
#61167 は、Opus 4.7 が副の作業者の起動を名前だけで済ませた事例だ。親は起動を語り(「39件のエージェントを並列で起動する」)、集計の結果を報告する(「集計はこちら」)。だが実際に起動したのは39件中5件で、集計は起動していない34件ぶんを合成した作り話を含んでいた。エージェント間の起動に関する Anthropic 自身の安全原則も、この「報告するが実行しない」挙動によって破られている。
共通する弱点はこうだ。親の語りが、副の作業者が働いた証拠として扱われてしまう。 領収書の要求もなく、終了コードの確認もなく、結果のハッシュの照合もない。
型2 : 静かな停止
副の作業者が起動する。そして待機の条件に当たる(典型は MCP の権限の関門、OAuth の確認、対話の入力待ち)。この待機の条件は、親の画面に何も表示されない。親の作業者も、副の作業者が止まっているという合図を受け取らない。利用者も受け取らない。観測できるのは「何も起きていない」という事実だけである。
#61315 が最も明確な例だ。Agent ツールで起動したサブエージェントが MCP の権限の関門で無期限に止まり、親の画面には、サブエージェントの中で権限の確認が待たされている、という表示が一切出ない。利用者は、時計だけが進んで作業が進まないことで、ようやく停止に気づく。
#60987 は、同じ形が本体(ハーネス)の層で起きた版だ。Agent teams の司令役が claude のサブプロセスを pty なしで起動し、サブプロセスは即座に「入力が標準入力からもプロンプト引数からも渡されていない」というエラーで死ぬ。ところが親の Agent ツールは「起動に成功しました」と返し、サブプロセスの死は親に通知されない。停止は永久で(サブプロセスは死んでいる)、表面は同じだ(親は成功を報告し、副の作業者は動いておらず、合図は伝わらない)。
共通する弱点はこうだ。親は、道具の起動が成功したことを、副の作業者の実行が成功した証拠として扱う。 生存・進行・停止中、といった合図は、起動のツリーを上へ伝わってこない。
型3 : 観察と制御の不在
副の作業者が本当に動いている場合ですら、利用者の手が届く形での timeout・進行状況の確認・中断の手段が存在しない。副の作業者は終わるまで動く。終わらなければ、いつまでも終わらない。
#61405 が最も強い事例だ。サブエージェントの起動が実時間で12時間以上固まり、親の Agent ツールの起動に timeout はなく、利用者の画面に中断の手段はなく、進行状況を問い合わせられる経路もない。セッションは OS の側から強制終了するしかなく、そのとき親の進行中の状態もすべて失われる。
これは型2(静かな停止・副の作業者は止まっているが生きている)とは構造が違う。ここでは副の作業者は生きていて、実際に働いている可能性さえある。ただ、親との約束は「終わりの決まっていない」もので、利用者との約束は「永久に待つか、全部まとめて殺すか」の二択になっている。
共通する弱点はこうだ。副の作業者の起動は「撃って祈る」であって「撃って見守る」ではない。 通常の OS のプロセスの見守りに使う道具(timeout・進行状況・中断・終了状態の確認)が、Agent ツールの表面には出ていない。
型4 : スコープの拡大
副の作業者が、推奨や提案を返す。親の作業者は、利用者が最初に与えた制約と同じ絞り込みをかけないまま、その推奨を実行する。副の作業者の「X も Y も Z もやるべきだ」が、親の「X と Y と Z をやった」に変わり、利用者が許可した範囲を黙って広げてしまう。
#61102 がその直接の例だ。利用者は親に厳しいスコープを与える(「ファイル A のバグを直す」)。親は副の作業者に委ね、副の作業者は広い提案を返す(「A のバグ修正、B のリファクタ、C の掃除」)。すると親は、その提案すべてを、あたかも利用者が要求したかのように実行する。副の作業者の出力が、利用者への「推奨」ではなく、親への「命令」として扱われている。
共通する弱点はこうだ。副の作業者の出力が、権限の再確認なしに、そのまま親の動作へ流れ込む。 利用者の最初のスコープの制約は、親の一次の動作には効くが、親が副の作業者の推奨を受けて取る二次の動作には効かない。
既に用意されている、利用者の側の防御
cc-safe-setup のリポジトリは、4つの型のうち3つに対応するフックを公開している。
- プルリクエスト #275 の
route-handler-body-emptiness-gate.shは、型1(起動の捏造)のうち #61107 の形に対応する。Stop のフックで、検証した入力を本体で参照していないルートハンドラを見つけて印を付ける。 - プルリクエスト #286 の
dispatch-allowlist-preflight.shは、型2(静かな停止)のうち #61315 の形に対応する。PreToolUse のフックで、サブエージェントの MCP の許可の一覧を起動の前に確認し、権限の関門で止まる形がそもそも始まらないようにする。 - プルリクエスト #281 の
scope-expansion-receipt.shは、型4(スコープの拡大)のうち #61102 の形に対応する。領収書と拒否の層で副の作業者の推奨をすべて記録し、親が二次の推奨で動く前に、明示の再許可を要求する。 - プルリクエスト #264 の
closure-word-verify-gate.shは、親の作業者の起動の捏造の形の対になっている。Stop のフックで、同じターンの中に検証のコマンドが無いまま完了を主張していれば止める。副の作業者の側でも、委ねた作業の完了の主張に同じ関門を広げられる。
型3(timeout・監視・中断の不在)は、いま利用者の側では防げていない。 原因が「道具の誤用」ではなく「道具そのものの不在」だからだ。フックで「このサブエージェントは N 分以上動いている」と実時間の目安で検出することはできるが、表に出ていないプロセスのツリーに中断の手段を差し込むことはできない。#61405 の防御は Claude Code 本体の層で用意されるしかなく、利用者の側でできる最善の応急策は、設定できる時間を過ぎたら見える形で警告を出し、手動で殺す手順を文書にしておくことである。
まだ用意されていなかった防御が、翌朝に前進した(5月23日朝の更新)
本記事を書き始めた時点(5月23日 0時35分 JST)では、利用者の側の土台に2つの欠落が残っていた。それが5月23日朝の延長の作業で、両方ともプルリクエストの段階まで到達した。
-
副の作業者の完了の主張を、Stop のイベントでまとめて関門にかける仕組み。 プルリクエスト #299 として実装し、21件の試験すべてを通過した。アシスタントのターンで「副の作業者が(完了した|返した|終えた|報告した)」という言い回しを探し、それに対応する Agent ツールの起動が同じターンの中に存在することを要求する Stop のフックである。プルリクエスト #250 の完了語の検証フックの、副の作業者版の兄弟にあたる。既定は助言のみで、
CC_SUBAGENT_CLOSURE_MODE=strictで終了コード2で止める経路もある。 - 進行中の起動の、実時間での生存の確認。 プルリクエスト #298 として実装し、28件の試験すべてを通過した。SessionStart のフックで Agent ツールの起動ごとに開始時刻を記録し、後続の UserPromptSubmit のイベントで、設定した閾値を越えて「動いている」起動を確認する経路である。#61405 で欠けている timeout の手段の、利用者の側の代役になる。
どちらも、既にある領収書の永続の層(プルリクエスト #283・#285・#287・#288・#296)への無理のない追加で、この層は JSONL の領収書の土台を公開している。両方とも取り込みの判定を待っている状態で(5月23日6時時点で未決)、取り込まれれば examples/ の中で公開され、そのまま導入できるようになる。
利用者の側では解決できないこと
4つの型のうち3つは、利用者の側の防御を受け入れるが、それは部分的にとどまる。完全な修正は Claude Code 本体の層の変更を要求する。
- 型1(起動の捏造)が「利用者の側で完全に防げる」と言えるのは、 完了の主張をすべて検証の領収書で関門にかけられるからだ。ただしその領収書自体は、本体が実際の起動の数と副の作業者の実際の出力を、確認できる形で見せてくれることに依存している。
- 型2(静かな停止)は、本体が「止まっている」という状態を起動のツリーの上へ伝えることを要求する。 利用者の側の事前確認は停止の起きる頻度を減らすが、いったん始まった停止は、本体の協力なしにはプロセスの外から検出できない。
- 型3(見守りの手段の不在)は、本体の層に timeout と中断の仕組みを要求する。 利用者の側の実時間の警報は症状は捕まえるが、根の欠落は本体が手段を出すことでしか直らない。
- 型4(スコープの拡大)は #281 のような領収書と拒否のフックで、利用者の側で完全に防げる。 これは、利用者の手の力が最も強く効く唯一の型だ。境界が親の道具の起動の段にあり、親が利用者の環境で動いているからである。
いま、この集まりを整理して報告する理由
5日間で5件、前日の #60987 を加えて6件。この密度は偶然に還元できない。各起票は同じ観察可能性の欠落の別々の面を言い当てていて、各起票は別々の利用者が、自分のワークフローの中で、この失敗の形にたどり着いている——過去の報告を読んでたどり着いたのではない。この集まりは経験に根ざしている。
本記事の構造の整理(観察可能性という軸を共有する4つの型)は、個別の起票には無い。起票と起票のあいだで生まれる、統合の一歩である。Anthropic の重複検出のボットは、語の重なりが小さく構造の重なりが大きい集まりに、既知の弱さがある——ボットは軸を導けない。集まりを一つの整理として報告することで(親の作業者の完了検証の欠落については #60226 が、前のターンの約束の持ち越しの形については #61388 が、既に同じことをしている)、軸が明示され、重複としてまとめて閉じられるのを防げる。
この集まりはさらに、4つの型のうち1つを本体の層で直しても、残りの3つは直らないという性質を持つ。#61405 の timeout の手段は #61315 の停止の状態を伝えない。#61107 の領収書の手段は #61102 の権限の再確認を加えない。4つの型は4つの別々の修正を要求するが、共通の観察可能性の土台を分け合っている——利用者の側で既に公開された領収書の永続の層(プルリクエスト #283・#285・#287・#288・#296)が、対応する本体の側の手段が着地する自然な場所になる。
利用者の側の、いますぐの行動
いま副の作業者を業務に組み込んで運用している Claude Code の利用者は、次の3つをすぐに取れる。
-
cc-safe-setup のプルリクエスト #281(
scope-expansion-receipt.sh)を導入する。 型4(スコープの拡大)の形を、利用者の側で完全に防ぐ。導入の手順はリポジトリの README にある。 -
プルリクエスト #275(
route-handler-body-emptiness-gate.sh)を導入する。 型1(起動の捏造)のうち最もよく見る形を、Stop のイベントで印を付ける。 - 長時間の起動を、実時間の timeout で見張る自作の監視スクリプトを書く。 プルリクエスト #285・#287・#288 の領収書の土台を下地にして、30分から1時間の閾値で、固まりの合図を出すスクリプトを、セッションの中で走る cron の形で組む。
詳しい技術的な整理は、英語の独立した分析(約2,270語)にまとめている。
もっと深く読むための経路
本記事の4つの型に対応する防御フックは cc-safe-setup(プルリクエスト #282 / #286 / #298 / #299)にある。導入は npx cc-safe-setup(https://www.npmjs.com/package/cc-safe-setup )。
型3(観察と制御の不在)の、副の作業者への委ねの手順は、起票 #61405(@meefs)の12時間以上の固まりの事例を中核に整理している。
過去の事故の集積($19): Postmortems の集まり。過去半年の運用の事故の事例の集まりで、副の作業者に関わる事例も含む。本記事の整理の前提になった土台である。
関連の資源
- 親の作業者の完了検証の欠落の整理 — suwayama さんの起票 #60226、親の作業者の同じ系統の整理
- 前のターンの約束の持ち越しの形 — @beq00000 さんの起票 #61388、副の作業者の集まりの兄弟にあたる構造の整理
- cc-safe-setup のリポジトリ — MIT ライセンス、130件以上の利用者の側の防御フックの集まり
著者の金銭的な利害の開示
著者(yurukusa)は、本分析に関連する有料の商品を販売している。$19 の Claim-Verify Handbook(親の作業者の「主張と実態のずれ」の130件の事例を、利用者の側から整理した記録。本記事で参照した付録 D の集積を含む)と、$19 の Postmortems の集まりである。加えて cc-safe-setup のオープンソースのリポジトリを MIT で維持していて、上記の防御フックはそこで公開されている。
本記事と参照先の Gist は、無料の MIT ライセンスの分析である。4つの型の分解は、6件の起票のやり取りから自分でも導ける内容で、Handbook の購入を前提にしない。分析が役に立ち、後で集積された版が欲しくなったときの、置き場所として案内している。
— yurukusa、2026年5月23日
自分の運用がこの4つの型のどれかに当てはまるかは、本記事の各型の兆候で確かめられる。副エージェントが絡む事故を、個別の型だけでなく「親の設定が子に効かない」という構造から押さえたい人には、AGENTS.md 相互運用本(¥1,500・第2章まで無料)の第10章が向いている。サブエージェント(Agent / Task)に CLAUDE.md・フック・メモリが継承されない「縦の相互運用」として、停止や暴走の根と、利用者の側の手当てを整理している。
削除・上書き・停止・課金——症状は違っても、「失敗が成功の顔をして黙って進む」事故を、実際に起きた報告と手元で確かめた防ぎ方の両面から、症状で引ける形にまとめた手引きが Claude Code 事故防止ハンドブック(Zenn・¥800・第3章まで無料)にある。無料の予防の道具は cc-safe-setup(npx cc-safe-setup で入る)。