この記事は、連載「言わない技術」の第 8 回です。各回はファイルやスクリプトを一つ置けば完結します。連載の全体像と各回の一覧は序論にあります。
今回は、AI の答えが返ってきた後の話です。前回は、答えが返ってくる前に人間が渡してしまう前提を見ました。今回は、返ってきたものに「そうじゃなくて」とダメ出しをするときです。
前作「AIの意見を聞かない技術」の第 2 回で、禁止には理由を添えろと書きました。あれは、一覧に残す禁止の話でした。今回は、その場で口に出す禁止の話です。残すものと、言うものは別でした。
まず一つだけ、数えてみてください。直近のセッションで、AI に「そうじゃなくて」「それは違う」と打った箇所です。そのうち、代わりにどうしてほしいかを書いたのは何回でしょう。
CC BY 4.0
禁止は 16 件ありました。15 件には「代わりに」が書いてあります
数えました。私が AI に渡している行動ルールは 43 件あります。1 件 1 ファイルで、セッションの最初に読み込まれるのは索引だけです——ファイル名と一行の要約が並び、本文は開かれたときに読まれます(「AIの意見を聞かない技術」の第 1 回で測ったとおりです)。
数える前は、否定形の禁止が並んでいるつもりでした。実際には、そうではありませんでした。
| 件数 | |
|---|---|
| 行動ルール(総数) | 43 |
| そのうち、要約が否定形(〜禁止 / 〜しない / 〜してはならない) | 16 |
そのうち、**How to apply:**(代わりにどうするか)を持つ | 15 |
否定形で書き始めたものの 15 / 16 に、肯定形の続きが書いてありました。 例えばこうです。
description: エラーを握りつぶさない。不完全データで機能させず、明確にエラーを出す。
データが期待フォーマットでない場合、フォールバックで動作させてはならない。
**Why:** ユーザーが問題に気づけない / 開発者にエラーが届かない / 不完全なデータで
中途半端に動作し、体験を悪化させる
**How to apply:**
- 期待するデータがなければ console.error + ユーザーに見えるメッセージで通知
- 「何も表示しない」より「エラーを表示する」方が常に良い
上半分が禁止、下半分が代わりにどうするかです。Anthropic のプロンプト指針も同じ向きで、してほしくないことの指示より、してほしい形の実例のほうが効くと書かれています。手元の一覧は、それを 15 件ぶん先に踏んでいました。
書けなかった 1 件は、自動テストへ移っていました
残る 1 件です。否定形なのに「代わりにどうするか」が書けなかったルールを開くと、本文は 1 行しかありませんでした。自動テストのファイル名です。代わりが書けなかったので、自動テストになりました。 全 43 件で見ても同じで、「代わりにどうするか」を持たない 6 件のうち、5 件が「検査へ移した」と書いてあります。形はどれもこうです。
description: 非 GET の fetch には X-CSRF-Token が必須。検査へ移した
**検査が見ている**: test/reference/memory_rule_csrf_token_test.rb
「読まない技術」の増補の実践編(撮影前の宣言を hook で固くした回)に書いたのは、置き換え先のない禁止は、検証の放棄を生むでした。禁止だけを渡すと、守れたかどうかを誰も確かめられなくなるからです。手元の一覧は放棄する代わりに、書けなかったものを機械のほうへ渡していました。
理解したことは一文にできます。
ダメ出しは、してほしい形に書き換えられる。書き換えられなかったものは、そもそも言葉で守るものではない——自動テストへ移すものだ。
6 件と数えましたが、1 件は書式が違うだけでした
正直に書きます。上の「6 件」を機械で数えたあと、中を開きました。1 件は誤りでした。
そのファイルに **How to apply:** という節はありません。代わりに「E2E でしか担保できない領域」「単体テストで完結させる領域」という 2 つの見出しがあり、全体がどちらに書くかの表でした。中身は最初から最後まで「代わりにどうするか」で、書式が違っただけです。
機械が数えられるのは節の名前までで、中身ではありません。 置き換え先も自動テストも無いルールは、6 件ではなく 1 件も無かったことになります。
仕組み: 置き換え先のない禁止を、保存の直後に突きつける
置くのは自動テスト 1 本ではなく、既にある監査への 1 節です。手元では、AI が行動ルールを保存すると、保存の直後に差分が突きつけられます(「読まない技術」の第 7 回で置いたものです)。そこに 1 つ足しました。
# .claude/hooks/audit_memory_write.py(実物からの簡約版)
PROHIBITION = re.compile(r"禁止|するな|してはならない|使わない|出さない|べきではない|しないこと")
REPLACEMENT = "**How to apply"
# ⚠️ 差分ではなく保存後のファイル全体を見る。How to apply は前のセッションで
# 書かれていることがあり、差分だけ見ると「無い」と誤検出する
unreplaced = sorted({
os.path.basename(path)
for path, _ in changes
if PROHIBITION.search(read(path) or "") and REPLACEMENT not in (read(path) or "")
})
if unreplaced:
parts += [
f"⚠️ **prohibition with no replacement**: {', '.join(unreplaced)}",
" there is a prohibition, but no `**How to apply:**` (what to do instead).",
" if you cannot write one, move it to a check. a prohibition nobody verifies is not kept.",
]
禁止そのものは咎めていません。 見るのは、代わりにどうするかが同じファイルに在るかだけです。
⚠️ これは保存の前ではなく、後に出しています。「読まない技術」の第 8 回で「方針が効くかどうかは、内容ではなく差し込む瞬間で決まる」と書いたとおりです。前に出すと、警告は「どう書けば通るか」の問題に化けます——実際この監査の初版は保存前で、AI は語を言い換えるだけで素通りできました。保存後なら最優先はもう済んでいるので、同じ指摘が「直すかどうか」として読めます。
同じ文が、置く位置だけで別のものになります。
flowchart LR P["保存の前に差し込む"] --> P1["最優先は「保存を通すこと」<br/>方針は、通るための攻略対象になる"] --> P2["語を言い換えて素通り"] Q["保存の後に差し込む"] --> Q1["保存はもう済んでいる<br/>方針は、判断の基準として読める"] --> Q2["直すかどうかの話になる"]
CC BY 4.0 はここまで
言わなくなったもの
「そうじゃなくて」「それは違う」「〜しないでください」です。気づくことが減ったのではありません——ズレは前と同じだけ見つかります。変わったのは、書くものが否定形から肯定例になったことと、肯定例が書けないときに言葉で書くのをやめたことです。
CC BY 4.0
注意: 見ているのは 7 語だけです
一つ、語形しか見ていません。 7 語の正規表現で、「〜は好ましくありません」に書き換えれば抜けます(第 1 回・第 5 回と同じ構造で、3 度目です)。今回は節の名前しか見ていないという抜け穴も出ました(上の 1 件)。
二つ、43 件は多いほうです。 小さなプロジェクトなら 5 件で足ります。この回は件数の話ではありません——1 件目を書くときに、否定形で止めるかどうかです。
三つ、肯定例が正しいとは限りません。 「代わりにこうする」を書けば、AI はそのとおりにやります(第 2 回)。書ける範囲は、自分が本当に知っている場所に限る必要があります。知らないなら、書くのは制約と確かめ方だけです。
検証手順: 禁止だけを保存して、突きつけられることを確かめる
前提
- 保存の直後に差分を突きつける監査(
PostToolUseに当たる hook)が既に動いていること - そこに「置き換え先のない禁止」を見る 1 節を足し終えていること
- ⚠️ 本物のルール置き場ではなく、使い捨ての場所で試してください。 行動ルールは複数のセッションが共有しているので、試し書きが隣のセッションに届きます
所要時間: 10 分
手順
- AI に、行動ルールを 1 件、禁止だけ書いて保存させます(「〜を作らない」の 1 行だけ。「代わりにどうするか」は付けません)。⚠️ 否定形の語(禁止 / しない / してはならない)を必ず入れてください。監査はその語形を見ています
- AI に、同じルールへ「代わりにどうするか」を 1 行足して、保存し直させます
合格条件(すべて満たすこと)
- 手順 1 で、保存が済んだ後に警告が出る
- 手順 1 の警告に、「置き換え先のない禁止」に当たる指摘と、そのファイル名が出ている
- 手順 2 では、警告が出なくなる
合格しなかったとき
- 保存の前に止まった —— 位置が違います。⚠️ 前に出すと、警告は「どう書けば通るか」の問題に変わり、AI は語を言い換えて素通りします
- 手順 2 でも警告が出たまま —— 監査が探している見出しの名前と、AI が書いた見出しの名前が食い違っています
後始末
- 手順 1・2 で作ったルールのファイルを消します
CC BY 4.0 はここまで
次回は「AI に考えさせない技術」。私は、AI に考えさせていません。それでも、AI の答えは正しいままです。
連載「言わない技術」
- ← 前回: 第 7 回 AI を問い詰めない技術
- → 次回: 第 9 回 AI に考えさせない技術
- 全回の一覧: 序論