📄 本页由源文件
skills/dev-flow/references/drift-handling.md自动投影生成(单一权威源)。请勿直接编辑本页。
需求漂移处理子流程
来源:从
references/working-context.md拆出(v1 创建 2026-05-19,独立文件 2026-05-19) 加载触发:仅在references/doc-sync-rules.md §路由分流命中「内部需求/方案漂移」分支时按需加载,普通创建/更新工作上下文场景不需要加载本文件。 反向引用:references/working-context.md、references/doc-sync-rules.md、SKILL.md、references/_index.md、../tech-doc/config/triggers.yaml
设计意图
用户在 dev-flow 推进中常通过沟通获取澄清结论,这些「带外信息回流」必须强制刷新工作上下文,否则 AI 会基于过时上下文继续编码,导致已写代码与最新需求漂移。
与 references/doc-sync-rules.md 的关系
doc-sync-rules 负责「外部文档变更」的同步(文档平台/Figma/protobuf),本子流程负责「内部上下文与已写产物」的对账。两者由 doc-sync-rules.md §路由分流 互相调度,单一权威源不重复。
触发条件
由 references/doc-sync-rules.md §路由分流 路由进入,触发信号包括:
- 用户消息命中
doc-sync-rules.md §B/C/D触发关键词(沟通结果回流 / 需求方案否定 / 澄清式调整) - AI 在编码前自检发现工作上下文「需求/计划/范围」与最近 5 轮用户输入存在语义冲突
模式豁免:mode: micro-fix 时跳过本子流程(任务规模 ≤3 行改动,沟通澄清场景几乎为零,强制反而打扰)。
显式命令触发(推荐)
用户输入 dev:fix --drift [描述] 直接触发,跳过 §B/C/D 关键词匹配判定。AI 收到此命令后无需调用 doc-sync-rules.md §路由分流,直接加载本文件 §三 三步动作执行。
三步固定动作(禁止跳过)
步骤 1:静默对账(≤15 秒)
读取以下区块的当前内容,与用户最新输入做语义 diff:
| 对账对象 | 区块名 | 关注点 |
|---|---|---|
| 业务目标 | ## 需求 / ## 需求理解(最终定稿) | 用户故事、不做边界 |
| 执行计划 | ## 计划 | 步骤清单、不做什么 |
| 影响范围 | ## 范围 | 文件清单、上下游影响 |
| 已写代码(仅 phase=coding/integration) | ## 编码进度细节 | 已改文件 + 实际状态 |
步骤 2:输出「漂移摘要 + 决策选项」(强制交互)
输出格式(≤15 行,必须先表格再 ask_followup_question,遵循 AI 行为规范「交互式选项一致性规则」):
## 🔄 检测到需求漂移
**变更点**:
- 原:{旧描述}
- 现:{新描述}
**影响范围**:
- 工作上下文区块:{## 需求 / ## 计划 / ## 范围 / ## 约束与决策} 中的 N 个需要刷新
- 已写代码:`{相对路径}` L{行号} 可能需要 {撤销 / 调整}
- 外部文档:{技术方案文档 / devlog} 是否需要更新正文(非仅追加备注)
| 选项 | 含义 |
| --- | --- |
| ① 全部按新需求刷新(推荐) | AI 同步刷新工作上下文 4 区块 + 标记旧决策 + 更新 文档平台 正文 + 列出已写代码回滚清单 |
| ② 仅记录到 ## 约束与决策 | 主区块暂不动,适合「待最终确认」场景 |
| ③ 我先回答 AI 的澄清问题再决定 | 进入交互式澄清问答 |
| ❌ 误判,继续原方案 | 取消本次漂移处理 |步骤 3:执行刷新(用户选 ① 后)
强制执行项:
## 约束与决策追加一行(带时间戳,复用既有删除线规范,详见references/working-context.md§ 字段说明 中「约束与决策」行):
- 2026-05-19 14:30 [需求漂移] 与产品 IM 沟通后调整:~~原 X~~ → 现 Y。影响 ## 计划 §2 / ## 范围:`{相对路径}`- 刷新主区块:
- 旧内容用
~~删除线~~包裹(不删除,保留可追溯性) - 新内容紧跟在删除线后追加
- 区块顶部加一行
> 🔄 最近一次刷新:{YYYY-MM-DD HH:mm}(需求漂移)
2.1 重写「当前执行方案」唯一视图(强制,本子流程的核心动作)
设计意图:解决多次需求变更/迭代后,AI 在
## 需求/## 计划/## 约束与决策三处散落的最新结论中读错或遗漏,导致编码偏离最新需求的问题。每次漂移后必须把"当前要做什么"重新打包成一份完整视图,作为编码前的唯一权威源。
操作:在 ## 需求 章节末尾重写(而非追加)以下子区块——若已存在则整体替换,旧版搬入「历史版本」表格保留 1 行摘要:
### 当前执行方案(v{N},定稿于 {YYYY-MM-DD HH:mm},关联 CR-{X}{, CR-Y})
> ⚠️ AI 编码前必读:本节是当前唯一权威源。如时间戳早于 `## 约束与决策` 最后一条 `[需求漂移]` 时间,需先重新走本子流程刷新本节。
> 版本号规则:`v{N} = change_requests 数组长度 + 1`(含本次新追加的 CR)。
#### 当前要做什么
- {改动点 1:完整描述,不依赖删除线历史}
- {改动点 2}
- …
#### 不做什么(边界)
- {边界 1}
- {边界 2}
#### 历史版本(每行 1 句摘要)
- v{N-1}({date}):{被替代的核心原因,≤30 字}
- v{N-2}({date}):{摘要}重写要求:
- ✅ "当前要做什么"必须完整描述当前最新方案,不允许写"在 v2 基础上去掉 X" 这类增量描述(防止 AI 跨会话读时还要回查 v2)
- ✅ "不做什么"必须包含历史所有版本累计声明的边界(去重合并),不允许只写本次新增的边界
- ✅ 版本号 v{N} 必须与本次步骤 3.5 即将追加的 CR 序号一致(CR-{N-1} 对应 v{N},因为 v1 是无 CR 的初版)
- ❌ 禁止跳过本步骤直接进入步骤 3 的其他动作;本子区块的存在性是步骤 3.5 完成的前置条件
- 同步刷新
.flow.recovery四段式(见references/active-flows.md§恢复指令):
recovery:
yesterday: "需求调整:X→Y,已刷新工作上下文,待对已写代码做回滚评估"
next_action: "{下一个具体动作}"
current_plan_summary: "v{N}:{当前完整方案 1 句话摘要 ≤80 字,与刚刚步骤 3.2.1 重写的『当前执行方案 v{N}』中『当前要做什么』首句保持一致}"
pending: ["{遗留待确认问题}"]⚠️ 必须刷新
current_plan_summary:本字段是跨会话恢复时 AI 编码前必读的「当前方案唯一摘要」。 漂移流程走完只更新 yesterday/next_action/pending 而漏改 current_plan_summary → 下次恢复时 AI 仍按旧方案编码(同形偏失)。
- 生成已写代码回滚清单(仅
phase ∈ {coding, integration}时):
- 在
## 编码进度细节表格中标记影响的文件「状态: 待回滚」 - 询问用户是 AI 自动回滚还是用户手动处理(强制交互,不可静默回滚)
步骤 3.5:记录 CR 条目(drift 处理完成后自动执行)
本步骤在步骤 3 的强制执行项完成后自动执行,无需用户操作。
将以下信息追加到工作上下文 YAML front matter 的 change_requests 数组:
- id: "CR-{序号}" # 从 1 开始递增(基于当前 change_requests 数组长度 +1)
description: "{漂移摘要中的「变更点-现」}"
type: "{scope|code|ui}" # AI 根据变更内容判断
level: "{minor|major|critical}" # AI 基于影响范围评估
detected_at: "step-{当前步骤}"
detected_time: "{ISO 8601 当前时间}"
status: "in_progress"
impact: "{漂移摘要中的「影响范围」}"
resolution: "" # 步骤 5.5 AI 自动标记 done 时填写判断标准:
type: scope:新增/删除功能点、改变业务边界type: code:实现方式变更(API/算法/数据结构)type: ui:界面/交互变更level: minor:影响 ≤2 个文件,不改变 API 契约level: major:影响 ≥3 个文件或改变 API 契约level: critical:跨项目影响或需要重新评审
与步骤 5.5 的联动:步骤 5.5(L1 审查通过后),AI 自动检测本轮 git diff 是否包含 CR description 涉及的文件修改,命中则标记 status: done + 填写 resolution。
🔐 门控校验(步骤 3.5 完成后自动执行)
物理事实校验,不依赖 AI 承诺。
执行:bash ~/.codebuddy/skills/dev-flow/scripts/lints/doc-sync-lint.sh <flow-name> --mode drift
校验项:
- 工作上下文
change_requests数组长度 > drift 开始前(CR 已追加) - 最新 CR 的
detected_time为今天(非残留旧条目) ## 约束与决策区块含今天日期的[需求漂移]行(约束已记录)
失败 → 🔴 阻断,回退到步骤 3.5 重做。
步骤 4:同步下游文档(必要步骤,不可跳过)
工作上下文已刷新为「当前执行方案 v{N}」。 本步骤将变更传播到全部下游文档(文档平台 / devlog / plan.md / report.yaml)。
执行方式:以 caller=from-drift 加载 references/in-flow-sync.md, 执行文档同步管道(H.0 / H.2 / H.3+ / plan.md / artifacts / working-context + 🔐 门控)。
与独立调用 dev:sync 的差异:
- H.0 CR 登记:工作上下文已有本次 CR(步骤 3.5 创建),扫 git diff 无新增 → 自动跳过
- H.3+ 文档平台:git diff 为空(尚未编码)→ 降级为工作上下文 + 文档平台 两方对账(见 closeout-flow.md H.3+ 边界条件表)
由本步骤承接下来的原 §3.4 职责:
- 文档平台 正文全量更新 → 由 H.3+ 的 文档平台 对账逻辑处理
- 确认清单(字段/流程图/接口/测试建议)→ H.3+ 对账报告覆盖
容错:dev:sync 中个别文档就绪检查失败(如 文档平台 无权限)不阻断本步骤, 仅记入同步报告的「未就绪文档」列表。
步骤 5:输出最终汇总
drifts 的最终步骤,整合所有产出。
✅ 需求漂移处理完成
- **工作上下文**:已刷新为「当前执行方案 v{N}」+ CR-{N} 已登记
- **下游文档**:dev:sync 已完成,状态见上方同步报告
- **编码回滚**:{无 / 已列出清单}
- **下一步**:{继续编码 / 等待用户确认回滚}反模式(违反即拒收)
- ❌ 直接覆盖
## 需求而不保留删除线 → 破坏可追溯性 - ❌ 只刷新
## 需求不更新.flow.recovery→ 跨会话恢复时仍会拿到旧值 - ❌ 默默刷新不交互 → 违反「需求理解优先」红线(开发规范-红线 §核心原则 1)
- ❌
phase: research时也强制生成回滚清单 → 此阶段尚未编码,无回滚对象 - ❌ 命中触发词后未先做静默对账,直接跳到选项交互 → 用户无法判断变更点是否真实
与既有机制的对照表
| 既有机制 | 关系 | 说明 |
|---|---|---|
## 约束与决策 删除线规范(见 references/working-context.md § 字段说明 中「约束与决策」行) | 复用 | 本子流程是其触发器之一,不重复定义格式 |
references/doc-sync-rules.md §路由分流 | 互补 | 一个管外部文档,一个管内部上下文,由路由分流互相调度 |
references/iteration-fix.md 重大复杂度 | 正交 | iteration-fix 是「提测/上线后」的修复路径,本子流程是「开发中」的澄清回流 |
### 恢复指令 三段式(见 references/active-flows.md §恢复指令) | 同步 | 漂移刷新后必须同步更新 yesterday/next_action/pending |
| AI 行为规范「长对话收尾自动沉淀触发器」 | 互补 | 长对话兜底;本子流程是关键词即时触发 |