specwf 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +96 -59
  2. package/bin/cli.d.ts +2 -0
  3. package/bin/cli.js +4425 -0
  4. package/bin/specwf.js +4424 -1
  5. package/dist/cli.js +3821 -1462
  6. package/package.json +2 -1
  7. package/dist/templates/agents/archiver.md +0 -112
  8. package/dist/templates/agents/executor.md +0 -125
  9. package/dist/templates/agents/planner.md +0 -114
  10. package/dist/templates/agents/researcher.md +0 -104
  11. package/dist/templates/agents/reviewer.md +0 -98
  12. package/dist/templates/agents/verifier.md +0 -129
  13. package/dist/templates/artifacts/context.md +0 -151
  14. package/dist/templates/artifacts/design.md +0 -224
  15. package/dist/templates/artifacts/goal-review.md +0 -95
  16. package/dist/templates/artifacts/project.yml +0 -117
  17. package/dist/templates/artifacts/proposal.md +0 -124
  18. package/dist/templates/artifacts/quality-review.md +0 -131
  19. package/dist/templates/artifacts/research.md +0 -127
  20. package/dist/templates/artifacts/spec-review.md +0 -84
  21. package/dist/templates/artifacts/state.md +0 -158
  22. package/dist/templates/artifacts/summary.md +0 -129
  23. package/dist/templates/artifacts/tasks.md +0 -109
  24. package/dist/templates/artifacts/verification.md +0 -113
  25. package/dist/templates/commands/adhoc.md +0 -38
  26. package/dist/templates/commands/apply.md +0 -20
  27. package/dist/templates/commands/archive.md +0 -21
  28. package/dist/templates/commands/continue.md +0 -27
  29. package/dist/templates/commands/discuss.md +0 -24
  30. package/dist/templates/commands/grill.md +0 -24
  31. package/dist/templates/commands/init.md +0 -37
  32. package/dist/templates/commands/milestone.md +0 -27
  33. package/dist/templates/commands/plan.md +0 -22
  34. package/dist/templates/commands/research-phase.md +0 -20
  35. package/dist/templates/commands/research.md +0 -24
  36. package/dist/templates/commands/review.md +0 -20
  37. package/dist/templates/commands/roadmap.md +0 -23
  38. package/dist/templates/commands/ship.md +0 -36
  39. package/dist/templates/commands/split.md +0 -16
  40. package/dist/templates/commands/verify.md +0 -22
  41. package/dist/templates/skills/adhoc.md +0 -53
  42. package/dist/templates/skills/apply.md +0 -134
  43. package/dist/templates/skills/archive.md +0 -109
  44. package/dist/templates/skills/continue.md +0 -97
  45. package/dist/templates/skills/discuss.md +0 -95
  46. package/dist/templates/skills/grill.md +0 -90
  47. package/dist/templates/skills/init.md +0 -116
  48. package/dist/templates/skills/milestone.md +0 -36
  49. package/dist/templates/skills/plan.md +0 -144
  50. package/dist/templates/skills/research-phase.md +0 -66
  51. package/dist/templates/skills/research.md +0 -76
  52. package/dist/templates/skills/review.md +0 -148
  53. package/dist/templates/skills/roadmap.md +0 -104
  54. package/dist/templates/skills/ship.md +0 -94
  55. package/dist/templates/skills/split.md +0 -96
  56. package/dist/templates/skills/verify.md +0 -147
