症状
Claudeで担当ごとに分けた複数のAIエージェントに、共通の言葉づかいルールを守らせたいと考えました。ルールを1つの共通ファイルにまとめ、各エージェントの設定ファイル(Claude Codeで言うCLAUDE.md)の冒頭に「先にこの共通ファイルを読むこと」という案内を1行入れる形ですね。
これで直るはずでしたが、直りませんでした。8月に指摘して直した言い回しが、9月に別の担当のエージェントからまた出てきます。案内は全部の設定ファイルに入っているのに、です。
前提の環境
- 用途別に分けた十数個のエージェント設定(それぞれ独立した
CLAUDE.md相当のファイル) - 共通ルールは1つのMarkdownファイルにまとめて、各設定ファイルから相対パスで参照する構成
- 実行環境はClaude Code(Cowork経由)。エージェントは毎回のセッションで設定ファイルを読み込んでから作業を始めます
修正した方法
1. 「案内」をやめて「本文への書き写し」にする
参照だけを置くのをやめ、同じ指摘が3回以上出た言葉だけを各エージェントの設定ファイル本文へ直接書き込むことにしました。全ての言葉を書き込むとファイルが際限なく長くなるので、繰り返し出たものだけを昇格させる基準にしています。
# 各エージェントのCLAUDE.mdに直接書く例
- 「正本」ではなく「大元のファイル」と書く
- 「点検」ではなく「見直し」と書く
- 「枠」ではなく「時間」と書く
共通ファイル自体は残し、新しく気づいた言い換えはまずそちらに足します。本文に転載するのは「3回以上」を基準にしています。
2. 送信直前にもう一段チェックをかける
書き終えた時点のチェックだけでは、まとめの一文や会話の返信では言い換え前の言葉が使われてしまうこともありました。そこで、出力を送る直前にもう一度、禁止語をgrepするスクリプトを挟むようにしました。
#!/usr/bin/env bash
# leak-check.sh
# 使い方: ./leak-check.sh wordlist.tsv target.md
set -euo pipefail
WORDLIST="$1"
TARGET="$2"
FOUND=0
while IFS=$'\t' read -r ng ok; do
[ -z "$ng" ] && continue
MATCHES=$(grep -n -- "$ng" "$TARGET" || true)
if [ -n "$MATCHES" ]; then
echo "NG:「$ng」 / 言い換え候補:「$ok」"
echo "$MATCHES"
FOUND=1
fi
done < "$WORDLIST"
[ "$FOUND" -eq 1 ] && { echo "→ 直してから送ってください"; exit 1; }
echo "→ 問題ありません"
wordlist.tsvはタブ区切りで「禁止語 → 言い換え候補」を並べるだけです。
正本 大元のファイル
点検 見直し
検証する 確かめる
穴 足りていないところ
実行例はこちら。
$ ./leak-check.sh wordlist.tsv output.md
NG:「正本」 / 言い換え候補:「大元のファイル」
output.md:3:これが正本です。
→ 直してから送ってください
3. 「内部用語を使ってよい場所」の例外を無くす
もう一つ、うまくいっていなかった原因は、「システムの仕組みを説明するファイルだから、内部用語を使ってよい」という例外を設けていたことでした。ところが、そういった設定ファイルも自分が日常的に読み返すファイルでもあります。仕組みの説明と自分向けの記録が同じファイルに同居していたため、例外にしていた場所から禁止語がそのまま流れ込んでいました(数えたら1語だけで50か所を超えていました)。この例外を無くし、日常的に開くファイルはすべてチェック対象に含めるようにしました。
なぜそうなるか
案内(参照)だけでは、エージェントが作業の途中でわざわざ別ファイルを開き直す一手間が発生しない限り効きません。そのタイミングはほとんどありません。だから、繰り返し出るものは参照ではなく本文そのものに置く必要があります。
また、ルールが効かないときは、ルールの中身より先に「どこを対象外にしているか」を疑ったほうが早いことが多いです。今回も、直したのはルールそのものではなく、例外の範囲でした。
結果(まだ途中)
仕組みを変えたのが今月に入ってからで、効果はまだ確認できていません。「同じ指摘が一定期間出なければうまくいっている」という基準を作ってはいるので、次に1回でも同じ指摘が出たらもう一度見直す予定です。