# fix(#1010): probe が作った transcript を残さない

2.5.3 で `/api/sessions` からは消えたが、**`claude --resume` には残る**。並んでいるのは
`~/.claude/projects/<encoded-cwd>/<session-id>.jsonl` で、これは claude が書いたファイルであって
一覧を作っているのは claude 自身なので、隠すのではなく**消すしかない**。

さらに 2.5.3 で消えたのは「これから作る分」だけで、**修正前に作られた分は id がランダム**なため
形では見分けられない。報告者の 41 件はそのまま残っている。

## 2 つに分かれる

### 1. これから作る分 — id で分かる

probe は `--session-id` に `PROBE_SESSION_PREFIX` 付きの id を渡している。settle 後にその
transcript を消せばよい。**判定は要らない**（自分が付けた id と完全一致で引く）。

タイミングに 1 つ注意がある。probe は PTY を kill して終わるが、claude 側の最終書き込みが
まだ走っていることがあり、消した直後にファイルが再生成されうる。kill から少し置いて消す。

### 2. 既存分 — 中身で見るしかない

**素朴な部分一致は使えない。** 実測（このマシンの transcript 7711 件）:

| 判定 | ヒット | 誤検出 |
| --- | --- | --- |
| `reply with the single character` を含む | 88 | **6 件が本物の会話**（974 メッセージ / 17MB のものを含む） |
| user メッセージがちょうど 1 件で、本文が probe のプロンプトと完全一致 | 82 | **0** |

プロンプト文字列を会話で話題にしただけで部分一致は引っかかる。**この issue を調べている
会話そのもの**が誤検出に入っていた。

構造判定の 82 件は全件が `CLAUDE_CWD` のプロジェクトディレクトリにあり、サイズも 87〜91KB に
揃っていた。probe は常に `CLAUDE_CWD` で走るので、**走査をそこに限定**する。他を見ても
見つかるものは増えず、risk だけ増える。

### 内容では probe と人間を区別できない（Codex レビューで判明）

「人間が同じ 1 ターンを打ったら消える」という指摘を受けて調べたところ、**区別する手がかりは
無かった**。probe は本物の TUI に打ち込むので、claude の記録は人間が打った場合と同じになる:

```
PROBE: {"origin": {"kind": "human"}, "promptSource": "typed", "permissionMode": "auto", ...}
REAL : {"origin": {"kind": "human"}, "promptSource": "typed", "permissionMode": "auto", ...}
```

そこで内容ではなく**時間**で塞ぐ。掃除の対象は修正前に書かれたファイルだけなので、**このマシンで
一度きり**しか走らせない（`~/.mulmoterminal/probe-sweep.json` に記録し、何も見つからなくても
書く — 権利を再取得させないため）。以後は人間が同じ文言を打っても何も起きない。

内容側にも条件を足す。どちらも外す方向にしか倒れない（誤爆が増えず、ゴミが残るだけ）:

- tool を一度でも使っていれば probe ではない（実測 84/84 の probe が tool 未使用）
- 1MB 超は読まずに飛ばす（probe は実測 87〜91KB）

一度きり化は実コストも消す。`CLAUDE_CWD` のディレクトリは実測 454 ファイル / 542MB で、
毎起動で掃除する版はそれを全部読んでいた（`yarn dev` では保存のたび）。

失敗は握りつぶす（掃除ができなくても本体は動くべき）。

## 触らないもの

`~/.claude/history.jsonl` は追記共有ファイルで、書き換えは同時書き込みと競合する。
`claude --resume` のセッション選択はこれを読んでいないので、残っても実害がない。

## テスト

- id 一致で消える / 別 id は消えない
- 構造判定: user が 1 件で本文一致なら true
- **user が複数あれば false**（プロンプトを含む本物の会話が消えないこと。#1010 の実測で
  一番効く回帰テスト）
- 本文が違えば false、user が 0 件なら false
- 壊れた JSONL 行があっても落ちない
- 走査対象が `CLAUDE_CWD` のディレクトリに限られること
- **1 ターンでも tool を使っていれば false**（Codex が挙げた境界）
- **掃除の後に打たれたものには触れない**（一度きりであること。人間が同じ文言を打つ危険が
  永続しないことの回帰）
- 巨大なファイルは読まずに残す
- probe の形をしていない id を `removeProbeTranscript` に渡しても消えない
