ctx-handoff-mod 深度源碼查核:長對話交接、專案記憶、進度、守門與快取成本邊界 | Allen 知識庫 | Allen 知識庫AI Developer Toolsthreads
ctx-handoff-mod 深度源碼查核:長對話交接、專案記憶、進度、守門與快取成本邊界
ctx-handoff-mod v0.5.0 確有 handoff、idle refresh、notes、progress、guards、promote 與防呆提醒機制;但它仍會透過 Claude Code 的模型 backend 發送對話片段,cache 保溫不是永久或零成本,promote 也不能被 guard approval 機制涵蓋。
2026年10月7日6 分鐘閱讀👁 4
Claude Code Mods / Source Audit / Context Handoff
ctx-handoff-mod 把長對話交接、專案記憶與守門做成 Mod,但它不是免成本或免審核的自動駕駛
這是一篇針對 cablate/ctx-handoff-mod v0.5.0、commit 3a06bc88 的 source audit:社群貼文說它能自動交接、快取保溫、整理專案筆記、留下進度、防呆提醒並把規則沉澱成 repo 內容;源碼大致支持這些機制存在,但多數能力仍依賴 Claude Code 的模型請求、hook 權限與後續使用者審核。
一屏結論:
作者聲稱:context 到門檻會自動摘要、清空並切新對話;閒置接近一小時刷新快取;背景整理偏好、進度、規則與流程;重複失敗、未驗證就完成、語言漂移會提醒 AI。作者也補充這個 mod 還很早期,可能有 bug。
源碼確認:v0.5.0 有 handoff、idle refresh、notes、progress、guards、promote、retry/done/reply-language nudges;預設門檻 600k token、閒置 55 分鐘、最多 3 次刷新、筆記模型 claude-sonnet-5-5 low effort。
限定測試:只跑本機純函式 fixture,驗證 secret-like action rejection、quote mismatch rejection、guard proposal validation、proposed 狀態不等於啟用、重複失敗與完成前驗證 heuristic。
未跑 live:沒有載入 Claude Code mod、沒有跑 model.fork/model.complete、沒有驗證 API key/Bedrock/Vertex cache、沒有測量節省額度百分比,未做完整的實際 Mod 整合測試。
版本、授權與最低條件
- 版本:
.claude-plugin/plugin.json 宣告 ctx-handoff 0.5.0。
- Commit:
3a06bc88c60a43dd2cde9b789487b9d6fc8d2b3c。
- 授權:GitHub API metadata 與 repo
LICENSE 均指向 MIT License;這只涵蓋 repo 程式碼,不等於 Anthropic、Bedrock、Vertex 或 Claude Code 服務條款。
- Claude Code:README 寫需要 Claude Code 2.1.287 以上,並稱已測到 2.1.293。這是 repo 自述,不是本次 live 驗證。
- 成熟度:作者 Threads follow-up 明說仍在很初期、可能有許多 bug;CHANGELOG 也提醒 1.0 前次版號可能改變行為。
六個能力:源碼能支持到哪裡
| 能力 | 源碼確認 | 要保留的邊界 |
|---|
| 自動交接 | classic.Stop 檢查 context token;到 min(threshold, window × ratio) 後以 $.model.fork 產生 handoff,再 /clear 並 submit 摘要。 | fork 逾時只是不再等待,底層請求可能仍在跑;clear 或 submit 失敗會記錄錯誤/pending,不是保證無縫。 |
| 快取保溫 | 回合結束排 idle timer;預設 55 分鐘後發送「只回覆 OK」的 fork,最多 3 次,之後存離席 handoff。 | 不是永久保溫,也不是零成本。API key、Bedrock、Vertex 或扣額度模式可能只有 5 分鐘 cache,README/guide 建議關掉 refresh。 |
| 專案筆記 | $.session.messages() 轉 transcript,呼叫 $.model.complete;有效 JSON actions 才寫入 ~/.claude/projects/<project>/memory/ctx-handoff.md。 | 只靠 regex 過濾 secret-like 值,不能承諾完整 redaction;摘要也可能遺漏、誤記或受來源內容影響。 |
| 進度備忘 | 整理 action 可輸出 set_progress;存在 $.store,下一段不同 session 24 小時內提供一次。 | 進度可能落後幾則訊息;同工作區多 session 最後寫入者覆蓋;自動 handoff 已涵蓋時不再提供。 |
| 防呆提醒 | 重複失敗、未驗證就說完成、回覆語言漂移各有 heuristic;done-check 可 block 一次 Stop。 | heuristic 會漏判或誤判;只看工具名、命令字串、最後訊息模式,不等於完整 QA。 |
| 規則/流程沉澱 | 規則或流程出現 3 次後,可在新 git repo session 的 prompt.context 注入指示,請 AI 寫到 CLAUDE.md、AGENTS.md、hook 或 .claude/skills,再用 mark_in_project 回報。 | 這不是 guard approval;prompt 明說不用先問使用者。mod 本身不寫 repo,但 AI 可能按提示改檔,仍需依 Claude Code 權限與 diff review 控制。 |
隱私與 provider 邊界
README 與 SECURITY 的語氣是「除了 Anthropic 不送到任何地方」,但從 source audit 更精確的說法應該是:這個 mod 沒看到 $.http、$.process 或自建 server;它把模型工作交給 Claude Code 的 $.model.fork 與 $.model.complete。模型請求交給使用者當下 Claude Code 的 backend;若 backend 是雲端服務,對話資料就會離開本機。如果使用 API key、Bedrock 或 Vertex,實際 provider 路徑與 cache TTL 不能簡化成「只送 Anthropic」。
整理筆記時會送出使用者訊息、助理回覆,以及工具輸入/結果的截短片段:工具 input 取前 300 字、工具 result 取前 500 字,總 transcript 最多 300,000 字。工具片段截短不等於脫敏,仍可能包含私有路徑、錯誤訊息、需求細節與非 regex 命中的秘密。源碼會丟掉疑似 sk-、GitHub token、Slack token、AKIA、BEGIN block、password、api_key、token、secret 的 action 行;這是模型回覆的 action 解析/筆記寫入防線,發生在 model.complete 已送出 transcript 之後,不是送出前的完整脫敏或 DLP。父流程用合成 password-like 字串確認 transcriptOf 仍會保留該字串;沒有發送真實秘密或呼叫雲端。
安全觀察:guard approval 不能泛化
- 守門:
/handoff guard suggest 只產生 proposed;必須 /handoff guard on N 後才會在 tool.call 檢查。這一點源碼和測試 fixture 都支持。
- 守門失敗:regex parse 或檢查出錯會 fail-open;
remind 模式本來就放行,只在結果 context 加提醒。
- 筆記/進度:背景整理成功時會直接寫 notes file 或 store progress;它不是 guard approval 流程。
- promote:達 3 次的規則、流程或啟用守門,會被交代給 AI 寫進 repo。這一步明確不是「使用者先核准才改 CLAUDE.md 或 skill」。正確採用方式是依賴 Claude Code 工具權限、檔案 diff、git status 與人審。
成本與 cache:不要把作者自用經驗寫成 benchmark
社群貼文說效率與額度消耗有很大優化;repo 也記錄第 2、3 次刷新曾整段 cache read、cache creation 為 0 的實機紀錄。這支持「在作者場景中 cache refresh 有效」的說法,但不足以推出固定節省百分比。不同模型、上下文長度、訂閱/API key/Bedrock/Vertex 路徑、cache TTL、是否命中、是否過期、是否換 model/effort,都會改變成本。尤其 source 設定的 notes_model=claude-sonnet-5-5 與 effort=low 只是程式字串與設定選項;本次沒有核官方 availability、帳號權限或各 provider 是否支援相同名稱。
本機限定測試結果
為避免 live model、cloud、私有 HOME 與安裝依賴,本次只在 scratch 複製純函式並調整 TypeScript import specifier,使用 Node strip-types 跑 fixture:
node --experimental-strip-types --test fixture-pure.mjs
tests 3 / pass 3 / fail 0 / exit code 0
覆蓋項目:重複失敗簽名與提醒、done-without-verification heuristic、distill action 的 secret-like rejection 與 quote mismatch rejection、guard regex sample validation、guard proposal 初始狀態為 proposed。直接跑 repo 測試 hooks/loops.test.ts 因本機沒有 claude-code/testing package 失敗,未安裝依賴。父流程重新執行三組純函式 fixture,同樣 3 pass/0 fail;另兩項合成邊界檢查重現「送出前 transcript 保留 secret-like 字串」與「無效 guard regex 回傳不命中」,沒有任何網路呼叫;這些反例不是完整整合或安全認證。
採用建議
- 把它視為高權限本機 Mod:會讀對話、工具呼叫、寫
~/.claude/projects 與 plugin store,且會在新 session 注入 context。
- 若使用 API key、Bedrock、Vertex 或扣額度模式,先關閉或審慎測試 cache refresh;不要假設 55 分鐘刷新仍命中。
- 先用小型非敏感 repo 試跑,開啟 git diff review;特別注意 promote 會引導 AI 寫
CLAUDE.md 或 .claude/skills。
- 不要把 notes 當權威記憶;定期看 panel 與
ctx-handoff.md,刪除錯誤記憶。
- guard 適合窄規則:例如特定工具、特定命令或正式環境危險操作;不適合模糊的寫作品質或推理順序。
來源覆蓋與實測限制
主貼、作者的早期版本/可能有 bug 警告,以及公開可讀的部分回覆已納入;畫面顯示的全部回覆未逐一取得。附圖的守門 4、記憶 63、規則 7 是作者面板展示,不代表本次重現。版本與源碼查核以固定 commit 為準,功能品質、快取命中與額度節省仍未做 live 驗證。
資料來源