ブログ

1つのファイルから生成しても、ズレは止まらなかった

2026年8月11日untactit

「エージェントの指示ファイルがどんどん食い違う」に対して真っ先に出てくる対処は、コピーの保守をやめることです。AGENTS.md を書き、そこから CLAUDE.md.cursor/rules/*.mdc.github/copilot-instructions.md を生成する。それで終わり、のはずでした。

実際に作りました。動きます。それでも問題は解けていません。この 2 つの差は書き出しておく価値があります。実機で回すまで、私にも見えていませんでした。

生成でカバーできる範囲

python3 agent_fanout.py

create    CLAUDE.md
create    .cursor/rules/from-agents-md.mdc
create    .github/copilot-instructions.md

正となるファイルが 1 つ、そこから派生ファイルが数個。派生側を誤って編集しないよう、先頭にヘッダを入れます。

<!-- Generated from AGENTS.md by agent-fanout. Do not edit this file. -->

CI に入れておけば、CLAUDE.md を直接編集したプルリクエストはビルドを落とします。

- run: python3 agent_fanout.py . --check

これでカバーされるのは CI が回るマシン上の、このリポジトリ です。全部のように聞こえますが、外れるものを並べると印象が変わります。

生成が届かない範囲

別のリポジトリ。 チームが持つリポジトリは 1 つではありません。それぞれに AGENTS.md があり、どこかの時点で互いにコピーされたものです。生成はリポジトリの内側の整合を保ちますが、リポジトリ同士は離れていきます。

グローバル設定。 Claude Code はプロジェクトのファイルに加えて ~/.claude/CLAUDE.md を読みます。Cursor にもユーザーレベルの指針があります。どのリポジトリにも属さず、CI にも乗りません。レビューで議論したくなかった指針が置かれるのは、まさにこの場所です。

編集と編集のあいだ。 生成は、誰かが実行したときに走ります。その瞬間から次の CI までのあいだに、派生ファイルは編集され、そのまま使われます。エージェントは変更を即座に読みます。CI が気づくのは push のとき、push があればの話です。

CI のないリポジトリ。 プロトタイプ、作業用のクローン、先週の火曜に誰かが作ったリポジトリ。指示が最も自由に書き換わる場所であり、ゲートが 1 つもない場所でもあります。

単位はリポジトリではなくマシン。 エージェントが動く単位はノート PC です。1 台の中に多数のチェックアウトがあり、同じリポジトリのコピーが何個もあり、ホームディレクトリがあります。リポジトリ単位で動く仕組みは、その全体を横断して見られません。

防ぐだけでなく、見に行く

防止はルール、検出は計測です。ルールは、計測するまで見えない形で迂回されます。

python3 agent_drift.py ~/work ~/side-projects

Scanned 47 instruction files.

DRIFT: 2 documents, 5 distinct versions between them.

  claude-code:CLAUDE.md
    6 copies, 3 versions
      9b01aeaa204d  3 files, 406 lines
      2dc3c616c279  2 files, 411 lines

こちらはリポジトリではなくパスを走査し、ファイル名ではなく内容の類似度でまとめます。無関係な 2 つのプロジェクトで CLAUDE.md の中身が違うのはズレではなく、それをズレとして報告した時点で出力は読まれなくなります。(このまとめ方を決めるのに 3 回書き直しました。その部分は同じ CLAUDE.md が、1台に18バージョンあった。)

1 プロジェクトではなく、作業ディレクトリ全体に対して走らせてください。見るべき結果は、リポジトリの境界をまたいだところに出ます。

2 つで 1 組

範囲答える問い
agent-fanoutリポジトリ 1 つ「派生ファイルは最新か」
agent-driftマシン全体、複数のパス「コピーはどこで分かれたのか」

生成は、コピーが存在する*理由*をなくします。検出は、想定していなかった理由で存在してしまったコピーを拾います。どちらも余分ではありません。前者だけをやると、カバーできているという誤った感触が残ります。ここが本当の失敗パターンで、私自身がはまったところです。

どちらも単一ファイルの Python、依存なし、肝心なところは読み取り専用、MIT ライセンスです。

  • agent-fanoutAGENTS.md を一度書き、残りを生成する
  • agent-drift:もう一致しなくなったコピーを見つける

この先

正直なところ、行き着く先はどちらのスクリプトも要らない状態です。資産がそもそもノート PC の上のファイルとして存在せず、レビュー済みの 1 か所からどのマシンにも届く。誰も何も貼り付けません。触らないから、ばらつかない。それを untactit で作っています。現在は公開前です。

スクリプトはそれ単体で成立していて、untactit には依存しません。使えるところだけ使って、あとは無視してください。

この記事は DEV にも載せています。

関連記事

エージェントが何で動いているのか。推測は、もう終わり。

ワークスペースをひとつ接続するだけで、チームで動いているスキル・ルール・メモリの全体が見えます。所要はおよそ10分です。

無料で始める 相談する

クレジットカードは不要です。いまお使いのツールのままで動きます。