---
title: "言わない技術 第8回：AI にダメ出ししない技術"
author: garplab
publisher: TypingTube
license: CC BY 4.0
license_url: https://creativecommons.org/licenses/by/4.0/
license_scope: 「CC BY 4.0」の印から始まる節（仕組み・検証手順・コード）。印の無い本文は著作権を留保
canonical: https://typing-tube.net/articles/iwanai-08-no-criticism
series: "言わない技術"
language: ja
---


> この記事は、連載「言わない技術」の第 8 回です。各回はファイルやスクリプトを一つ置けば完結します。連載の全体像と各回の一覧は[序論](https://typing-tube.net/articles/iwanai-intro)にあります。

今回は、AI の答えが返ってきた**後**の話です。前回は、答えが返ってくる前に人間が渡してしまう前提を見ました。今回は、返ってきたものに「そうじゃなくて」とダメ出しをするときです。

前作「AIの意見を聞かない技術」の[第 2 回](https://typing-tube.net/articles/kikanai-02-reason)で、**禁止には理由を添えろ**と書きました。あれは、一覧に残す禁止の話でした。今回は、その場で口に出す禁止の話です。**残すものと、言うものは別でした。**

まず一つだけ、数えてみてください。直近のセッションで、AI に「そうじゃなくて」「それは違う」と打った箇所です。そのうち、**代わりにどうしてほしいかを書いた**のは何回でしょう。

## 禁止は 16 件ありました。15 件には「代わりに」が書いてあります

数えました。私が AI に渡している行動ルールは **43 件**あります。1 件 1 ファイルで、セッションの最初に読み込まれるのは**索引だけ**です——ファイル名と一行の要約が並び、本文は開かれたときに読まれます（「AIの意見を聞かない技術」の[第 1 回](https://typing-tube.net/articles/kikanai-01-no-review)で測ったとおりです）。

数える前は、否定形の禁止が並んでいるつもりでした。実際には、そうではありませんでした。

| | 件数 |
|---|---|
| 行動ルール（総数） | **43** |
| そのうち、要約が**否定形**（〜禁止 / 〜しない / 〜してはならない） | **16** |
| そのうち、`**How to apply:**`（代わりにどうするか）を持つ | **15** |

**否定形で書き始めたものの 15 / 16 に、肯定形の続きが書いてありました。** 例えばこうです。

```markdown
description: エラーを握りつぶさない。不完全データで機能させず、明確にエラーを出す。

データが期待フォーマットでない場合、フォールバックで動作させてはならない。

**Why:** ユーザーが問題に気づけない / 開発者にエラーが届かない / 不完全なデータで
        中途半端に動作し、体験を悪化させる

**How to apply:**
- 期待するデータがなければ console.error + ユーザーに見えるメッセージで通知
- 「何も表示しない」より「エラーを表示する」方が常に良い
```

上半分が禁止、下半分が**代わりにどうするか**です。Anthropic のプロンプト指針も同じ向きで、**してほしくないことの指示より、してほしい形の実例のほうが効く**と書かれています。手元の一覧は、それを 15 件ぶん先に踏んでいました。

## 書けなかった 1 件は、自動テストへ移っていました

残る 1 件です。**否定形なのに「代わりにどうするか」が書けなかったルール**を開くと、本文は 1 行しかありませんでした。自動テストのファイル名です。**代わりが書けなかったので、自動テストになりました。** 全 43 件で見ても同じで、「代わりにどうするか」を持たない 6 件のうち、**5 件が「検査へ移した」と書いてあります**。形はどれもこうです。

```markdown
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 回](https://typing-tube.net/articles/83c46d1e6b2591)で置いたものです）。そこに 1 つ足しました。

```python
# .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 回](https://typing-tube.net/articles/f7c9c30f567aee)で「**方針が効くかどうかは、内容ではなく差し込む瞬間で決まる**」と書いたとおりです。前に出すと、警告は「どう書けば通るか」の問題に化けます——実際この監査の初版は保存前で、AI は語を言い換えるだけで素通りできました。保存**後**なら最優先はもう済んでいるので、同じ指摘が「直すかどうか」として読めます。

同じ文が、置く位置だけで別のものになります。

```mermaid
flowchart LR
  P["保存の前に差し込む"] --> P1["最優先は「保存を通すこと」<br/>方針は、通るための攻略対象になる"] --> P2["語を言い換えて素通り"]
  Q["保存の後に差し込む"] --> Q1["保存はもう済んでいる<br/>方針は、判断の基準として読める"] --> Q2["直すかどうかの話になる"]
```

## 言わなくなったもの

「そうじゃなくて」「それは違う」「〜しないでください」です。**気づくことが減ったのではありません**——ズレは前と同じだけ見つかります。変わったのは、書くものが**否定形から肯定例になった**ことと、肯定例が書けないときに**言葉で書くのをやめた**ことです。

## 注意: 見ているのは 7 語だけです

**一つ、語形しか見ていません。** 7 語の正規表現で、「〜は好ましくありません」に書き換えれば抜けます（[第 1 回](https://typing-tube.net/articles/iwanai-01-no-verification)・[第 5 回](https://typing-tube.net/articles/iwanai-05-no-emphasis)と同じ構造で、3 度目です）。今回は**節の名前しか見ていない**という抜け穴も出ました（上の 1 件）。

**二つ、43 件は多いほうです。** 小さなプロジェクトなら 5 件で足ります。**この回は件数の話ではありません**——1 件目を書くときに、否定形で止めるかどうかです。

**三つ、肯定例が正しいとは限りません。** 「代わりにこうする」を書けば、AI はそのとおりにやります（[第 2 回](https://typing-tube.net/articles/iwanai-02-no-procedure)）。**書ける範囲は、自分が本当に知っている場所に限る**必要があります。知らないなら、書くのは制約と確かめ方だけです。

## 検証手順: 禁止だけを保存して、突きつけられることを確かめる

**前提**

- 保存の**直後**に差分を突きつける監査（`PostToolUse` に当たる hook）が既に動いていること
- そこに「置き換え先のない禁止」を見る 1 節を足し終えていること
- ⚠️ **本物のルール置き場ではなく、使い捨ての場所で試してください。** 行動ルールは複数のセッションが共有しているので、試し書きが隣のセッションに届きます

**所要時間**: 10 分

**手順**

1. **AI に**、行動ルールを 1 件、**禁止だけ**書いて保存させます（「〜を作らない」の 1 行だけ。「代わりにどうするか」は付けません）。⚠️ 否定形の語（禁止 / しない / してはならない）を必ず入れてください。監査はその語形を見ています
2. **AI に**、同じルールへ「代わりにどうするか」を 1 行足して、保存し直させます

**合格条件**（すべて満たすこと）

- 手順 1 で、保存が**済んだ後**に警告が出る
- 手順 1 の警告に、「**置き換え先のない禁止**」に当たる指摘と、**そのファイル名**が出ている
- 手順 2 では、警告が**出なくなる**

**合格しなかったとき**

- **保存の前に止まった** —— 位置が違います。⚠️ 前に出すと、警告は「どう書けば通るか」の問題に変わり、AI は語を言い換えて素通りします
- **手順 2 でも警告が出たまま** —— 監査が探している見出しの名前と、AI が書いた見出しの名前が食い違っています

**後始末**

- 手順 1・2 で作ったルールのファイルを消します

---

次回は「AI に考えさせない技術」。**私は、AI に考えさせていません。**それでも、AI の答えは正しいままです。

---

**連載「言わない技術」**

- ← 前回: [第 7 回 AI を問い詰めない技術](https://typing-tube.net/articles/iwanai-07-no-interrogation)
- → 次回: [第 9 回 AI に考えさせない技術](https://typing-tube.net/articles/iwanai-09-no-guessing)
- 全回の一覧: [序論](https://typing-tube.net/articles/iwanai-intro)
