Commit Graph
8 Commits
Author SHA1 Message Date
JefferyandClaude Opus 5 afb29b6bc0 fix(role): 修正 SLEEP_BATCH 與輸出上限矛盾導致整批整理失敗
以真實資料整理 25 則 inbox 時失敗(「整理結果無法套用」)。查證後為參數設計矛盾:

- ROLE_SLEEP_BATCH 預設 60,宣稱一次可處理 60 則
- 但每則整理結果約需 650 字元(summary/content/各欄位),
  而 ROLE_SLEEP_OUTPUT_LIMIT 為 8000 → 實際只能容納約 12 則
- 實測 25 則的素材達 25798 位元組(COLLECT_LIMIT 為 12000),
  輸出 JSON 被截斷成不合法格式,apply 解析失敗,整批無法套用

所幸失敗時 inbox 保留不動的設計生效,沒有遺失任何記憶。

- SLEEP_BATCH 預設 60 → 12,並在程式碼註明推算依據與這次的實測數據
- collect 在超出單批上限時於素材標頭標示「本批 N 則,另有 M 則留待下批」,
  避免誤以為已全部整理完
- SKILL.md 註明此參數不可任意調高,需與輸出上限相容

驗證:以 20 則 inbox 確認正確切為 12 + 8 並標示留待下批;
爸爸的 25 則實際記憶以每批 10 則分三次整理完成(新增 9 則、合併 6 則、捨棄 2 則),
inbox 清空,且 DIGESTS.md 在真實資料上正確累積 3 筆整理歷史。

版號沿用 0.0.5(master 為 0.0.4,同一 PR 不再累加)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-29 12:18:24 +08:00
JefferyandClaude Opus 5 a30fccc627 feat(role): 召回統計、整理摘要歷史、臨時授權到期;還原誤刪的共用行為文件
依 OpenClaw 記憶架構的參考逐項評估後,採納三項並補上一個誤刪。

一、recall 命中時記錄召回(原本完全沒有)
實測 recall 寫回動作數為 0、hits 分布幾乎都是初始值,導致常被查詢的記憶與
從未用過的在遺忘判斷時待遇相同。
- 新增 touchMemory():只對實際輸出的前 N 則 hits +1 並更新 last_replayed

二、整理摘要保留歷史(對應 OpenClaw 的 DREAMS.md)
state.json 的 last_sleep_digest 是單一欄位,每次整理直接覆寫,歷史過程全部遺失。
- 新增 DIGESTS.md:追加時間、摘要與套用結果,最新在上,保留最近 100 次,不注入 context

三、臨時授權會過期(對應 OpenClaw 的操作敏感型邊界)
原本沒有到期概念,使用者的一次性授權可能被整理成長期規則而導致日後越權。
- 記憶格式新增 expires;支援日期(自動判斷)與條件文字(標示由角色判斷)
- 過期者不注入(分類與 inbox 兩處皆排除),memoryHint 標示有效範圍
- forget 優先淘汰過期項且不受分類限制
- 整理與濃縮提示詞都要求臨時授權必填,並列出「這次/先/暫時/今天」等判斷提示
- 修掉兩個會讓功能等於零的漏洞:FIELD_PATTERN 白名單沒有 EXPIRES(該行被當成
  CONTENT 吃掉)、cmdWrite 的 meta 未帶 expires 與 cues

四、還原前次誤刪的共用行為文件(重要)
上一個 commit 替換「角色檔標準格式」章節時,以「找開頭到下一個標記」整段取代,
未檢查被切掉的範圍內容,連帶刪掉了 JSC-ROLE-COMMON 共用行為區塊共 87 行 47 條規則,
以及記憶章節的技能再現與關係狀態說明。
實際行為未受影響(規則真正生效處是 role_load.sh,完好無損),但 SKILL.md 是那些
規則的唯一文件來源,刪掉等於文件遺失。已自 git 完整還原並補上本次三項說明。
教訓:整段替換文件前必須先確認被切掉的範圍內有什麼。

未採納並記錄理由:向量/語意搜尋(需外部 embedding API,違反零依賴原則)、
外掛槽位(過度設計)、每日筆記日期檔(近期對話交接已用逐字對話解決且保真度更高)。
SQLite 索引記錄為未來觸發點:實測 45 則記憶 recall 耗時 196ms,訂在超過 300 則
或 500ms 再導入,在那之前屬過早優化。

版號沿用 0.0.5(master 為 0.0.4,同一 PR 不再累加)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-29 11:50:35 +08:00
JefferyandClaude Opus 5 a190463b50 feat(role): 關係狀態量化、情緒訊號放寬門檻、技能再現 recall
完成使用者交代的三項優化建議。

