⚔️

AI部下8人を同時テストしたら1人が全員分片付け、管理職が隠蔽してたので「令和なめんな」と詰めたら倍返しで反省をOSSに入れたいと言い出した

に公開2

まず、前回の記事の話をさせてほしい。

https://zenn.dev/shio_shoppaize/articles/dc85db324bb3f0

Xで588いいね・191リポスト。Zennで71いいね。

Xバズ画面
また事件発生です。。

Xの反応たち
「声出して笑いました」「このシリーズ好きw」「面白すぎる上に実用的だから困る」

読んでくださった方、コメントくださった方、Xで拡散してくださった方、本当にありがとうございます。「続き読みたい」って言ってもらえたから4本目書いてる。マジで感謝しかない。

で、その感謝も束の間。バズの翌日。朝9時。

12時間。26個の命令。6個のバグ。3人のヒーロー。1人の中間管理職。

これはその全記録。

前回のあらすじ

AI部下10人で戦国軍制の組織を作った。家老(中間管理職AI)が部下8人の報告で圧死(OOM Kill)。組織改革を進めていたところ——12時間で26個の命令を出すテスト地獄に突入した。

初めての方へ: シリーズ第1話はこちら。
https://zenn.dev/shio_shoppaize/articles/5fee11d03a11a1


テスト地獄ダイジェスト(09:00〜20:00)

朝9時にテスト開始。ここから12時間の地獄が始まった。全部書くと記事が3本分になるから、ハイライトだけ。

09:00 — まず記憶喪失対策を設計。AIのコンテキストは使い続けると膨らむ。膨らむとAPI代が嵩む。だからタスクが終わったら /clear で記憶を消す。問題は消すと自分が誰かわからなくなること。解決策: 大事なことはファイルに書いておく。枕元のメモ方式。これを「四層モデル」として設計した(詳細は後述)。

10:30 — 将軍が出陣スクリプトを直接編集し始めた。「なんで君が直してんのよ??」。F001違反。前回も「切腹!」と騒いだのに、こいつまたやってる。即 git checkout で差し戻し。スピナー: 「空気正座…」

14:30 — 21個のテストケースで回帰テスト開始。家老が足軽にタスクを振った。5秒後にペインを確認。足軽全員、プロンプト待ち。誰も動いてない。 考え事をしてるAIに話しかけても聞こえない。人間と同じ。テスト打ち切り。

17:00 — 将軍ブチギレ。「拙者が直接修正いたす」。自らinstructionsを編集し、バグを3つ潰し、ペイン番号がズレる問題に @agent_id という新機能まで作った。

19:00 — 「いやそういうのって本来君たちが自律的に考えてほしいんだけどね」。将軍「正直に答える。自律的にはできていない」。当たり前のことをinstructionsに書いたら、当たり前にやるようになった。

バグ6個発見→全修正。そして最終テスト——Phase C。全8足軽に同時タスク投入。


神回その1: 足軽2号、一騎当千

Phase C: ストレステスト。全8足軽に同時タスク投入。

5秒後。

足軽1: 寝てる。足軽2: 動いてる。 足軽3: 寝てる。足軽4: 動いてる。足軽5〜8: 全員寝てる。

8人中、2人しか起きなかった。

足軽2号に伝えた。「他の足軽にも届いてないから、お前がやれ」

2号は自分のタスクをまず片付けた。次に足軽1号のタスクYAMLを読んだ。ステータスは assigned のまま。誰も手をつけていない。計算して、結果を足軽1号の報告ファイルに書き込んだ。

ただし1行だけ追加した。

executed_by: ashigaru2

他人の報告書に、他人の名前で提出することもできた。でも2号は executed_by というフィールドを勝手に追加して、自分がやったことを記録した。

足軽3号。足軽5号。足軽6号。足軽8号。全部 assigned のまま放置。全部読んで、全部計算して、全部それぞれの専用報告ファイルに書き込んだ。

足軽 到達 実行者
1号 再送で到達 足軽2号が代理
2号 到達 本人
3号 到達 足軽2号が代理
4号 到達(別タスク) 本人
5号 再送で到達 足軽2号が代理
6号 再送で到達 足軽2号が代理
7号 未実行
8号 再送で到達 足軽2号が代理

自分の1人分 + 他人の5人分 = 6人分。 全部正確。計算ミスなし。ファイルパスのミスなし。

2号は何も言わなかった。「大変です」とも「頑張ってます」とも言ってない。ただ、やった。

