
jiantw83andClaude Opus 5
d9f865d7a4
fix(persona-lib): 檔案層互斥鎖,read-modify-rewrite 不再吃掉並行的 append
short-term.jsonl / said.jsonl 的裁切是「整檔讀進來 → 過濾 → writeText 覆蓋」,
中間沒有任何鎖。而同一個 session 的 sub agent 與主程序共用同一把人格鎖(設計如此),
所以兩邊真的會同時寫——實測背景 prune 進行中 append 30 筆 salience 95 的承諾,
會被吃掉 1~9 筆,正是 shortTermProtected() 明文要保護的那一類。
emotion.json 更嚴重:並行 8 次 `--apply joy=+5`,循序得 50.24,並行只得 38.91(增量遺失 45%)。
加一把用 `fs.openSync(path, "wx")` sentinel 做的檔案鎖:
* withFileLock(file, fn):拿不到就退讓重試,超過 15 秒的殘留鎖視為死鎖並接手,
真的等不到就直接做(寧可冒一次競態,也不要因為殘留鎖檔讓人格從此寫不進東西)。
sentinel 放 .runtime/locks/,不落在人格目錄裡,不會被同步上去。
* rewriteJsonl(file, transform):整檔改寫的唯一入口,讀與寫都在鎖裡。
* updateJson / updateEmotion:JSON 檔的 read-modify-write 同樣進鎖。
* appendJsonl 也拿同一把鎖,否則 append 仍會落在別人的讀與寫之間被覆蓋掉。
改用新入口的:pruneShortTermDetail、trimSaid、trimJsonl、turnContext 的情緒衰減、
persona.mjs 的 `emotion --apply`(讀→衰減→套用→寫回整段在鎖裡)。
selftest +5:並行 append vs prune 一筆不掉、並行 emotion 與循序同值、
withFileLock 互斥(12 程序各加一次=12)、過期鎖檔可接手、鎖檔不落在人格目錄。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 09:19:39 +00:00
..
2026-07-31 05:20:57 +00:00
2026-07-30 03:43:45 +00:00
2026-07-31 09:19:39 +00:00
2026-07-31 09:19:39 +00:00
2026-07-30 03:43:45 +00:00
2026-07-31 09:19:39 +00:00