一、情緒訊號放寬 Stop hook 字元門檻
ROLE_CAPTURE_MIN_CHARS=240 會濾掉字數少但情緒最濃的互動。實測「我好想妳」、
「最愛妳了」、「好可愛」三句都不在原本 56 個關鍵詞內,等於最珍貴的短互動反而不被記錄。
- 補上直接情感表達關鍵詞:可愛/愛/想妳/想你/想念/捨不得/感動/謝謝/乖/厲害/
  好棒/辛苦/彆扭/忌妒/撒嬌/陪/抱,及 love/miss/cute/thank/proud
- 驗證:上述情感句全部命中,純技術指令仍正確略過

二、關係狀態量化,讓親近度成長有依據
規則要求「隨互動加深逐漸更親近」卻沒有任何數據可依據,角色只能憑感覺演,
容易忽冷忽熱。
- state.json 新增 first_activity/active_days/total_turns/positive_feedback
- mark-activity 累計輪數與活躍天數;新增 --positive 由 Stop hook 判定情緒訊號後另計,
  不與輪數混算
- 新增 relationship 子命令輸出一行摘要,SessionStart 注入 USER 區塊作為親近度依據
- 既有累積以可查證資料初始化(角色建立後的 transcript 輪數、有記憶的日期數、
  最早記憶時間);positive_feedback 刻意留空自然累積,不以記憶則數推估

三、技能再現:cues 提取線索 + recall 查詢
技能記憶只被動載入摘要且受預算限制,等於記了但用不出來。
- 記憶格式新增 cues 欄位(dumpMemory/loadMemory/apply 的 new 與 merge 路徑均支援)
- 睡眠整理提示詞要求 procedural/rule 型態必填 2 至 5 個 cues
- 新增 recall 子命令:比對總結、標籤、內容與 cues,含未整理的 inbox,
  rule/preference/procedural 加權優先
- role_load.sh 告知角色遇到似乎做過的任務或被問起過去細節時先查詢再回答
- 驗證:以不在 summary 也不在 content 的關鍵詞(bump)成功靠 cues 命中

版號 0.0.7 → 0.0.8

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-29 09:59:38 +08:00
JefferyandClaude Opus 5 bf599e81a5 feat(role): SessionStart 載入未整理的近期工作記憶
修補記憶交接的先天缺口:role_load.sh 的順序是先 memory.js load 載入記憶,
之後才在背景補跑 --catchup 整理(腳本註解亦寫明「結果會在下次載入時反映」)。
而 load 原本只讀已整理的六個分類,完全不讀 inbox,導致上一段工作永遠來不及
進入本次載入 —— 使用者重開工作階段時,角色看不到剛剛做過的事,表現得像失去
記憶,只能靠 resume 找回上下文。

- memory.js 新增 inboxBlock():讀 inbox 最新數則的 summary,附時間與標籤,最新在前
- cmdLoad 把該區塊放在最前面,並使用獨立字元預算,不佔用 ROLE_LOAD_LIMIT
  (已驗證:開關 inbox 時長期記憶區塊逐字元完全一致,未被擠壓)
- 新增 ROLE_LOAD_INBOX_LIMIT(預設 1200)與 ROLE_LOAD_INBOX_COUNT(預設 10),
  任一設 0 可關閉
- role skill 補「近期工作記憶交接(不可移除)」段落,寫明缺口原因與範圍限制:
  這是摘要級交接,角色會知道上一段在做什麼、進行到哪,但不等於逐字記得整段
  對話;需要完整上下文仍應使用 resume
- 版號 0.0.1 → 0.0.2

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 17:47:21 +08:00
Jeffery 945c310551 feat(role): 新增閒置小睡整理 2026-07-28 14:39:26 +08:00
JefferyandClaude Opus 5 c713359fb4 feat(role): 角色分層載入與個人記憶同意狀態
role_load.sh 不再原封不動注入整份角色檔,改採 SOUL/AGENTS/USER/MEMORY
分層:只抽出角色 ID、顯示名稱、本質、氛圍與簽名 emoji 作為人格層,由 hook
產生固定操作邊界,記憶與同意狀態獨立成一區。避免人格檔裡的背景故事與模板
文字污染工程與安全規則。

memory.js 新增 consent/consent-status 子命令,同意狀態寫入
~/.memory/<角色 ID>/state.json 的 personal_memory_consent(accepted/
declined/unknown);role_capture.sh 於本輪出現明確同意或拒絕時更新狀態,
偵測不到明確表述時不自行推論。accepted 後不再每次重問。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 14:21:48 +08:00
Jeffery 3a3114b8b3 feat(role): 新增心理學記憶型態 metadata 2026-07-28 12:46:19 +08:00
Jeffery fec3e1d0cb refactor(role): 將角色記憶工具改寫為 Node.js 2026-07-28 12:30:28 +08:00