你在 monorepo 裡讓 Cursor Agent 改支付模組,它卻去動了使用者中心的 DTO;Claude Code 跑了二十轮 bash 之後,突然忘了「禁止直接 import 内部 legacy 包」——这不是模型突然变笨,而是大型專案裡最常見的故障模式:上下文遺失。
2026 年的 Cursor、Claude Code 都標榜百萬級上下文,但工程現場裡,丟約定的頻率並沒有明顯下降。本文交付一套可複現的五步排查法:先分清是哪種「丟」,再按順序查預算、索引、邊界、倉庫約定與會話策略。工具版本截至 2026-07-17(Cursor 1.x、Claude Code 近期 CLI)。
Quick Answer:五步排查一覽
| 步驟 | 你在查什麼 | 典型動作 | 見效信號 |
|---|---|---|---|
| 1. 分類症狀 | 會話截斷 / 索引未命中 / 規則未載入 | 对照下表判断丟法,別一上來換模型 | 知道該修「會話」還是「倉庫」 |
| 2. 查上下文預算 | 工具輪次與自動注入是否撐爆視窗 | 關無關分頁、減 @ 檔案、換更小模型做探索 | 重複指令減少,diff 不再自相矛盾 |
| 3. 重建索引 | .cursorignore、巨型目录、索引陳舊 | Reindex、排除 node_modules / DerivedData | Agent 能自動找到正確套件路徑 |
| 4. 劃定邊界 | 任務範圍是否過大 | 子目錄工作區、顯式 @ 呼叫鏈、寫交接塊 | 改動檔案數落在預期模組內 |
| 5. 寫入倉庫約定 | 口頭規則沒進可檢索文字 | AGENTS.md、.cursor/rules、拆長會話 | 新開會話仍遵守同一約束 |
大型專案裡,「上下文遺失」到底指什麼?
先把概念對齊:長上下文視窗回答「這一刻能不能裝下这么多 token」;有效上下文回答「模型這一轮决策用到了哪些事实」。二者差距在大仓裡会被放大——详見我们此前的AI 程式設計持久記憶一文。
工程師口頭說的「丟了」,通常落在三類:
| 類型 | 表象 | 常見根因 | 優先排查步驟 |
|---|---|---|---|
| A. 會話截斷 | 同一執行緒裡越聊越偏,開始推翻剛才的約束 | 多輪工具輸出擠掉早期指令;compact / 摘要丟細節 | 步驟 2、5 |
| B. 索引未命中 | 「找不到某模組」「以為沒有這張表」 | ignore 過猛、索引未更新、倉庫太大檢索雜訊高 | 步驟 3、4 |
| C. 規則未載入 | 新開會話後命名風格、禁止路徑全忘 | 约定只在聊天裡,AGENTS.md 缺失或過長失效 | 步驟 5 |
步驟 1:先分類——別把所有「忘了」都當成模型問題
接到報錯或離譜 diff 時,用下面 60 秒決策樹:
- 同一會話內前後矛盾?→ 傾向 A 會話截斷,看步驟 2。
- 新開會話才忘約定?→ 傾向 C 規則未載入,看步驟 5。
- 模型堅稱「没有某檔案」,但你
grep得到?→ 傾向 B 索引未命中,看步驟 3–4。 - 報錯是
context length exceeded/prompt is too long?→ 明確的預算問題,直接步驟 2。
Cursor 與 Claude Code 的側重點略有不同:Cursor 的 Composer / Agent 會自動注入開啟檔案與索引片段,容易在 IDE 裡「悄悄撐爆」;Claude Code 終端 Agent 在長 bash 鏈 + 自動 compact 後更易丟中間決策。工具對比見選型文。
步驟 2:檢查上下文預算——視窗大不等於用得省
一次 Agent 任務的真實 token 消耗往往來自:系統提示 + 規則檔案 + @ 檔案 + 工具輸出(grep、測試日誌)+ 歷史摘要。在 12 萬行 TypeScript monorepo 的實測裡,單次 Cursor Agent 若自動讀了 8 個相關檔案並跑完全套測試,輸入側很容易到 80K–120K token——還沒算多輪重試。
2.1 Cursor 側
- 關掉與任務無關的已開啟檔案;大 JSON / 鎖檔案不要留在編輯器裡。
- 探索階段用較小上下文模型或普通 Chat;確認方案後再開 Agent 改程式。
- 避免在一條 Composer 裡串聯「重構 + 寫測試 + 改 CI」——拆成三次任務,每次帶明確檔案列表。
- 注意 Settings 裡的 Codebase indexing 状态;索引失敗時 Agent 会反覆用 grep 硬撐,加速膨脹。
2.2 Claude Code 側
- 長任務觀察是否觸發 auto-compact;compact 後套用固定模板補一句「不可違反約束」。
- 把巨型命令輸出重新導向到檔案,讓 Agent
tail關鍵行,而不是把 5000 行日誌塞進對話。 - 用
/clear或新會話前,先把結論寫入HANDOFF.md或 issue 評論。
| 信號 | 可能原因 | 立刻可做 |
|---|---|---|
| 越到後面越瞎改 | 早期約束被擠出視窗 | 新會話 + 交接塊 + 更短任務 |
| API 帳單單任務飆升 | 反覆讀大檔案 / 全量測試輸出 | 限制測試範圍、用 head/tail |
| 提示 context exceeded | 硬超限 | 減 @ 檔案、拆任務、換探索模型 |
步驟 3:重建索引並清理 ignore——讓 Agent「找得到」
類型 B 的核心是:不是模型不想看,而是檢索鏈路沒把正確檔案送進來。
3.1 檢查 .cursorignore / .claudeignore
合理 ignore 能省索引時間,但過度 ignore 會導致「幽靈盲區」。建議保留排除:
node_modules/、.git/、dist/、build/、DerivedData/- 產生程式碼體積巨大的目錄(若需改產生物,改為顯式 @ 單檔案)
- 二進位與媒體資源
不要把业务源码包随意 ignore——很多团队把 legacy/ 整包排除後,Agent 永遠「看不見」相容層。
3.2 觸發 Reindex
Cursor:Settings → Indexing & Docs → Resync Index(文案隨版本略有差異)。大倉首次索引在 M4 上常見 15–40 分鐘;若本機同時跑 Ollama + Xcode,建議把索引任務放到獨享雲 Mac 節點上完成,避免 swap 讓 IDE 與 Agent 雙雙逾時——這與M4 AI 程式設計實測裡的記憶體結論一致。
git ls-files | wc -l 與索引檔案數對比,索引覆蓋率掉太多時統一 Reindex,比每人各自玄學重啟 Cursor 省時間。步驟 4:劃定邊界——大倉裡最怕「全倉一把梭」
上下文遺失有時是任務定義過大:你問「優化支付」,模型在 40 個套件裡各改一點。
4.1 縮小工作區
- 用 VS Code / Cursor 多根工作區,只打開
apps/checkout+packages/payment-sdk。 - Claude Code 在子目錄啟動:
cd apps/checkout && claude,減少無關路徑進入檢索。
4.2 顯式 @ 呼叫鏈
改 API 時至少 @:介面定義 → 伺服端實作 → 一個真實呼叫方 → 相關測試。我们在 Vue + Spring Boot 前後端倉的實測裡,補上呼叫鏈 @ 後,漏改前端的機率從約 40% 降到 10% 以內——更系統的做法見CodeGraph 案例。
4.3 交接塊模板(Handoff)
長任務換會話前,貼上固定結構:
## Handoff
- 目標:
- 已完成:
- 未完成:
- 不可違反:(路徑/命名/禁止 import)
- 下一步建議開啟的檔案:
这比「帮我把上面總結一下」更不容易丟約束,因為條目是可檢查的,而不是散文摘要。
步驟 5:把約定寫進倉庫,並學會拆會話
類型 C 的根治手段是:讓規則成為倉庫的一部分,而不是聊天的一部分。
5.1 AGENTS.md 與 Cursor Rules
在倉庫根維護簡短、可執行的約定(建議 < 200 行,長了要拆):
- 模組邊界與「禁止 AI 修改」路徑(如
generated/、vendor/) - 命名與錯誤處理風格(附一個「好/壞」範例各一條)
- 改 API 必須同時改哪些層的 checklist
- 必須跑的命令:
pnpm test payment --filter=...
Cursor 會讀 .cursor/rules;Claude Code 會讀 AGENTS.md 與 CLAUDE.md。內容應事實一致,避免兩處打架。
5.2 何時拆會話
| 場景 | 建議 |
|---|---|
| 單功能已合併,開始下一功能 | 新會話 + Handoff |
| Agent 連續 3 次理解跑偏 | 停、寫 Handoff、縮小 @ 範圍 |
| 已觸發 compact / 上下文條過半 | 先落盤約定再續聊 |
| 跨天續作 | 永遠新會話 + 鏈到 PR/issue |
當呼叫鏈跨十幾個套件、@ 檔案仍不夠時,再評估程式知識圖譜類工具——那是步驟 5 之後的增强,不是第一步。
實測案例:12 萬行 monorepo 上的 45 分鐘排錯
某 B2B SaaS 團隊(8 人後端 + 4 人前端)使用 Cursor + Claude Code 維護 pnpm monorepo(约 118k LOC,含 6 個 app、23 個 package)。現象:Agent 修改 billing-api 時反覆破壞 auth-middleware 的類型匯出,且新會話後仍犯。
| 排查順序 | 發現 | 動作 | 結果 |
|---|---|---|---|
| 步驟 1 | 新會話也忘約束 → 類型 C | 確認無 AGENTS.md | 定位根因 |
| 步驟 3 | .cursorignore 誤排除 packages/auth | 修正 ignore + Reindex | Agent 能引用 middleware |
| 步驟 4 | 任務描述「修 billing」過寬 | 工作區縮到 billing + auth 兩套件,@ 测试 | 改動檔案從 19 個降到 6 個 |
| 步驟 5 | 口頭約定未落盤 | 新增 120 行 AGENTS.md + CI 檢查 import 邊界 | 連續一週 PR 無同類回歸 |
團隊未換更貴模型,單任務 token 均值下降約 35%,因為 Agent 不再反覆全倉 grep。他們把 Reindex 與夜間測試放到 Macstripe 24GB 雲節點,本機筆電只連 SSH 寫程式——索引階段 swap 告警消失。
自檢清單:開工前 2 分鐘
- ☐ 能說出本次任務屬於 A / B / C 哪類丟法
- ☐ 編輯器裡只保留相關檔案;巨型日誌未開啟
- ☐
.cursorignore未誤傷業務原始碼 - ☐ 索引狀態正常,或已計畫 Reindex
- ☐ 工作區範圍 ≤ 2–3 個相關套件
- ☐ 已 @ 呼叫鏈關鍵檔案(含一個測試)
- ☐
AGENTS.md含本次「不可違反」条目 - ☐ 長任務準備了 Handoff 模板
FAQ
上下文視窗標稱 200K,為什麼還會丟?
視窗是容量上限,不是注意力保證。Agent 多輪工具调用会把早期指令擠出有效注意力區;摘要 compact 也會丟細節。可檢索的倉庫約定比更長的聊天更可靠。
Cursor 和 Claude Code 誰更容易丟上下文?
Cursor 易在 IDE 自動注入與長 Composer 鏈中丟邊界;Claude Code 易在長 bash 與 compact 後丟中間決策。二者都應主動 @、寫 AGENTS.md、拆任務——沒有「更省心」的一方。
.cursorignore 會影響 @ 手動引用嗎?
手動 @ 單一檔案通常仍可讀;影響的是全倉索引與自動檢索。被 ignore 的目錄需要顯式 @,否則 Agent 很難自己找到。
要不要上程式知識圖譜?
當呼叫鏈跨很多套件、@ 檔案仍漏改時值得試點。小倉或邊界清晰時,先把 AGENTS.md 與 CI 寫好,ROI 更高。
換 Mac / 上雲能改善嗎?
不能增大模型上下文,但24GB 獨享 M4能減少索引與測試時的 swap,避免 Agent 逾時中斷;也可作為團隊統一的「重任務」環境。按天試用即可驗證。