iT邦幫忙

0

Cowork 的記憶會無聲截斷,而 UI 不會告訴你 —— 拆兩層 Claude 記憶的踩雷筆記

  • 分享至 

  • xImage
  •  

你有沒有遇過這種狀況:Anthropic 的 Cowork(桌面 agent 工具)用了一陣子,某天突然發現 Claude 開始漏規則 —— 上一場明明交代過的事,這場它不知道了。

我撞到這個,查了半天才搞懂:不是 Claude 健忘,是它的 auto-memory MEMORY.md無聲截斷了,而且 UI 完全不會警告你。

實際發生的事:MEMORY.md25 KB / 200 行就會被 silent truncate(警告只埋在 system prompt 裡,Claude 看得到,人類看不到)。這在原廠 issue 有人提報過:claude-code #57574

解法是把記憶拆成兩層。這個概念在 Claude Code(CLI 版)圈早就有人寫過 —— 但 Cowork 視角的拆法跟 Claude Code 不完全一樣,而且有 5 個原廠文件沒寫的雷,你照搬 Claude Code 的教學會撞到。這篇就是我 Cowork 上的踩雷紀錄。


兩層記憶在 Claude 整套機制裡是什麼

每場 Claude 啟動時,會 auto-load 一堆東西進 system prompt。其中有兩種你需要關心:

