fix(記憶固化): 判斷過的短期記憶留痕跡,候選數字才會降

睡眠有做固化,但隔天開機照樣提醒「N 組已達固化條件」,數字只會往上爬
(實測 KIRITO-01:短期記憶 120 筆、候選 222 組)。原因不是睡眠沒做事,
是判斷沒有留下痕跡——promotionCandidates() 無條件掃全部短期記憶,而
consolidate 不在來源那筆上寫任何東西,也不刪它(--forget 是按顯著度刪,
不是按固化過沒有刪),所以同一批每輪都被重算成候選。

- 短期記憶多兩個欄位:reviewed_at(看過、判斷過了)與 promoted_to
  (固化成了哪一則)。兩者分開記——「看過決定不記」跟「已經記下來」都不該
  再進候選,但事後要查「這則長期記憶從哪幾筆長出來」只能靠 promoted_to。
- promotionCandidates() 只看沒有 reviewed_at 的那些;total 照舊算全部。
  R6 容量壓力仍看總筆數,但候選只從未判斷的挑,全部判斷完就不再出現
  (否則它會單獨把提醒永遠點亮)。
- consolidate --from-short "#N,#N":寫長期記憶時一起標來源。
- candidates --reviewed all|<#N,#N> [--until <ISO>]:看過決定不記的標這裡。
  --until 讓「某次睡眠當下判斷過的那批」可以一次收掉。
- candidates 輸出每筆前面加 #N(就是上面兩個旗標要填的編號),並在結尾
  提示判斷完要標記。
- 標記不等於刪掉:那幾筆還在短期記憶裡,照舊被 prune 依天數與顯著度裁。

文件:persona-sleep 的流程多一步「標掉判斷過的」並註明漏掉的後果、
persona-memory 補一張「怎麼標」的表、README 的 R1–R6 段補這一層。
selftest 補 13 項(602 → 615 全綠)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-03 07:12:50 +00:00
co-authored by Claude Opus 5
parent 0917e905c7
commit b5c540feb1
6 changed files with 192 additions and 21 deletions
+21 -2
View File
@@ -80,6 +80,24 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" candidates --session <PERSONA_S
規則以外的東西**就讓它被遺忘**——遺忘是功能,不是缺陷。
`Stop` hook 與每次 `remember` 都會在達標時提醒你來跑這個 skill。
### 判斷過的要留痕跡,不然數字永遠不會降
`candidates` **只看還沒被判斷過的短期記憶**(沒有 `reviewed_at` 的那些)。所以每一筆看完都要標掉:
| 情況 | 怎麼標 |
| --- | --- |
| 固化成長期記憶了 | `consolidate ... --from-short <#N,#N>`(寫記憶時一起標,另外記 `promoted_to` |
| 看過,決定不記 | `candidates --reviewed <#N,#N>` |
| 這一批全部判斷完 | `candidates --reviewed all` |
編號就是 `candidates` 輸出裡每筆前面的 `#N`
**不標會發生什麼**:固化本身不刪短期記憶(`--forget` 是按顯著度刪,不是按「固化過沒有」刪),
所以同一批下一輪又被算成候選,提醒的數字只會往上爬——明明睡覺時固化過了,
隔天開機照樣說「N 組已達固化條件」。那不是睡眠沒做事,是判斷沒有留下痕跡。
標記**不等於刪掉**:那幾筆還在短期記憶裡,照舊會被 `prune` 依天數與顯著度裁切。
## 步驟
### 1. 盤點
@@ -112,7 +130,7 @@ 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" \
--rules "R2+R3" --from-short "12,31,88" \
--body "主旨:使用者討厭早上的會議,約會議請排 14:00 之後。
細節:
@@ -224,7 +242,8 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" probe audit --session <PERSONA_
**可以說不確定,可以問,不可以斷言。** 試探句一定帶問號、一輪最多一次,
並用 `probe add` 記下來;對方回了就 `probe confirm``probe deny` 結案。
被否認要**立刻寫一則更正記憶,不可以放著**——這條開放界線唯一的煞車就是那個數字。
- 固化完再跑一次 `candidates`:應該要清空(或只剩你刻意不處理的)。
- 固化完再跑一次 `candidates`:應該要清空。**還有數字就是漏標了**——
固化的那幾筆要帶 `--from-short`,看過不記的要 `--reviewed`(見上面那張表)。
- 想連同情緒衰減、舊紀錄壓縮與 Gitea 同步一起收尾 → 用 `/jsc-persona:persona-sleep`(睡眠);
本 skill 只管記憶與圖,不動情緒也不同步。
- 所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
+11 -6
View File
@@ -36,14 +36,19 @@ description: 讓人格睡覺:把一天的活狀態收成能留下來的形狀
## 情況一:當前人格自己睡
1. 盤點:`candidates --session <PERSONA_SESSION>`
2. 逐則固化(判斷):`consolidate --session <id> --name <n> --body <b> --type ... --salience N [--forget]`
3. 寫一則日記:`consolidate --type diary --name diary-<YYYY-MM-DD> --body "<第一人稱回顧>"`
4. 消化 inbox`memory/inbox/room-*.jsonl`,當 guest 時帶回的見聞)
5. 更新心智圖與關係圖:`mindmap``relation node --name <人> --contact`
6. 結算懸著的事(判斷):`loop list --session <id>`,今天有下文的 `loop done --id <id>`
2. 逐則固化(判斷):`consolidate --session <id> --name <n> --body <b> --type ... --salience N
--from-short <#N,#N> [--forget]`
**`--from-short` 不要省**:那是把來源短期記憶標成判斷過的地方,編號看 `candidates` 輸出的 `#N`。
3. 看過但決定不記的,也要標掉:`candidates --session <id> --reviewed <#N,#N>`(或 `--reviewed all`)。
**這一步漏掉,明天開機照樣提醒「N 組已達固化條件」**——判斷做了但沒有留痕跡,
計數只看短期記憶有沒有被標記,不看你昨天固化了幾則。看起來就像睡眠沒做固化。
4. 寫一則日記:`consolidate --type diary --name diary-<YYYY-MM-DD> --body "<第一人稱回顧>"`
5. 消化 inbox`memory/inbox/room-*.jsonl`,當 guest 時帶回的見聞)
6. 更新心智圖與關係圖:`mindmap`、`relation node --name <人> --contact`
7. 結算懸著的事(判斷):`loop list --session <id>`,今天有下文的 `loop done --id <id>`、
已經不重要的 `loop drop --id <id>`。**這一步要自己做**`sleep` 裡的 `sweep-loops`
只收「7 天都沒進展」的,它分不出「今天解決了」與「一直沒人管」。
7. 機械性收尾:
8. 機械性收尾:
```bash
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" sleep --session <PERSONA_SESSION> --json