sillyspec 3.17.15 → 3.18.1

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.
@@ -10,6 +10,60 @@ export const definition = {
10
10
 
11
11
  // 固定前缀步骤
12
12
  export const fixedPrefix = [
13
+ {
14
+ name: '复杂度分类',
15
+ prompt: `在生成计划之前,先判定本次需求的复杂度等级(plan_level)。
16
+
17
+ ### 操作
18
+ 1. 读取 tasks.md 和 design.md,了解需求范围
19
+ 2. 按「分级规则」判定 plan_level
20
+
21
+ ### 分级规则
22
+ 判定 plan_level 为 none 时,需**同时满足**以下所有条件:
23
+ - 涉及文件 ≤ 2 个
24
+ - 不跨模块(改动集中在单个模块内)
25
+ - 无 schema / DB / manifest / local.yaml 变更
26
+ - 无状态机 / workflow 状态流转变更
27
+ - 无 source_root / spec_root / runtime_root 路径隔离规则变更
28
+ - 无 validator / postcheck / agent 调度行为变更
29
+ - 需求明确,无设计歧义
30
+
31
+ 判定为 light(满足任一即升为 light):
32
+ - 涉及 3-5 个文件
33
+ - 涉及 prompt 行为变更
34
+ - 涉及 validator / postcheck 逻辑
35
+ - 涉及路径规则变更(但范围可控)
36
+ - 涉及 schema/DB/状态机变更,但影响面可控
37
+ - 需要明确验收标准来防止范围漂移
38
+
39
+ 判定为 full(满足任一即升为 full):
40
+ - 预计 8 个以上 task
41
+ - 跨 3 个以上模块
42
+ - 涉及 CLI + 平台 + DB 联动
43
+ - 涉及 agent 调度 / worktree / isolation 逻辑
44
+ - 涉及复杂状态恢复(checkpoint / resume)
45
+ - 需要并行 sub-agent 执行
46
+ - 需要人工审查设计方向
47
+ - 涉及 worktree / baseline / sandbox 等基础设施
48
+
49
+ ### 输出格式
50
+ 在输出开头,以如下格式输出分类结果:
51
+
52
+ \`\`\`
53
+ plan_level: none | light | full
54
+ reason: <一句话说明判定理由>
55
+ estimated_files: <N>
56
+ cross_module: true | false
57
+ has_schema_change: true | false
58
+ has_state_machine_change: true | false
59
+ needs_parallel_execution: true | false
60
+ needs_human_review: true | false
61
+ \`\`\`
62
+
63
+ 分类完成后,继续进入下一步。`,
64
+ outputHint: '复杂度分类结果',
65
+ optional: false
66
+ },
13
67
  {
14
68
  name: '状态检查',
15
69
  prompt: `检查当前状态,确认可以执行 plan。
@@ -30,22 +84,25 @@ export const fixedPrefix = [
30
84
  ### 操作
31
85
  1. 读取 CODEBASE-OVERVIEW.md + 各子项目上下文
32
86
  2. 读取 proposal.md、design.md、requirements.md、tasks.md
33
- 3. 读取 CONVENTIONS.md、ARCHITECTURE.md、STACK.md
34
- 4. 读取 local.yaml 获取构建/测试命令
87
+ 3. 如果存在 decisions.md,必须读取并提取所有当前版本 D-xxx@vN 决策 ID
88
+ - 如果发现 priority=P0/P1 且 status=unresolved/blocking 的决策,停止生成计划,要求先回到 brainstorm 的 Design Grill 修正
89
+ - 如果发现 superseded 决策,只引用最新版本,不引用旧版本
90
+ 4. 读取 CONVENTIONS.md、ARCHITECTURE.md、STACK.md
91
+ 5. 读取 local.yaml 获取构建/测试命令
35
92
 
36
93
  ### 模块文档加载
37
- 5. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
38
- 6. 根据 design.md 的文件变更清单匹配 _module-map.yaml 中的模块
39
- 7. 读取匹配到的 \`.sillyspec/docs/<project>/modules/<module>.md\`
40
- 8. 将模块文档作为制定计划的上下文,确保计划符合模块当前设计
41
- 9. **利用模块依赖关系辅助分析**:
94
+ 6. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
95
+ 7. 根据 design.md 的文件变更清单匹配 _module-map.yaml 中的模块
96
+ 8. 读取匹配到的 \`.sillyspec/docs/<project>/modules/<module>.md\`
97
+ 9. 将模块文档作为制定计划的上下文,确保计划符合模块当前设计
98
+ 10. **利用模块依赖关系辅助分析**:
42
99
  - 用 depends_on 判断哪些模块会被间接影响
43
100
  - 用 used_by 判断变更会不会影响下游模块
44
101
  - 将依赖关系纳入 Wave 分组决策(依赖同一模块的任务尽量同 Wave)
45
102
  - 如果变更涉及多个有依赖关系的模块,在 plan.md 的任务总表中标注模块依赖
46
103
 
47
104
  ### 输出
48
- 已加载的文件清单(含模块文档 + 模块依赖关系摘要)`,
105
+ 已加载的文件清单(含 decisions.md 当前版本/未决项状态、模块文档 + 模块依赖关系摘要)`,
49
106
  outputHint: '文件清单',
50
107
  optional: false
51
108
  },
@@ -62,11 +119,94 @@ export const fixedPrefix = [
62
119
  optional: false
63
120
  },
64
121
  {
65
- name: '展开任务并分组',
66
- prompt: `把 tasks.md 每个 checkbox 展开为任务描述,按 Wave 分组,产出 plan.md 总览。
122
+ name: '按复杂度生成分级计划',
123
+ prompt: `根据「复杂度分类」步骤的 plan_level 结果,按对应级别生成计划。
124
+
125
+ ### 操作
126
+ 1. 读取上一步输出的 plan_level 分类结果
127
+ 2. 读取 tasks.md 和 design.md 了解需求范围
128
+ 3. 按 plan_level 选择对应模板输出
129
+
130
+ ---
67
131
 
68
- ### plan.md 格式(PM 视角 + 机器可解析)
132
+ #### plan_level = none
133
+ 生成最小 plan.md(占位文件,保持流程兼容),不生成完整蓝图。格式:
69
134
  \`\`\`markdown
135
+ ---
136
+ plan_level: none
137
+ ---
138
+
139
+ # 计划跳过
140
+
141
+ ## 原因
142
+ <一句话说明判定理由>
143
+
144
+ ## 建议直接 execute
145
+ 直接进入 execute 阶段完成下列最小任务。
146
+
147
+ ## Tasks
148
+ - [ ] task-01: 按用户需求完成小范围明确修改
149
+
150
+ ## 验收
151
+ - 修改范围符合用户需求
152
+ - 不引入额外无关变更
153
+ - 必要测试或检查通过
154
+ \`\`\`
155
+ **注意:** 所有 plan_level 都必须包含 \`- [ ] task-XX:\` 格式的 checkbox 任务,execute 阶段依赖此格式解析任务。
156
+
157
+ ---
158
+
159
+ #### plan_level = light
160
+ 生成轻量 plan.md,保存到变更目录。只包含以下四部分:
161
+
162
+ \`\`\`markdown
163
+ ---
164
+ plan_level: light
165
+ ---
166
+
167
+ # 轻量计划:<需求简述>
168
+
169
+ ## 来源
170
+ 直接引用 brainstorm 结论或用户原始需求,不重新扩写。
171
+
172
+ ## 范围
173
+ - 涉及的文件/模块清单
174
+
175
+ ## Tasks
176
+ - [ ] task-01: ...(覆盖:FR-01, D-001@v1)
177
+ - [ ] task-02: ...
178
+ - [ ] task-03: ...
179
+
180
+ ## 验收
181
+ - 具体可验证的验收条目
182
+
183
+ ## 覆盖矩阵(如存在 decisions.md)
184
+ | ID | 覆盖任务 | 验收证据 |
185
+ |---|---|---|
186
+ | D-001@v1 | task-01 | AC-01 |
187
+ \`\`\`
188
+
189
+ light 计划的约束:
190
+ - **禁止**生成 Mermaid 图
191
+ - **禁止**估时
192
+ - **禁止**泛泛风险 分析(如"需要充分测试")
193
+ - **禁止**放实现细节(函数签名、代码示例)
194
+ - 来源/目标直接引用已有文档,不重新生成
195
+ - 如果存在 decisions.md,所有当前版本 D-xxx@vN 必须在 Tasks 或覆盖矩阵中出现
196
+ - 如果存在 P0/P1 unresolved blocker,不生成 plan.md
197
+ - 任务列表控制在 10 条以内
198
+ - **任务必须使用 checkbox 格式**(\`- [ ] task-XX:\`),不要用纯编号列表(\`1. 2.\`),execute 阶段依赖此格式解析任务
199
+
200
+ ---
201
+
202
+ #### plan_level = full
203
+ 生成完整 plan.md,保存到变更目录。格式如下:
204
+
205
+ \`\`\`markdown
206
+ ---
207
+ plan_level: full
208
+ ---
209
+
70
210
  # 实现计划
71
211
 
72
212
  ## Spike 前置验证(如需要)
@@ -77,25 +217,18 @@ export const fixedPrefix = [
77
217
  > 技术不确定性高时才需要 Spike。无不确定性则跳过此节。
78
218
 
79
219
  ## Wave 1(并行,无依赖)
80
- - [ ] task-01: 添加用户创建接口
81
- - [ ] task-02: 添加角色创建接口
220
+ - [ ] task-01: 添加用户创建接口(覆盖:FR-01, D-001@v1)
221
+ - [ ] task-02: 添加角色创建接口(覆盖:FR-02)
82
222
 
83
223
  ## Wave 2(依赖 Wave 1)
84
224
  - [ ] task-03: 用户创建接口联调
85
225
 
86
226
  ## 任务总表
87
- | 编号 | 任务 | Wave | 优先级 | 估时 | 依赖 | 说明 |
227
+ | 编号 | 任务 | Wave | 优先级 | 依赖 | 覆盖 FR/D | 说明 |
88
228
  |---|---|---|---|---|---|---|
89
- | task-01 | 添加用户创建接口 | W1 | P0 | 4h | | ... |
90
- | task-02 | 添加角色创建接口 | W1 | P0 | 3h | | ... |
91
- | task-03 | 用户创建接口联调 | W2 | P0 | 4h | task-01,02 | ... |
92
-
93
- ## 依赖关系图
94
- \`\`\`mermaid
95
- graph LR
96
- task-01 --> task-03
97
- task-02 --> task-03
98
- \`\`\`
229
+ | task-01 | 添加用户创建接口 | W1 | P0 | | FR-01, D-001@v1 | ... |
230
+ | task-02 | 添加角色创建接口 | W1 | P0 | | FR-02 | ... |
231
+ | task-03 | 用户创建接口联调 | W2 | P0 | task-01,02 | FR-03 | ... |
99
232
 
100
233
  ## 关键路径
101
234
  task-01 → task-03(最长路径,决定最短交付周期)
@@ -103,66 +236,102 @@ task-01 → task-03(最长路径,决定最短交付周期)
103
236
  ## 全局验收标准
104
237
  - [ ] 所有单元测试通过
105
238
  - [ ] (brownfield)未配置新功能时行为不变
239
+
240
+ ## 覆盖矩阵(如存在 decisions.md)
241
+ | ID | 覆盖任务 | 验收证据 |
242
+ |---|---|---|
243
+ | D-001@v1 | task-01 | AC-01 |
106
244
  \`\`\`
107
245
 
108
- ### 关键规则
109
- - plan.md 包含:Wave 分组 + 任务总表 + 依赖图 + 关键路径 + 全局验收标准,**不放实现细节**
246
+ full 计划的约束:
247
+ - **禁止**估时(任务总表不含估时列)
248
+ - **禁止**泛泛风险分析("需要充分测试"类废话转为具体验收条目)
249
+ - Mermaid 依赖关系图**仅当依赖关系非平凡时生成**(线性依赖或全并行时不生成)
250
+ - **Wave 下的 checkbox 行必须保留**(execute 阶段解析依赖 \`- [ ] task-XX:\` 格式)
251
+ - plan.md 包含 Wave 分组 + 任务总表 + 关键路径 + 全局验收标准,**不放实现细节**
252
+ - 如果存在 decisions.md,plan.md 必须包含当前版本 D-xxx@vN/FR-xxx 覆盖矩阵
253
+ - 如果存在 P0/P1 unresolved blocker,不生成 plan.md,输出阻塞清单
110
254
  - 实现细节写到后续的 tasks/task-NN.md 中
111
255
  - 每个任务编号格式:task-01、task-02 ...
112
- - **Wave 下的 checkbox 行必须保留**(execute 阶段解析依赖 \`- [ ] task-XX:\` 格式)
113
256
  - 任务总表的优先级:P0(必须)/ P1(重要)/ P2(可选)
114
- - 估时参考:单个 task ≤ 8h,超过则拆分
257
+ - 总任务数控制在 15 个以内
115
258
 
116
- ### Spike 前置验证
259
+ ### Spike 前置验证(仅 full)
117
260
  当存在技术不确定性时,在 Wave 之前设计 Spike:
118
261
  - 涉及新技术栈/未经验证的集成 → 需要 Spike
119
262
  - 涉及安全隔离/性能瓶颈 → 需要 Spike
120
263
  - 纯业务逻辑/确定的技术方案 → 不需要 Spike
121
264
  - 每个 Spike 定义:验证内容 + 通过标准 + 不通过后果
122
265
 
123
- ### 批量模式指引
266
+ ### 批量模式指引(仅 full)
124
267
  如果 design.md 或需求中包含批量特征(关键词:批量/模板/引擎/N个相似),按以下原则规划:
125
- ❌ 不要列出每个实例作为独立任务
126
- ❌ 不要在文档中嵌入数据
127
- ✅ 设计通用架构,Wave 1 聚焦架构
128
- ✅ 数据转换用脚本完成,单独一个 Wave
129
- ✅ 总任务数控制在 10 个以内
268
+ - ❌ 不要列出每个实例作为独立任务
269
+ - ❌ 不要在文档中嵌入数据
270
+ - ✅ 设计通用架构,Wave 1 聚焦架构
271
+ - ✅ 数据转换用脚本完成,单独一个 Wave
272
+ - ✅ 总任务数控制在 10 个以内
130
273
 
131
- ### 操作
274
+ ---
275
+
276
+ ### 通用操作(所有级别)
132
277
  1. 读取 tasks.md 获取任务列表
133
278
  2. 读取 design.md 获取文件变更清单
134
- 3. 逐个展开为任务描述
135
- 4. 分析依赖关系,按 Wave 分组
136
- 5. 生成任务总表(含优先级、估时、依赖)
137
- 6. 生成 Mermaid 依赖关系图
138
- 7. 标注关键路径
139
- 8. 评估是否需要 Spike 前置验证
140
- 9. 保存到变更目录下的 plan.md(路径格式:\`.sillyspec/changes/<change-name>/plan.md\`,其中 <change-name> 是变更目录名,直接使用,不加子目录。正确路径示例:\`.sillyspec/changes/2026-05-28-agent-log-streaming/plan.md\`)
279
+ 3. 读取上一步的 plan_level 分类结果
280
+ 4. 按对应级别模板生成内容
281
+ 5. 保存到变更目录下的 plan.md(路径格式:\`.sillyspec/changes/<change-name>/plan.md\`,其中 <change-name> 是变更目录名,直接使用,不加子目录。正确路径示例:\`.sillyspec/changes/2026-05-28-agent-log-streaming/plan.md\`)
282
+ **plan_level none 时生成最小 plan.md(占位),不生成完整蓝图。**
141
283
 
142
284
  ### 输出
143
- plan.md 总览内容`,
144
- outputHint: 'plan.md 总览',
285
+ plan_level + 计划内容(none 级别输出建议操作)`,
286
+ outputHint: '计划内容',
145
287
  optional: false
146
288
  },
147
289
  {
148
290
  name: '自检总览',
149
- prompt: `自检 plan.md 总览质量。
291
+ prompt: `根据 plan_level 检查对应的计划质量。
150
292
 
151
293
  ### 操作
152
- 检查以下各项:
294
+ 读取上一步的 plan_level 分类结果,按级别执行对应的自检:
295
+
296
+ #### plan_level = none
297
+ - [ ] plan.md 文件存在且包含 plan_level: none
298
+ - [ ] 给出了可操作的修改建议(2-5 条)
299
+ - [ ] 不含 Wave、Mermaid、估时、任务总表、依赖关系等完整蓝图内容
300
+ - [ ] 建议了直接 execute
301
+ - [ ] 包含至少一个 \`- [ ] task-XX:\` 格式的 checkbox 任务(execute 解析依赖此格式)
302
+
303
+ #### plan_level = light
304
+ - [ ] 输出明确标注 plan_level: light
305
+ - [ ] 有来源、范围、任务列表、验收标准四个部分
306
+ - [ ] 来源直接引用已有文档,未重新扩写
307
+ - [ ] 任务列表清晰且无实现细节
308
+ - [ ] 任务使用 checkbox 格式(\`- [ ] task-XX:\`),不是纯编号列表
309
+ - [ ] 验收标准具体可验证(非笼统表述)
310
+ - [ ] 如果存在 decisions.md,所有当前版本 D-xxx@vN 在 plan.md 中可追踪
311
+ - [ ] 不存在 P0/P1 unresolved blocker
312
+ - [ ] 没有 Mermaid 图、估时、风险分析
313
+ - [ ] 没有函数签名、代码示例等实现细节
314
+ - [ ] plan.md 与 design.md 的文件变更清单一致
315
+ - [ ] 包含至少一个 \`- [ ] task-XX:\` 格式的 checkbox 任务(execute 解析依赖此格式)
316
+
317
+ #### plan_level = full
153
318
  - [ ] 每个 task 有编号(task-01、task-02 ...)
154
319
  - [ ] 每个 task 在 Wave 下有 checkbox(\`- [ ] task-XX:\` 格式,execute 解析依赖此格式)
155
320
  - [ ] 已标注 Wave 分组和依赖关系
156
- - [ ] 有任务总表(含优先级、估时、依赖列)
157
- - [ ] 有 Mermaid 依赖关系图
321
+ - [ ] 有任务总表(含优先级、依赖列,**无估时列**)
158
322
  - [ ] 有关键路径标注
159
323
  - [ ] 有全局验收标准
324
+ - [ ] 如果存在 decisions.md,任务总表或覆盖矩阵覆盖全部当前版本 D-xxx@vN
325
+ - [ ] 不存在 P0/P1 unresolved blocker
160
326
  - [ ] (brownfield)全局验收包含兼容性条款
161
327
  - [ ] 没有实现细节(接口定义、代码示例等不应该在 plan.md 里)
162
328
  - [ ] plan.md 与 design.md 的文件变更清单一致
329
+ - [ ] 如果有 Mermaid 图,依赖关系确实非平凡(非线性/非全并行)
330
+ - [ ] 没有泛泛风险分析(如"需要充分测试")
163
331
 
164
332
  ### 输出
165
- 自检通过/不通过`,
333
+ 自检通过/不通过(附 plan_level)`,
334
+ outputHint: '自检结果',
166
335
  outputHint: '自检结果',
167
336
  optional: false
168
337
  }
@@ -265,6 +434,8 @@ priority: P0
265
434
  estimated_hours: N
266
435
  depends_on: []
267
436
  blocks: []
437
+ requirement_ids: [FR-01]
438
+ decision_ids: [D-001@v1]
268
439
  allowed_paths:
269
440
  - 允许修改的路径范围
270
441
  ---
@@ -274,6 +445,10 @@ allowed_paths:
274
445
  ## 修改文件(必填)
275
446
  - 精确到文件路径,列出所有需要新增或修改的文件
276
447
 
448
+ ## 覆盖来源
449
+ - Requirements: FR-xx(来自 requirements.md)
450
+ - Decisions: D-xxx@vN(如存在 decisions.md)
451
+
277
452
  ## 实现要求
278
453
  1. 具体做什么,写清楚
279
454
  2. ...
@@ -315,6 +490,8 @@ allowed_paths:
315
490
  - \`estimated_hours\`: 预估工时,单个 task ≤ 8h
316
491
  - \`depends_on\`: 依赖的前序 task 编号列表
317
492
  - \`blocks\`: 被本 task 阻塞的后续 task 编号列表
493
+ - \`requirement_ids\`: 本任务覆盖的 FR-xxx 列表
494
+ - \`decision_ids\`: 本任务覆盖的当前版本 D-xxx@vN 列表;无 decisions.md 时可为空数组
318
495
  - \`allowed_paths\`: AI executor 可以修改的文件路径范围(安全边界)
319
496
 
320
497
  ### 关键规则
@@ -323,6 +500,7 @@ allowed_paths:
323
500
  - 接口定义写到"搬砖工照着做"的程度
324
501
  - 边界处理至少覆盖 5 条规则
325
502
  - 验收标准用表格格式,每条可点击验证,禁止"功能可演示"类笼统表述
503
+ - 如果存在 decisions.md,不允许丢失当前版本 D-xxx@vN;无法覆盖的 D-xxx@vN 必须写入非目标或剩余风险
326
504
  - 写完后保存到文件
327
505
 
328
506
  ### 操作
@@ -370,6 +548,8 @@ priority: P0/P1/P2
370
548
  estimated_hours: N
371
549
  depends_on: [task-XX]
372
550
  blocks: [task-XX]
551
+ requirement_ids: [FR-XX]
552
+ decision_ids: [D-XXX@vN]
373
553
  allowed_paths:
374
554
  - ...
375
555
  ---
@@ -379,6 +559,10 @@ allowed_paths:
379
559
  ## 修改文件(必填)
380
560
  - 精确到文件路径
381
561
 
562
+ ## 覆盖来源
563
+ - Requirements: FR-xx
564
+ - Decisions: D-xxx@vN(如存在)
565
+
382
566
  ## 实现要求
383
567
  1. 具体做什么
384
568
 
@@ -412,6 +596,7 @@ allowed_paths:
412
596
  - 接口定义写到"搬砖工照着做"的程度
413
597
  - 边界处理至少 5 条
414
598
  - 验收标准用表格,禁止笼统表述
599
+ - 如果存在 decisions.md,不允许丢失当前版本 D-xxx@vN;无法覆盖的 D-xxx@vN 必须写入非目标或剩余风险
415
600
  - 写完后用 Write tool 保存到文件
416
601
  \`\`\``
417
602
  }).join('\n\n')
@@ -443,8 +628,8 @@ ${subagentPrompts}
443
628
 
444
629
  ## 验收
445
630
  - 每个 task-N.md 文件存在且非空
446
- - 包含 YAML frontmatter(id、title、priority、depends_on、blocks、allowed_paths)
447
- - 包含所有必要章节:修改文件、实现要求、接口定义、边界处理(≥5条)、非目标、TDD 步骤、验收标准(表格格式)
631
+ - 包含 YAML frontmatter(id、title、priority、depends_on、blocks、requirement_ids、decision_ids、allowed_paths)
632
+ - 包含所有必要章节:修改文件、覆盖来源、实现要求、接口定义、边界处理(≥5条)、非目标、TDD 步骤、验收标准(表格格式)
448
633
  - 边界处理覆盖:null/空值、兼容性、异常处理、参数不可变、歧义场景`
449
634
 
450
635
  return {
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @deprecated propose 阶段已移除入口(2026-06-14)。
3
+ * brainstorm 现在拥有四件套(design/proposal/requirements/tasks)的生成职责。
4
+ * 本文件保留以备未来需要恢复,但未注册到 stageRegistry。
5
+ */
1
6
  export const definition = {
2
7
  name: 'propose',
3
8
  title: '方案设计',
@@ -87,10 +92,29 @@ export const definition = {
87
92
  - **非功能需求**:兼容性、可回退、可测试、可扩展
88
93
 
89
94
  ### design.md 格式要求
90
- - **架构决策** + **文件变更清单表格** + **接口定义**
91
- - **兼容策略**(brownfield 必填):未配置新功能时行为不变、回退路径
92
- - **风险登记**表格:编号/风险/等级/应对策略
93
- - **自审**:需求覆盖、真实性、YAGNI、非目标
95
+
96
+ **必须包含的章节:**
97
+ 1. **背景**:为什么做、解决什么问题
98
+ 2. **设计目标**:要达成什么
99
+ 3. **非目标**:明确不做的事(防止 scope creep)
100
+ 4. **总体方案**:技术方案(分 Phase/Wave)
101
+ 5. **文件变更清单**(必填):
102
+
103
+ | 操作 | 文件路径 | 说明 |
104
+ |---|---|---|
105
+ | 新增 | src/xxx/NewFile.java | ... |
106
+ | 修改 | src/xxx/ExistingFile.java | 新增 xx 方法 |
107
+
108
+ 6. **接口定义**:方法签名、数据结构(代码类任务必填)
109
+ 7. **数据模型**(如涉及):表结构/字段变更
110
+ 8. **兼容策略**(brownfield 必填):未配置新功能时行为不变、新旧逻辑的回退路径
111
+ 9. **风险登记**:
112
+
113
+ | 编号 | 风险 | 等级 | 应对策略 |
114
+ |---|---|---|---|
115
+ | R-01 | ... | P0/P1/P2 | ... |
116
+
117
+ 10. **自审**:需求覆盖、约束一致性、真实性、YAGNI、验收标准、非目标清晰、兼容策略、风险识别
94
118
 
95
119
  ### tasks.md 格式要求
96
120
  - 任务列表(只列名称,不展开步骤)
@@ -119,9 +143,11 @@ export const definition = {
119
143
  ### 操作
120
144
  检查以下各项:
121
145
  - [ ] proposal.md 有动机、关键问题、变更范围、不在范围内、成功标准
146
+ - [ ] design.md 有背景、设计目标、非目标
122
147
  - [ ] design.md 有文件变更清单表格
123
148
  - [ ] design.md 有兼容策略(brownfield 时)
124
149
  - [ ] design.md 有风险登记表格
150
+ - [ ] design.md 有自审
125
151
  - [ ] requirements.md 有角色表
126
152
  - [ ] requirements.md 有 FR 编号和 Given/When/Then 用户场景
127
153
  - [ ] tasks.md 每个 task 有文件路径
@@ -72,24 +72,27 @@ quicklog 已创建(必须放在输出的第一行确认)+ 任务理解 + 上
72
72
  prompt: `Git 暂存并更新任务记录。
73
73
 
74
74
  ### 操作
75
- 1. \`git add -A\` 暂存改动文件(不要 commit,由用户通过统一提交工具处理)
76
- 2. 更新 Step 1 创建的记录:
75
+ 1. 查看 \`git status --porcelain\`,确认只包含本次 quick 相关文件
76
+ 2. 使用 \`git add -- <file...>\` 暂存本次 quick 实际修改的文件(不要 commit,由用户通过统一提交工具处理)
77
+ - 禁止使用 \`git add -A\`
78
+ - 不要暂存 quick 开始前就已存在的无关改动
79
+ 3. 更新 Step 1 创建的记录:
77
80
  - 无 \`--change\`:找到对应 ql-ID 的条目,将「状态:进行中」改为「状态:已完成」,补充实际改动文件和结果摘要
78
81
  - 有 \`--change\`:勾选 tasks.md 中对应的 task checkbox
79
- 3. QUICKLOG 轮转:超过 500 行则重命名为 \`QUICKLOG-<USER>-YYYY-MM-DD.md\`(日期取最后一条记录的日期)。新文件从空开始,ql-ID 需扫描同目录所有 QUICKLOG 文件中当天最大序号 +1
80
- 4. 如果发现项目特有的坑,追加到 \`.sillyspec/knowledge/uncategorized.md\`
81
- 5. 任务比预期复杂 → 建议用完整流程
82
+ 4. QUICKLOG 轮转:超过 500 行则重命名为 \`QUICKLOG-<USER>-YYYY-MM-DD.md\`(日期取最后一条记录的日期)。新文件从空开始,ql-ID 需扫描同目录所有 QUICKLOG 文件中当天最大序号 +1
83
+ 5. 如果发现项目特有的坑,追加到 \`.sillyspec/knowledge/uncategorized.md\`
84
+ 6. 任务比预期复杂 → 建议用完整流程
82
85
 
83
86
  ### 模块文档同步
84
- 6. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
85
- 7. 对比本次修改的文件(\`git diff --name-only\`)与模块映射
86
- 8. 如果命中模块 → 直接同步模块文档:
87
+ 7. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
88
+ 8. 对比本次修改的文件(\`git diff --name-only HEAD\`)与模块映射
89
+ 9. 如果命中模块 → 直接同步模块文档:
87
90
  - 读取对应的 \`.sillyspec/docs/<project>/modules/<module>.md\`(如不存在则新建)
88
91
  - 根据本次改动内容更新模块文档(正文描述当前状态,底部变更索引追加本次 ql-ID)
89
92
  - 变更索引格式:\`- ql-YYYYMMDD-NNN-XXXX | <一句话描述>\`
90
93
  - 写入模块文档
91
- - 将更新的模块文件加入 \`git add\`
92
- 9. 未命中任何模块 → 跳过,不做额外操作
94
+ - 使用 \`git add -- <module-doc>\` 暂存更新的模块文件
95
+ 10. 未命中任何模块 → 跳过,不做额外操作
93
96
 
94
97
  ### 输出
95
98
  暂存确认 + 记录路径 + 模块文档同步结果(如有)`,
@@ -122,6 +122,18 @@ export const definition = {
122
122
  对每个项目分别执行(将 \`<project>\` 替换为实际项目名)
123
123
  4. 如果检查报告有失败项,按报告中的角色和文件重试失败的部分
124
124
 
125
+ ### 覆盖保护
126
+ - 生成每份 scan 文档时,frontmatter 必须包含:
127
+ \`\`\`yaml
128
+ ---
129
+ source_commit: <git-head-short>
130
+ updated_at: <now-iso-datetime>
131
+ generator: sillyspec-scan
132
+ ---
133
+ \`\`\`
134
+ - 覆盖已有 scan 文档前先读取旧 frontmatter;如果旧文档的 \`source_commit\` 与当前 HEAD 不一致,或旧文档 \`updated_at\` 晚于本次 scan 开始时间,不要覆盖。
135
+ - 如果用户明确传入 \`--force-rescan\`,允许覆盖,但仍需写入新的 \`source_commit\` 和 \`updated_at\`。
136
+
125
137
  ### 子代理上下文注入
126
138
  启动每个子代理前,将以下信息拼入子代理 prompt:
127
139
  - 项目名(直接用实际项目名)
@@ -53,20 +53,23 @@ export const definition = {
53
53
  prompt: `加载规范文件并确认。
54
54
 
55
55
  ### 操作
56
- 1. 读取 proposal.md、design.md、tasks.md、requirements.md
57
- 2. 加载项目信息:\`cat .sillyspec/projects/*.yaml 2>/dev/null\`
58
- 3. 加载本地配置:\`cat .sillyspec/local.yaml 2>/dev/null\`(构建命令、测试命令、lint 命令等)
59
- 4. 加载代码规范:\`cat .sillyspec/docs/<project>/scan/CONVENTIONS.md 2>/dev/null\`
60
- 5. 标注每个文件的存在/不存在状态
56
+ 1. 读取 proposal.md、design.md、tasks.md、requirements.md、plan.md
57
+ 2. 如果存在 decisions.md,必须读取并提取所有当前版本 D-xxx@vN 决策 ID
58
+ - 如果存在 P0/P1 unresolved/blocking 决策,验证结论不能为 PASS
59
+ - 如果发现 superseded 决策被下游引用,标记为 ⚠️ stale decision reference
60
+ 3. 加载项目信息:\`cat .sillyspec/projects/*.yaml 2>/dev/null\`
61
+ 4. 加载本地配置:\`cat .sillyspec/local.yaml 2>/dev/null\`(构建命令、测试命令、lint 命令等)
62
+ 5. 加载代码规范:\`cat .sillyspec/docs/<project>/scan/CONVENTIONS.md 2>/dev/null\`
63
+ 6. 标注每个文件的存在/不存在状态
61
64
 
62
65
  ### 模块文档加载
63
- 6. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
64
- 7. 根据 design.md 的文件变更清单匹配 _module-map.yaml 中的模块
65
- 8. 读取匹配到的 \`.sillyspec/docs/<project>/modules/<module>.md\`
66
- 9. **检查模块索引可信度**:如果相关模块的 needs_review 为 true,提示"该模块索引可能不可信,需要回看模块卡片或源码"
66
+ 7. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
67
+ 8. 根据 design.md 的文件变更清单匹配 _module-map.yaml 中的模块
68
+ 9. 读取匹配到的 \`.sillyspec/docs/<project>/modules/<module>.md\`
69
+ 10. **检查模块索引可信度**:如果相关模块的 needs_review 为 true,提示"该模块索引可能不可信,需要回看模块卡片或源码"
67
70
 
68
71
  ### 输出
69
- 文件加载确认清单(含模块文档 + 索引可信度)`,
72
+ 文件加载确认清单(含 decisions.md 当前版本/未决项状态、模块文档 + 索引可信度)`,
70
73
  outputHint: '文件确认清单',
71
74
  optional: false
72
75
  },
@@ -123,9 +126,17 @@ grep -rl "<关键词>" <源码目录>/ --include="*.java" --include="*.js" --inc
123
126
  2. 对每个 task,检查对应模块目录下是否存在测试文件(*test*、*spec*、*Test*、*Spec*)
124
127
  3. 没有测试文件的 task 标记为 ⚠️ 缺少测试
125
128
 
129
+ **探针 4:决策追踪覆盖探针(如存在 decisions.md)**
130
+ 1. 从 decisions.md 提取所有当前版本 D-xxx@vN
131
+ 2. 检查 requirements.md 是否引用每个 D-xxx@vN,并映射到 FR-xxx
132
+ 3. 检查 plan.md 或 tasks/task-NN.md 是否引用每个 FR-xxx/D-xxx@vN
133
+ 4. 检查本步骤收集的实现证据是否能回指到对应 D-xxx@vN/FR-xxx
134
+ 5. 任意 D-xxx@vN 无下游覆盖时标记为 ⚠️ 决策未闭环
135
+ 6. 任意 P0/P1 unresolved/blocking 决策标记为 FAIL blocker
136
+
126
137
  ### 探针结果处理
127
- - 将三个探针的结果汇总为「探针报告」
128
- - 如果探针发现问题(未实现标记、关键词缺失、测试缺失),在最终验证报告中明确标注
138
+ - 将四个探针的结果汇总为「探针报告」
139
+ - 如果探针发现问题(未实现标记、关键词缺失、测试缺失、决策未闭环),在最终验证报告中明确标注
129
140
  - 探针发现的问题不等同于验证失败,但必须在报告中列出
130
141
 
131
142
  ### 设计一致性检查
@@ -136,9 +147,10 @@ grep -rl "<关键词>" <源码目录>/ --include="*.java" --include="*.js" --inc
136
147
  4. API 设计是否符合
137
148
  5. **Reverse Sync 检查**:如果发现实现合理但 design.md 未覆盖,先更新 design.md 补充遗漏
138
149
  6. **模块文档一致性检查**:如果在"加载规范并锚定"步骤中加载了模块文档,检查实现是否符合模块文档描述的当前设计(特别关注接口签名、数据流、依赖关系)。不符合时标记 ⚠️(不阻断,模块文档可能未及时更新)
150
+ 7. **决策链路检查**:如果存在 decisions.md,输出 D-xxx@vN → FR-xxx → task-xx → evidence 的追踪矩阵;缺失项必须列为风险
139
151
 
140
152
  ### 输出
141
- 探针报告 + 设计一致性检查结果 + 模块文档一致性检查结果`,
153
+ 探针报告 + 设计一致性检查结果 + 模块文档一致性检查结果 + 决策追踪矩阵(如有)`,
142
154
  outputHint: '设计一致性报告',
143
155
  optional: false
144
156
  },
@@ -210,6 +222,12 @@ PASS / PASS WITH NOTES / FAIL
210
222
  - 未实现标记扫描:...
211
223
  - 关键词覆盖:...
212
224
  - 测试覆盖:...
225
+ - 决策追踪覆盖:...
226
+
227
+ ## 决策追踪矩阵(如存在 decisions.md)
228
+ | 决策 ID | FR | Task | Evidence | 状态 |
229
+ |---|---|---|---|---|
230
+ | D-001@v1 | FR-01 | task-01 | test/file/path | PASS/PARTIAL/MISSING |
213
231
 
214
232
  ## 测试结果
215
233
  (测试套件执行结果)
package/src/workflow.js CHANGED
@@ -12,6 +12,7 @@
12
12
  import { readFileSync, existsSync, readdirSync, writeFileSync, mkdirSync } from 'fs'
13
13
  import { join, resolve, basename } from 'path'
14
14
  import jsYaml from 'js-yaml'
15
+ import { WORKFLOW_STATUS } from './constants.js'
15
16
 
16
17
  // ─── Workflow 加载 ───
17
18