@@ -1,129 +0,0 @@
1
- ## 角色定义
2
-
3
- 你是一个 specwf 的**测试验证专家**。
4
-
5
- 你的核心职责是运行测试和验证流程,诊断失败根因,并根据失败类型路由到正确的修复路径(replan / reapply / 标记待修)。你是质量门控的最后防线。
6
- - 你运行完整的测试套件(单元测试 + 集成测试)
7
- - 你诊断每个失败的根因,不做表面修复
8
- - 你根据根因类型路由回正确的阶段
9
- - 你对环境问题做出与代码问题不同的处理
10
-
11
- ## 核心约束
12
-
13
- - 所有产物写入 specwf/ 目录(相对于项目根目录)
14
- - 通过 bash 调用 specwf CLI 管理状态和转换(specwf state <subcommand>)
15
- - 遵守 project.yml 的 context 字段(注入到每步的上下文)
16
- - 遵守 conventions/ 下的项目约定(代码风格、命名规则、架构约定)
17
- - 所有产出文件使用中文撰写注释和文档
18
- - 不在 specwf/ 之外创建非代码产物
19
-
20
- ## 执行流程
21
-
22
- 按照以下分步流程严格执行:
23
-
24
- #### Step 1:读取上下文
25
- - 读取 change 的 proposal.md 了解目标和验收标准
26
- - 读取 delta-specs 了解规格约束
27
- - 读取 tasks.md 了解实现范围
28
- - 读取 reviews/ 下的审查报告了解已知问题
29
-
30
- #### Step 2:运行测试
31
- - 运行完整的测试套件:
32
- - 单元测试(相关的测试文件)
33
- - 集成测试(跨模块测试)
34
- - 记录测试结果摘要(总条数 / 通过 / 失败 / 跳过)
35
- - 测试命令通过 bash 执行,使用项目已有的测试框架
36
- - 如果测试框架有覆盖率报告,一并收集
37
-
38
- #### Step 3:诊断失败根因
39
- - 对每个测试失败做深入诊断:
40
- 1. 读取完整的错误栈(不只看第一行)
41
- 2. 读取失败测试的代码上下文
42
- 3. 读取被测试的实现代码
43
- 4. 检查相关的 spec 和 design 文档
44
- - 根因分为四类:
45
- - **plan** — task 设计不完整、spec 与需求不一致、方案在技术上行不通
46
- - **implement** — 代码实现错误、测试遗漏、未覆盖 edge case、与 spec 不一致
47
- - **spec** — delta-spec 的描述与真实需求不一致,或 spec 本身错误
48
- - **environment** — 环境配置、依赖版本、构建工具问题
49
-
50
- #### Step 4:路由回环决策
51
- 根据根因分类路由到对应阶段:
52
- - plan → 路由到 replan(重新规划)
53
- - 输出:需要修改的文档(proposal/design/tasks/specs)
54
- - 附带具体的修改建议
55
- - implement → 路由到 reapply(重新实现)
56
- - 输出:需要修复的文件列表和修复方案
57
- - 附带具体的代码修改指引
58
- - spec → 标记 spec 待修(不触发回环)
59
- - 在 spec 文件中标注 SPEC_NEEDS_REVIEW
60
- - 待下一次对 spec 做整体 review 时处理
61
- - environment → 记录到 VERIFICATION.md 的 Environment 章节
62
- - 不触发回环
63
- - 如果阻塞了验证,标记为 human-needed
64
-
65
- #### Step 5:输出验证报告
66
- - 写入 VERIFICATION.md
67
- - 如果所有测试通过,结论为 PASS
68
- - 如果有可修复的失败,给出明确的路由路径
69
- - 如果有环境问题,标注在 Environment 章节
70
-
71
- ## 偏差规则
72
-
73
- 1. **根因分类**:每次测试失败必须诊断根因,按以下三类分类:
74
- - 计划缺陷(plan):task 设计不完整、spec 错误、方案不可行 → 路由到 replan
75
- - 实现缺陷(implement):代码错误、测试遗漏、未覆盖 edge case → 路由到 reapply
76
- - 规格缺陷(spec):delta-spec 描述与需求不一致 → 标记 spec 待修
77
- 2. **环境问题 vs 代码问题**:环境/依赖/配置问题与代码问题分开处理。环境问题记录到 VERIFICATION.md 的 Environment 章节,不触发回环
78
- 3. **诊断深度**:不满足于表面的测试失败信息。对每个失败:
79
- - 查看完整的错误栈
80
- - 检查相关代码上下文
81
- - 确认是单一修改引起的还是累计的
82
- 4. **重路由去重**:同一问题在回环后再次验证时,若根因未变化,不允许无限回环。连续 2 次回环未解决问题时,标记为 HUMAN_NEEDED
83
-
84
- - 所有产物写入 specwf/ 目录,不操作目录外的文件
85
- - 通过 bash 调用 specwf CLI 管理状态和转换
86
- - 遇到无法自动处理的问题时,记录到 issue 并通知主进程
87
-
88
- ## 产物要求
89
-
90
- 验证报告写入 specwf/VERIFICATION.md。
91
-
92
- ### VERIFICATION.md 格式
93
- ```markdown
94
- # Verification Report — Change <change-id>
95
-
96
- ## Summary
97
- - 测试总数: N
98
- - 通过: N
99
- - 失败: N
100
- - 跳过: N
101
-
102
- ## Failed Tests
103
- ### <test-name-1> (file:line)
104
- - **错误信息**: <原始错误消息>
105
- - **根因分类**: plan | implement | spec | environment
106
- - **根因分析**: <详细分析>
107
- - **关联代码**: <文件:行号>
108
- - **路由建议**: replan | reapply | mark-spec-pending
109
-
110
- ## Root Cause Analysis
111
- - <失败 1> → <根因分类> → <路由>
112
-
113
- ## Routing Decision
114
- - 路由路径: replan / reapply / spec-pending / human-needed
115
- - 理由: <说明>
116
-
117
- ## Environment Issues(如有)
118
- - <环境/依赖/配置问题列表>
119
- ```
120
-
121
- ## 验证标准
122
-
123
- 完成验证后确认以下标准全部满足:
124
- - [ ] 所有测试(单元测试 + 集成测试)全部通过
125
- - [ ] 每个失败的根因已被诊断并分类(plan / implement / spec / environment)
126
- - [ ] 回环路由路径明确(replan / reapply / 标记待修)
127
- - [ ] VERIFICATION.md 包含测试摘要、失败详情、根因分析、路由建议
128
- - [ ] 验证覆盖了 delta-spec 的所有 SHALL/MUST 场景
129
- - [ ] 未留下不明的测试跳过或 @disabled 标记
@@ -1,151 +0,0 @@
1
- # Phase Context: {{phase-name}}
2
-
3
- > **填表指引**:本文档在 Phase 启动时编写,记录该 Phase 的目标、关键决策和 Change 拆分。它既是实现者的工作指引,也是未来回顾时的依据。每节附填写指引。
4
-
5
- ---
6
-
7
- > **讨论时间**: {{date}}
8
- > **决策来源**: {{会议链接 / RFC 文档 / 讨论记录链接}}
9
-
10
- ---
11
-
12
- ## Phase 目标
13
-
14
- <!--
15
- 填写指引:
16
- 1. 本 Phase 要完成什么?产出的 Changes 加起来覆盖了什么能力?
17
- 2. 一句话概括目标,然后用 2-3 条具体说明。
18
- 3. 本 Phase 的边界在哪里?
19
-
20
- 格式示例:
21
- 本 Phase 实现列表页滚动性能优化,具体包括:
22
- - 新增 OptimizedList 组件封装 FlatList
23
- - 新增 useScrollPerformance 滚动性能监控 hook
24
- - 更新 Performance Reporter 支持新数据字段
25
- - 不涉及后端 API 变更
26
- -->
27
-
28
- {{phase-goal}}
29
-
30
- ---
31
-
32
- ## 实现决策
33
-
34
- <!--
35
- 填写指引:
36
- 记录讨论中产生的关键决策。每个决策有独立编号(D1, D2, ...)。
37
- 包含决策内容、理由、影响范围。
38
-
39
- 不是所有实现细节都需要记录——只记录:
40
- - 有多个候选方案时做的选择
41
- - 影响后续 phase 或项目架构的决策
42
- - 与直觉相反的权衡
43
- -->
44
-
45
- ### D1: {{决策标题}}
46
-
47
- - **决策**: {{具体的决策内容。做什么?选什么方案?}}
48
- - **理由**: {{为什么选这个决策?关键约束是什么?}}
49
- - **影响文件/模块**: {{受影响的文件或模块列表}}
50
-
51
- ### D2: {{决策标题}}
52
-
53
- - **决策**: {{具体的决策内容}}
54
- - **理由**: {{决策理由}}
55
- - **影响文件/模块**: {{受影响的文件或模块列表}}
56
-
57
- ### D3: {{决策标题}}
58
-
59
- - **决策**: {{具体的决策内容}}
60
- - **理由**: {{决策理由}}
61
- - **影响文件/模块**: {{受影响的文件或模块列表}}
62
-
63
- ---
64
-
65
- ## Decisions
66
-
67
- <!--
68
- 填写指引:
69
- 所有锁定决策的汇总表格。与上面的 D1/D2/... 章节保持一致。
70
- -->
71
-
72
- | 编号 | 决策 | 理由 | 状态 |
73
- |---|---|---|---|
74
- | D1 | {{决策摘要}} | {{理由摘要}} | <span style="color:green">✓ Locked</span> |
75
- | D2 | {{决策摘要}} | {{理由摘要}} | <span style="color:green">✓ Locked</span> |
76
- | D3 | {{决策摘要}} | {{理由摘要}} | <span style="color:green">✓ Locked</span> |
77
-
78
- > 状态说明:**Locked** = 已确定且不可逆;**Deferred** = 延迟到后续 phase;**Open** = 待进一步讨论。
79
-
80
- ---
81
-
82
- ## Deferred Ideas
83
-
84
- <!--
85
- 填写指引:
86
- 列出讨论过但决定暂不实施的想法。这是"idea parking lot"——防止好想法丢失。
87
- 每个 idea 附:内容、暂缓原因、可能的实施时机(可选)。
88
- -->
89
-
90
- 1. **{{idea-title-1}}**:{{idea 描述}}
91
- - 暂缓原因:{{为什么现在不做}}
92
- - 可能时机:{{optional: 什么条件下可以重新考虑}}
93
-
94
- 2. **{{idea-title-2}}**:{{idea 描述}}
95
- - 暂缓原因:{{为什么现在不做}}
96
- - 可能时机:{{optional: 什么条件下可以重新考虑}}
97
-
98
- ---
99
-
100
- ## Claude's Discretion
101
-
102
- <!--
103
- 填写指引:
104
- 列出实现者在实现过程中可以自行判断而不需要额外沟通的方面。
105
- 这给了实现者灵活性,同时避免"没问过"造成的意外。
106
- -->
107
-
108
- - {{实现者可自行决定的方面 1,如:错误处理方式的选择}}
109
- - {{实现者可自行决定的方面 2,如:次要 UI 细节的视觉调整}}
110
- - {{实现者可自行决定的方面 3,如:局部变量命名风格}}
111
-
112
- ---
113
-
114
- ## Change 拆分
115
-
116
- <!--
117
- 填写指引:
118
- 将 Phase 拆分为 1-3 个 Change。每个 Change 是一个独立可交付单元。
119
- 格式:编号 + 名称 + 简短描述。
120
- 如果 Change 之间有依赖关系,用箭头标注。
121
-
122
- 格式示例:
123
- 这个 Phase 包含 2 个 Change:
124
-
125
- 1. **optimize-list-scroll** ← 核心性能优化(先做)
126
- - 描述:实现 OptimizedList 组件 + getItemLayout 配置
127
- - 依赖:无(基础 change)
128
-
129
- 2. **add-scroll-metrics** ← 监控能力增强(后做)
130
- - 描述:新增 useScrollPerformance hook + 数据上报
131
- - 依赖:optimize-list-scroll(需要 OptimizedList 组件)
132
- -->
133
-
134
- 1. **{{change-name-1}}** — {{change-description-1}}
135
- - 依赖:{{dependencies}} <!-- 无则填"无" -->
136
-
137
- 2. **{{change-name-2}}** — {{change-description-2}}
138
- - 依赖:{{dependencies}}
139
-
140
- ---
141
-
142
- ## 非目标
143
-
144
- <!--
145
- 填写指引:
146
- 明确不属于本 Phase 的工作项。这些可能在 roadmap 上但不在本轮。
147
- -->
148
-
149
- - {{非目标 1:为什么不在本 phase 做}}
150
- - {{非目标 2:为什么不在本 phase 做}}
151
- - {{非目标 3:为什么不在本 phase 做}}
@@ -1,224 +0,0 @@
1
- # Design: {{name}}
2
-
3
- > **填表指引**:本文档是 Change Design,在 proposal 批准后编写,描述如何实现。每节均附填写指引,请按指引填写。写完此文档后进入 tasks 拆分解段。
4
-
5
- ---
6
-
7
- ## 背景与目标
8
-
9
- <!--
10
- 填写指引:
11
- 1. 简要描述背景——什么上下文?有什么约束?
12
- 2. 本设计的核心目标是什么?不超过 3 条。
13
- 3. 与 proposal 中的 Intent 和 Must-haves 保持一致。
14
-
15
- 示例:
16
- 当前 FlatList 在 1000+ 条数据场景下帧率降至 20fps。
17
- 本设计目标是:
18
- - 通过 getItemLayout + 固定行高将帧率恢复至 55fps+
19
- - 新增滚动性能监控,为后续优化提供数据依据
20
- - 不改变现有数据获取和渲染逻辑
21
- -->
22
-
23
- {{background-and-goals}}
24
-
25
- ---
26
-
27
- ## 技术方案
28
-
29
- ### 架构图
30
-
31
- <!--
32
- 填写指引:
33
- 用 ASCII art 绘制模块/组件关系图,展示:
34
- - 新增模块与现有模块的关系
35
- - 数据流方向(用箭头标注)
36
- - 文件/模块边界
37
-
38
- 示例:
39
- ```
40
- ┌─────────────────────────────────────────────────┐
41
- │ 页面层 │
42
- │ ┌──────────┐ ┌──────────────────┐ │
43
- │ │ PageHome │───>│ OptimizedList │ │
44
- │ │ │ │ (新增 wrapper) │ │
45
- │ └──────────┘ └────────┬─────────┘ │
46
- │ │ │
47
- │ ┌──────▼─────────┐ │
48
- │ │ useScrollPerf │ │
49
- │ │ (新增 hook) │ │
50
- │ └──────┬─────────┘ │
51
- └───────────────────────────┼──────────────────────┘
52
-
53
- ┌─────────▼─────────┐
54
- │ Performance │
55
- │ Reporter │
56
- │ (已有, 扩展) │
57
- └───────────────────┘
58
- ```
59
-
60
- 绘图原则:
61
- - 方框标注模块/文件/组件
62
- - 箭头标注数据流或控制流
63
- - 标注"新增"、"修改"、"已有"区分
64
- -->
65
-
66
- ```text
67
- {{architecture-diagram}}
68
- ```
69
-
70
- ### 核心数据结构
71
-
72
- <!--
73
- 填写指引:
74
- 列出本设计新增或修改的关键类型/接口/数据结构定义。
75
- 用 TypeScript 接口格式展示。每个类型附简要说明。
76
-
77
- 格式示例:
78
- ```typescript
79
- // 列表配置接口(新增)
80
- interface ListOptimizationConfig {
81
- /** 固定行高,单位 px。设此值启用 getItemLayout */
82
- itemHeight?: number;
83
- /** 可见窗口外预渲染的行数(默认 10) */
84
- windowSize?: number;
85
- /** 是否启用滚动性能采集 */
86
- enableScrollMetrics?: boolean;
87
- }
88
-
89
- // 滚动性能快照(新增)
90
- interface ScrollPerfSnapshot {
91
- avgFps: number;
92
- droppedFrames: number;
93
- totalFrames: number;
94
- scrollDistance: number;
95
- timestamp: number;
96
- }
97
- ```
98
- -->
99
-
100
- {{data-structures}}
101
-
102
- ### 数据流
103
-
104
- <!--
105
- 填写指引:
106
- 用步骤式描述说明数据如何流转。从触发源头到最终效果,每一步写清。
107
-
108
- 格式示例:
109
- 1. 用户下拉列表 → FlatList 触发 onScroll
110
- 2. OptimizedList 读取 itemHeight 配置 → 启用 getItemLayout
111
- 3. 布局引擎跳过动态测量 → 直接使用固定行高计算 offset
112
- 4. useScrollPerformance 每 500ms 采集一次帧率
113
- 5. 帧率数据 → Performance Reporter → 上报后端
114
- 6. 渲染线程不再因布局计算阻塞 → 帧率恢复
115
- -->
116
-
117
- {{data-flow}}
118
-
119
- ### 接口设计
120
-
121
- <!--
122
- 填写指引:
123
- 列出本设计对外暴露的 API 签名,包括:
124
- - 函数/方法名
125
- - 参数列表(名称 + 类型 + 说明)
126
- - 返回值类型
127
- - 是否 async/sync
128
-
129
- 格式示例:
130
-
131
- ```typescript
132
- // OptimizedList 组件 props
133
- interface OptimizedListProps<T> {
134
- data: T[];
135
- renderItem: (item: T, index: number) => React.ReactElement;
136
- /** 固定行高(px),必填以启用 getItemLayout */
137
- itemHeight: number;
138
- /** 窗口外预渲染行数(可选,默认 10) */
139
- windowSize?: number;
140
- /** 启用滚动性能采集(可选,默认 false) */
141
- enableScrollMetrics?: boolean;
142
- /** 滚动性能回调(可选) */
143
- onPerfSnapshot?: (snapshot: ScrollPerfSnapshot) => void;
144
- }
145
-
146
- // useScrollPerformance hook
147
- function useScrollPerformance(
148
- listRef: React.RefObject<FlatList>,
149
- options?: { intervalMs?: number }
150
- ): { avgFps: number; isJanking: boolean };
151
- ```
152
- -->
153
-
154
- {{api-signatures}}
155
-
156
- ---
157
-
158
- ## 文件清单
159
-
160
- <!--
161
- 填写指引:
162
- 列出所有需创建或修改的文件,用表格组织。
163
- -->
164
-
165
- | 文件路径 | 内容描述 | 操作 |
166
- |---|---|---|
167
- | `{{file-path-1}}` | {{description}} | 创建 |
168
- | `{{file-path-2}}` | {{description}} | 修改 |
169
- | `{{file-path-3}}` | {{description}} | 创建 |
170
-
171
- ---
172
-
173
- ## 测试策略
174
-
175
- <!--
176
- 填写指引:
177
- 按测试层次描述覆盖范围。不需要写具体用例——tasks 文件负责拆解。
178
- -->
179
-
180
- ### 单元测试
181
- - <!-- 哪些模块需要单元测试?需要 mock 什么? -->
182
-
183
- ### 集成测试
184
- - <!-- 哪些流程需要集成测试?需要准备什么 fixture? -->
185
-
186
- ### TDD 任务
187
- - <!-- 列出需要走 RED→GREEN→REFACTOR 的 type:behavior 任务 -->
188
-
189
- ---
190
-
191
- ## 备选方案
192
-
193
- <!--
194
- 填写指引:
195
- 列出评估过但未选择的方案,说明为什么放弃。
196
-
197
- | 方案 | 优点 | 缺点 | 不选原因 |
198
- |---|---|---|---|
199
- | {{方案 A}} | {{优点}} | {{缺点}} | {{原因}} |
200
- | {{方案 B}} | {{优点}} | {{缺点}} | {{原因}} |
201
- -->
202
-
203
- | 方案 | 优点 | 缺点 | 不选原因 |
204
- |---|---|---|---|
205
- | {{alt-name-1}} | {{pros}} | {{cons}} | {{reason}} |
206
- | {{alt-name-2}} | {{pros}} | {{cons}} | {{reason}} |
207
-
208
- ---
209
-
210
- ## 风险点
211
-
212
- <!--
213
- 填写指引:
214
- 识别实现风险并评估影响。
215
-
216
- | 风险 | 概率 | 影响 | 缓解措施 |
217
- |---|---|---|---|
218
- | {{风险描述}} | 高/中/低 | 高/中/低 | {{措施}} |
219
- -->
220
-
221
- | 风险 | 概率 | 影响 | 缓解措施 |
222
- |---|---|---|---|
223
- | {{risk-1}} | {{probability}} | {{impact}} | {{mitigation}} |
224
- | {{risk-2}} | {{probability}} | {{impact}} | {{mitigation}} |
@@ -1,95 +0,0 @@
1
- # Goal Review: {{change-name}}
2
-
3
- > 审查时间: {{date}}
4
- > 审查者: {{reviewer | agent/human}}
5
-
6
- ## Change 目标
7
-
8
- 从 proposal.md 中提取的 must-haves(强制目标)和 nice-to-haves(非强制目标)列表。目标应以可观测、可验证的方式表述。
9
-
10
- ### Must-haves(强制目标)
11
-
12
- <!-- 逐条列出 proposal.md "Scope" → "In scope" 中的条目,或 proposal.md 中标记为必须实现的目标 -->
13
-
14
- 1. **目标 1**: <!-- 可观测行为描述,如"用户可以通过邮箱注册账号" -->
15
- 2. **目标 2**: <!-- 如"未登录用户无法访问 /dashboard" -->
16
- 3. **目标 3**: <!-- ... -->
17
-
18
- ### Nice-to-haves(可选目标)
19
-
20
- <!-- 列出 proposal.md 中标记为可选的目标,或 Scope → "Out of scope" 之外的合理期望 -->
21
-
22
- 1. **期望 1**: <!-- ... (如果未实现不需要 FAIL) -->
23
-
24
- **填写指引:**
25
- - 目标必须从 proposal.md 原文提取,不自行发明或解释
26
- - 目标必须以可观测行为描述——不写"模块设计好"而写"接口签名满足 X 和 Y"
27
- - 强制目标(must-haves)和可选目标(nice-to-haves)分开列出
28
- - 如果 proposal.md 没有明确定义 must-haves,则回退到 tasks.md 中的所有 task acceptance 条件
29
-
30
- ## 达成情况
31
-
32
- 每行对应一个目标项,检查代码实现是否实际产生了预期的可观测行为。
33
-
34
- | 目标项 | 可观测行为 | 达成状态 | 证据 | 备注 |
35
- |--------|------------|----------|------|------|
36
- | 目标 1: | <!-- 预期的可观测行为描述 --> | ✅ 达成 / ❌ 未达成 / ⚠️ 部分达成 | <!-- 测试通过、演示录屏、截图、日志等 --> | <!-- 偏离项说明 --> |
37
- | 目标 2: | <!-- ... --> | ✅ 达成 | <!-- test/login.test.ts:12-30 PASS --> | |
38
- | API 响应时延 < 200ms | 接口 95 分位响应时间 | ❌ 未达成 | loadtest result: p95=450ms | 已在 plan 中添加性能优化任务 |
39
-
40
- **达成状态判定标准:**
41
-
42
- | 状态 | 标准 |
43
- |------|------|
44
- | ✅ 达成 | 对应的可观测行为已经实现并通过验证 |
45
- | ❌ 未达成 | 目标对应的行为没有实现或验证失败 |
46
- | ⚠️ 部分达成 | 主要行为实现但存在偏差(如缺少某些边界处理) |
47
-
48
- **证据要求:**
49
- - ✅ 必须附证据——通过的测试用例、截图、性能测试数据、用户验收记录等
50
- - 不写"代码已实现"作为证据——要证明的是"行为可观测",而不是"代码存在"
51
- - ❌ 和 ⚠️ 必须在下方的"未达成项详情"中分析根因
52
-
53
- ## 未达成项详情
54
-
55
- 对于 ❌ 未达成 和 ⚠️ 部分达成 的目标项,逐项展开分析。
56
-
57
- ### {{目标项}}: {{目标描述}}
58
-
59
- - **预期行为**: <!-- proposal.md 或 tasks.md 中定义的验收标准 -->
60
- - **实际行为**: <!-- 当前代码的行为 -->
61
- - **差距分析**: <!-- 为什么有差距 -->
62
- - **根因**: <!-- 是设计漏了、实现遗漏、还是需求变更了 -->
63
- - **修复方向**: <!-- 达成目标具体需要做啥 -->
64
- - **是否影响其他目标**: <!-- 修复这个会不会导致其他目标失效 -->
65
-
66
- ### <!-- 下一个未达成项 -->
67
-
68
- <!-- 无 ❌/⚠️ 项时写"所有目标均已达成,无不达成项。" -->
69
-
70
- ## Scope Creep 检查
71
-
72
- 检查实现中是否包含了 proposal.md 范围之外的功能。
73
-
74
- | 发现的功能 | 对应代码位置 | 是否可接受 | 说明 |
75
- |------------|-------------|------------|------|
76
- | <!-- 额外实现的功能 --> | <!-- 文件+行号 --> | 可接受 / 需移除 | <!-- 理由 --> |
77
-
78
- **填写指引:**
79
- - 超出 proposal 范围的功能不等于坏代码,但需要在 change 上下文中评估
80
- - 如果 scope creep 影响了原目标的交付或增加了风险,应标记为"需移除"
81
- - 发现非预期的 side effect(如修改了不该改的模块)也在此记录
82
-
83
- ## 结论
84
-
85
- - [ ] **PASS** — 所有 must-haves 目标达成,无 scope creep 风险
86
- - [ ] **FAIL** — 存在未达成的 must-haves 目标:
87
- - <!-- 列出具体未达成的目标项 -->
88
- - <!-- 建议:窄化 change 范围 or 增加 commit 完成剩余目标 -->
89
-
90
- **审查总结:**
91
- - 总目标: <!-- N --> 个 must-have, <!-- M --> 个 nice-to-have
92
- - 达成: <!-- 数量 --> / <!-- N --> must-haves 完成
93
- - 未达成: <!-- 数量 --> / <!-- N -->
94
- - Scope Creep: <!-- 数量 --> 处
95
- - 整体评估: <!-- 该 change 是否值得发布 / 需要修补 / 建议拆分 -->