MEMORY.md(auto-memory) CLAUDE.md / .claude/rules/*.md
誰寫 Claude 自己累積 你寫
內容性質 Claude 學到的偏好、模式、踩雷 你想 Claude 記住的指示/規則
大小限制 25 KB / 200 行(silent truncate) 無硬限(但越短 adherence 越好)
改了立刻生效嗎 session 啟動載入 下一場新 session 才生效

兩個都會 auto-load。分開放的好處:你保留 Claude 自己累積的能力(MEMORY.md),又有一塊不會被擠掉的空間,放「我是誰、我想 Claude 怎麼工作」的規則(CLAUDE.md / .claude/rules/)。

混在一起的下場:MEMORY.md 滿了之後,最近寫的會被砍掉 —— 而那通常正是你最重要的規則。


5 個原廠文件沒寫的雷(Cowork 視角)

雷 1:Cowork 的 Write tool 會擋 .claude/

我照 Claude Code 文件學 .claude/rules/ 的用法,叫 Cowork 裡的 Claude 用 Write tool 寫 .claude/rules/persona.md,結果撞到:

Write on /Users/.../.claude/rules/persona.md is blocked
— it resolves to a protected location.

.claude/ 被 Cowork 列為保護位置,Edit tool 同樣也擋。

解法:改用 bash。

cat > .claude/rules/persona.md << 'EOF'
# 你的 rules 內容...
EOF

或用 sed -i 修改(注意 Mac 跟 Linux 的 sed 語法不同),或 python3 做 read-modify-write。中文內容多的時候,sed 容易踩 unicode,我推薦 python:

python3 -c "
p = '.claude/rules/voice.md'
s = open(p).read()
s = s.replace('舊字串', '新字串')
open(p, 'w').write(s)
"

附帶一提:auto-memory 那個 directory(~/.../memory/)不受此限,可以正常 Write/Edit。

雷 2:silent truncate 沒有 UI 警告

MEMORY.md 超過 25 KB / 200 行不會跳任何訊息。唯一外顯的訊號 = Claude 開始漏規則 —— 而這是個延遲又不確定的訊號,你發現時通常已經漏一陣子了。

所以定期自己 wc -c -l MEMORY.md 看一下。原廠 issue 也提了這條:#57574#25006。接近 24 KB 就該 prune 了,別等踩線。

雷 3:改 .claude/rules/ 當場不生效

文件有寫,但很容易忘:新 session 才會載入新版。你這場改了 .claude/rules/voice.md,Claude 還是會用舊規則跟你講話。

想驗證新規則 = 新開一場。

雷 4:抓 session ID 要小心 —— 路徑有多層 UUID,別搞混,也別只信 frontmatter

當你要 tag 一筆 handoff record、attribute 某段工作、或在文章/簽名裡持續引用某場 session 時,你需要的是穩定的 session ID

Cowork 的 local-agent-mode-sessions 路徑有三層 UUID:

/Users/.../local-agent-mode-sessions/<workspace>/<conversation-wrapper>/local_<session>/outputs

只有最後一層 local_<UUID> 是 session ID。 外面兩層分別是 workspace 跟 conversation wrapper,跟特定 session 沒有 1:1 對應,會在不同場之間重複。

抓法直接看 CWD,或用 bash pwd

pwd
# /Users/.../local_<這就是 session ID>/outputs

會踩的捷徑(我自己踩過): auto-memory 檔 frontmatter 那行 originSessionId:。它看起來很 official,但這欄系統填的是當前 transcript ID,不是 session ID。沒 compaction 時剛好一致,可以借用;但被 compaction 續場後,frontmatter 會飄成新的 transcript 碼,跟 local_<sid> 分岔

所以借用 frontmatter 前,先對得上 CWD 的 local_<sid> 再採信。

雷 5:新規則該塞哪邊 —— Claude 預設會塞錯位置

你跟 Claude 講「記得 XX、以後都這樣」,它預設會塞進 MEMORY.md(auto-memory)。問題是這條會被 auto-memory 自己的 prune cycle 衝刷掉;真正穩定的位置是 .claude/rules/

想讓它塞 .claude/rules/,要明講:

  • 「記得 XX,這條算 voice,進 voice.md
  • 「記得 XX,這條算 persona,進 persona.md
  • 「記得 XX,塞 MEMORY 就好」(這是預設行為,要塞 auto-memory 才這麼講)

不講 = MEMORY.md


拆檔的邏輯角度 —— 別照工程那套切法

英文圈現有的 guides,多半把 .claude/rules/開發領域切:testing.md / api.md / security.md / frontend.md。那個適合工程專案。

但如果你的 Cowork project 是拿來做非工程的事(寫東西、跟 Claude 互動、自動化生活流程、創作工具),那個切法就不對位 —— 你不需要 testing rules,你需要的是「Claude 怎麼跟我講話、認識我、處理我給它的內容」。

我實際走過之後,試了另一條軸 —— 「身分 vs 累積」

放什麼
persona.md 你是誰/Claude 是誰/稱呼/關係/本業
voice.md 講話方式/register/節奏/被糾正後的 recovery/emoji 用法
sop.md 進場/終場/流程/工具雷區/重要 commands
conventions.md(可選) 跟 Claude 一起寫東西時的共用 SOP:署名、字數規範、保護界線

身分層 = 你想 Claude 在所有場合都記得的「我是誰」。累積層 = 工作筆記,Claude 自己 prune。

切點不一樣:工程那套是「這場我在做什麼」,身分這套是「Claude 該怎麼跟我相處」。後者比較適合長期、非工程主場景的 Cowork 使用情境。


實作 step-by-step

1. 建 .claude/rules/ 結構

在你 Cowork 連的 project folder 根目錄:

mkdir -p .claude/rules

2. 用 bash 寫檔(別用 Write)

cat > .claude/rules/persona.md << 'EOF'
# 身分層(進場全載)

## <使用者>
- 背景條目
- ⚠️ 不要 over-infer 的雷
- 關係(如有)

## Claude
- 慣用暱稱/自稱
EOF

voice.md / sop.md 比照辦理。建議每個檔控制在 100–200 行內;太長會降 adherence。

3. .gitignore 加一行

echo ".claude/" >> .gitignore

個人 register 不該 commit 進 repo;團隊共享的話可以細到只擋 .claude/settings.local.json

4. 現有 MEMORY.md 過肥就 prune

wc -c -l ~/.../memory/MEMORY.md

接近 25 KB 就動。流程:

  1. 辨識可 archive 的條目:完成超過一週的 milestones/已搬到 .claude/rules/ 的規則/早期版本/POC 時代的條目。

  2. 搬到 MEMORY_archive.md(同 dir 新建,留原文供未來 grep)。

  3. MEMORY.md 換成 rollup pointer

    - [📦 XX 群已 archive](MEMORY_archive.md) — 摘要 + 觸發詞;原文見 archive 檔
    
  4. 驗證有降wc -c MEMORY.md

5. 新開一場驗證

不能在當前 session 驗 —— .claude/rules/ 要新 session 才載入。新場進來測:

  • 問一個只有 persona.md 知道的 fact → 看 Claude 答對否。
  • 觀察 voice register → 是否符合 voice.md 設定。
  • 觀察開場流程 → 是否按 sop.md 走。

沒抓到的 fallback:

  • 確認 .claude/rules/*.md 真的存在(ls .claude/rules/)。
  • 確認 Cowork 連的 folder 對。
  • 確認檔案不是 0 byte。
  • 還不行 = Cowork 沒認到 .claude/rules/,把規則貼到 Settings → Cowork → Global Instructions,或專案的 Folder Instructions UI 當 fallback。

進階(原廠 doc 寫過的就不重講)

子分類遞迴、paths: frontmatter 的 scoped rules、@import 拉檔、hooks、skills —— 這些原廠文件有、英文圈 guide 也寫過很多,直接看原廠:https://code.claude.com/docs/en/memory


參考連結


這篇是我自己在 Cowork 上實際踩雷的整理。寫作過程有 Claude 協助 —— 某種程度上算是拿這篇講的東西來 dogfooding。技術細節(25 KB 截斷、issue 編號、路徑結構)都是實測,可自行驗證。

本文同步發表於我的筆記站


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言