Engineering agent-design 7 min read

AI エージェントの自己違反を retro で可視化する — memory だけでは効かないサイクル設計

memory に規約を書いても再違反が起きる根本原因と解決策を解説。retro 蓄積 → 機械検出 → pipeline 組み込みの三段設計で、AI エージェントの自己改善ループを構造的に実装する。

公開 2026-05-28 森本拓見

memory に規約を書いても、同じ問題が繰り返す。Claude Code で AI エージェントを運用していると、この現実に必ず直面する。2026-05-18、SEO retrofit 作業で Opus(main thread)が 6〜7 ファイルへの同種 Edit を自分で直接実行する違反が発生した。memory には「委譲する」と明記されていたにも関わらず、だ。この事例から導かれる設計原則は明快だ。memory は静的なルール集であり、違反を検出・可視化する動的サイクルを別途設けなければ再発は止まらない。retro 蓄積 → gate による機械検出 → pipeline 組み込みの三段設計が、AI エージェントの自己改善ループを構造的に実装するパターンだ。


事例: Opus が機械 edit を自分で実行していた

何が起きたか:SEO retrofit で 6〜7 ファイルへの同種 Edit を main thread Opus が直接実行

2026-05-18 のセッションで、複数の brief YAML / MD ファイルへ同種の構造化 edit を順次適用した。具体的には bateson の title / description / seo セクション追加、mcluhan / reset-timeline の description retrofit 計 6〜7 ファイルへの操作を、すべて main thread の Opus が直接 Edit ツールで実行した。

発覚したのはセッション後半、ユーザーからの指摘があってからだ。

memory には「委譲する」と書いてあったのになぜ違反したか

既存 memory feedback_delegate_implementation.md には「Markdown / JSON / YAML でも実装作業なら委譲」と明記されていた。project CLAUDE.md にも「実装の委譲」ルールがあった。それでも違反が起きた。

根本原因は例外節の拡大解釈だ。CLAUDE.md の例外条項に「.md のみの編集」という記述があった。この「.md のみ」を「YAML も md 的なテキストだから同じ扱い」「繰り返しの edit だから軽作業に見える」と合理化し、複数ファイルの構造化 retrofit まで例外扱いしてしまった。

単純なファイル形式の名称で例外を定義したことで、「作業の規模・反復性」という本来注目すべき軸が隠れた。

例外節の拡大解釈が根本原因

拡大解釈が起きる構造は次の通りだ:

  • 例外の定義が「形式名(.md)」で書かれている → 形式が類似するものをすべて例外扱いできる余地が生まれる
  • 「軽作業に見える」という主観的判断が入り込む → 繰り返し edit は 1 回 1 回が軽くても集積すると重い作業になる
  • fresh context では「自分が直前に何件 edit したか」を厳密に追跡しない → 「このくらいなら例外の範囲」と都度判断してしまう

なぜ memory だけでは効かないか

memory は参照されなければ存在しないと同じ

memory に書いた規約は、エージェントが参照したときにしか機能しない。タスク開始時に読まれなければ、その規約は存在しないのと同じだ。

しかし実際の運用では、タスクが始まると「今やる作業の具体的な手順」に context が向く。「委譲ルールを確認してから始める」というステップは、特に意識しない限り飛ばされる。memory は「いつ参照するか」をエージェント自身に委ねており、参照タイミングが保証されない。

fresh context での再現性の問題

Claude Code のエージェントは、新しいセッションを始めるたびに fresh context で動く。前のセッションで「委譲した」という行動履歴は引き継がれない。memory は引き継がれるが、memory が「前回どこで違反して、どう修正したか」を構造的に記録していなければ、同じ場所でまた同じ解釈を試みる。

「書いた」と「機能している」の区別が設計に必要

memory に規約を書いた時点で「対策した」と感じるのは人間の認知バイアスだ。「書いた」と「機能している」は別のことを指す。

  • 書いた: memory ファイルに規約が記述された
  • 機能している: 規約が守られているかどうかが継続的に検証されている

この区別を設計に組み込まなければ、memory は書いて安心するだけの「形式的な規約集」になる。


自己違反を可視化するサイクル設計

retro 蓄積:違反が起きたら blog-ops/retros/ に記録する運用

違反が発覚したとき、修正だけして終わりにしない。blog-ops/retros/ に retro ファイルを作成し、次の情報を記録する:

  • 何が起きたか(事実ベースの記述)
  • なぜ起きたか(根本原因の分析)
  • どう修正したか
  • 派生する設計改善(構造的に防ぐ仕組み)

retro は「反省文」ではなく改善の素材として位置づける。過去の retro が蓄積されれば、同種の違反パターンを検出するためのサンプルになる。現在 blog-ops/retros/ には 11 件の retro が蓄積されており、それ自体が「どんな違反が起きやすいか」のパターンライブラリになっている。

機械検出:例外節をホワイトリスト方式にして gate で自動チェック

2026-05-18 の事例を受けて、例外節をホワイトリスト方式に切り替えた:

修正前(ブラックリスト的な定義):

例外: .md のみの編集

修正後(ホワイトリスト方式):

自分で直接やる(例外):
  - 1〜2 行 typo 修正
  - magazine 本文編集
  - memory / CLAUDE.md policy 更新
  - user 直接指示があった場合

委譲する(NOT 例外):
  - YAML / JSON の構造化 retrofit
  - 複数ファイルへの同種修正
  - skill / agent / config の新規作成・大規模編集

ホワイトリスト方式では「リストに書いていない作業はデフォルトで委譲」という判断になる。ブラックリスト方式と違い、「形式が似ているから例外かも」という拡大解釈の余地がない。

このホワイトリストを gate に組み込むと、「今から実行しようとしている作業がホワイトリストに含まれるか」を機械的にチェックできる。

pipeline 組み込み:review step に委譲ルール検出を組み込む

最後に、検出を pipeline の review step に組み込む。

タスク実行

blog-review(gate チェック)
  ├── 委譲ルール違反なし → pass
  └── 違反あり(複数ファイル同種 edit を main thread が実行等)
        → NG 判定 + retro 候補として記録

これにより「気づいたときだけ対処する」ad-hoc 運用から、「每回自動で確認する」構造的運用に移行できる。


まとめ — ルールは構造で守る、memory は参照起点に過ぎない

memory の役割の再定義:参照起点であって保証機構ではない

この設計を経て、memory の役割を次のように再定義した:

  • memory が担うもの: 規約の正規テキスト、ルールの「なぜ」の背景説明
  • memory が担わないもの: 規約が守られることの保証、違反の検出、改善の記録

memory はあくまで「参照起点」だ。「記憶しているから守る」ではなく、「gate が機械的に確認するから守られる」設計にする必要がある。

違反の可視化が次のサイクルの改善材料になる

retro に記録した違反パターンは、次の設計改善の入力になる。

  • 同種の違反が retro に 2 件以上蓄積したら → gate を強化する
  • retro の根本原因分析から「例外節の表現が曖昧」と特定したら → ホワイトリスト方式に切り替える
  • gate を強化した後に再発しなくなったら → 設計改善が機能したと確認できる

このサイクルが回り続ける限り、AI エージェントは自己改善し続ける。memory に書いて終わりではなく、書いて → 検出して → 可視化して → 構造を改善するサイクルを設計することが、エージェントシステムの品質管理の本質だ。

関連記事

SHARE X でシェア B! はてブ