Claude Code 跨会话上下文恢复:从 8 次纠正到 0 次的工程实践

12 阅读7分钟

如果你用 Claude Code 做过超过一周的项目开发,大概率遇到过这个场景:

上午做了一半的功能,下午开新会话继续,结果 Claude 完全不记得之前的工作。你得花 10 分钟解释项目背景、当前进度、技术决策的理由。更糟的是,解释完了它还经常理解偏——你说"继续做登录模块的 token 刷新",它开始给你重写整个认证系统。

这不是偶发问题。Claude Code 是会话级工具,每次新建会话就是一张白纸。在短期任务中这没什么,但在持续迭代的项目开发中,跨会话的上下文断裂会造成三个累积问题:

  • 恢复成本递增:项目越复杂,每次恢复需要的解释越多
  • 纠正成本递增:Claude 基于不完整上下文做出错误判断的概率随项目复杂度上升
  • 一致性递减:同一个功能跨会话开发时,技术方案、命名风格、架构决策会产生漂移

我做了一个量化测试:同一个中等规模项目(十几个功能模块),3 次模拟会话中断后恢复上下文,用手动维护 CLAUDE.md 的方案需要 8 次人工纠正,才能让 Claude 准确对齐之前的工作进度和技术决策。

现有方案的局限

目前社区常见的方案有两类:

方案 A:手动维护 CLAUDE.md

在 CLAUDE.md 中写项目说明、技术约束、当前进度。问题是:

  • 你得记得更新它——做完一个功能忘了改进度,下次就会脱节
  • 格式不统一——每次手写的粒度不一样,Claude 解析不稳定
  • 只有"是什么"没有"在哪"——知道项目用 React,但不知道 token 刷新做到哪一步了

方案 B:TodoWrite 任务列表

用 Claude 内置的 TodoWrite 跟进度。问题是:

  • 任务完成就消失了——没有历史上下文
  • 不处理变更——你说"这个先不做了",TodoWrite 没有"暂停并保留工作成果"的概念
  • 没有质量保障——Claude 跳过测试或者自己审批自己的事经常发生

两种方案的共同问题:它们管的是信息,不是流程。 真正需要的是项目状态的自动维护 + 流程规则的强制执行。

解决思路:让 Claude 自己维护项目状态

核心设计思路有三条:

  1. 状态自动维护:每次会话结束时 Claude 自动更新项目状态文件,下次会话自动读取恢复。人不需要手动维护任何东西
  2. 结构化 Markdown:所有状态文件是纯 Markdown,有明确的 Schema 约束。LLM 和人类都能读写,不依赖任何外部服务
  3. 规则驱动行为:通过 Claude Code Plugin 的 Rules 机制注入行为规则,让 Claude 在特定场景下自动执行流程(创建变更请求、质量检查、等待人工审批等)

基于这个思路,做了 devpace——一个 Claude Code Plugin,v1.6.0,MIT 开源。

核心机制

双模式设计

devpace 有两种工作模式:

  • Explore 模式(默认):自由读代码、分析、讨论。不触发任何流程,不修改状态文件。问问题、看代码时零摩擦。
  • Advance 模式(改代码时):通过 /pace-dev 触发。创建变更请求(CR),进入状态机(created → developing → verifying → in_review → approved → merged),自动运行质量检查。

你不需要主动想模式的事。问问题就是 Explore,开始实现功能就是 Advance。

.devpace/ 目录结构

运行 /pace-init 后生成最小状态目录:

.devpace/
├── state.md          # 项目状态快照(限制 15 行)
├── project.md        # 价值功能树:目标→功能→任务
├── backlog/          # 初始为空,开始开发后自动创建 CR 文件
│   └── CR-001.md     # (第一个任务时自动出现)
└── rules/
    ├── workflow.md   # CR 状态机规则
    └── checks.md     # 质量检查(从工具链自动检测)

关键:state.md 限制在 15 行。过长的状态文件增加 token 消耗且降低恢复准确率。15 行包含:业务目标摘要、当前进行中的工作、下一步建议。

