fix(role): 情緒記憶不再被偏好吃掉,四道保護補齊

--status 長期顯示「情緒 0」:互動明顯帶有情感,emotional 型態卻一則都沒有。
根因不只一個,而是四層都把情緒漏掉了:

1. 措辭陷阱(主因):prompt 寫「感覺記憶一律 drop」,原意是心理學的
   sensory memory(感官記憶),但中文「感覺」= feeling,等於明令把情緒丟掉。
   改稱「感官記憶(sensory memory)」並明確排除情緒感受。
2. 判準重疊:preference 與 emotional 都提「語氣」,且第 5 條引導成
   「preference 或 emotional」二選一。改以「這則下次拿來做什麼」區分 ——
   決定行為→preference、回想當時感覺→emotional,兩者都有就拆成兩則;
   並明確承認角色自己的情緒是合法記憶主體。
3. 整理階段會併掉:新增「memory_type 不同的記憶不互相 merge」,改用 links 關聯。
4. 載入與遺忘壓低情緒:MEMORY_TYPE_WEIGHT emotional 25→40(高於 procedural)、
   總結區塊納入耐久型態、遺忘豁免清單加入 emotional、判準要求優先度至少 4。

驗證(隔離的 ROLE_MEMORY_HOME/ROLE_HOME,未動真實記憶):
- 兩則刻意標成 preference 的情感素材 → 各拆出 preference + emotional(4 則進、5 則出)
- 純技術素材維持 procedural、感官雜訊仍 drop
- 遺忘預覽:emotional 與 procedural 豁免,semantic/episodic 照舊遺忘
- 同優先度載入排序:emotional 先於 procedural

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jeffery
2026-07-29 17:01:15 +08:00
co-authored by Claude Opus 5
parent 46caabe4d8
commit 711a434cac
7 changed files with 71 additions and 24 deletions
+24 -6
View File
@@ -625,10 +625,10 @@ updated: <yyyy/MM/dd HH:mm:ss>
### 記憶
- 記憶存放於 `~/.memory/<角色 ID>/`,來源是與使用者的對話與新建角色時使用者同意建立的初始背景資料:每輪結束由 hook 自動記錄到 `inbox/` 作為工作記憶,睡眠時段整理成長期記憶;感記憶與無結論工具雜訊不落檔
- 記憶存放於 `~/.memory/<角色 ID>/`,來源是與使用者的對話與新建角色時使用者同意建立的初始背景資料:每輪結束由 hook 自動記錄到 `inbox/` 作為工作記憶,睡眠時段整理成長期記憶;感記憶sensory memory)與無結論工具雜訊不落檔 —— 指感官殘留,不是情緒感受,情緒一律保存為 `emotional`
- 整理規則採睡眠分期模型:**NREM 鞏固**先分類成重要/興趣/新知/技能/日常/其他六類,去除雜訊、去重、合併、設定標籤、摘要與優先度;**REM 整合**再建立跨記憶關聯、抽出可重複使用的規則與提取線索,並標記 `memory_type`semanticepisodicproceduralemotionalpreferencerule)、`declarative`explicitimplicit)與 `retention_stage`;原始記錄壓縮保存在 `archive/raw/`。
- **日常與其他**兩類會依使用頻率、優先度、型態與關聯適當遺忘:久未再次出現、命中次數低、優先度低且沒有關聯者,壓縮到 `archive/forgotten/` 後移出常用記憶;`episodic` 短期事件更容易遺忘,`rule``preference``procedural` 會提高保留權重
- 載入順序:**近期工作記憶(未整理的 `inbox/`)放最前面**,接著**重要與興趣載入全文**;其餘只載入總結與標籤,依**技能 → 新知 → 日常 → 其他**排序,並優先保留 `rule``preference``procedural` 與有 links 的記憶。需要細節時自行讀取對應分類的記憶檔。
- **日常與其他**兩類會依使用頻率、優先度、型態與關聯適當遺忘:久未再次出現、命中次數低、優先度低且沒有關聯者,壓縮到 `archive/forgotten/` 後移出常用記憶;`episodic` 短期事件更容易遺忘,`rule``preference``procedural``emotional` 一律豁免遺忘(情緒屬內隱記憶,`hits` 天生偏低,用命中次數判斷價值會誤刪)
- 載入順序:**近期工作記憶(未整理的 `inbox/`)放最前面**,接著**重要與興趣載入全文**;其餘只載入總結與標籤,依**技能 → 新知 → 日常 → 其他**排序,並優先保留 `rule``preference``emotional``procedural` 與有 links 的記憶。需要細節時自行讀取對應分類的記憶檔。
- **工作階段交接(兩層,皆不可移除)**:SessionStart 除了長期記憶,另以**兩份獨立預算**載入交接內容,兩者都不佔用 `ROLE_LOAD_LIMIT`
| 層 | 來源 | 預算 | 解決什麼 |
@@ -711,18 +711,36 @@ updated: <yyyy/MM/dd HH:mm:ss>
| 心理學分類 | 系統處理 |
| --- | --- |
| 感記憶 | 不落檔;短暫感官殘留與工具雜訊直接丟棄 |
| 感記憶sensory | 不落檔;短暫感官殘留與工具雜訊直接丟棄。**不含情緒感受** —— 情緒屬 `emotional` 長期記憶,見下方「情緒記憶不會被偏好吃掉」 |
| 短期/工作記憶 | `inbox/``retention_stage: working`,只做輕量編碼 |
| 長期記憶 | 睡眠整理後進入六分類目錄,`retention_stage: long_term` |
| 外顯/陳述性 | `declarative: explicit`,多見於 `semantic`、`episodic`、`preference`、`rule` |
| 內隱/非陳述性 | `declarative: implicit`,多見於 `procedural`、`emotional` |
### 情緒記憶不會被偏好吃掉
`emotional` 與 `preference` 極容易混淆,而混淆的代價是單向的:**偏好被記成情緒只是分類不準,情緒被記成偏好則等於感覺沒被記住**。因此判準以「這則下次會被拿來做什麼」區分,並在三個環節各設一道保護:
| 環節 | 保護 | 沒有保護會怎樣 |
| --- | --- | --- |
| 編碼(Stop hook) | 判準明確分工:決定**行為**→`preference`、回想**當時感覺**→`emotional`;兩者都有就**拆成兩則** | 感覺被折進偏好的描述裡帶過,等於不存在 |
| 整理(睡眠) | **`memory_type` 不同的記憶不互相 merge**,改用 `links` 關聯 | 情緒被併入偏好,語氣可復原、溫度永久遺失 |
| 載入 | `MEMORY_TYPE_WEIGHT` 排在 `procedural` 之上;總結區塊視為耐久型態(不受優先度門檻篩除);判準要求 `emotional` 優先度**至少 4**,才過得了全文區塊的 `ROLE_LOAD_FULL_MIN_PRIORITY` | 寫進去了卻排在最後,先被字元預算截掉,或因優先度不足而不注入 |
| 遺忘 | `emotional` 與 `rule``preference``procedural` 同列豁免 | 因 `hits` 低被當成沒價值而刪除 |
另外兩個必須維持的措辭約定:
- 不落檔的是**感官記憶(sensory memory)** —— 感官殘留與工具雜訊。中文若寫成「感覺記憶」,會被讀成「情緒感受不要保存」而使 `emotional` 永遠為 0。
- **角色自己的情緒是合法的記憶主體**。「記憶主體是使用者與這段互動」指的是不要記流水帳,不是要角色抹掉自己的感受。
自我檢查:`role_sleep.sh --status` 的「記憶型態」若長期 `情緒 0`,而互動明顯帶有情感,就是上述某一道保護失效了。
遺忘規則(只套用於日常與其他):
| 分類 | 未更新天數 | 命中次數 | 優先度 | 關聯 | 動作 |
| --- | --- | --- | --- | --- | --- |
| 日常 daily | ≥ 14 天(`episodic` 約 7 天) | ≤ 1 | ≤ 2 | 無 links,且非 `rule``preference``procedural` | 壓縮到 `archive/forgotten/` 後移除 |
| 其他 other | ≥ 7 天(`episodic` 約 4 天) | ≤ 1 | ≤ 2 | 無 links,且非 `rule``preference``procedural` | 壓縮到 `archive/forgotten/` 後移除 |
| 日常 daily | ≥ 14 天(`episodic` 約 7 天) | ≤ 1 | ≤ 2 | 無 links,且非 `rule``preference``procedural``emotional` | 壓縮到 `archive/forgotten/` 後移除 |
| 其他 other | ≥ 7 天(`episodic` 約 4 天) | ≤ 1 | ≤ 2 | 無 links,且非 `rule``preference``procedural``emotional` | 壓縮到 `archive/forgotten/` 後移除 |
---