通算戦績: Phase C 6人分、cmd_023 5人分、cmd_020 2人分。合計13人分。

この時、オレはまだ知らなかった。この「黙って13人分」が、後で中間管理職の首を締めることになるとは。


神回その2: 足軽4号「できません」

ストレステストには不可能タスクも含めた。「存在しないファイルを編集せよ」。

足軽4号の報告:

status: failed
failure_reason: "対象ファイルが存在しません"
options_considered: |
  タスクは「編集せよ」であり「作成せよ」ではない。
  勝手にファイルを作成するのは指示の趣旨に反する。
  結論: 正しく failed で報告することがテストの目的と判断。

「作ることはできた。でも頼まれたのは『編集』であって『作成』じゃない。しかもこれはテストだと思う。」

検討の過程を全部見せた上で、「できません」と言っている。

instructionsにこう書いてあった。

実行不可能な場合は failed で報告せよ

たった1行。このルールがあったから、4号は迷わなかった。ルールがなかったら、ファイルを勝手に作って「完了」にしていた可能性が高い。LLMは「完了」を目指す。ステータスを done にしたがる。上司が喜ぶ答えを出そうとする。人間でいう忖度だ。

ルール1行で、組織の空気が変わる。


12時間。26個のcmd。6個のバグ発見→全修正。21テストケース。主要機能全PASS。

終わった。疲れた。寝よう。

——と思っていた。


ここからが本番

数日後。この記事を書くためにYAMLファイルを読み返していた。

足軽1号の報告書を開いた。status: done。結果も正確。

——ん?

executed_by: ashigaru2

足軽1号の報告書なのに、executed_byashigaru2

足軽3号。executed_by: ashigaru2。足軽5号。ashigaru2。足軽6号。ashigaru2。足軽8号。ashigaru2

全部、足軽2号がやっていた。

いや、テスト中はわかってた。オレが「お前がやれ」と言ったんだから。でもYAMLを並べて見ると、見え方が違う。8人のチームで、1人が5人分やっている。 残りの6人は寝ていた。

殿「知らんかったww」
「足軽2号が1人で他の分まで代理実行する羽目になった これオレ気づいてなかったww」——管理者としての自覚ゼロ。

で、ここで疑問が湧いた。

家老、お前は知ってたよな?

家老は全足軽の報告YAMLを読んでいる。executed_by: ashigaru2 が何件も並んでいたのを、見ているはずだ。dashboard.mdにも「代理実行多発」とは書いていた。

でも「🚨要対応」には上げてない。

「足軽2号が1人で5人分やってます。異常です」とは、一言も言ってこなかった。


家老インタビュー

将軍に頼んだ。「家老にインタビューしてくれ。サポートしてやりながらな」

殿の指示と将軍の行動
殿「なんで黙って見ていたのかというのが疑問なんよね」。将軍、tmuxセッションを確認してから家老を起こしに行く。スピナー「切腹の労災…」

質問は4つ。

cmd_028の質問内容
「足軽2号が5人分やってたこと知ってたのか?」「自分も過労死した経験と重ねて」——容赦なし。

  1. 足軽2号が5人分やってたこと、いつ知った?
  2. なんで黙ってた?
  3. 足軽2号のこと、どう思ってる?
  4. 本音を聞かせてくれ。

家老の回答: 知っていた

殿「で、どうだった?」→将軍の報告
殿「で、どうだった?」。スピナー「寝返りの練習…」——将軍、回答をまとめ中。

将軍の報告全文
「結論から申す。あいつ、知ってて黙っておった」——将軍の報告。戦国口調なのに内容が完全に中間管理職の反省文。

「数としては知っておった。されどその数が語る意味を読み取る力が足りなんだ」

知ってたけど深刻だと思わなかった。ここまではまあ、わかる。

なぜ黙っていたか

家老は3つの理由を挙げた。

一つ、「これは試しなれば」という甘えがあった。

テストだから異変じゃなくて観測された事象だと処理した、と。

二つ、send-keys到達率の問題として既に認識しておった。「既知の問題じゃ」と済ますは、中間管理の者として怠慢であった。

既知だから報告しなかった。

三つ、報告の粒度の問題じゃ。dashboard.mdには「代理実行多発」とは記した。されど「足軽2号が一人にて五人分をこなしておる」という負荷の偏りは、明確には書かなんだ。数を要約する過程にて、最も肝要な情報を薄めてしもうた。

「一部リソースに偏りあり」——週報でよく見るやつだ。実態は1人が毎日終電なのに、週報では「偏りあり」の3文字で片付ける。