11 个 Hook 管理完整的会话生命周期:

  • session-start.sh:读取 state.md,注入上下文。Claude 一句话报告现状。
  • session-end.sh:更新 state.md,记录工作进展和下一步。
  • pre-compact.sh:上下文窗口压缩前保存状态,防止长对话丢失信息。
  • intent-detect.mjs:检测代码变更意图,建议进入 Advance 模式。

渐进式披露:初始化只有最小文件集。迭代文件在 /pace-plan 时出现,度量文件在 /pace-retro 时出现,发布文件在 /pace-release 时出现。你不会看到不需要的复杂度。

state.md 示例

> 目标:用户权限系统 → 成效指标:支持 RBAC + OAuth 登录
> 迭代:ITER-002(核心权限模块)| 进度:3/5 产品功能已完成

- **进行中**:Token 刷新机制 → 步骤 3/5:middleware 实现
- **待 Review**:角色权限矩阵
- **决策**:选择 JWT 而非 Session | Redis 缓存 Token 黑名单
- **下一步**:完成 middleware 后运行集成测试,然后提交 Review

会话开始时 Claude 读到这个,输出:"上次停在 Token 刷新的 middleware 实现,角色权限矩阵在等 Review。继续?"——不输出 ID、状态机术语,只说人话。

三级质量门

级别触发时机执行者可跳过?
Gate 1开发完成 → 进入验证Claude 自动
Gate 2验证通过 → 提交审查Claude 自动
Gate 3审查 → 批准合并人工审批不可跳过

Gate 3 是硬约束——写死在规则里,无论 Claude 认为变更多简单,都必须等人确认。

三个专业子代理

  • pace-engineer:处理实现(/pace-dev/pace-test)。技术视角,关注代码和测试。
  • pace-pm:处理规划和变更(/pace-change/pace-plan)。业务视角,关注价值和优先级。
  • pace-analyst:处理回顾(/pace-retro)。数据视角,关注度量和趋势。

数据对比

跨会话恢复测试

指标devpace手动 CLAUDE.md
3 次中断后纠正次数0 次8 次
恢复方式自动读取 state.md手动解释

7 维度能力对比

维度devpace手动方案TodoWrite
跨会话恢复自动手动无持久化
变更管理5 种场景 + 影响分析
质量保障3 级质量门,人审不可跳过
价值追溯OBJ→BR→PF→CR 全链路任务→完成
度量能力DORA 代理指标
风险管理预飞行扫描 + 分级响应
角色适配5 种角色视角

总分:devpace 21/21 vs 手动方案 7/21 vs TodoWrite 4/21

变更管理:核心差异化

开发中途需求变了是常态,但现有工具都没有真正处理这个问题。

devpace 的 /pace-change 支持 5 种变更场景:

场景触发方式Claude 的处理
需求插入"加一个 XX 功能"影响分析 → 容量评估 → 创建 CR
需求暂停"这个先不做了"保留工作成果 → CR 暂停 → 解除依赖
需求恢复"之前暂停的继续做"从暂停点恢复 → 检查上下文是否过期
优先级重排"XX 先做"重排计划 → 更新 state.md
需求修改"XX 的要求变了"识别返工 → 质量检查重置 → 更新验收标准

还支持 undo(撤销上次变更)和 batch(批量变更)。

安装与试用

Marketplace 安装(推荐):

/plugin marketplace add arch-team/devpace
/plugin install devpace@devpace

从源码安装

git clone https://github.com/arch-team/devpace.git
claude --plugin-dir ./devpace

然后:

/pace-init

Claude 问你一个问题:"用一句话描述项目做什么"。然后自动检测工具链,创建 .devpace/。开始工作,关会话,开新会话。看 Claude 是否还记得。

局限与诚实评价

  • 价值感知延迟:第一个会话感受不明显,需要 2-3 次跨会话恢复才能体会
  • 概念门槛:BizDevOps 的价值链对不熟悉的开发者有理解成本(但日常只用 3-4 个命令)
  • 适用范围:不适合一次性脚本。目标是多会话持续迭代的项目
  • 平台限制:目前只支持 Claude Code

GitHub:github.com/arch-team/d… 许可:MIT | 版本:v1.6.0 | 18 Skills | 34 场景验证


一个受够了每天早上对 Claude 说三遍"不对,我们已经决定过了"的开发者做的。