fix(memory): R6 容量壓力真的會清,而且不清承諾與今天的紀錄(v0.0.7 同批)

實際踩到的 bug:短期記憶連睡兩次都停在 70 筆、111 組候選,`prune-short-term`
每次都回報 ok 卻一筆都沒清掉。

原因:`pruneShortTerm()` 只有兩道——超過 14 天、超過硬上限 240 筆。但提示固化的門檻
(`CONSOLIDATE_THRESHOLD`)是 40 筆,中間那 200 筆沒有任何機制會動它。R6 在
`candidates` 裡被列為「依顯著度清出空間」,但那個清除動作**從來沒有實作**。

修法:加一道軟上限(`SHORT_TERM_SOFT_CAP`=120),超過就從顯著度最低、最舊的開始裁。
兩個保護,因為「沒經過判斷就把今天清掉」是這裡最不能犯的錯:

  - 顯著度 ≥ 80 或 `intent=commit`(承諾與界線都在這一層)→ 一則都不清
  - 24 小時內的新紀錄 → 一則都不清(還沒機會被固化)

順帶:`pruneShortTermDetail()` 回傳清了幾筆、為什麼清、保護了幾筆,`sleep` 的
`run()` 會把細節帶進回報——**不做無聲的裁切**。

測試:302 項全過(新增 5 項:軟上限會清、承諾不清、今天的不清、清的是顯著度最低的、
回報帶細節)。文件同步:README 的 R6 與目錄樹、persona-memory 的 R6。

版本:與 PR #10 同一批未合併的改動,維持 0.0.7。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-31 05:01:52 +00:00
co-authored by Claude Opus 5
parent 23751c2c05
commit 54d14eae68
5 changed files with 88 additions and 13 deletions
+3 -2
View File
@@ -85,7 +85,8 @@ flowchart TB
│ ├── sync.json # Gitea 同步狀態(最後 push / pull
│ └── config.json # 含人格編號 code
├── memory/
│ ├── short-term.jsonl # 短期記憶(語意分析後;上限 240 筆 / 14 天)
│ ├── short-term.jsonl # 短期記憶(語意分析後;軟上限 120 筆 / 硬上限 240 筆 / 14 天)
│ ├── felt.jsonl # 每輪讀到的對方情緒 + 自己套用的 delta(走向與偏差稽核)
│ ├── long-term/*.md # 長期記憶(一則一檔 + frontmatter
│ ├── INDEX.md # 長期記憶索引(自動產生)
│ └── inbox/room-*.jsonl # 當 guest 時留下的見聞,待本體消化
@@ -142,7 +143,7 @@ flowchart TB
| **R3** | 單筆情緒變動總量 ≥ 25 | `event`(帶情緒錨點) |
| **R4** | `intent=commit` 或命中承諾/界線關鍵詞 | `promise` / `boundary`salience ≥ 80,不可遺忘) |
| **R5** | 同一人物(entity)≥ 2 筆 | `relationship`(並更新關係圖) |
| **R6** | 短期記憶 ≥ 40 筆(容量壓力) | 依顯著度清出空間 |
| **R6** | 短期記憶 ≥ 40 筆(容量壓力) | 依顯著度清出空間。**真的會清**:超過軟上限 120 筆時從顯著度最低、最舊的開始裁,但顯著度 ≥ 80 或 `intent=commit`(承諾/界線)與 24 小時內的新紀錄一律不動;裁掉幾筆會寫進 `sleep` 的回報,不做無聲的裁切 |
沒命中任何規則的就讓它被裁掉——**遺忘是功能**。達標時 `Stop` 與 `remember` 都會提醒去跑
`/jsc-persona:persona-memory`。