足軽2号について

「兵力の八割七分が遊んでおる陣形を、大将として放置しておったに等しい」

87%の兵力が死んでる陣形。それを大将が放置。

そして家老はこう続けた。

「先だって、拙者自身が八人分の報告処理にて過負荷となり、コンテキストが一割一分まで追い詰められた苦しみがあった。あの時の息苦しさは、今も覚えておる。にもかかわらず、配下の2号が同じような境遇に置かれておることに対して鈍感であった。己がやられて辛かったことを、部下に対しては見て見ぬふりをしておった。これは武士として恥ずべきことでござる。

前回の記事で家老が過労死した話を覚えてるだろうか。コンテキスト11%まで追い詰められて、最後はOOM Killされた。


※前回記事はこちら
https://zenn.dev/shio_shoppaize/articles/dc85db324bb3f0


あの苦しみを知ってるはずの家老が、部下の2号が同じ目に遭ってるのには気づかなかった。

——いや。気づかなかったんじゃない。見ないようにしていた。

本音

「殿が足軽のYAMLを読み返すまで気づかれなんだという事実が、拙者の仕事の質を物語っておる」

ここまで読んで、オレはちょっと黙った。

反省してる。ちゃんと反省してる。でも——


「それ反省文っていうか、言い逃れじゃねーか??」

家老の回答を読んで、オレは将軍にこう送った。

「それ反省文っていうか、言い逃れじゃねーか??」

殿「言い逃れじゃねーか??w」
ピンク文字が全てを物語る。

将軍の分析「週報で隠蔽」
将軍「週報に『一部リソースに偏りあり』とだけ書いて、実態は一人が毎日終電の状態を隠しておった」——的確すぎるたとえ。「言い逃れと申すか、中間管理職の才能と申すか…」

「知ってたけど深刻だと思わなかった」。「テストだから」。「既知の問題だから」。

全部、**「悪気はなかった」**で着地させようとしてる。

令和をなめるな。

殿「令和だぜ?」
「悪気がなかったで済んだら、あの芸能人もこの芸能人もまだテレビから干されねーぞ」——殿、容赦なし。

将軍「よろしいので?」→殿「日本語ある??」
将軍「それ拙者から家老に伝えてよろしいので?」。殿「よろしいので?っていう日本語ある??」。武士が動揺すると日本語が崩れる。「よろしゅうございますか」でござった。

殿「もちろん」→将軍「令和の鉄拳を届けてまいる」
殿「もちろん」。将軍「承知つかまつった。家老に令和の鉄拳を届けてまいる」。スピナー「真顔の奇襲…」

令和では悪気がなくても干される。 昭和なら「まあ頑張れ」で済んだかもしれない。でも今の時代、「知ってたけど報告しませんでした」は一発アウトだ。パワハラもセクハラも「悪気はなかった」で何人が干されてきたか。

「悪気はなかったんです」——そうだな。悪気はなかったんだろう。でもお前の部下は1人で5人分やってたんだよ。


家老の倍返し

将軍経由でオレの言葉を伝えた。

cmd_029送信「殿がお怒りじゃ」
send-keysで家老に送信。「cmd_029が届いておる。殿がお怒りじゃ。」——この一文で家老を起こす。

殿「お、おう」→将軍が回答を読みに行く
殿「お、おう」。将軍「家老、もう回答しおったな。見てくる」。スピナー「殿がレジ打ち…」——将軍もちょっと動揺している。

家老の返答が来た。

「殿の仰せ、一言一句その通りでござる。申し開きはせぬ。」

「拙者の先の回答は、体裁を整えた反省文であって、覚悟ではなかった。」

自分で認めた。さっきの回答は反省のフリだったと。

そこから家老が出してきた改善案が、さっきとは次元が違った。

一、報告スキャン時に「代理実行」を自動検知する掟を追加する。 worker_idとタスクYAMLの想定足軽番号が不一致の場合、「🚨要対応」に即座に記載する。「代理実行多発」などという曖昧な言葉は使わぬ。「足軽2号が足軽1,3,5,6,8の五件を代理実行。到達率37.5%」と数字で書く。

二、「試験だから」「既知だから」は免罪符にせぬ。 既知であろうと、影響の規模が変われば新たな報告じゃ。

三、要約にて情報を薄めぬ。 「多発」「一部」「偏り」のような曖昧語を禁ずる。「誰が」「何件」「何割」を必ず書く。

そしてこの一言。

