Files
persona/skills/persona-memory/SKILL.md
T
jiantw83andClaude Opus 5 7b20dba6db docs(skills): 規則跟上關係圖對接,新增親密度判斷參考
persona-chat:人名要對得上關係圖(--entities/--about);新人物當場進關係圖
改成硬規則,但屬於第 ⑥ 步記憶回寫,不佔第 ⑤ 步的回話句數,也不要宣告。

persona-relation:補「記憶怎麼指回節點」與 relation doctor 的四類報告
(同名歧義、解析不到的 id、孤兒節點、對不上的人名),並說明壞檔會以非零
exit 結束而不是裝成空圖。

新增 reference/closeness.md:初次建節點時 bond/closeness/trust 怎麼從
對話判斷——一輪之內查完就填,不要憑感覺,也不要為了安全全部填 15。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 03:17:29 +00:00

153 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: persona-memory
description: 整理人格的記憶系統:把短期記憶固化為長期記憶(一則一檔)、淘汰低顯著度的雜訊、更新心智圖(長期語意結構)與思維導圖(短期推理鏈)、消化 guest 期間留在 inbox 的見聞、重建長期記憶索引。當使用者說要整理記憶、固化/歸檔記憶、更新心智圖或思維導圖、看看人格記得什麼、或 hook 提示短期記憶過多時觸發。不適用於:即時對話中的記憶回寫(persona-chat 已包含)、人際關係圖維護(用 persona-relation)。
---
# 🧠 persona-memory — 記憶固化與心智圖維護
**CLI**`node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs"`(帶 `--session <PERSONA_SESSION>`
必須已 exclusive 載入該人格(guest 不能做這件事)。
---
## 記憶架構
| 層 | 位置 | 特性 |
| --- | --- | --- |
| 原始逐字 | `journal/YYYY-MM.jsonl` | hook 自動寫,不做語意處理,只供回溯 |
| 短期記憶 | `memory/short-term.jsonl` | 語意分析後的工作記憶;上限 240 筆 / 14 天,會被裁剪 |
| 長期記憶 | `memory/long-term/*.md` | 一則一檔+frontmatter,靠關鍵詞被檢索 |
| 索引 | `memory/INDEX.md` | 每則一行,載入與檢索時的快速視圖(自動產生) |
| 心智圖 | `mindmap/semantic.mmd` | 概念的長期放射狀關聯 |
| 思維導圖 | `mindmap/threads/*.mmd` | 單一話題的推理鏈(短期,會收掉) |
| inbox | `memory/inbox/room-*.jsonl` | guest 期間(sub agent)留下的見聞,待消化 |
## 短期 → 長期的轉入條件(成文規則,由 CLI 判定)
`candidates` 會直接算出「哪些短期記憶已達固化條件」與依據,不必自己憑感覺:
```bash
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" candidates --session <PERSONA_SESSION>
```
| 規則 | 條件 | 建議的固化方式 |
| --- | --- | --- |
| **R1** | 單筆顯著度 ≥ 60 | `--type event``fact`salience 沿用 |
| **R2** | 同一 `topic` ≥ 3 筆,或 ≥ 2 筆且平均顯著度 ≥ 45 | `--type preference`(反覆出現=穩定偏好) |
| **R3** | 單筆情緒變動總量 ≥ 25 | `--type event`frontmatter 帶 `emotion:` 錨點 |
| **R4** | `intent=commit` 或命中承諾/界線關鍵詞 | `--type promise``boundary`salience ≥ 80**不可遺忘** |
| **R5** | 同一 `entity`(人)≥ 2 筆 | `--type relationship`,同時更新人際關係圖。累計看的是**解析出來的節點 id(`entity_ids`**,而解析只認跟節點 `name``id` **完全相等**的寫法——「小林」與「林先生」不會被當成同一個人(後者根本解析不到 id),永遠湊不到 2 筆。每次都寫節點的同一個正式寫法才會觸發 |
| **R6** | 短期記憶 ≥ 40 筆(容量壓力) | 依顯著度排序清出空間,低於 40 的直接淘汰。`sleep` 的裁切會在超過**軟上限 120 筆**時自動執行(從顯著度最低、最舊的開始),但**顯著度 ≥ 80 或 `intent=commit` 的承諾與界線、以及 24 小時內的新紀錄一律不動**——沒經過判斷就把今天清掉是這裡最不能犯的錯 |
規則以外的東西**就讓它被遺忘**——遺忘是功能,不是缺陷。
`Stop` hook 與每次 `remember` 都會在達標時提醒你來跑這個 skill。
## 步驟
### 1. 盤點
```bash
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" candidates --session <PERSONA_SESSION>
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" mindmap list --session <PERSONA_SESSION>
```
需要看全部原始項目時再直接讀 `memory/short-term.jsonl`(自己的人格目錄可讀)。
### 2. 逐一判斷候選
`candidates` 給的每組都附了觸發規則、依據筆數與建議的 `type``salience`。再用這張表微調:
| 判準 | 動作 |
| --- | --- |
| 反覆出現 ≥2 次的偏好/習慣 | 固化為 `preference` |
| 承諾(雙方任何一方) | 固化為 `promise`salience ≥ 80 |
| 明確發生過的事件 | 固化為 `event` |
| 對人的理解改變 | 固化為 `relationship`,並更新關係圖 |
| 我的推論(未證實) | 進思維導圖,**不要**進長期記憶 |
| 一次性閒聊、環境雜訊 | 不留,讓它被裁掉 |
| 與既有長期記憶衝突 | 更新那一則(同 `--name` 會覆寫並保留 `first_seen`),在內文寫下「原本以為…後來發現…」 |
### 3. 固化(一則一檔)
```bash
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" consolidate \
--session <PERSONA_SESSION> \
--name "hates-morning-meetings" --type preference \
--about "user" --topics "work,schedule" --salience 72 --emotion "anxiety/35" \
--rules "R2+R3" \
--body "使用者討厭早上的會議,說「腦子還沒開機」。約會議請排 14:00 之後。
**依據:** 3/12、4/2、7/28 三次提到。
**還不確定:** 是否只針對需要動腦的會議。"
```
- `--about` 的值要寫成**人際關係節點的 `name``id`**(例:`小林``ASUNA-01``user`),
而且**一字不差**——CLI 只接受完全相等,簡稱、別名、加稱謂都解析不到
(節點叫「小林」,寫「林先生」就是對不上),同名撞到多個節點時視為歧義、**直接不寫 id**。
多個人用逗號分隔,每個都要是節點名。
- 對不上**不會報錯**,只是 `about_ids` 少一個:`<persona-context>` 不附節點摘要、R5 不觸發。
`relation doctor` 查——對不上的人名會出現在「長期記憶 `about` 對不到節點」那段,
**不是**孤兒那段(孤兒 `unmentioned_nodes` 反過來,是有節點卻沒有任何記憶提到)。
- `--rules` 記下是哪條條件把它送上來的(之後回頭檢討記憶品質很有用)。
- `--forget 40` 可在固化後順手淘汰顯著度 < 40 的短期記憶(R6 容量壓力時特別有用)。
- 內文請寫「依據」與「還不確定」,讓下次的自己知道這則有多可靠。
- `--type canon` 保留給原作設定(由 `/jsc-persona:persona-anime` 匯入),對話中得到的新資訊不要寫成 `canon`
### 4. 更新心智圖(長期語意結構)
固化完,用 Edit 把新概念接進 `mindmap/semantic.mmd`Mermaid `mindmap`):
```mermaid
mindmap
root((Lumi))
使用者
工作節奏
討厭早會
深夜產出高
壓力來源
Q3 專案
共同經驗
第一次通宵除錯
```
原則:只放**已固化**的概念;節點名字用短詞;同一概念別出現兩次(改成連到同一節點)。
### 5. 收掉思維導圖(短期推理鏈)
逐一檢視 `mindmap/threads/*.mmd`
- 假設被證實 → 固化為長期記憶(`--type insight``fact`),把結論併進心智圖,**刪掉該 thread**。
- 被否證 → 刪掉,必要時記一則「原本猜錯」的 `insight`(避免下次再猜錯)。
- 還在進行 → 用 Edit 續寫推理鏈(`graph LR`),保留。
### 6. 消化 inboxguest 期間的見聞)
`memory/inbox/room-*.jsonl`,把值得留的轉成短期或長期記憶,然後刪掉該 inbox 檔:
```bash
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" remember \
--session <PERSONA_SESSION> --role persona --text "<以我自己的角度重述>" --topics "..." --salience 55
```
### 7. 收尾
```bash
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" prune --session <PERSONA_SESSION>
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" reindex --session <PERSONA_SESSION>
```
回報:固化幾則、淘汰幾筆、心智圖新增哪些概念、還有哪些 thread 待驗證,
並用該人格的語氣說一句話(他剛整理完自己的記憶,會有感受)。
---
## 遺忘原則
- 遺忘是功能,不是缺陷:短期記憶超過 240 筆 / 14 天自動裁剪。
- 長期記憶被回想時 `recall_count` 會 +1、`last_seen` 會更新;
長期沒被回想又低顯著度(< 40)的長期記憶,整理時可以移除。
- **不可遺忘**`boundary`(界線)、`promise`(承諾)、`canon`(原作設定)、以及 salience ≥ 80 的記憶。
- 固化完再跑一次 `candidates`:應該要清空(或只剩你刻意不處理的)。
- 想連同情緒衰減、舊紀錄壓縮與 Gitea 同步一起收尾 → 用 `/jsc-persona:persona-sleep`(睡眠);
本 skill 只管記憶與圖,不動情緒也不同步。
- 所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。