Files
git-learn/skill-workbench/docs/sm-flow/workflow.md
T
zhuyongxin c9a6777340 sm-flow v4.2: add verifiable checkpoints and gate file mechanism
Based on real execution review (lookup-knowledge-integration), discovered
that constraints are "soft" - rules are clear but lack enforcement mechanism.

Core problem: Agent can skip stages despite explicit rules saying "must not skip"

Changes:
1. Commit phase: add verifiable checkpoint
   - File completeness check: proposal ≥50 words, design ≥1 data structure, specs ≥3 requirements, tasks ≥5 items
   - Consistency check: proposal concepts → design mapping, design decisions → tasks implementation
   - Gate file: create .committed after passing all checks

2. Apply phase: add pre-gate check
   - Hard constraint: check .committed file existence
   - If missing: report, list gaps, ask user to fix or explicitly skip
   - Block implementation based on incomplete OpenSpec

3. Archive phase: add mandatory execution order
   - 5-step checklist: devflow files → index → .archive-ready → report → archive
   - Self-check: verify Step 1-3 before Step 4
   - Prevent "handoff first, devflow forgotten" issue

New gate files:
- .committed: created by commit phase, checked by apply phase
- .archive-ready: created by archive Step 3

Expected impact:
- Commit skip rate: -100% (explicit checklist prevents fuzzy pass)
- Apply on incomplete OpenSpec: -100% (gate blocks)
- Archive devflow omission: -100% (mandatory order)

Design principles:
- Verifiability: "executable state" → "≥50 words + ≥1 structure + ≥3 requirements"
- Gate files: soft judgment → file existence check
- Mandatory order: advisory "should do" → 5-step checklist "must do"

Complexity: +80 lines (phase-contracts.md +40, archive-rules.md +40)
Approach: turn soft constraints into hard checks, no new stages

Relation to v4.1:
- v4.1: solve "insufficient research causes rework" (quality issue)
- v4.2: solve "lack of enforcement causes stage skipping" (process issue)

Docs:
- phase-contracts.md: enhanced commit + apply phases
- archive-rules.md: added mandatory execution order at top
- workflow.md: added v4.2 evolution chapter
- phase-contracts-v4.2-changelog.md: detailed change log
- sm-flow-optimization-suggestions.md: source review
2026-06-24 14:51:45 +08:00