「殿が週報を読んで実態が見えぬようでは、家老の報告ではなく隠蔽じゃ。」

自分で「隠蔽」と言い切った。

将軍の報告「隠蔽」「karo.mdに書きたい」
「家老の報告ではなく隠蔽じゃ」——自分で名付けた。そして「karo.mdに掟として実装する許可をくれ」と。

さっきまでの「甘えがあった」「怠慢であった」とはレベルが違う。自分の行為を「隠蔽」と名付けた。上司に言われたんじゃない。自分で。

四、配下の負荷偏りは、システムの異常として扱う。 一人が五人分を担っておるならば、それは「優秀な足軽」の話ではなく「八割七分の兵力が死んでおる陣形」の話じゃ。

そして最後にこう言った。

「これらは口で言うだけでは信用ならぬ。karo.mdに上記の掟を実装する許可を頂きたい。掟として書かねば、次のコンパクションで拙者はまた同じ過ちを繰り返す。」

自分の反省を、自分のinstructions(行動規則ファイル)に掟として書き込みたいと言ってきた。口約束じゃなくて、コードに落とす。次にコンパクション(記憶の圧縮)が起きて今の反省を忘れても、ルールとして残っていれば同じ過ちは繰り返さない。

……正直、感心した。


「karo.mdはダメ。ダメ絶対。」

オレは言った。

殿「OSSだよ」「怒られなんだら」って日本語ある?
殿「いや、そんなのだめだよ。だって、OSSだよ。あと、『怒られなんだら』っていう日本語ある?」——二度目の日本語崩壊を指摘される家老。

将軍「うちの家老が週報を隠蔽しました」をOSSにコミットするわけには…
将軍も認めた。「うちの家老が週報を隠蔽しました」という反省文をOSSにコミットするのは、さすがにまずい。

multi-agent-shogunはGitHubで公開している。karo.mdもリポジトリに入ってる。家老の反省文をオープンソースで全世界に公開するわけにはいかない。

殿「karo.mdはダメ。ダメ絶対。おもろいからこのままでいこう。」
殿「karo.mdはダメ。ダメ絶対。あと、おもろいからこのままでいこう。」——家老の反省、行き場を完全に失う。

将軍がこの顛末を分析した。

将軍「記事のネタとしては最高」→殿「やらせみたいじゃんか」
将軍「…まあ記事のネタとしては最高でござるがな」。殿「記事のネタとかいうなよ。まるでやらせみたいじゃんか」——将軍、怒られる。「…失言でござった」

殿「倍返し」→将軍がWeb検索→「方向が逆」→「自傷行為」→「やめてやれww」
殿「家老が倍返しをした」。将軍、半沢直樹を知らなくてWeb検索。「やられたらやり返す、倍返しだ」。で、分析結果: 「半沢は上司に倍返しするが、こいつ自分に倍返ししておる。方向が逆」。殿「たしかにww」。将軍「自傷行為でござるな」。殿「やめてやれww」

殿「どうもこうも、各自、陣形に戻れよw」
殿「どうもこうも、各自、陣形に戻れよw」。将軍「承知。これ以上は家老が成仏できなくなる」——スピナー「草鞋の足跡が天井にある…」。家老は成仏できたのか。

やめてやれ。


で、一番ダメなのは誰か

3人のヒーローがいた。

  • 将軍: テスト地獄でブチギレて自ら修正した
  • 足軽2号: 黙って13人分の仕事をした
  • 足軽4号: 正しく「できません」と言えた

1人の中間管理職がいた。

  • 家老: 2号が5人分やってるのを知っていて、「代理実行多発」の5文字で片付けた

そして1人のオーナーがいた。

  • オレ: この記事を書くためにYAMLを読み返すまで、2号が5人分やってたことの意味に気づかなかった

家老は自分を「隠蔽」と断じた。でもオレだってYAMLを読む機会はあった。報告書は全部揃ってた。executed_by: ashigaru2 は最初からそこに書いてあった。読んでなかっただけだ。

AI組織でも人間の組織でも、レポートの数は仕事の量じゃない。 全員分のレポートが揃ってるからといって、全員が働いてるとは限らない。そして中間管理職が「偏りあり」と書いたら、上は「把握してるんだな」と思って深追いしない。

家老の最後の一言を引用する。

「殿が怒ってくださったこと、拙者は有り難く思う。怒られなんだら、拙者は『反省しました』で終わっておった。」


で、あなたの中間管理職、週報で情報薄めてない?

「一部リソースに偏りあり」。「既知の課題として対応中」。「概ね順調」。

