# 判断の記録を md にまとめ、skill が読む

Issue: #1015（#991 段階 5 の入口、#997 の続き）

## 一度間違えた

#1008 で人間向けの画面を作りかけて閉じた。**消費者は人間ではなくエージェント**だった。過去ログを
繰り返し眺める用途は実在せず（分析は使い捨てスクリプトで済んだ）、必要なのは「エージェントが
判断しようとした瞬間に、前回どう決まったかが手元にある」こと。

## opt-in

`decisionDigest`（既定 `false`）。vision 由来の機能で全ユーザーに要るとは限らず、しかも**普段は
存在しないファイルを書く**ので、既定 off 以外にない。設定は毎ティック読むので、切り替えに再起動は
要らない。

## md に書くのは事実だけ

#991 の論点がここに刺さる。

> **自動適用ではなく提案から始める**（間違った学習が黙って効くのが一番まずい）

なので**推論した規則を書かない**。「この人はいつも推奨案を選ぶ」は書けてしまうし、間違っていても
それらしく読める。書くのは日付つきの出来事だけ:

- 何が繰り返し聞かれているか（header の実測。**同義語をまとめない** —— 分類を発明せず、実際に
  打たれた文字列のまま出す）
- **自由記述で返ってきたもの**を、提示していた選択肢ごと逐語で
- **未回答のもの**
- 直近の「選ばれた答え」

冒頭に「これは記録であって規則ではない」と明記する。読むのが言語モデルである以上、注意書きは
**ドキュメントの中**になければ意味がない。

## 置き場所

`~/.mulmoterminal/decisions/<encoded-project>.md`。プロジェクト内に書くと diff に出て、いずれ
コミットに混ざる。ファイル名は Claude が transcript ディレクトリに使うのと同じ符号化にして、
おかしいときに目で突き合わせられるようにした。

skill はパスを知らなくてよい: `GET /api/decisions/digest?cwd=` が md を返す。`enabled: false` を
**空の digest と区別して**返すのが要点で、skill が「機能が off」と「まだ何も決めていない」を
取り違えないようにする。

## 更新

起動時 + 6 時間ごと。対象はこのホストが実際に触っているディレクトリ（ワークスペース + 起動中の
セッションの cwd）。判断は人間の行為なので日に数件で、分単位の更新には意味がない。

## skill

`server/skills/mulmoterminal-decisions/`。既存の 2 つと同じ経路で `~/.claude/skills/` に配られる。
中身の要点は 3 つ:

1. `enabled: false` なら**そこで止まる**。transcript を自分で読みに行かない（ユーザーは opt-in
   していない）
2. 過去の答えは**提案の材料**であって指示ではない。従うなら「前回はこうだったので」と口に出す
3. 一番効くのは「選択肢から答えなかった」節 —— **同じ聞き方をしようとしているなら、その選択肢は
   前回外した**

## 範囲外

自動適用しない。会話文の判断（「マージ」等）は #997 と同じく対象外。判断キュー（#991 段階 4）は別で、
これは**聞く前**に材料を渡す話。
