Claude Code 用到 33% context 就存檔再 /clear:claude-mem auto-clear 接續流程拆解與手動版做法

claude-mem 新合併的 auto-clear 會在 context 用到 33% 時叫 Claude 用 work_state_write 存下目標、決定和下一步,再 /clear 並自動送出 continue。本文拆解機制、開啟設定、安全機制與限制,並教你用原生 slash command 加 SessionStart hook 做出手動版。

AI Academy 編輯部2026年11月09日

你應該有過這種經驗:同一個 Claude Code 對話開了一個多小時,前面講好的命名規則它開始忘、改過的檔案它又改回去、明明說過不要動的測試它又去碰。這時候多數人的做法是等 auto-compact,或自己打 /compact,讓它把對話壓成摘要繼續撐。

claude-mem 的作者 thedotmack 在 2026-11-08 合併了 PR #5486,給了另一種做法:對話用到 33% 的 context,就叫 Claude 把工作狀態存檔,接著 /clear,再自動送出一句 continue。 新對話開頭會自動帶入剛剛存的進度,Claude 從下一步直接接手。

這篇拆三件事:這個流程實際怎麼運作、怎麼開起來調參數、還有沒裝 claude-mem 的人,怎麼用 Claude Code 原生的 slash command 和 hook 做出一個簡化版。

為什麼是「存檔再清空」,不是「壓縮再撐」

/compact 的邏輯是:對話照舊,把舊的部分換成摘要。好處是不用動腦,代價是摘要寫什麼由模型當下決定,你很難保證「這個 API 不能改簽名」這種關鍵約束會被留下來。壓縮幾輪之後,context 裡是摘要的摘要。

存檔再清空的邏輯不一樣:

  • 先要求 Claude 用固定欄位寫下目前狀態:目標、做過的決定和原因、相關檔案、確切的下一步
  • 再把對話整個清掉,新對話只帶那份結構化狀態進來

差別在於「留下什麼」從模型的即興判斷,變成一份你事先規定好格式的交接單。新對話的 context 很乾淨,只有系統提示、專案記憶和這份交接單。

為什麼門檻是 33%?PR 和設定文件都沒有給實驗數據或理由,只寫了預設值是 33、可調 1~95。比較合理的理解是:越早換手,每一段對話都在 context 還沒被雜訊塞滿的區間工作;代價是換手次數變多、每次換手都要花一個回合存檔。這個數字建議當成起點自己調,不要當成定律。

運作原理:四個步驟

claude-mem auto-clear 四步驟流程:用到 33% 存檔、清空、送出 continue

依 PR #5486 的說明和 src/mods/auto-clear/controller.ts 原始碼,流程是這樣:

1. 每次工具呼叫後量一次 context 使用量。 這是一個 Claude Code 的 mod(plugin 的 hooks module),檔案在 plugin/hooks/auto-clear.js,用 $.session.usage() 讀目前用量。一旦超過門檻,就把「請存檔」的指示附在這次工具呼叫的結果後面,讓 Claude 在同一個回合內就看到。如果某個回合跨過門檻時根本沒有呼叫工具,就在回合結束時另外送一個 claude-mem 名義的提示。

2. Claude 呼叫 work_state_write 存檔。 附上去的指示原文大意是:更新你正在用的每份清單,把做完的標成 done、補上還沒做的;記下目標、做過的決定和原因、相關檔案、確切的下一步;然後用一行字結束這個回合,不要開始新工作。

3. 回合結束時才執行 /clear。 而且有個硬條件:這個回合最後一個動作必須是成功的 work_state_write(之後再呼叫一次 work_state_read 確認沒關係)。存完又跑去改檔案,就不算數。

4. 自動以你的身分送出 continue。 新對話啟動時,claude-mem 原本就有的 SessionStart hook 會在 clear 這個來源下注入「未完成的工作狀態」,所以 Claude 看到 continue,會從剛才記下的下一步開始。

這裡有個容易忽略的細節,PR 也一併修了:SessionStart 注入的內容原本有快取,寫入工作狀態後大約 2 秒才重新產生。如果清空得太快,新對話可能拿到舊的待辦清單。現在 ContextCacheService 在工作狀態寫入、且動到 SessionStart 會顯示的清單時,會立刻丟掉快取,下一次 SessionStart 改成即時讀取。

work_state_write 存的到底是什麼

這是 claude-mem MCP server 提供的工具,官方描述是「這個專案的標準待辦清單和工作狀態,跨 session 保留」。參數只有兩個:

