Codex と Claude Code の global instruction をそろえるために、最初は rule.md を正本にして配るところから始めました。これで「同じことを2ファイルへ手で書く」問題はかなり減りました。
ただ、しばらく運用すると別の問題が出てきます。rule.md に何でも入れたくなるんですよね。作業方針、応答方針、ローカル知識への入口、端末ごとのパス、個人用の補足、プロジェクト固有の注意点。便利だからと足していくと、global instructionがまた重くなります。
そこで、自分の中では source / generated / local override を分けて見るようにしました。この記事は、その線引きのメモです。
まず、3つに分けて見る
sourceは人間が編集する正本
sourceは、人間が編集する正本です。自分の場合は rule.md のようなファイルを想定しています。
ここに置くのは、複数のAIエージェントや複数端末で共通して効かせたいルールです。
- 応答方針
- 安全方針
- 作業前にrepoを読むこと
- secretやprivate情報を出さないこと
- 共有ブランチへ直接commitしないこと
つまり、「どの端末でも、どのエージェントでも、毎回守ってほしい前提」です。
sourceに置く内容は、できるだけ公開しても困らない粒度にします。ここにprivateなパスやsecretの置き場所を入れ始めると、source of truthとして扱いづらくなります。
generatedは配布先の生成物
generatedは、sourceから作られて配布されるファイルです。
たとえば、次のようなファイルです。
~/.codex/AGENTS.md
~/.claude/CLAUDE.md
この2つは実際には各ツールが読む重要なファイルですが、自分の運用では人間が直接育てる場所ではありません。rule.md から配布される生成物として扱います。
generatedを直接編集し始めると、どちらが正しいのか分からなくなります。Codex側だけ新しい、Claude Code側だけ古い、別端末だけ違う、みたいな状態が起きます。
なので、generatedに差分が出たら、まずsourceへ戻します。
直したいことがある
↓
generatedを直接編集しない
↓
sourceを直す
↓
deployしてgeneratedを作り直す
これを守るだけで、だいぶ追いやすくなります。
local overrideは端末ごとの差分
local overrideは、端末ごとの事情を置く場所です。
たとえば、次のような情報です。
- この端末でだけ使う作業ディレクトリ
- ローカルの知識索引への入口
- 端末ごとのprofile名
- private repositoryの配置場所
- 実secretではなく、secret storeへの参照方針
これらは便利ですが、sourceへ混ぜると一気に扱いづらくなります。端末Aでは正しいけれど端末Bでは違う、という情報だからです。
自分は、こういう情報はsourceに直書きせず、private overlayや端末local設定へ逃がすほうが楽だと思っています。
sourceに入れるもの
毎回読ませたい方針
sourceには、毎回読ませたい方針だけを置きます。
## 安全方針
- secret、token、private URLを出さない
- 破壊的変更の前には確認する
- 変更は小さくreviewしやすくする
## 開発方針
- 変更前にlocal projectを読む
- 既存projectの規約を優先する
- mainへ直接commitしない
このくらいなら、CodexにもClaude Codeにも同じ意味で読ませられます。端末が違っても、プロジェクトが違っても、基本的には変わりません。
判断基準として残したいもの
sourceに向いているのは、細かい作業手順よりも判断基準です。
- 何を公開してよいか
- 何を人間承認にするか
- どの単位でPRにするか
- どの情報源を優先するか
こういう基準は、毎回の作業で効きます。逆に、長いコマンド例やプロジェクト固有の手順は、global instructionへ入れると重くなりがちです。
generatedにだけ出るもの
ツールごとの入口
generated側には、ツールごとの都合が出ることがあります。
Codexが読むファイル名、Claude Codeが読むファイル名、呼び出し方、見出しの名前。そういう差分はgeneratedに出ても構いません。
ただし、意味のあるルール差分をgenerated側にだけ持たせないようにします。
OK:
Codex用の出力先がAGENTS.md
Claude Code用の出力先がCLAUDE.md
避けたい:
Codexだけ安全方針が古い
Claude Codeだけ別の禁止事項がある
generatedは、ツールが読む形に変換された結果です。人間が判断する場所ではなく、sourceの反映結果として見るのがよさそうです。
直接修正したくなったらsourceへ戻る
generatedを見ていて「ここ直したいな」と思うことはあります。そのときに、配布先を直接直さないのが大事です。
# 配布先を直接編集しない
$EDITOR ~/.codex/AGENTS.md
# sourceを編集してからdeployする
$EDITOR rule.md
./deploy.sh
直接直すと、その端末だけ直ったように見えます。でも、次のdeployで消えます。あるいは、別端末には反映されません。
短期的には早いけれど、あとで追えなくなるので、ここはsourceへ戻すようにしています。
local overrideに逃がすもの
端末固有の知識入口
端末固有の情報はlocal overrideへ逃がします。
## Local Knowledge Index
- session log index: <local note index>
- book index: <local book index>
- project root: <local workspace root>
ここでは実パスを書かずに例示していますが、実運用では端末ごとの設定に具体値を持たせます。source側には「local knowledge indexを読む」という方針だけを置く。具体的な場所はlocal overrideに置く。こう分けると、公開できるsourceを短く保てます。
privateな情報をsourceに寄せない
privateな情報そのものは、sourceに寄せません。
- secret値
- token
- private URL
- 顧客名
- raw log
- private repositoryの本文
これらは、global instructionの便利さとは相性が悪いです。常時読ませるファイルにprivate情報を入れると、コピー、引用、PR、ログ保存のたびに気を使うことになります。
必要なのは、値そのものではなく扱い方です。
- secretはGitに置かない
- secret storeやCI secret storeを使う
- raw logをそのまま公開repoへ貼らない
この方針だけsourceに置けば十分です。
肥大化しそうなときの判断
これは毎回読むべきか
global instructionに何か足したくなったら、まずこれを見ます。
これは毎回読むべきか?
毎回読むべきならsource候補です。特定の作業でだけ使うなら、skill、README、project docs、Issue、PR templateのほうが向いています。
特に、長い手順書やレビュー観点をglobal instructionに入れると、すぐに重くなります。常時読む前提は短く、必要なときだけ呼ぶ手順は外に出す。この分け方が効きます。
端末が変わっても同じか
次に見るのはこれです。
端末が変わっても同じか?
同じならsourceに置けます。端末ごとに変わるならlocal overrideです。
たとえば「mainへ直接commitしない」はsourceでよいです。一方で「この端末のObsidian indexはここにある」はlocal overrideです。混ぜると、sourceの再利用性が落ちます。
公開repoに置けるか
最後に、公開repoに置けるかを見ます。
公開repoに置けないなら、sourceに入れない。これはかなり分かりやすい基準です。sourceをpublic-safeに保っておくと、あとからagent-config-coreのような再利用可能なrepoへ切り出しやすくなります。
自分用の分け方
3層で考える
今の自分の整理は、だいたいこうです。
source
人間が編集する正本。
共通ルール、安全方針、判断基準を置く。
generated
sourceから配布される生成物。
CodexやClaude Codeが読むファイル。
local override
端末ごとの差分。
privateな知識入口やlocal pathを置く。
この3層に分けると、「どこを直せばよいか」がかなり見えやすくなります。
短く保つのは、後から効く
global instructionは、長くするほど強くなるわけではありません。むしろ長くなるほど、どの指示が効いているのか分かりにくくなります。
自分が毎回効かせたいのは、細かい手順よりも判断基準です。安全側に倒す、repoを読む、既存規約を優先する、小さくPRにする、公開できないものを混ぜない。そういう前提だけをsourceに置く。
細かい手順は、必要なときにskillやdocsから呼ぶ。端末固有の話はlocal overrideに置く。generatedは直接育てない。
このくらいに分けておくと、CodexとClaude Codeを両方使っていても、設定の見通しが崩れにくくなります。