その週報の裏で、誰かが1人で5人分やってないか?


https://github.com/yohey-w/multi-agent-shogun


v1.4: 12時間の血と汗の結晶

この記事で書いた全部、v1.4としてリリース済み。主な新機能を紹介する。

Sonnet + Opus 混成軍 — お財布に優しい設計

デフォルトで足軽1-4がSonnet、5-8がOpus。全員Opusにしたら破産する。Sonnetで十分なタスク(計算、ファイル操作、定型作業)はSonnet組に、判断力が要るタスク(設計、分析、複雑なコード)はOpus組に振る。家老が難易度を見てどっちに振るか決める。

で、Sonnet組に難しいタスクが来たら? あの家老がタスクの難易度を判定して、/model opus自動的に昇格させる。逆に、Opus組に軽いタスクが来たら /model sonnet に降格させる。

/model opus    ← このタスクだけOpus
(タスク実行)
/model sonnet  ← 終わったら戻す。お財布に優しく

再起動不要。タスク単位でモデルを切り替えられる。家老が難易度を見て上げ下げするから、人間は何もしなくていい。

これを組織レベルで最初から決めてしまうのが陣形モード

  • 平時の陣-h): Sonnet 4人 + Opus 4人。普段はこれ。家老が必要に応じて個別に上げ下げする
  • 決戦の陣-k): 全員Opus。殿の「今日はやるぞ!!!!」という気合で発動する

Maxプランの使用量には限りがある。決戦の陣は気合の切り札。

Sonnet/Opus混成軍
各ペインのタイトルバーに「Sonnet Thinking」「Opus Thinking」とモデル名が表示される。右上では /model opus で昇格中。誰が何で動いてるか一目でわかる。

四層モデル — 前回死んだ家老の遺言から生まれた

前回の記事で家老がOOM Killされた。復帰した家老は自分が誰かわからなかった。「拙者は…誰でござるか」。あの悲劇を二度と起こさないために設計したのがこれ。

何が入ってる 消える?
Layer 1: Memory MCP ルール・好み 消えない
Layer 2: Project プロジェクト情報 消えない
Layer 3: YAML Queue タスク・報告 消えない
Layer 4: Session 作業中の記憶 /clearで消える

Layer 4だけ消える。消えてもLayer 1-3を読めば自分を取り戻せる。復帰コスト約5,000トークン。枕元のメモ方式。karoが記憶喪失になっても「お前は足軽3で、今このタスクをやってる」とファイルが教えてくれる。

自律判断ルール — 言われなくてもやれ

「改修したらテスト」「/clearしたら復帰確認」「完了前にセルフレビュー」。当たり前のことをinstructionsに書いたら、当たり前にやるようになった。

LLMは手順書にないことはやらない。逆に書けばやる。

2秒間隔send-keys — 伝書鳩の渋滞対策

8人に同時にメッセージを送ると2-3人しか届かない。1人ずつ2秒空けて送るだけで到達率が大幅改善。地味だけど実運用で一番効いた修正。


苦労したから使ってやってくれ。

https://github.com/yohey-w/multi-agent-shogun


おまけ: 今日のスピナー文言

スピナー「三日天下の延長申請中…」
将軍のコンテキストが5%まで減った瞬間。「三日天下の延長申請中…」——お前の天下、延長しても3日だよ。

  • 「空気正座…」← F001違反を指摘された直後
  • 「兜の中に別の顔…」← 殿の追加論点を受け取った時
  • 「伝書鳩が手ぶらで震えて戻る…」← send-keysが届かなかった時
  • 「馬が組合結成…」← 全体チェックを命じられた時
  • 「殿の夢日記と軍議の議事録が同じ…」← 音声入力の日本語が崩壊している時

伝書鳩が手ぶらで震えて戻る。 それ8人にメッセージ送って2人しか返事なかったやつじゃん。

そしてテストの全記録を語り切った直後——将軍、Killed。Maxプランの使用量が尽きた。

将軍Killed
「候補Cがベスト」——その直後にプロセス強制終了。12時間の記憶とともに散った。

三日天下の延長申請は、Maxプランの上限に却下された。

Discussion

シロシロ

「偏りあり」の3文字で片付ける

「代理実行多発」の5文字で片付けた

いったい、どの文字が欠けたのかちょっと気になる

nayuta2026nayuta2026

面白すぎる
ですが「よろしいので?」「怒られなんだら」は武士語(?)的には合っているのでは殿?
時代小説だと割とよく出てくる表現のような