@culeo/specx 0.1.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.
- package/README.md +154 -0
- package/package.json +30 -0
- package/skills/specx-archive/SKILL.md +235 -0
- package/skills/specx-clarify/SKILL.md +581 -0
- package/skills/specx-create-design-template/SKILL.md +262 -0
- package/skills/specx-create-rule/SKILL.md +174 -0
- package/skills/specx-demystify/SKILL.md +180 -0
- package/skills/specx-design/SKILL.md +126 -0
- package/skills/specx-docs-align/SKILL.md +225 -0
- package/skills/specx-executing-plans/SKILL.md +83 -0
- package/skills/specx-writing-plans/SKILL.md +183 -0
- package/specx.js +385 -0
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: specx-clarify
|
|
3
|
+
description: specx 流程第二步 — 需求澄清 & 规格输出。通过迭代式提问,逐步完善需求文档并输出规格说明书。
|
|
4
|
+
category: software-development
|
|
5
|
+
tags: [specx, requirements, clarify, spec]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# specx-clarify:需求澄清 & 规格输出
|
|
9
|
+
|
|
10
|
+
## 触发条件
|
|
11
|
+
|
|
12
|
+
当有一个已拆解的子需求 `00-子需求.md`,需要生成 `01-clarify.md` 和 `02-spec.md` 时使用。
|
|
13
|
+
|
|
14
|
+
**输入:** `00-子需求.md`
|
|
15
|
+
**输出:** `01-clarify.md` + `02-spec.md`
|
|
16
|
+
|
|
17
|
+
## 前置:了解项目背景(可选)
|
|
18
|
+
|
|
19
|
+
如果对需求背景、领域概念等有疑问,可查阅 `docs/specx/wiki/` 中的已有知识沉淀。
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 核心思想
|
|
24
|
+
|
|
25
|
+
### 两个文件,两个角色
|
|
26
|
+
|
|
27
|
+
| 文件 | 回答的问题 | 何时产出 |
|
|
28
|
+
|------|-----------|---------|
|
|
29
|
+
| **01-clarify.md** | 这个功能「要做什么」| 快速扫盲后立即输出初始版 |
|
|
30
|
+
| **02-spec.md** | 怎么算「做好了」| 深度挖掘,逐步完善 |
|
|
31
|
+
|
|
32
|
+
### 迭代式澄清
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
读 00-子需求.md(快速扫盲)
|
|
36
|
+
↓
|
|
37
|
+
输出 01-clarify.md(初始版)
|
|
38
|
+
↓
|
|
39
|
+
尝试写 02-spec.md(深度挖掘)
|
|
40
|
+
↓
|
|
41
|
+
遇到模糊点 → 问问题 → 更新 01-clarify.md
|
|
42
|
+
↓
|
|
43
|
+
继续写 spec
|
|
44
|
+
↓
|
|
45
|
+
重复,直到 spec 完成
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 核心方法论
|
|
51
|
+
|
|
52
|
+
### 1. 5W1H(快速扫盲用)
|
|
53
|
+
|
|
54
|
+
> 用于 Step 1 快速扫盲时建立需求初步认知
|
|
55
|
+
|
|
56
|
+
| 问题 | 含义 | 在 clarify 中的用途 |
|
|
57
|
+
|------|------|------------------|
|
|
58
|
+
| **What** | 是什么 | 需求概述 |
|
|
59
|
+
| **Who** | 谁用 | 用户场景 |
|
|
60
|
+
| **When** | 什么时候 | 边界情况/触发时机 |
|
|
61
|
+
| **Why** | 为什么做 | ❌ 不深究需求价值评估,那是上游的职责 |
|
|
62
|
+
| **Where** | 在哪 | ❌ 大部分情况上下文已带出,无需再问 |
|
|
63
|
+
| **How** | 怎么做 | 在 spec 里写 |
|
|
64
|
+
|
|
65
|
+
**注意:clarify 质疑的是「是否清晰」,不质疑「是否应该做」。**
|
|
66
|
+
|
|
67
|
+
### 2. Given-When-Then(写 spec 验收标准用)
|
|
68
|
+
|
|
69
|
+
> 用于描述可测试的行为标准,写入 `02-spec.md` 的验收标准章节
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
GIVEN {前置条件}
|
|
73
|
+
WHEN {触发动作}
|
|
74
|
+
THEN {预期结果}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**参考模板:见 Step 3 spec 模板中的「验收标准」章节**
|
|
78
|
+
|
|
79
|
+
### 3. SRS Quality Attributes(clarify 完成后的质量检查)
|
|
80
|
+
|
|
81
|
+
> 用于 Step 6 完成前的质量自检,基于 IEEE 830 SRS 标准
|
|
82
|
+
|
|
83
|
+
| 属性 | 含义 | 检查问题 |
|
|
84
|
+
|------|------|---------|
|
|
85
|
+
| **Complete** | 完整 | 所有必要细节都覆盖了?用户场景、边界情况都写了? |
|
|
86
|
+
| **Consistent** | 一致 | 内部无矛盾?与其他子需求无冲突? |
|
|
87
|
+
| **Clear** | 清晰 | 描述无歧义?只有一种理解?没用模糊词汇? |
|
|
88
|
+
| **Testable** | 可测试 | 能导出 Given-When-Then 验收标准?标准是否明确可验证? |
|
|
89
|
+
| **Traceable** | 可追溯 | 能追溯到 00-子需求 的原始需求? |
|
|
90
|
+
|
|
91
|
+
**参考:见「质量检查清单」章节**
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 流程(Step-by-Step)
|
|
96
|
+
|
|
97
|
+
### Step 0️⃣ 检查现有文件(恢复模式)
|
|
98
|
+
|
|
99
|
+
> ⚠️ 如果之前中断或未完成,从这里开始
|
|
100
|
+
|
|
101
|
+
**动作:**
|
|
102
|
+
1. 检查是否存在 `01-clarify.md` 和 `02-spec.md`
|
|
103
|
+
2. 如果存在,读取并分析中断点
|
|
104
|
+
|
|
105
|
+
**判断逻辑:**
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
读取 01-clarify.md:
|
|
109
|
+
├── 有「回答:-」的 Q → 继续这个 Q(不要重复问)
|
|
110
|
+
├── 「待确认」有未勾选 → 继续问
|
|
111
|
+
└── 都是 ✅ → 检查 spec 完成度
|
|
112
|
+
|
|
113
|
+
读取 02-spec.md:
|
|
114
|
+
├── 有空章节 → 补全
|
|
115
|
+
└── 都写完 → 检查「待确认」是否清空
|
|
116
|
+
├── 已清空 → 标记完成,结束
|
|
117
|
+
└── 未清空 → 继续问
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**中断点判断:**
|
|
121
|
+
|
|
122
|
+
```markdown
|
|
123
|
+
// 01-clarify.md 中断信号
|
|
124
|
+
**状态:** 🔄 进行中 ← 进行中 = 未完成
|
|
125
|
+
**clarify 结束时间:** - ← 空 = 未完成
|
|
126
|
+
|
|
127
|
+
// Q&A 中断信号
|
|
128
|
+
### Q2: ...
|
|
129
|
+
**回答:** - ← 空 = 未回答,继续追问
|
|
130
|
+
**确认时间:** - ← 空 = 未确认
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**不存在 → 从 Step 1 开始。存在但不完整 → 从中断点继续。**
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
### Step 1️⃣ 快速扫盲
|
|
138
|
+
|
|
139
|
+
**动作:** 读 `00-子需求.md`,理解这个子需求要做什么
|
|
140
|
+
|
|
141
|
+
**原则:不要逐字逐句分析,不要深挖细节,先快速建立整体认知**
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
### Step 2️⃣ 输出初始 clarify-prd
|
|
146
|
+
|
|
147
|
+
**动作:** 基于快速扫盲,立即输出 `01-clarify.md` 初始版本
|
|
148
|
+
|
|
149
|
+
**01-clarify.md 内容结构:**
|
|
150
|
+
|
|
151
|
+
```markdown
|
|
152
|
+
---
|
|
153
|
+
status: draft
|
|
154
|
+
updated: {YYYY-MM-DD}
|
|
155
|
+
history:
|
|
156
|
+
- "v1: 初始创建"
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
# {子需求名称}
|
|
160
|
+
|
|
161
|
+
**所属原始需求:** {需求名称}
|
|
162
|
+
**子需求目录:** T-{序号}-{名称}
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 需求概述
|
|
167
|
+
|
|
168
|
+
{用一段话描述这个功能要做什么}
|
|
169
|
+
|
|
170
|
+
## 用户场景
|
|
171
|
+
|
|
172
|
+
- 场景 1:{描述}
|
|
173
|
+
- 场景 2:{描述}
|
|
174
|
+
|
|
175
|
+
## 功能要点
|
|
176
|
+
|
|
177
|
+
- {要点1}
|
|
178
|
+
- {要点2}
|
|
179
|
+
- {要点3}
|
|
180
|
+
|
|
181
|
+
## 边界情况
|
|
182
|
+
|
|
183
|
+
- {情况1}
|
|
184
|
+
- {情况2}
|
|
185
|
+
|
|
186
|
+
## Q&A 记录
|
|
187
|
+
|
|
188
|
+
{clarify 过程中逐步添加}
|
|
189
|
+
|
|
190
|
+
## 待确认 / 需要澄清的点
|
|
191
|
+
|
|
192
|
+
- [ ] {问题1}
|
|
193
|
+
- [ ] {问题2}
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 更新记录
|
|
198
|
+
|
|
199
|
+
| 时间 | 更新内容 |
|
|
200
|
+
|------|---------|
|
|
201
|
+
| {YYYY-MM-DD} | 初始版本 |
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**这个版本可能不完整,但先写出来再说。**
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
### Step 2.5️⃣ 框架对齐(跳过已定义的)
|
|
209
|
+
|
|
210
|
+
> ⚠️ 如果 `docs/specx/rule/` 下已有规范,只clarify 框架未定义的部分
|
|
211
|
+
|
|
212
|
+
**动作:**
|
|
213
|
+
1. 扫描 `docs/specx/rule/` 目录下的规范文件
|
|
214
|
+
2. 在 clarify-prd 中标注哪些是框架定义的(直接引用,不重复问)
|
|
215
|
+
3. 只对「框架未定义」的部分提问
|
|
216
|
+
|
|
217
|
+
**扫描范围:**
|
|
218
|
+
```
|
|
219
|
+
docs/specx/rule/ → 项目框架规范(由项目自己组织子目录结构)
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**标注示例:**
|
|
223
|
+
```markdown
|
|
224
|
+
## 交互行为
|
|
225
|
+
|
|
226
|
+
- 加载状态:骨架屏 ← 框架定义(rule/ui/loading.md)
|
|
227
|
+
- 空数据:「暂无数据」← 框架定义(rule/ui/empty.md)
|
|
228
|
+
- 网络错误:重试按钮 ← 框架定义(rule/error/retry.md)
|
|
229
|
+
- [ ] 分页加载:每次加载多少条?← 需要澄清
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**好处:**
|
|
233
|
+
- 不重复问已有答案 → 省时间
|
|
234
|
+
- 不污染上下文 → AI 不会被无用信息干扰
|
|
235
|
+
- 保持一致性 → 大家都用同一套规范
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
### Step 3️⃣ 尝试写 spec
|
|
240
|
+
|
|
241
|
+
**动作:** 基于当前的 `01-clarify.md`,尝试写 `02-spec.md`(参考「框架已定义」的部分,不重复问)
|
|
242
|
+
|
|
243
|
+
**02-spec.md 内容结构:**
|
|
244
|
+
|
|
245
|
+
```markdown
|
|
246
|
+
---
|
|
247
|
+
status: draft
|
|
248
|
+
updated: {YYYY-MM-DD}
|
|
249
|
+
history:
|
|
250
|
+
- "v1: 初始创建"
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
# {子需求名称} — 规格说明书
|
|
254
|
+
|
|
255
|
+
**所属子需求:** T-{序号}-{名称}
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 验收标准
|
|
260
|
+
|
|
261
|
+
> 使用 Given-When-Then 格式,描述行为而非实现
|
|
262
|
+
|
|
263
|
+
```markdown
|
|
264
|
+
验收标准:
|
|
265
|
+
|
|
266
|
+
GIVEN {前置条件}
|
|
267
|
+
WHEN {触发动作}
|
|
268
|
+
THEN {预期结果}
|
|
269
|
+
|
|
270
|
+
GIVEN 用户打开页面
|
|
271
|
+
WHEN 数据加载完成
|
|
272
|
+
THEN 显示股票名称、当前价格、涨跌幅
|
|
273
|
+
AND 显示更新时间
|
|
274
|
+
|
|
275
|
+
GIVEN 用户下拉刷新
|
|
276
|
+
WHEN 网络请求成功
|
|
277
|
+
THEN 更新数据并显示新时间戳
|
|
278
|
+
AND 显示「刷新成功」提示
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Given-When-Then 格式说明:**
|
|
282
|
+
```
|
|
283
|
+
GIVEN → 前置条件(状态/数据/用户角色)
|
|
284
|
+
WHEN → 触发动作(用户操作/系统事件)
|
|
285
|
+
THEN → 预期结果(可见变化/返回值)
|
|
286
|
+
AND → 附加结果(可叠加多个)
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
> ⚠️ 一个 When 对应一个 Then,不要在一个 When 下写多个独立行为
|
|
290
|
+
|
|
291
|
+
## 功能描述
|
|
292
|
+
|
|
293
|
+
{详细描述功能行为}
|
|
294
|
+
|
|
295
|
+
## 数据要求
|
|
296
|
+
|
|
297
|
+
- 数据来源:{描述}
|
|
298
|
+
- 数据格式:{描述}
|
|
299
|
+
- 边界数据:{描述}
|
|
300
|
+
|
|
301
|
+
## 交互行为
|
|
302
|
+
|
|
303
|
+
- 正常流程:{描述}
|
|
304
|
+
- 异常流程:{描述} ← 引用框架定义(rule/error/*.md)
|
|
305
|
+
- 加载状态:{描述} ← 引用框架定义(rule/ui/*.md)
|
|
306
|
+
- 错误状态:{描述} ← 引用框架定义(rule/error/*.md)
|
|
307
|
+
|
|
308
|
+
## UI 要求(如有)
|
|
309
|
+
|
|
310
|
+
{尺寸、布局、字体等}
|
|
311
|
+
|
|
312
|
+
## 技术约束
|
|
313
|
+
|
|
314
|
+
{性能要求、兼容性要求等}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
> ⚠️ spec 中引用框架已定义的部分时,标注来源(如 `← 框架定义 rule/ui/loading.md`),不用重复描述细节。
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
### Step 4️⃣ 迭代澄清
|
|
322
|
+
|
|
323
|
+
**触发条件:** 写 spec 时遇到以下情况
|
|
324
|
+
|
|
325
|
+
- 某个点「不知道」「不确定」「原文没写」
|
|
326
|
+
- 边界情况没定义
|
|
327
|
+
- 数据格式没明确
|
|
328
|
+
- 交互逻辑有歧义
|
|
329
|
+
|
|
330
|
+
**动作:**
|
|
331
|
+
1. **停下来**,不要猜
|
|
332
|
+
2. **问一个问题**(一次只问一个)
|
|
333
|
+
3. 等回答
|
|
334
|
+
4. 记录到 `01-clarify.md` 的「Q&A 记录」和「待确认」
|
|
335
|
+
5. 基于新信息继续写 spec
|
|
336
|
+
|
|
337
|
+
**提问后处理答案:**
|
|
338
|
+
```
|
|
339
|
+
用户回答 → 判断类型:
|
|
340
|
+
├── 选择 A/B/C → 直接采用,更新文档
|
|
341
|
+
├── 提出新方案 → 评估后采纳或再确认
|
|
342
|
+
└── 开放式回答 → 整理成明确结论,更新文档
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
**分节确认(可选):**
|
|
346
|
+
clarify 完成后,spec 可以分节呈现给用户确认:
|
|
347
|
+
|
|
348
|
+
```
|
|
349
|
+
"02-spec.md 的「验收标准」已写完,
|
|
350
|
+
你看一下这部分 OK 吗?"
|
|
351
|
+
|
|
352
|
+
→ OK 后继续写下一节(功能描述)
|
|
353
|
+
→ ...直到 spec 完成
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
> 如果用户懒得分节确认,可以直接写完再一起过一遍。
|
|
357
|
+
|
|
358
|
+
**提问原则:**
|
|
359
|
+
- 一次只问一个问题
|
|
360
|
+
- 等回答后再问下一个
|
|
361
|
+
- 描述模糊的地方要具体化
|
|
362
|
+
|
|
363
|
+
**提问策略(借鉴 brainstorming):**
|
|
364
|
+
|
|
365
|
+
1. **多选优先** — 不只问「怎么做」,而是给选项:
|
|
366
|
+
|
|
367
|
+
```
|
|
368
|
+
❌ 开放式提问(用户难回答)
|
|
369
|
+
"数据加载失败怎么显示?"
|
|
370
|
+
|
|
371
|
+
✅ 多选提问(用户轻松选)
|
|
372
|
+
"数据加载失败怎么显示?
|
|
373
|
+
A. 显示「加载失败」+ 重试按钮
|
|
374
|
+
B. 显示「加载失败」+ 自动重试3次
|
|
375
|
+
C. 显示「加载失败」+ 进入离线缓存模式
|
|
376
|
+
|
|
377
|
+
选哪个?"
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
2. **提出方案(涉及设计决策时)** — 不只问偏好,而是给出方案 + 分析:
|
|
381
|
+
|
|
382
|
+
```
|
|
383
|
+
"对于这个功能,我建议 3 种方案:
|
|
384
|
+
|
|
385
|
+
A. 方案A(描述)
|
|
386
|
+
优点:...
|
|
387
|
+
缺点:...
|
|
388
|
+
|
|
389
|
+
B. 方案B(描述)
|
|
390
|
+
优点:...
|
|
391
|
+
缺点:...
|
|
392
|
+
|
|
393
|
+
C. 方案C(描述)
|
|
394
|
+
优点:...
|
|
395
|
+
缺点:...
|
|
396
|
+
|
|
397
|
+
推荐 A,因为..."
|
|
398
|
+
|
|
399
|
+
你觉得哪个合适?"
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
3. **开放式(无标准答案时用)** — 多选无法覆盖时:
|
|
403
|
+
|
|
404
|
+
```
|
|
405
|
+
"这个功能的用户是谁?"
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
**记录格式:**
|
|
409
|
+
```markdown
|
|
410
|
+
### Q{n}: {问题}
|
|
411
|
+
**回答:** {答案}
|
|
412
|
+
**确认时间:** {YYYY-MM-DD}
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
**更新待确认:**
|
|
416
|
+
```markdown
|
|
417
|
+
- [x] {问题} ✅
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
### Step 5️⃣ 更新文档
|
|
423
|
+
|
|
424
|
+
**每次澄清后,同步更新:**
|
|
425
|
+
- `01-clarify.md`:补充 Q&A 记录,更新「待确认」清单,追加更新记录
|
|
426
|
+
- `02-spec.md`:基于新信息完善 spec
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
### Step 6️⃣ 完成
|
|
431
|
+
|
|
432
|
+
**停止条件:**
|
|
433
|
+
```
|
|
434
|
+
02-spec.md 的所有章节都填写完整
|
|
435
|
+
所有「待确认」都已清除或有明确结论
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
**完成标记:**
|
|
439
|
+
```markdown
|
|
440
|
+
// 01-clarify.md 顶部,将 status 改为 review
|
|
441
|
+
---
|
|
442
|
+
status: review
|
|
443
|
+
updated: {YYYY-MM-DD}
|
|
444
|
+
history:
|
|
445
|
+
- "v1: 初始创建"
|
|
446
|
+
- "v2: clarify 完成"
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
// 更新记录追加
|
|
450
|
+
| {YYYY-MM-DD} | clarify 完成 |
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## 示例迭代过程
|
|
456
|
+
|
|
457
|
+
```
|
|
458
|
+
第 1 次迭代:
|
|
459
|
+
→ 读 00-子需求.md
|
|
460
|
+
→ 写 01-clarify.md(初始版)
|
|
461
|
+
→ 尝试写 02-spec.md
|
|
462
|
+
→ 发现:数据来源不清楚
|
|
463
|
+
→ 问:数据从哪个接口获取?
|
|
464
|
+
|
|
465
|
+
第 2 次迭代:
|
|
466
|
+
→ 回答:XX 接口
|
|
467
|
+
→ 更新 01-clarify.md(Q&A + 待确认打勾)
|
|
468
|
+
→ 继续写 02-spec.md
|
|
469
|
+
→ 发现:空数据怎么显示?
|
|
470
|
+
→ 问:空数据展示什么?
|
|
471
|
+
|
|
472
|
+
第 3 次迭代:
|
|
473
|
+
→ 回答:显示「暂无数据」
|
|
474
|
+
→ 更新 01-clarify.md
|
|
475
|
+
→ 继续写 02-spec.md
|
|
476
|
+
→ ...(继续直到完成)
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
---
|
|
480
|
+
|
|
481
|
+
## 中断恢复示例
|
|
482
|
+
|
|
483
|
+
```
|
|
484
|
+
场景:clarify 进行到一半,AI 关闭了
|
|
485
|
+
|
|
486
|
+
恢复时:
|
|
487
|
+
Step 0 → 读取 01-clarify.md
|
|
488
|
+
→ 发现:
|
|
489
|
+
- Q2 的「回答:-」→ 继续追问 Q2
|
|
490
|
+
- 待确认有 2 项未勾选 → 继续问
|
|
491
|
+
→ 继续 Step 4
|
|
492
|
+
|
|
493
|
+
而不是:
|
|
494
|
+
→ 重新从 Step 1 开始
|
|
495
|
+
→ 重复问 Q1、Q2(用户崩溃)
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
---
|
|
499
|
+
|
|
500
|
+
## 重要提示
|
|
501
|
+
|
|
502
|
+
- **不要在扫盲阶段深挖** — 快速建立认知,先写出来
|
|
503
|
+
- **一次只问一个问题** — 问完等回答,不要堆一堆问题
|
|
504
|
+
- **遇到不确定就问** — 不要猜,不要假设,不要「应该」
|
|
505
|
+
- **两个文件同步更新** — clarify-prd 和 spec 是一体的
|
|
506
|
+
- **clarify 迭代次数不限** — 可能是 1 次,可能是 10 次,都正常
|
|
507
|
+
- **文档状态** — 新建时 `draft`,完成时 `review`
|
|
508
|
+
- **框架已定义的不重复问** — 先扫描 `docs/specx/rule/`,直接引用,只clarify 未定义的部分
|
|
509
|
+
- **避免污染上下文** — 框架规范在 rule/ 目录维护,不进clarify过程
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
## 质量检查清单
|
|
514
|
+
|
|
515
|
+
完成 clarify 后,确认:
|
|
516
|
+
|
|
517
|
+
### SRS Quality Attributes 质量检查(clarify-prd)
|
|
518
|
+
|
|
519
|
+
```
|
|
520
|
+
SRS Quality Attributes 检查
|
|
521
|
+
━━━━━━━━━━━━━━━━━━━━━━
|
|
522
|
+
☐ Complete(完整)?
|
|
523
|
+
→ 所有必要细节都覆盖了?用户场景、边界情况都写了?
|
|
524
|
+
|
|
525
|
+
☐ Consistent(一致)?
|
|
526
|
+
→ 内部无矛盾?与其他子需求无冲突?
|
|
527
|
+
|
|
528
|
+
☐ Clear(清晰)?
|
|
529
|
+
→ 描述无歧义?只有一种理解?没用模糊词汇?
|
|
530
|
+
|
|
531
|
+
☐ Testable(可测试)?
|
|
532
|
+
→ 能导出 Given-When-Then 验收标准?标准是否明确可验证?
|
|
533
|
+
|
|
534
|
+
☐ Traceable(可追溯)?
|
|
535
|
+
→ 能追溯到 00-子需求 的原始需求?
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### Given-When-Then 检查(spec 验收标准)
|
|
539
|
+
|
|
540
|
+
```
|
|
541
|
+
GWT 检查
|
|
542
|
+
━━━━━━━━━━━━━━━━━━━━━━
|
|
543
|
+
[ ] 每个验收标准都有 GIVEN-WHEN-THEN
|
|
544
|
+
[ ] GIVEN 描述的是前置条件,不是实现细节
|
|
545
|
+
[ ] WHEN 描述的是用户动作或系统事件
|
|
546
|
+
[ ] THEN 描述的是可见结果
|
|
547
|
+
[ ] 一个 WHEN 对应一个 THEN(不多对一)
|
|
548
|
+
[ ] 验收标准可测试、可验证
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
---
|
|
552
|
+
|
|
553
|
+
### 综合自检(SRS Quality Attributes)
|
|
554
|
+
|
|
555
|
+
```
|
|
556
|
+
clarify 质量自检(SRS Quality Attributes)
|
|
557
|
+
━━━━━━━━━━━━━━━━━━━━━━
|
|
558
|
+
☐ Complete(完整)?
|
|
559
|
+
[ ] 01-clarify.md 的「需求概述」能回答「这个功能做什么」
|
|
560
|
+
[ ] 01-clarify.md 有「用户场景」描述
|
|
561
|
+
[ ] 01-clarify.md 的「边界情况」已列出
|
|
562
|
+
|
|
563
|
+
☐ Consistent(一致)?
|
|
564
|
+
[ ] 01-clarify.md 的「待确认」都已清除或有结论
|
|
565
|
+
[ ] 与其他子需求无冲突
|
|
566
|
+
|
|
567
|
+
☐ Clear(清晰)?
|
|
568
|
+
[ ] 02-spec.md 的「功能描述」无歧义
|
|
569
|
+
[ ] 没用模糊词汇(如「可能」「也许」「大概」)
|
|
570
|
+
|
|
571
|
+
☐ Testable(可测试)?
|
|
572
|
+
[ ] 02-spec.md 的「验收标准」使用 Given-When-Then 格式
|
|
573
|
+
[ ] 02-spec.md 的「异常流程」有定义
|
|
574
|
+
|
|
575
|
+
☐ Traceable(可追溯)?
|
|
576
|
+
[ ] 01-clarify.md 的需求能追溯到 00-子需求 的原始需求
|
|
577
|
+
|
|
578
|
+
[ ] 01-clarify.md 状态为「✅ 已完成」
|
|
579
|
+
[ ] 01-clarify.md 有 clarify 结束时间
|
|
580
|
+
[ ] 02-spec.md 的所有章节都填写完整
|
|
581
|
+
```
|