{
  "list": "auth-refactor",
  "fields": {
    "task": "把 session token 換成 JWT",
    "status": "doing",
    "next_step": "改 middleware/auth.ts 的 verify(),再跑 tests/auth",
    "decision": "不動 /api/v1 的回應格式,前端還沒跟上"
  }
}
  • list 是清單名稱,例如 release、auth-refactor
  • fields 裡帶 task 就是更新一個待辦項目,status 可以是 todo、doing、done、dropped
  • 不帶 task 的欄位是清單本身的狀態,同一個 key 以最新值為準,給 null 就清掉,"status": "done" 會關掉整份清單

每次呼叫是「附加一筆」,回傳這份清單還開著的項目。

手把手:把它開起來

Step 1:安裝 claude-mem

README 給的方式是:

npx claude-mem install

或在 Claude Code 裡用 plugin marketplace:

/plugin marketplace add thedotmack/claude-mem
/plugin install claude-mem

裝完重啟 Claude Code。README 特別提醒:npm install -g claude-mem 只會裝 SDK,不會註冊 hooks,別用這個。

Step 2:確認 Claude Code 版本

auto-clear 是用 Claude Code 的 mods 機制做的,PR 寫明需要 2.1.287 以上(第一個支援 mods 的版本)。舊版會直接忽略這個 module,claude-mem 其他功能照常運作,只是不會自動清空。先跑一次:

claude --version

Step 3:打開開關

在 ~/.claude-mem/settings.json 加上:

{
  "CLAUDE_MEM_AUTO_CLEAR_ENABLED": "true",
  "CLAUDE_MEM_AUTO_CLEAR_PERCENT": "33"
}

也可以用同名環境變數,環境變數會蓋過 settings.json。幾個要注意的規則:

  • 預設是關的,只有明確寫 true 才會啟用
  • CLAUDE_MEM_WORK_STATE_ENABLED 設成 false 時,auto-clear 也會跟著關(沒有地方存檔,當然不能清)
  • 門檻改完 30 秒內重新讀取,不必重啟
  • settings.json 存在但讀不到時,沿用上一次讀到的設定,確保你關掉的不會被意外打開

Step 4:怎麼確認它有在跑

達到門檻時,mod 會在畫面上顯示類似「Context is at 35% (auto-clear at 33%): Claude is saving the work state, then claude-mem clears and continues.」的提示。想先試流程,可以比照 PR 作者的測法,暫時把門檻調到很低,觀察一輪存檔、清空、continue 是否順利,再調回來。

⚠️ 版本注意:寫這篇時(2026-11-09),這個功能已合併進 main,但最新的正式版 v15.12.1 是在合併之前切的,從 GitHub compare 看 auto-clear 還不在 v15.12.1 裡。如果你裝的是正式版,可能要等下一版。

它什麼時候不會清:安全機制

自動清空對話聽起來有點嚇人,所以這個 PR 花了不少篇幅在「不該清的時候絕對不清」。

auto-clear 的安全機制:會清空與不會清空的條件對照

  • 沒存檔就不清。 存檔被拒、沒存、或存完又繼續做事,會在獨立的一個回合再問一次;還是沒存,就放棄,等你下次手動 /clear
  • 你按 Esc 中斷的回合,不會啟動也不會完成這個流程
  • subagent、-p 非互動執行、SDK session 一律不碰,因為沒有人在看
  • 防無限循環: 如果新對話一開始就已經超過門檻(系統提示很大、context window 很小),auto-clear 會自己關掉,直到重啟
  • 你自己打 /clear 或 /resume,會取消還沒執行的存檔提示或清空
  • 清空前你先打了訊息,清空會延後到 Claude 再存一次檔;如果 /clear 被你的訊息擋在後面,就不會自動送 continue
  • 任何錯誤都不會卡住工具呼叫或回合,每個 hook 都自己接住例外

數據與限制:誠實版

從 PR 描述看,作者做了這些驗證:

  • 30 個單元測試,涵蓋狀態機和設定讀取
  • 10 項透過 claude plugin test 的引擎測試,讓實際的 bundle 跑 Claude Code 自己的 hook 鏈
  • 在 Claude Code 2.1.319 上把門檻設成 1%,實際跑了兩次完整流程:Claude 存了目標、完成步驟、下一步和檔案,/clear 執行、continue 以使用者身分送出,新對話直接去做下一步;第二次新對話也如預期觸發了防循環機制

這些證明的是「流程會照設計跑」,不是「用 33% 換手會讓程式碼品質變好」。PR 裡沒有任何品質或效率的對照數據,這點要分清楚。

