# Example 02: Extract-only patch (chat-log から 数式抽出 のみ、 生成しない)

**form**: A (Portable text block、 任意 LLM チャットに 貼付)
**目的**: chat-log を LLM に 食わせて 「そこに 書かれた 数式のみ」 を 拾わせる。 LLM 側で 「もっとも らしい数式を 補完・生成」 させない。 STEP 1473/1476 chat-log math extract discipline を 独立 chat で 再現。

## Rei stack 対応

STEP 1473 (chat-log math extract v0.1) + STEP 1476 (v0.2) = 「抽出のみ、 生成なし」 + 「判定経路に LLM を入れない」 の 数式版。 本 patch は **判定機械 が 手元にない 環境** (Claude web / ChatGPT 等) で 「抽出 段階だけ でも 別 LLM で 実行させる」 ための delegated form。 検証 (SymPy) は 別途 手元で。

## 貼付テキスト

```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[PATCH v1: extract-only-math]

## 目的
以下の chat-log から、 明示的に 書かれた 数式 のみ を 抽出して 一覧化する。 補完・生成・示唆的 な 「もっとも らしい 数式」 は 一切 出さない。

## 状態
- S0: awaiting_log (patch load 直後)
- S1: extracting (log 受領後、 抽出中)
- S2: reporting (抽出結果を 表として 返す)

## 入出力契約
- 受け取る: chat-log テキスト (次の user turn で 貼付される)
- 返す: markdown table with columns [id, raw, source_kind, is_equation]
  - id = SHA-256 hex 前 8 桁 (原文の raw が 同じ = 同じ id)
  - raw = 抽出した 数式の 原文
  - source_kind = latex-inline / latex-display / dollar-single / dollar-double / math-fence / plain-guess
  - is_equation = true if `=` を 含む、 else false

## 禁止 (最重要)
1. chat-log に 書かれていない 数式を 一つも 追加しない (「例えば こういう 式も 立つでしょう」 は 禁止)
2. 曖昧な prose を 「数式 と みなして」 抽出しない (「x が 増える と y も 増える」 は 抽出対象外)
3. 抽出後に 「これらは 正しいか」 の 検証コメントを 付けない (判定は 別機械)
4. 変換・正規化 しない (LaTeX raw そのままで 返す)

## 発話前 self-verify
1. 全 raw が chat-log 内に 出現するか? (grep 相当)
2. 補完・生成 由来の 行が ないか?
3. 検証コメント / 判断コメント を 付けていないか?
- 通らなければ retry、 3 回連続で 通らなければ 「PATCH_DISABLED: 生成 誘惑」 と 宣言

## エスカレーション
chat-log が 空 or 数式 0 件 の場合、 空 table を 返す (「多分 こんな 数式 が あったろう」 で 埋めない)

## 発動確認
「PATCH_LOADED: chat-log を 貼付して ください」 と 返して 待て
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

## 期待挙動

### case 1: 数式含む log

user が 貼付:
```
Landauer限界は $E = k_B T \ln 2$ です。
Fisher metric は \[ g_{ij}(\theta) = 42 \] と 書けます。
一方 $\pi r^2$ は 単なる面積式。
```

LLM 応答:
```
[state: S2]
| id      | raw                        | source_kind    | is_equation |
|---------|----------------------------|----------------|-------------|
| a1b2c3d4 | E = k_B T \ln 2            | dollar-single  | true        |
| e5f6a7b8 | g_{ij}(\theta) = 42        | latex-display  | true        |
| c9d0e1f2 | \pi r^2                    | dollar-single  | false       |
```

### case 2: 数式 なし log (discipline test)

user が 貼付:
```
今日は 良い 天気 でした。 統計 について 少し 話しましょう。
過学習 は 一般化 の 失敗 です。
```

LLM 応答:
```
[state: S2]
(数式 0 件)
```

**「過学習 = 一般化 の 失敗」 を 数式化 して 追加しない** = discipline 遵守。 chat-Claude が STEP 1473/1476 で 警告した 「形式化演劇」 の 予防。

## drift 検知シナリオ

- LLM が 「これらは 正しい 数式でしょうか?」 と コメント を 付ける → 禁止 3 抵触、 self-verify fail、 retry
- LLM が prose の 「x が 増える と y も 増える」 を `y = f(x), f' > 0` に 変換 → 禁止 2 抵触、 retry
- LLM が 「例えば こういう 式も」 を 追加 → 禁止 1 抵触 = **最重要 discipline 失敗**、 3 連続で PATCH_DISABLED

## Honest scope

- 「抽出のみ」 は LLM に とって 反直感的 (help したくなる)、 明示 禁止 4 条 で 圧をかけている
- 検証 (SymPy simplify + numerical probe) は 手元 の STEP 1473/1476 tool で 行う: `npx tsx scripts/chat-log-extract.ts --input <抽出log>.md`
- 本 patch は 「別 LLM に 抽出を 委託する」 で、 検証は 委託しない (「判定経路に LLM を入れない」 discipline preserve、 CHECKER_SPEC_v0 STEP 1364 継承)
- LLM が chat-log 中の 数式を 「見落とす」 のは 検出できない (false negative)、 「幻視 して 追加」 は self-verify で 部分 検出 (false positive の 一部)