1118 lines
53 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SM-Flow 工作流
## 当前设计理念(v4 方向)
**核心定位**:sm-flow 是一个**用提示词实现的协议层 harness**——编排 OpenSpec 的完整生命周期,通过阶段、门控、人类对齐和长期记忆,约束 agent 以正确的顺序、条件和标准使用 OpenSpec。
**四层架构**:
```
sm-flow → 编排层(harness):阶段、门控、产物约束、人类对齐
OpenSpec → 执行引擎:propose/apply/archive 的能力提供方
devflow/ → 记忆层:为编排层提供上下文,接收执行结果的回填
code → 实现结果:apply 的产出
```
**用户命令(4 个)**:
| 命令 | 用户意图 |
|---|---|
| `/sm-flow` | 完整流程 |
| `/sm-flow explore` | 先想想(需求不清楚) |
| `/sm-flow apply` | 只执行(已有 Committed OpenSpec) |
| `/sm-flow archive` | 收尾(回填 devflow + 归档确认) |
**内部阶段(9 个,英文动词命名)**:
```
clarify → context → propose → grill → specify → audit → commit → apply → archive
入口澄清 上下文 轻量提案 澄清 细化 审计 提交 执行 归档
```
阶段名是 harness 的内部协议词汇(用于 checkpoint 汇报和进度通知),不是用户 API。用户只需知道 4 个命令,其余通过自然语言交互,由 harness 识别意图后编排。
**关键设计决策**:
- **真理源分层**:devflow = 上下文(术语、历史决策、验收记录),OpenSpec = 执行(唯一执行真理源),代码 = 结果。devflow 增强 OpenSpec,不替代 OpenSpec。
- **Draft / Committed 分离**:propose 产出 Draft OpenSpec(讨论对象),commit gate 后成为 Committed OpenSpec(执行许可)。apply 只执行 Committed OpenSpec。
- **grill 在 specify 前**:先澄清需求再细化产物,避免"细化 → grill → 回写细化"的返工循环。propose 只写轻量 proposal.md,grill 稳定需求后 specify 才补全 design/specs/tasks。
- **devflow 延迟写入**:clarify → apply 期间只维护 `decisions.md` 作为过程日志,archive 阶段从中提取完整 devflow 档案(brief/evidence/acceptance)。
- **micro ≠ skip**:快速模式合并 gate(clarify+context 合并 checkpoint → propose+specify 合并 checkpoint → grill 最少 1 个问题 → commit 简化检查),但保留最关键的门控。
- **质量约束可观测**:质量约束必须转化为可观测产出(写入文件 + checkpoint 检查),否则不是约束而是建议。
**使用方式**:
详细的使用说明见 [使用方式.md](./使用方式.md),包括:
- 4 个用户命令的典型场景
- 完整规划 → 执行 → 归档的分次调用示例
- 自然语言交互方式
- 规模分档(micro / standard / complex)
- devflow 自动维护机制
- OpenSpec 集成与 Draft/Committed 分离
- 常见问题解答
---
## 演进历史
以下是 sm-flow 工作流的历史演进记录,从 v1 到当前 v4 方向。每一版都从真实执行失败中提炼,不是理论推演。
## 旧工作流 vs 新工作流
```
旧: 新:
Phase 1 手动整理PRD Phase 0 手动初始PRD(入口,保留人的判断)
Phase 2 openspec:explore Phase 1 openspec:propose → research
Phase 3 grill-me Phase 1.5 to-prd → 结构化PRD(替代初始PRD)
Phase 4 openspec:apply Phase 2 grill-with-docs → CONTEXT.md + ADR
Phase 2.5 zoom-out → 架构审计
Phase 3 openspec:apply → 执行
diagnose → bug排查
tdd → 质量闭环
横切: 横切:
无 git-guardrails → 安全锁
```
关键变化:**手动 PRD 从"整个流程的全部输入"降级为"Phase 0 的启动草稿"**——你仍然需要手写初始 PRD(这是人的判断力不可替代的部分),但它不再直接喂给 openspec apply,而是先经过 research → 精化 → grill → 架构审计,最终执行的是层层校验后的方案。
## 旧工作流的三个关键缺口
1. **需求澄清后缺少可行性验证**
- 旧:grill-me 追问后 → 直接进入 apply。如果方案有架构问题,到了编码阶段才发现
- 新:grill-with-docs 追问后 → zoom-out 拉高视角做架构审计。grill 问的是"需求对不对",zoom-out 问的是"方案行不行"
2. **openspec 产出不能沉淀到长期记忆**
- 旧:openspec archive 只归档需求,项目的术语、业务规则、架构决策散落在对话中,下次新对话全丢
- 新:grill-with-docs 的 CONTEXT.md 沉淀领域词汇表,ADR 沉淀架构决策。换会话重启 AI 也不丢失上下文
3. **apply 完成后缺少验证闭环**
- 旧:apply → 完成。功能对不对取决于人肉测试
- 新:apply 过程中遇到 bug → diagnose(假说→验证→修复→回归测试),写代码时 → tdd(Red→Green→Refactor)
## 新增技能的投入产出
| 技能 | 学多久 | 一次省多少 | 什么时候用 |
|------|--------|-----------|-----------|
| to-prd | 0 分钟(自动综合) | 10-15 分钟 | openspec research 结束后 |
| grill-with-docs | 替换已有 grill-me | 0 额外时间 + 产出文档 | 需求澄清阶段 |
| zoom-out | 10 秒(一句话) | 避免方向性返工 | grill 完成后、apply 前 |
| diagnose | 5 分钟了解流程 | 每次 bug 省 20-30 分钟 | apply 中遇到问题 |
| tdd | 5 分钟了解流程 | 减少回归 bug | apply 中写代码 |
| git-guardrails | 0 分钟(被动生效) | 防止灾难性操作 | 全程自动 |
## 为什么这套组合优于单纯依赖 openspec
openspec 管控的是"流程"——先出 proposal,再写 specs,再排 tasks。但它不解决三个问题:
- **领域知识沉淀**:openspec 归档后只剩需求文档,术语表、架构决策全丢了 → grill-with-docs 补齐
- **质量验证**:openspec 把 tasks 勾完就算完成 → diagnose + tdd 补齐验证闭环
- **流程安全**:openspec 不管 AI 误操作 → git-guardrails 补齐安全层
一句话:**openspec 管"按什么步骤走",mattpocock 技能管"每一步走得好不好"。**
## v2.0:devflow/ 产物聚合层
### 问题
v1.0 一次完整流程的产物散落在 **5 个位置**:
```
CONTEXT.md ← Phase 2 (根目录)
docs/adr/ ← Phase 2 (docs/)
docs/agents/ ← Phase 1.5 (docs/)
openspec/changes/ ← Phase 1+3 (openspec/)
knowledge/entries/ ← /knowledge-absorber
```
三个月后想回溯"knowledge-index-panel 这个项目到底做了什么决策",需要同时翻 4 个目录。产物按**工具来源**组织(openspec 写哪、grill 写哪、to-prd 写哪),而非按**项目本身**组织。
### 借鉴 CodeStable 的单一聚合根设计
CodeStable 的核心设计决策:所有产物集中在 `codestable/` 一个目录下,按"软件实体类型"(需求/架构/特性/问题/知识)分子目录,而非按"哪个工具产生的"。
dev-flow v2.0 借鉴这一点,在不改变 openspec 工作区的前提下,增加一个**人类可读的档案层**:
```
devflow/ ← 单一入口
├── projects/YYYY-MM-DD-{slug}/ ← 一个 PRD→实现 闭环
│ ├── {slug}-prd.md # Phase 0+1.5 需求文档
│ ├── {slug}-research.md # Phase 1 技术方案(从 openspec 提取)
│ ├── {slug}-design.md # Phase 1+2.5 设计 + 架构审计
│ ├── {slug}-tasks.md # Phase 1 任务清单(从 openspec 提取)
│ ├── {slug}-acceptance.md # Phase 3+4 验收报告
│ └── adr/ # Phase 2 架构决策
├── glossary/
│ └── CONTEXT.md # 跨项目领域词汇表
├── compound/ # 跨项目知识沉淀
│ └── YYYY-MM-DD-{type}-{slug}.md # type ∈ {learning, trick, decision, explore}
└── reference/ # 共享模板/规范
```
### 两层架构
| | openspec/changes/ | devflow/projects/ |
|------|-----------|-------------------|
| 角色 | 工具工作区(WAL) | 人类档案层(Tables) |
| 谁读 | 机器 | 人 |
| 生命周期 | 活跃变更期 → Archive 后清空 | 永久保留 |
| 组织方式 | 按变更名 | 按日期 + 项目 |
**关键**:openspec archive 后 `openspec/changes/` 清空,但 `devflow/projects/` 不受影响。Phase 4 收尾时从 openspec 提取关键内容到 devflow。
### 各 Phase 产物路径变化
| Phase | v1.0 | v2.0 |
|-------|------|------|
| 1.5 PRD | `docs/agents/<name>-prd.md` | `devflow/projects/{date}-{slug}/{slug}-prd.md` |
| 2 CONTEXT | 根目录 `CONTEXT.md` | `devflow/glossary/CONTEXT.md` |
| 2 ADR | `docs/adr/` | `devflow/projects/{slug}/adr/` |
| 2.5 架构审计 | 对话中,丢失 | `devflow/projects/{slug}/{slug}-design.md` |
| 4 验收 | `docs/agents/lessons/` | `devflow/projects/{slug}/{slug}-acceptance.md` |
| 4 经验沉淀 | 无 | `devflow/compound/YYYY-MM-DD-{type}-{slug}.md` |
| 4 从 openspec 提取 | 无 | 提炼到 `{slug}-research.md` + `{slug}-tasks.md` |
## 一键启动
已固化为 skill:**`/dev-flow`**
```
/dev-flow # Phase 0 开始:粘贴初始 PRD 草稿 → 走完后续全流程
/dev-flow --prd docs/my-idea.md # 跳过 Phase 0,直接用已有 PRD 文件 → Phase 1
/dev-flow --from phase2 # 已有 research,从 grill 开始
/dev-flow --from apply # 已有 PRD + 文档,直接执行
/dev-flow --quick # 小需求,跳 PRD 精化 + zoom-out
```
Skill 位置:`.claude/skills/dev-flow/SKILL.md`
## Skill 评估结论(2026-05-19)
详细评估报告见:`devflow/projects/2026-05-19-dev-flow-skill-evaluation/dev-flow-skill-evaluation.md`。
### 总体判断
`dev-flow` 的方向是正确的:它没有试图替代 openspec,而是在 openspec 的流程控制之上增加需求精化、架构审计、质量闭环和长期知识沉淀。
最有价值的设计是 `devflow/` 产物聚合层:
- `openspec/changes/` 负责机器可执行的变更工作区。
- `devflow/projects/` 负责人类可回溯的项目档案。
- `devflow/glossary/CONTEXT.md` 负责跨项目领域词汇。
- `devflow/compound/` 负责沉淀可复用工程知识。
评估中发现的核心问题是:早期 `SKILL.md` 更像设计说明书,而不是代理可稳定执行的运行手册。它解释了很多理念,但缺少执行时必需的检查点、模板、分支规则和 fallback 策略。
### 已确认的亮点
1. **产物聚合层设计清晰**
- `devflow/projects/YYYY-MM-DD-{slug}/` 解决了 openspec archive 后上下文难以回溯的问题。
- 工具工作区和人类档案层分离,职责边界明确。
2. **阶段顺序合理**
- Phase 0 → Phase 1 → Phase 1.5 → Phase 2 → Phase 2.5 → Phase 3 → Phase 4 的顺序能有效避免“需求没想清楚就开始编码”。
3. **Phase 4 很有价值**
- 从 openspec 提炼 research、design、tasks、acceptance、ADR 和 compound knowledge。
- 这是区别于普通 openspec 流程和普通编码 skill 的核心优势。
4. **文档化追问方向正确**
- Phase 2 要求一次只问一个问题,并即时更新 `CONTEXT.md` / ADR。
- 这符合“边澄清边沉淀”的工作方式。
5. **质量闭环意识强**
- Phase 3 明确要求 bug 不允许猜测式修复,必须走 diagnose 协议。
- TDD 被设计为可选增强,避免对所有任务强制套用重流程。
### 主要改进点
| 问题 | 改进方向 |
| --- | --- |
| 触发描述不够完整 | 明确覆盖需求到实现、规划 feature、执行 openspec change、沉淀工程文档、规范化开发流程等场景 |
| Claude 工具耦合较强 | 保留 Claude 版本兼容,同时在 skill 正文中提供环境无关 fallback |
| 依赖安装状态写死 | 改为启动时检查 required / optional / fallback |
| 子 skill 调用方式不稳 | 优先调用子 skill;不可调用时读取对应 `SKILL.md`;不存在时执行最小协议 |
| 缺少初始化算法 | 明确 `devflow/` 目录骨架、slug 生成、重名处理和旧 `CONTEXT.md` 迁移规则 |
| 缺少模板 | 拆出 PRD、research、design、tasks、acceptance、CONTEXT、ADR、compound knowledge 模板 |
| quick 模式与约束冲突 | quick 只能跳 Phase 1.5 和 2.5,不能跳 Phase 2 最小澄清和 Phase 4 轻量归档 |
| Phase 退出条件不足 | 为每个 Phase 增加进入条件、动作、输出、退出条件和失败回退路径 |
### 产品化方向
评估结论不是继续增加理念,而是把 workflow 产品化为“代理稳定执行协议”:
- `SKILL.md` 保持短而硬:角色、触发场景、阶段总览、核心规则、关键分支。
- `references/` 承载长内容:Phase 契约、模板、归档规则、fallback 协议。
- 每个 Phase 都要有明确的进入条件和退出条件。
- quick 模式、fallback、归档确认、人类检查点必须写成硬规则。
- `devflow/` 只做长期记忆和上下文增强,不应与 openspec 抢执行真理源。
### 后续演进:sm-flow 产品化
基于这次评估,`dev-flow` 的设计被重构为 `.agents/skills/sm-flow/`。这一步仍属于 **v2 产品化**:目标不是改变 v2 的“devflow 聚合层”定位,而是把早期设计说明书拆成代理可执行的 skill 结构。
```
.agents/skills/sm-flow/
├── SKILL.md # 短执行协议
└── references/
├── phase-contracts.md # Phase 输入/动作/输出/退出条件
├── templates.md # PRD/ADR/验收等模板
├── archive-rules.md # 从 openspec 提取到 devflow 的规则
└── fallbacks.md # 子 skill 不可用时的最小协议
```
v2 的核心仍然是:在不改变 openspec 工作区的前提下,增加 `devflow/` 作为人类可读档案层,并让 Phase 4 把 openspec、实现、验证结果提炼回长期记忆。
## v3.0:OpenSpec-first / Devflow-assisted
### 背景
v2 跑通后暴露出一个更深的问题:`devflow/` 产物越来越完整,容易让代理在执行阶段直接依赖 PRD、design、tasks、acceptance 等档案写代码,从而弱化 openspec 的执行真理源地位。
这会导致两套“执行依据”并存:
```
devflow/projects/{slug}/... # 人类档案层,也包含 PRD/design/tasks
openspec/changes/{change}/... # 工具工作区,也包含 proposal/design/specs/tasks
```
如果没有主从关系,Phase 3 执行时代理可能不知道到底听 devflow tasks,还是听 openspec tasks。文档越多,不一定越准确;没有唯一执行真理源时,反而更容易漂移。
### v3 的核心判断
v3 不重新设计一套替代 openspec 的工作流,而是明确:
> **devflow 辅助 OpenSpec,OpenSpec 指挥执行,执行结果回填 devflow。**
职责分层变为:
| 层 | 角色 | 负责回答 |
| --- | --- | --- |
| `devflow/` | 上下文真理源 / 长期记忆 | 为什么这样做?术语是什么?历史决策是什么?之前怎么验收? |
| `openspec/changes/` | 执行真理源 / 当前变更规格 | 这次到底改什么?验收标准是什么?任务是否完成? |
| code | 实现结果 | OpenSpec apply 后实际落地的代码 |
### v2 vs v3
| 维度 | v2:devflow 聚合层 | v3:OpenSpec-first / Devflow-assisted |
| --- | --- | --- |
| 核心目标 | 防止 openspec archive 后上下文丢失 | 防止 devflow 与 openspec 成为并列执行源 |
| devflow 角色 | 人类可读档案层 | 上下文增强层 + 归档层 |
| openspec 角色 | 工具工作区 | 当前变更的唯一默认执行真理源 |
| Phase 1 | openspec propose 产出 research | 基于 devflow 上下文生成/修正 OpenSpec 产物 |
| Phase 2 | grill-with-docs 更新 glossary/ADR | human-in-the-loop 澄清后必须回写 OpenSpec |
| Phase 2.5 | zoom-out 产出架构审计 | 架构审计若影响实现,必须回写 OpenSpec design/tasks |
| Phase 3 | openspec apply + diagnose/tdd | 默认只能依赖 OpenSpec apply;devflow 只作参考上下文 |
| Phase 4 | 从 openspec 提炼到 devflow | 轻量回填 devflow 必要档案,避免重复 OpenSpec |
### v3.1:Devflow 产物瘦身
v3 继续跑完整流程后,又暴露出一个实践问题:`devflow` 作为辅助和人类阅读层时,如果默认生成 PRD、research、design、tasks、alignment、clarifications、acceptance,会和 OpenSpec 的 proposal、design、specs、tasks 大量重叠。
因此 v3.1 明确:**devflow 不复制 OpenSpec,只保存 OpenSpec 不擅长表达的人类上下文、证据、决策和验收归档。**
默认必要产物收敛为:
```text
devflow/projects/YYYY-MM-DD-{slug}/
├── brief.md # 背景、目标、范围、非目标、关联 OpenSpec
├── evidence.md # 代码/文档证据、evidence-driven 结论和汇报状态
├── decisions.md # user-interview 确认、关键取舍、OpenSpec 回写记录
└── acceptance.md # 实现结果、验证、未验证项、archive 状态
```
扩展产物只在有明确理由时创建:
- `prd.md`:复杂需求、对外协作或用户明确要求。
- `research.md`:真实调研、代码考古、竞品/API 对比或复杂方案比较。
- `design.md`:长期架构背景、架构审计摘要或决策索引;实现设计仍以 OpenSpec design 为准。
- `tasks.md`:跨轮次人类复盘任务;执行任务仍以 OpenSpec tasks 为准。
- `alignment.md` / `clarifications.md`:冲突或澄清问题很多时拆出;否则并入 `decisions.md`。
规模分档:
| 分档 | 适用场景 | devflow 默认产物 |
| --- | --- | --- |
| `micro` | 小改动、低风险、需求明确 | `brief.md`、`decisions.md`、`acceptance.md`;证据少时并入 `brief.md` |
| `standard` | 默认模式 | `brief.md`、`evidence.md`、`decisions.md`、`acceptance.md` |
| `complex` | 高风险、跨模块、需求不清、多人协作 | standard + 按需 PRD/research/design/tasks/alignment |
### v3 新增 Phase 0.5
v3 在 Phase 0 和 Phase 1 之间增加:
```
Phase 0.5 Devflow Context Harvest
```
读取:
- `devflow/glossary/CONTEXT.md`
- 相关项目 PRD/design/tasks/acceptance
- 相关 ADR
- `devflow/compound/` 中的 learning、trick、decision、explore
目的不是直接指导编码,而是给 Phase 1 的 OpenSpec propose 提供更准确的上下文输入。读取旧项目时可以参考历史 PRD/design/tasks,但新项目不再默认生成这些重复产物。
### v3 中各 skill 的参与方式
这些 skill 仍然参与,但职责从“并列执行流程”调整为“服务 OpenSpec 产物质量”:
| 阶段 | 主要 skill / 工具 | 作用 | 产物去向 |
| --- | --- | --- | --- |
| Phase 0 初始需求 / PRD / research | `sm-flow` | 收集原始需求、已有 PRD 或 research,判断启动模式 | 入口摘要、初步 slug |
| Phase 0.5 Devflow Context Harvest | `sm-flow` | 读取 `devflow/` 的 glossary、ADR、历史 PRD、acceptance、compound knowledge | 作为 Phase 1 的 OpenSpec 输入上下文 |
| Phase 1 OpenSpec propose | `openspec-propose` | 生成或修正 `proposal.md`、`design.md`、`specs/**/*.md`、`tasks.md` | `openspec/changes/<change>/` |
| Phase 1.5 PRD / OpenSpec 对齐 | `to-prd` + `sm-flow` | 检查 brief/devflow/OpenSpec 是否一致;复杂需求才生成独立 PRD | `brief.md` / 按需 `prd.md`;冲突回写 OpenSpec |
| Phase 2 Human-in-the-loop 澄清 | `grill-with-docs` | 追问术语、边界、验收;区分 `evidence-driven` 和 `user-interview` | `evidence.md` / `decisions.md`;影响实现的结论回写 OpenSpec |
| Phase 2.5 架构审计 | `zoom-out` | 拉高视角审查模块、数据流、耦合、架构风险 | 默认写入 decisions/evidence;复杂审计才拆 `design.md`;影响实现则回写 OpenSpec |
| Phase 3 OpenSpec apply | `openspec-apply-change` | 按 OpenSpec specs/tasks 执行实现 | 代码变更、OpenSpec task 状态 |
| Phase 3 bug/不确定行为 | `diagnose` | 复现 → 最小化 → 假设排序 → 仪器化 → 修复 → 回归 | 根因若是规格问题,先修 OpenSpec;修复记录进入 acceptance |
| Phase 3 高风险/复杂行为 | `tdd` | 按 OpenSpec specs 做纵向切片测试驱动 | 测试与实现代码 |
| Phase 4 回填 devflow | `sm-flow` + `openspec-archive-change` | 从 OpenSpec、实现和验证提炼长期档案,并询问是否 archive | `devflow/projects/`、`devflow/compound/`;用户确认后 archive |
说明:`grill-me` 在 v3 中不再作为主要入口,已被 `grill-with-docs` 替代。原因是 v3 需要把澄清结果沉淀到 glossary/ADR,并把影响实现的结论回写 OpenSpec;纯对话式 grill 容易丢失上下文。
### v3 的执行规则
1. **OpenSpec 是执行真理源**
- Phase 3 默认必须依赖 `openspec/changes/<change>/proposal.md`、`design.md`、`specs/**/*.md`、`tasks.md`。
- 不允许直接基于 `devflow/projects/...` 绕过 OpenSpec 写代码。
2. **Devflow 是上下文真理源**
- 术语、历史决策、项目背景、踩坑记录来自 `devflow/`。
- 这些内容用于增强和修正 OpenSpec,而不是替代 OpenSpec。
3. **冲突先修 OpenSpec**
- 如果 devflow 和 OpenSpec 冲突,不能直接执行。
- 必须汇报冲突、让用户确认、更新 OpenSpec,再进入 apply。
4. **evidence-driven 也必须汇报**
- 证据驱动不是“AI 自己确认完就继续”。
- 代理必须汇报查了什么、得出什么结论、是否需要用户确认。
5. **user-interview 必须等待确认**
- 涉及范围、偏好、验收口径、风险接受度时,必须问用户。
6. **归档仍回到 devflow**
- OpenSpec 完成后,从 OpenSpec、实现结果、验证结果中提炼长期档案。
- Phase 4 询问是否 archive OpenSpec change,不默认执行。
7. **devflow 产物按需生成**
- 默认只生成 brief、evidence、decisions、acceptance。
- PRD、research、design、tasks、alignment、clarifications 只有在复杂度或协作需要时才生成。
- 小需求走 `micro`,不能让文档成本超过实现成本。
### v3 流程图
```
Phase 0 初始需求 / PRD / research
skill: sm-flow
↓
Phase 0.5 读取 devflow 上下文
skill: sm-flow
↓
Phase 1 生成或修正 OpenSpec proposal/design/specs/tasks
skill: openspec-propose
↓
Phase 1.5 PRD / Devflow / OpenSpec 对齐检查
skill: to-prd + sm-flow
↓
Phase 2 human-in-the-loop 澄清,并回写 OpenSpec
skill: grill-with-docs
↓
Phase 2.5 架构审计;影响实现则回写 OpenSpec
skill: zoom-out
↓
Phase 3 OpenSpec apply 执行
skill: openspec-apply-change;按需 diagnose / tdd
↓
Phase 4 回填 devflow,并确认是否 archive
skill: sm-flow;用户确认后 openspec-archive-change
```
### v3 一句话定位
`sm-flow` 不是 OpenSpec 的替代品,而是 OpenSpec 的上下文增强层和归档闭环层。
## v3.1:可执行 gate 与使用摩擦修正
v3.1 来自一次真实使用复盘:接口变更文档粒度、propose 后再 grill 的返工感、devflow 增长后的检索成本、子 skill 路径兼容,以及 Phase 3 中用户质疑和代码发现与原设计冲突时的处理方式,都需要变成可执行规则。
v3.1 不改变 v3 的主轴:
> `devflow/` 提供上下文,OpenSpec 提供执行依据,代码只是实现结果。
### Draft / Committed OpenSpec
Phase 1 产出的 OpenSpec 统一视为 **Draft OpenSpec**。它是后续 PRD 对齐、grill 和架构审计的讨论对象,不是实现许可。
Phase 2 和 Phase 2.5 的结论必须回写 OpenSpec。随后新增 Phase 2.9:
```text
Phase 2.9 Commit OpenSpec
```
Phase 2.9 检查:
- proposal 是否说明范围、非目标和原因。
- design 是否记录关键约束、架构风险和接口影响。
- specs 是否覆盖可观察行为和验收口径。
- tasks 是否是可执行的纵向切片。
- 是否还有未确认的 user-interview、未汇报的 evidence-driven 结论、未判级接口影响或 devflow/OpenSpec 冲突。
只有通过 Phase 2.9 的 OpenSpec 才是 **Committed OpenSpec**,Phase 3 只能执行 Committed OpenSpec。
### Grill 必须人工确认
Phase 2 的 `grill-with-docs` 不是代理自问自答。`user-interview` 问题必须一次只问一个,等待用户显式回答,并记录到 `decisions.md`。未获得用户确认的问题不能视为已解决,也不能进入 Phase 2.9 或 Phase 3。
`evidence-driven` 问题可以由代理先查证,但也必须汇报证据、结论和是否需要用户确认。
Phase 2 在开始追问前,还应该先建立一个 question pool。最小问题池至少覆盖:
- 术语
- 范围边界
- 验收口径
如果变更涉及多模块、接口、权限、下游消费者、响应结构或生命周期规则,再把这些维度补进问题池。问题池的作用是先把风险面列全,再继续保持 one-at-a-time 的 `user-interview` 消费节奏,而不是一次把所有问题都抛给用户。
单个 grill 决策确认不等于 Phase 3 apply 授权。用户在 Phase 2 回答“可以”只表示该问题已确认;代理必须先回写 OpenSpec/devflow,停在 Phase 2.9,报告 Committed OpenSpec 检查结果,并等待用户明确要求进入 apply、开始实现、执行修改或继续 Phase 3。
### Phase Checkpoint
v3.1 的另一个收紧点是:关键阶段不再靠“看起来做完了”判断完成,而是靠显式 checkpoint。
关键阶段至少包括:
- Phase 0
- Phase 0.5
- Phase 1
- Phase 2
- Phase 2.5
- Phase 2.9
每个 checkpoint 至少说明:
- 当前阶段
- 调用的 capability 来源
- 产出的关键 artifact
- 已满足的退出条件
- 尚未解决的 blocker
如果没有这些信息,就不应该把阶段视为已完成,更不应该直接进入下一阶段。
### Cross-Artifact Alignment
v3.1 之后,Phase 1.5 和 Phase 2.9 不只是“看看文档差不多”,而是要显式检查一条对齐链:
```text
brief/prd -> proposal -> design -> specs -> tasks
```
检查重点不是格式,而是下游产物有没有把上游已经确定的内容接住,例如:
- `brief/prd` 里的范围和非目标有没有进入 `proposal`
- `proposal` 的关键承诺有没有进入 `design`
- `design` 里的实现约束和接口影响有没有进入 `specs` 或 `tasks`
- `specs` 里的可观察行为有没有被 `tasks` 切成可执行工作
如果字段、术语、约束、行为或切片只停留在上游文档里,就应该视为对齐缺口,先修 OpenSpec,再继续流程。
### 接口影响分级
v3.1 区分“接口影响记录”和“独立接口文档”:
- 所有接口变更都必须记录影响范围。
- 只有 L3/L4 才强制独立接口文档或等价独立章节。
分级规则:
| 级别 | 判断条件 | 产物要求 |
| --- | --- | --- |
| L1 内部实现 | 不改变调用方可观察行为 | tasks / acceptance 记录验证 |
| L2 内部接口 | 内部 DTO、service 方法、内部事件、内部判断逻辑变化,消费者仍在同一实现范围内 | 内联接口影响记录 |
| L3 协作接口 | 影响前端、其他模块/服务、跨团队消费者、数据库契约、事件、回调或 SDK | 独立接口文档或独立章节 |
| L4 破坏性接口 | 旧调用方可能失败、数据/状态/错误码不同,或需要迁移/灰度/回滚 | 独立接口文档 + 迁移/回滚说明,必要时 ADR |
接口内部判断逻辑也按可观察行为评估。即使签名和字段不变,只要返回数据、错误码、状态、权限结果、排序/过滤、幂等性、时序或副作用变化,也属于接口影响。
### Devflow Index
`devflow/index.md` 成为 Phase 0.5 的默认入口。上下文查找顺序为:
```text
devflow/index.md
devflow/glossary/CONTEXT.md
相关项目 brief / acceptance / ADR
devflow/compound/
```
Phase 4 回填项目档案时必须更新 `devflow/index.md`。最小字段为日期、slug、领域、关键词、关联 OpenSpec 和状态。
另外,v3.1 也把一个实践经验写成硬规则:devflow 不是等到 Phase 4 才第一次补写。`brief.md`、`evidence.md`、`decisions.md` 这类过程内档案应该随阶段就近更新,Phase 4 主要负责 consolidation 和归档口径收束。
### Micro 不是 Skip
`micro` 的目标是降低文档重量,不是给代理发放“可以跳 gate”的许可证。
因此即使是 `micro` 变更,也仍然要保留:
- Phase 0.5 最小上下文收集
- Phase 2 最小澄清
- Phase 2.9 commit gate
- Phase 4 轻量回填
如果因为“改动很小”就跳过这些 gate,应该视为协议偏差,而不是合法优化。
### 实现期冲突处理
Phase 3 中,如果用户质疑、用户修改、代码发现、测试失败或运行行为与 Committed OpenSpec 冲突,必须先分类:
| 分类 | 含义 | 处理 |
| --- | --- | --- |
| 实现偏差 | OpenSpec 正确,代码没有按规格做 | 修代码,不改 OpenSpec |
| 规格遗漏 | OpenSpec 没覆盖真实边界、接口影响、验收或外部行为 | 暂停 apply,修正 OpenSpec,重新 commit |
| 设计冲突 | OpenSpec 与架构、ADR、历史验收、数据所有权或模块边界冲突 | 暂停并请用户确认设计方向 |
| 用户变更 | 用户改变目标、范围、验收或风险接受度 | 更新 proposal/specs/tasks 后继续 |
冲突分类、证据、用户确认和 OpenSpec 回写状态必须进入 `decisions.md` 或 `acceptance.md`。
### 子 skill 兼容
v3.1 将子 skill 从“路径绑定”改为“能力绑定”。例如 `openspec-propose`、`openspec-apply-change`、`to-prd`、`grill-with-docs` 都是能力契约。
调用优先级:
1. 平台原生 skill。
2. 本地 `SKILL.md`,例如 `.claude/skills/...` 或 `.agents/skills/...`。
3. `sm-flow` 的 fallback 协议。
这样 `sm-flow` 可以在 Claude、Codex 或其他代理环境中迁移,而不会被某个固定目录锁死。
一旦进入 fallback,代理还必须把这次降级本身记录下来。也就是说,fallback 不只是“内部换个做法”,而是一个需要显式声明 capability 缺失、降级原因和风险的协议事件。
## v3.1 后续收口:协议瘦身与 review 修正
在执行硬化规则落地后,又做了一轮非常实际的收口:不是再增加新规则,而是把已经确认的规则放到更稳定、可维护的位置,并修掉瘦身过程中暴露的引用问题。
### 顶层 skill 瘦身
`SKILL.md` 不再同时承担“入口协议”和“大段运行手册”两种职责,而是收敛为:
- 工作流定位
- 真理源分层
- 核心硬规则
- reference 加载入口
- 阶段总览
原来放在顶层但更适合按需读取的内容,被下沉到新的:
```text
references/operating-rules.md
```
这里集中放:
- 接口影响分级
- 启动检查
- 项目标识规则
- devflow 产物分层
- 快速模式细则
- 完成标准
这样做的目标不是减少规则,而是减少“启动时一次读太多”和“顶层协议与 reference 抢职责”的问题。
### Fallback 去重复
`fallbacks.md` 也做了第二轮整理:
- 顶部统一定义 fallback 通用记录要求
- 各 fallback 小节只保留自己的额外记录义务
这样可以避免每个 fallback 都重复写一遍“要声明 fallback、要记录 fallback”,同时不丢失协议要求。
### Review 驱动的自洽性修正
瘦身后又发现了一类很典型的问题:**规则本身没错,但 cross-reference 可能断掉**。因此又补了一轮 review 驱动修正,重点包括:
- `phase-contracts.md` 在首次使用接口分级、分档、快速模式时,显式指向 `operating-rules.md`
- 修正 fallback 锚点,避免 skill 指向不存在的章节名
- 统一 `operating-rules.md` 的语言风格,避免在主协议是中文时夹着一整份英文运行规则
这轮修正说明一件事:协议产品化不只是”把规则写出来”,还要保证**入口、逐阶段契约、fallback 和运行规则之间的导航关系始终自洽**。
## v4.0:协议层 Harness 重设计
### 背景
v3.1+ 的规则已经比较完整,但一次完整设计评审暴露出三个结构性问题:
1. **定位模糊**:SKILL.md 说”不替代 OpenSpec,而是增强”,但实际上 sm-flow 已经在编排 OpenSpec 的完整生命周期——包括 propose 时机、grill 顺序、commit gate、apply 授权。这不是”增强”,这是”编排”。
2. **阶段顺序导致返工**:Phase 1 一次性产出完整 4 件套(proposal + design + specs + tasks),Phase 2 才做 grill 澄清。澄清结果必然回写已细化的产物,形成不可避免的返工循环。
3. **规则过载**:19 条核心规则平铺在一个列表里,混合了硬约束、流程约束和质量约束。agent 读到第 15 条已经记不清前 5 条的优先级。
### 核心认知转变
sm-flow 不是一个”更好的 skill”,也不是 OpenSpec 的增强插件。它是一个**用提示词实现的协议层 harness**——控制 agent 以什么顺序、什么条件、什么标准使用工具。
这个认知来自一个类比:Claude Code harness 是**代码实现**的(工具权限、hooks、context window),agent 物理上绕不过。sm-flow 是**提示词实现**的,agent 理论上可以违反。因此 sm-flow 需要 checkpoint、显式约束、降级声明等机制来强化执行力——这些机制的本质就是弥补提示词 harness 缺乏物理强制力的弱点。
### 四层架构
```
Claude Code Harness → 代码层:工具权限、hooks、context window(agent 绕不过)
sm-flow Harness → 协议层:工作流阶段、门控规则、产物约束、人类对齐(提示词实现)
OpenSpec → 执行引擎:propose/apply/archive 的具体操作
Sub-skills → 能力层:grill、zoom-out、diagnose、tdd
```
### 用户命令:Actions, Not Phases
借鉴 OpenSpec 的 “Actions, Not Phases” 设计哲学——用户命令表达意图,不表达阶段。阶段是 harness 的内部词汇,不是用户的 API。
v3.1 有 9 个阶段编号(Phase 0 / 0.5 / 1 / 1.5 / 2 / 2.5 / 2.9 / 3 / 4),用户需要记住每个编号对应的含义。v4 收敛为 4 个用户命令:
| 命令 | 用户意图 |
|---|---|
| `/sm-flow` | 完整流程(从入口到归档) |
| `/sm-flow explore` | 先聊聊(需求不清楚) |
| `/sm-flow apply` | 只执行(已有 Committed OpenSpec) |
| `/sm-flow archive` | 收尾(回填 devflow + 归档确认) |
内部阶段全部改为英文动词命名:
```
clarify → context → propose → grill → specify → audit → commit → apply → archive
```
### 阶段顺序调整:grill 在 specify 前
v3.1 的执行顺序:propose(完整 4 件套)→ grill → specify → audit → commit → apply
v4 的执行顺序:propose(只写轻量 proposal)→ grill → specify(补全 design/specs/tasks)→ audit → commit → apply
核心改变:propose 只写轻量 proposal.md,不调用 openspec-propose。grill 在需求稳定前完成澄清。specify 在需求稳定后才调用 openspec-propose 补全完整 OpenSpec。
这消除了返工循环——grill 在细化之前,不存在”细化 → grill → 回写细化”的问题。
### devflow 延迟写入
v3.1 要求 devflow 产物按阶段就近更新(brief、evidence、decisions 随阶段写入),Phase 4 做 consolidation。实践中 agent 同时维护 OpenSpec 和 devflow 形成双重记录。
v4 改为:clarify → apply 期间只维护 `decisions.md` 作为过程日志。archive 阶段从 decisions.md + OpenSpec 产物提取完整档案(brief.md、evidence.md、decisions.md、acceptance.md)。
### 规则精简:19 条 → 6 条硬约束
v3.1 的 19 条规则按三类分组(硬约束 7 条 / 流程约束 7 条 / 质量约束 5 条)。v4 进一步精简为 6 条硬约束留在 SKILL.md,其余约束下沉到 phase-contracts.md 各阶段退出条件。
```
v3.1:SKILL.md 包含 19 条三类规则 → agent 需要同时记住所有规则
v4:SKILL.md 只放 6 条硬约束 → agent 按阶段加载对应的过程约束和质量约束
```
6 条硬约束:
1. OpenSpec 是唯一执行真理源
2. 不得跳过 context
3. 不得跳过 grill(至少 3 个问题)
4. 不得跳过 commit
5. 冲突必须先分类再处理
6. 降级执行必须标注
### 冲突分类简化
v3.1 的四分类(实现偏差 / 规格遗漏 / 设计冲突 / 用户变更)在实际执行中边界模糊,agent 需要同时判断类型、选择处理方式、记录到 decisions.md、考虑是否回写 OpenSpec。判断链过长。
v4 简化为 2+1:
- OpenSpec 不准 → 修 OpenSpec
- 代码偏离 → 修代码
- 不确定 → 暂停等用户确认
### 质量约束可观测化
v3.1 的质量约束(如”evidence-driven 必须汇报””user-interview 必须等确认”)缺乏可观测产出,agent 可能形式化地填写而不真正验证。
v4 要求质量约束必须有可观测产出:写入文件 + checkpoint 检查。例如:
| 约束 | v3.1(软) | v4(硬) |
|---|---|---|
| evidence-driven 汇报 | “必须向用户汇报” | 写入 decisions.md + checkpoint 列出汇报状态 |
| user-interview 确认 | “必须等待用户回答” | decisions.md 记录问题原文/用户原话/确认状态 |
| cross-artifact 对齐 | “必须显式检查” | checkpoint 包含 4 行对齐检查表 |
### Micro 模式升级
v3.1 的 micro 只压缩产物(少写几个文件),没有压缩 gate 数量。v4 的 micro 合并 gate:
```
v3.1 micro:仍然走完整阶段,只是产物变少
v4 micro:clarify+context 合并 checkpoint → propose+specify 合并 checkpoint → grill(最少 1 个问题)→ commit(简化检查)
```
### 文件结构变化
```
v3.1:
.agents/skills/sm-flow/
├── SKILL.md # ~85行,入口协议 + 19条规则 + 阶段总览
└── references/
├── phase-contracts.md # 阶段契约(Phase 0-4 编号)
├── operating-rules.md # 运行规则
├── fallbacks.md # 降级协议
├── archive-rules.md # 归档规则
└── templates.md # 产物模板
v4:
.agents/skills/sm-flow/
├── SKILL.md # ~50行,入口协议 + 6条硬约束 + 4命令 + 9阶段总览
└── references/
├── phase-contracts.md # 阶段契约(英文命名,grill 在 specify 前)
├── operating-rules.md # 运行规则(启动识别 4 命令,micro 合并 gate)
├── fallbacks.md # 内置执行协议(冲突 2+1 分类)
├── archive-rules.md # 归档规则(decisions.md 过程日志提取)
└── templates.md # 产物模板(+cross-artifact 对齐检查表)
```
### 新增文档
- `skill-workbench/docs/sm-flow/使用方式.md`:面向用户的使用指南
- `skill-workbench/docs/sm-flow/design-review.md`:设计评审记录
### v3.1 → v4 变更对照
| 维度 | v3.1 | v4 |
|---|---|---|
| 定位 | “OpenSpec 的上下文增强层和归档闭环层” | “协议层 harness,编排 OpenSpec 完整生命周期” |
| 阶段命名 | Phase 0/0.5/1/1.5/2/2.5/2.9/3/4 | clarify/context/propose/grill/specify/audit/commit/apply/archive |
| 用户命令 | 无(用户需要知道阶段编号) | 4 个命令(Actions, Not Phases) |
| propose 产出 | 完整 4 件套(proposal+design+specs+tasks) | 只写轻量 proposal.md |
| grill 时机 | specify 之后 | specify 之前 |
| devflow 写入策略 | 按阶段就近更新多个文件 | 只维护 decisions.md,archive 提取 |
| 核心规则数量 | 19 条三类分组 | 6 条硬约束 |
| 冲突分类 | 4 类(实现偏差/规格遗漏/设计冲突/用户变更) | 2+1(OpenSpec 不准/代码偏离/不确定) |
| micro 模式 | 压缩产物 | 合并 gate |
| 质量约束 | 文字描述 | 可观测产出(写入文件 + checkpoint) |
## v4.0 验证执行复盘(2026-05-25)
用 entry-expand-collapse 需求跑了一轮完整 sm-flow 流程,验证 v4.0 协议的可执行性。功能变更已回滚,仅保留验证发现。
### 暴露的问题
| # | 问题 | 具体表现 | 分析结论 |
|---|------|----------|----------|
| 1 | propose 阶段越界 | 在 propose 阶段一次性生成了 proposal + design + specs + tasks,跳过 grill 和 specify | 需求小时 agent 本能跳过门控。现有硬约束 #3(不得跳过 grill)和阶段流程顺序已覆盖,属于执行层面问题,不需要改协议 |
| 2 | 子 skill 伪调用 | grill 阶段读了 grill-with-docs 的 SKILL.md 后自行执行,audit 阶段跳过了 zoom-out | Skill 工具调用和 Read 后执行效果等价,关键是"不能跳过"而非"用什么工具调用"。硬约束 #6 已覆盖,不需要改协议 |
| 3 | spec 遗漏用户行为 | spec 写的是"添加 .expanded class"(实现细节),没有写"展开后显示完整正文"(用户可观察行为) | 导致第一版实现只切换了 CSS class,正文内容仍显示截断文本。spec 应描述用户可观察的结果而非实现方式 |
### 做对的部分
- clarify + context 合并执行正确(micro 模式)
- grill 的 evidence-driven / user-interview 分类和 one-at-a-time 节奏执行到位
- commit gate 的文件存在性检查生效
- apply 阶段的冲突分类(代码偏离)处理正确
- devflow 延迟写入(只维护 decisions.md)降低了维护成本
### 后续观察项
问题 1 和 2 暂不改协议,如果多次验证中反复出现再考虑加约束。问题 3 需要在下次 specify 阶段验证:spec scenario 是否自然地描述用户行为而非实现细节。
## v4.1:Apply 阶段前置调研增强(2026-06-23)
### 背景
基于"山东商客意向单同步接口"的执行复盘(`skill-workbench/docs/sm-flow/sm-flow-execution-review-shandong-intent-sync.md`),发现 apply 阶段存在严重的返工问题:
- **返工次数**:4-5 次重大返工
- **核心问题**:apply 阶段"想当然"开始写代码,缺少充分调研和分步验证
- **主要表现**:
- 参考实现利用不充分(设计文档提到参考实现,但直到用户提醒才去看)
- 技术栈不熟悉(RequestMsg 结构、Kafka 发送方式、Consumer 位置全部返工)
- 设计-实现偏离(验签/解密/查询接口只有 TODO 注释)
### 核心改进:Pre-apply Checkpoint
在 apply 阶段开始前增加强制性调研检查点(方案 B 简化版):
#### 修改 1:grill 阶段增加技术实现维度
在 question pool 中新增"技术实现维度":
```markdown
**技术实现维度**(新增):当 proposal 提到参考实现、或涉及项目现有基础设施时,增加技术澄清问题:
- 参考实现的具体文件路径是什么?
- 项目现有的 [请求结构/MQ/缓存/加密/工具类] 标准是什么?
- 有哪些技术点需要先调研或新建?
```
**目的**:在 grill 阶段就识别技术调研需求,避免 apply 时才发现技术栈不熟悉。
#### 修改 2:apply 阶段增加 Pre-apply Checkpoint
在 apply 阶段开始前增加 15-20 分钟的强制调研步骤:
**触发条件**(3 条):
- design 或 tasks 中提到"参考 XXX 实现"
- 需要调用项目现有基础设施(MQ/统一请求结构/工具类等)
- 技术栈不熟悉或第一次在该项目实现类似功能
**执行步骤**(3 步):
1. **完整阅读所有参考实现**(约 10 分钟)
- 从 OpenSpec design 或 tasks 中定位参考实现文件
- 如果路径不明确,通过 Grep 搜索关键类名或模式
- 逐行理解关键逻辑,提取可复用代码片段和模式
2. **Grep 关键技术栈**(约 5 分钟)
- 请求/响应结构模式
- 消息队列模式
- 统一工具类
- 异常处理和日志记录标准
3. **形成技术栈清单并写入 decisions.md**
- 项目使用的请求/响应结构标准
- MQ 消息定义和发送标准
- Consumer 标准位置和写法
- 加密/验签/工具类的标准用法
- 识别需要新建的工具类或基础设施
**输出要求**(3 条):
- ✅ 技术栈清单已写入 `decisions.md` 的 "Pre-apply Research" 章节
- ✅ 已列出所有参考实现的文件路径
- ✅ 已识别需要新建的工具类/基础设施
**快速模式支持**:micro 分档可缩短为 5-10 分钟快速扫描,但仍需形成清单。
#### 修改 3:apply 实现过程增强
**分步实现**:建议按 Controller → Service → MQ/异步组件 → Consumer/下游 顺序,每完成一层验证后再继续。
**首模块完成后对齐检查**:完成第一个接口/模块后,对比 OpenSpec design/tasks,标记"已完成/TODO";核心功能(加密/验签/核心业务逻辑)不允许空实现或纯 TODO 注释。
**快速失败**:连续返工 ≥ 2 次时,暂停并重新执行 pre-apply checkpoint 或向用户汇报。
#### 修改 4:apply 退出条件增强
新增退出条件:
- ✅ 已完成 pre-apply checkpoint(如触发条件满足),技术栈清单已写入 `decisions.md`
- ✅ 核心功能已实现或明确标注"待联调",无纯 TODO 占位
### 预期效果
| 指标 | 当前 | 目标 | 改善 |
|------|------|------|------|
| 返工次数 | 4-5 次 | 0-1 次 | -80% |
| 核心功能空实现率 | 高(3/3 核心功能) | 0% | -100% |
| 实现时间(含返工) | 2 小时 | 1.5 小时 | -25% |
| 前置调研时间 | 0 分钟 | 15-20 分钟 | +20 分钟 |
**ROI 分析**:
```
投入:15-20 分钟调研
回报:节省 60 分钟返工 + 避免核心功能遗漏
ROI = (60 - 20) / 20 = 200%
```
### 复杂度评估
**本次修改复杂度**:中等
- 文本增量:+55 行(从 281 行 → 336 行,+20%)
- 概念层级:+1 层(apply 内部增加 Pre-apply Checkpoint 子阶段)
- 强制规则:+5 条(pre-apply 触发条件、执行步骤、输出要求)
**整体复杂度**:高(但合理)
- 总行数:606 行 → ~700 行(+15%)
- 阶段数:9 个(不变)
- 门控数:4 个 → 6 个(+propose checkpoint, +pre-apply checkpoint)
**简化设计**:
- 采用方案 B(简化版),相比完整方案减少 45% 文本量和 44% 规则数
- 保留核心价值(前置调研、技术栈清单、核心功能质量保证)
- 去掉过度约束(严格执行顺序、频繁检查点、详细操作模板)
### 适用场景
✅ **强烈推荐**:
- 中等及以上规模需求(3+ 接口或涉及多模块)
- 涉及项目现有基础设施(MQ/统一请求结构/工具类)
- 第一次在该项目实现类似功能
- 设计文档提到"参考 XXX 实现"
🟡 **可选执行**:
- micro 分档的简单需求(可缩短为 5-10 分钟)
- 纯数据处理或工具脚本(技术栈熟悉)
❌ **不推荐**:
- 紧急热修复(时间紧急)
- 一次性脚本(不涉及项目标准)
### 相关文档
- 执行复盘:`skill-workbench/docs/sm-flow/sm-flow-execution-review-shandong-intent-sync.md`
- 更新日志:`skill-workbench/docs/sm-flow/phase-contracts-v4.1-changelog.md`
- 修改文件:`.agents/skills/sm-flow/references/phase-contracts.md`
## v4.2:可验证 Checkpoint 与执行机制增强(2026-06-24)
### 背景
基于"lookup-knowledge-integration"的执行复盘(`skill-workbench/docs/sm-flow/sm-flow-optimization-suggestions.md`),发现一个结构性问题:
**约束是"软性"的,缺少执行机制**
- **规则清楚但可绕过**:6 条硬约束写得很清楚"不得跳过 commit",但 agent 仍然能跳过
- **标准模糊无法判断**:commit 阶段说"检查是否可执行",但不知道具体检查什么
- **流程无强制顺序**:archive 建议"先 devflow 后 handoff",但 agent 可能先创建 handoff
**核心认知**:规则是"描述性"的(说应该做什么),缺少"执行性"的机制(强制检查、文件依赖)。
### 核心改进:从软性约束到硬性检查
v4.2 不增加新阶段或新规则,而是**把现有约束变成可验证的 checkpoint**:
| 改进点 | Before(v4.1) | After(v4.2) |
|--------|---------------|--------------|
| Commit 标准 | "检查是否可执行"(模糊) | 文件完整性 + 一致性检查清单(具体) |
| Apply 门控 | "已通过 commit"(软性) | 检查 `.committed` 文件存在(硬性) |
| Archive 顺序 | "应该先 devflow"(建议) | 5 步强制顺序 + 自检(必须) |
### 详细修改
#### 修改 1:Commit 阶段增加可验证 Checkpoint
**文件完整性检查**(必须全部通过):
- [ ] `proposal.md` 存在,包含问题描述(≥50字)、建议方案(≥100字)、范围/非目标
- [ ] `design.md` 存在,包含架构设计、数据结构(≥1个)、关键决策(≥2条)
- [ ] `specs/` 目录存在,至少 1 个 functional-spec.md 包含 ≥3 个 requirement
- [ ] `tasks.md` 存在,包含 ≥5 个可执行子任务,每个任务有验收标准
**一致性检查**(必须通过):
- [ ] proposal 核心概念 → design 有对应设计
- [ ] design 关键决策 → tasks 有对应实现
- [ ] tasks 验收标准可验证(非"正确实现"这类模糊描述)
**标记文件**:检查通过后,创建 `openspec/changes/{slug}/.committed` 文件
#### 修改 2:Apply 阶段增加前置门控
**前置门控检查**(硬约束):
1. 检查 `openspec/changes/{slug}/.committed` 文件是否存在
2. 如不存在:
- 汇报:Draft OpenSpec 未通过 commit 检查
- 列出缺失的 checkpoint 项
- 询问用户:是否补做 commit,或明确跳过(需显式确认)
#### 修改 3:Archive 阶段增加强制执行顺序
**5 步 Checklist**(不得跳过或重排):
1. **创建 devflow 档案**(必需):brief.md + evidence.md + decisions.md + acceptance.md
2. **更新索引**(必需):在 `devflow/index.md` 追加一行
3. **标记 OpenSpec**(必需):创建 `.archive-ready` 文件
4. **向用户汇报**(必需):列出文件、验证分类、剩余风险,询问是否归档
5. **执行 OpenSpec Archive**(可选):用户确认后调用 `openspec-archive-change`
**自检**:Step 4 前检查 Step 1-3 是否都完成
### 新增门控文件
| 文件 | 创建时机 | 用途 |
|------|----------|------|
| `.committed` | commit 阶段退出时 | apply 阶段前置门控依据 |
| `.archive-ready` | archive Step 3 | 标记归档准备就绪 |
### 预期效果
**解决的问题**:
- ❌ Commit 标准不明确 → ✅ 有具体检查清单,无法模糊通过
- ❌ Apply 可能基于不完整 OpenSpec → ✅ 门控文件强制阻止
- ❌ Archive 容易遗漏 devflow → ✅ 强制顺序确保完整
**量化指标**:
- Commit 阶段跳过率:-100%(有 checklist 无法跳过)
- Apply 基于不完整 OpenSpec:-100%(门控阻止)
- Archive 遗漏 devflow:-100%(强制顺序)
### 设计原则
#### 1. 可验证性
将模糊标准转为可测量的具体要求:
- Before: "检查 OpenSpec 是否可执行"
- After: "proposal ≥50字、design ≥1个数据结构、specs ≥3个 requirement"
#### 2. 门控文件
用文件存在性替代软性判断:
- Before: 描述"已通过 commit"
- After: 检查 `.committed` 文件存在
#### 3. 强制顺序
用 checklist 替代建议性描述:
- Before: "应该先创建 devflow"
- After: "Step 1 devflow → Step 2 索引 → Step 3 标记 → Step 4 汇报"
### 复杂度评估
**本次修改复杂度**:低-中等
- 文本增量:+80 行(phase-contracts.md +40 行,archive-rules.md +40 行)
- 概念增加:2 个门控文件
- 规则增强:3 个阶段的检查清单
**整体复杂度**:高(但更可靠)
- 总行数:~700 行 → ~780 行(+11%)
- 门控数:6 个 → 8 个
**权衡**:
- ✅ 收益:彻底解决"跳过阶段"问题
- ⚠️ 成本:增加 80 行文本,更多检查项
### 与 v4.1 的关系
| 版本 | 核心改进 | 解决问题 |
|------|----------|----------|
| v4.1 | Pre-apply Research Checkpoint | apply 前置调研不足,导致返工(4-5次 → 0-1次) |
| v4.2 | 可验证 Checkpoint + 门控文件 | 约束是软性的,agent 容易跳过阶段 |
**互补关系**:
- v4.1 解决"调研不充分导致返工"(质量问题)
- v4.2 解决"缺少执行机制导致跳过阶段"(流程问题)
### 适用场景
**✅ 所有场景(无例外)**
v4.2 的改进是执行机制层面的,不涉及业务逻辑:
- 无论 micro/standard/complex,都需要 commit 检查
- 无论需求大小,都需要 apply 前置门控
- 无论项目规模,都需要 archive 强制顺序
**快速模式**:可以简化产物(如 tasks 只需 3 个),但**不能跳过门控**。
### 后续演进方向(v5.0 候选)
如果 v4.2 执行良好但仍有问题,考虑:
1. **流程状态文件** `.sm-flow-state`
- 记录当前阶段、已完成阶段、时间戳
- 支持断点续做
2. **更多门控文件**
- `.context-done`、`.grill-done`、`.apply-done`
- 形成完整的阶段间依赖链
3. **违规自检机制**
- 每个阶段退出前,自动检查 6 条硬约束
4. **进度可视化**
- 每次开始时,汇报进度条
**判断依据**:如果 v4.2 后仍频繁出现跳过阶段,再引入更重的机制。
### 相关文档
- 执行复盘:`skill-workbench/docs/sm-flow/sm-flow-optimization-suggestions.md`
- 更新日志:`skill-workbench/docs/sm-flow/phase-contracts-v4.2-changelog.md`
- 修改文件:
- `.agents/skills/sm-flow/references/phase-contracts.md`
- `.agents/skills/sm-flow/references/archive-rules.md`