Claude Code、Cursor、ChatGPT。チームで複数のAIエージェントを使い始めると、ある時点から同じ問題にぶつかります。
同じはずの指示ファイルが、端末ごとに違う。
この記事は、その現象がなぜ「起きてしまう」のかを構造として整理し、よくある対処法がどこで限界を迎えるかまでを書きます。製品の宣伝ではなく、設計の話です。
何が起きているか
エージェントが動く前に読むファイルがあります。呼び方はツールごとに違いますが、中身はだいたい三種類です。
| 種類 | 例 | 中身 |
|---|---|---|
| スキル |
SKILL.md、カスタムコマンド |
特定の作業の手順 |
| 指針 |
CLAUDE.md、.cursorrules、AGENTS.md
|
常に守らせたい規則 |
| メモリ | プロジェクト固有の文脈ファイル | 前提知識・決定事項 |
問題は置き場所です。これらは基本的に各自のローカルに置かれます。
写しは、あなたが作るのではない
各ツールは自分専用のパスから指示を読みます。
| ツール | パス |
|---|---|
| Claude Code |
CLAUDE.md、~/.claude/CLAUDE.md
|
| Cursor | .cursor/rules/*.mdc |
| GitHub Copilot | .github/copilot-instructions.md |
| Codex ほか | AGENTS.md |
写しを4つ持とうと決めたわけではありません。ツールを4つ使うと決めただけで、写しは後からついてきます。
ズレは不注意で起きるのではない
三つの機構がズレを生みます。どれも誰かが雑だからではありません。
使う場所で直す。 作業の途中でエージェントが変な動きをする。目の前で開いている指示ファイルを直す。そのファイルは4つのうちの1つで、修正は1つにしか入りません。
チェックアウトが単位ではない。 同じリポジトリを2つクローンしている。main用と長期ブランチ用。どちらにも指示ファイルがあり、片方を触った瞬間に分岐します。
ホームディレクトリの規則は見えない。 ~/.claude/CLAUDE.md はどのリポジトリにも属さない。CIにも乗らない。そしてレビューで議論したくなかった規則が置かれる場所が、だいたいここです。
生成では閉じない
自然な対策は、写しを持つのをやめることです。AGENTS.md を一つ書いて残りを生成する。
作りました。動きます。agent-fanout — 単一ファイルのPython、依存ゼロ、MIT。
python3 agent_fanout.py
create CLAUDE.md
create .cursor/rules/from-agents-md.mdc
create .github/copilot-instructions.md
生成物にはヘッダが入り、CI に --check を入れれば派生ファイルを手で書き換えたPRはビルドが赤くなります。
カバーできるのは このリポジトリの、CIが回る範囲 です。外れるものを並べると印象が変わります。
- ホームディレクトリのグローバル設定 — リポジトリなし、CIなし
- 編集と編集の間 — エージェントは変更を即座に読む。CIが気づくのはpushの時、pushがあれば
- CIのないリポジトリ — 試作、使い捨てのクローン、先週作ったやつ。指示が最も自由に書き換えられ、ゲートが一つもない
- 単位がリポジトリではなく端末 — ノートPCには複数のチェックアウトと複数コピーとホームディレクトリがある
だから「測る」
防止はポリシーです。検出は計測です。ポリシーは計測しない限り、見えない形で迂回されます。
agent-drift はパスを走査し、ファイル名ではなく内容の類似度で束ねます。
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
ファイル名一致では役に立ちません。無関係なプロジェクトの CLAUDE.md が違うのは当たり前で、それをズレとして報告する道具は使われなくなります。
一つのプロジェクトではなく作業ディレクトリ全体に当ててください。面白い結果はリポジトリ境界をまたぐところに出ます。
二つの役割
| 範囲 | 答える問い | |
|---|---|---|
| agent-fanout | 一つのリポジトリ | 派生ファイルは最新か |
| agent-drift | 端末全体・複数パス | どこで写しがズレたか |
生成は写しが存在する理由を消します。検出は想定しなかった理由で存在してしまった写しを拾います。
片方だけやると 「守れているつもり」 になります。私自身がそこに踏み込みました。
その先
正直な最終形は、どちらのスクリプトも要らなくなることです。資産がそもそも端末上のファイルとして散らばっておらず、レビューを通った一か所から全端末に届く形になっていればいい。
それが untactit で作っているものです。現在はプリローンチです。
スクリプト自体はそれに依存しません。必要な部分だけ使ってください。