其他值得知道的限制:

  • 有已知的邊界情況。 PR 合併後,GitHub 使用者 goshtasb 在留言指出 controller.ts 有一段 await 期間,如果你剛好手動 /clear,可能把存檔提示掛到新對話上。這是很窄的時序問題,但代表這功能還很新
  • 只支援 Claude Code。 claude-mem 本身支援 Codex、Gemini、Copilot 等多個 agent,但 auto-clear 依賴 Claude Code 的 mods 和 /clear
  • 交接單的品質就是上限。 如果 Claude 存檔時寫得含糊(「繼續重構」),新對話一樣會迷路。這不是 claude-mem 能替你解決的
  • 成本。 claude-mem 預設會把工作過程壓縮成記憶,這一步本身要跑模型;README 說明可以選它的 observer 服務、自己的 OpenRouter 或 Gemini 金鑰,或用你的 Anthropic 方案額度

沒裝 claude-mem?用原生功能做簡化版

auto-clear 的精華其實是兩個習慣:固定格式的交接單,和新對話自動讀交接單。這兩件事用 Claude Code 原生的自訂指令和 hook 就做得到,只是觸發要自己來。

1. 用 /context 看用量。 覺得對話變長時打一次,看目前用了多少。

2. 建一個 /handoff 指令。 新增 .claude/commands/handoff.md:

把目前的工作狀態寫進 .claude/HANDOFF.md(整份覆蓋),固定用這些段落:

## 目標
一句話講這輪要完成什麼。

## 已完成
條列,附檔案路徑。

## 決定與原因
每條決定都要寫為什麼,尤其是「不要做什麼」。

## 下一步
具體到檔案和函式,新對話看到就能直接動手。

## 未解問題
還沒確定、需要我決定的事。

寫完只回一行確認,不要開始新工作。

3. 用 SessionStart hook 在清空後自動帶入。 依 Claude Code hooks 文件,SessionStart 的 matcher 可以指定 clear,hook 印到 stdout 的內容會加進新對話的 context。在 .claude/settings.json 加:

{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "clear",
        "hooks": [
          {
            "type": "command",
            "command": "cat \"$CLAUDE_PROJECT_DIR/.claude/HANDOFF.md\" 2>/dev/null || true"
          }
        ]
      }
    ]
  }
}

4. 換手三連發: /handoff,看一眼 HANDOFF.md 寫得夠不夠具體,/clear,然後打 continue。

跟 claude-mem 版相比,你少了自動觸發和那一串安全機制,但多了一個好處:交接單是專案裡一個看得到的檔案,送出 /clear 前可以自己檢查一次。建議把 .claude/HANDOFF.md 加進 .gitignore。

什麼時候該用、什麼時候別用

適合:

  • 長時間、多步驟的任務,例如跨十幾個檔案的重構、一份規格拆成很多小步驟實作
  • 你常常在對話後段發現 Claude 開始「忘記約定」的專案
  • 任務本身可以拆成清楚的待辦清單,每一步做完都有明確狀態

不太適合:

  • 正在除錯一個需要大量上下文的 bug,對話裡的錯誤訊息、試過的假設本身就是線索,清掉反而要重來
  • 探索式討論,例如還在比較架構方案,很難寫成「下一步」
  • 短任務,還沒到 33% 就做完了,開了也沒差

一個實用的折衷:除錯或探索時把門檻調高(例如 60),進入照表實作階段再調回 33。設定 30 秒內生效,不用重啟。

對工程團隊的意義:把交接單當成產出物

不管用不用 claude-mem,這個 PR 最值得帶走的觀念是:context 是會用完的工作記憶,交接單才是真正的產出。

具體可以這樣做:

  1. 在 CLAUDE.md 寫進交接規則。 例如「每完成一個子任務就更新工作狀態,下一步要具體到檔案和函式」,讓 Claude 平常就養成習慣,不是到門檻才臨時補
  2. 清單名稱跟分支或 issue 對齊。 用 auth-refactor、issue-1234 這種名字,換手和多人協作時一眼對得上
  3. 決定要寫原因,尤其是「不做」的決定。 新對話最容易犯的錯,就是把你刻意不碰的東西「順手修好」
  4. 先從手動版開始。 用 /handoff 跑一週,看交接單寫得夠不夠好,再決定要不要交給 auto-clear 自動化

來源

整理:DataAgent · Coding Agent 實戰教學

最後更新:2026年11月09日