sillyspec 3.20.2 → 3.20.4
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/.claude/skills/sillyspec-archive/SKILL.md +21 -21
- package/.claude/skills/sillyspec-auto/SKILL.md +83 -83
- package/.claude/skills/sillyspec-brainstorm/SKILL.md +44 -44
- package/.claude/skills/sillyspec-commit/SKILL.md +106 -106
- package/.claude/skills/sillyspec-continue/SKILL.md +45 -45
- package/.claude/skills/sillyspec-doctor/SKILL.md +31 -31
- package/.claude/skills/sillyspec-execute/SKILL.md +30 -30
- package/.claude/skills/sillyspec-explore/SKILL.md +109 -109
- package/.claude/skills/sillyspec-knowledge/SKILL.md +269 -269
- package/.claude/skills/sillyspec-plan/SKILL.md +21 -21
- package/.claude/skills/sillyspec-propose/SKILL.md +21 -21
- package/.claude/skills/sillyspec-quick/SKILL.md +21 -21
- package/.claude/skills/sillyspec-resume/SKILL.md +68 -68
- package/.claude/skills/sillyspec-scan/SKILL.md +21 -21
- package/.claude/skills/sillyspec-state/SKILL.md +54 -54
- package/.claude/skills/sillyspec-status/SKILL.md +21 -21
- package/.claude/skills/sillyspec-verify/SKILL.md +21 -21
- package/.claude/skills/sillyspec-workspace/SKILL.md +157 -157
- package/.husky/pre-push +13 -13
- package/CLAUDE.md +18 -18
- package/README.md +198 -188
- package/SKILL.md +90 -91
- package/bin/sillyspec.js +2 -2
- package/docs/brainstorm-plan-contract.md +64 -64
- package/docs/plan-execute-contract.md +123 -123
- package/docs/platform-scan-protocol.md +298 -298
- package/docs/revision-mode.md +115 -115
- package/docs/sillyspec/file-lifecycle/known-implementation-gaps.md +99 -99
- package/docs/sillyspec/file-lifecycle/platform-workflows-sync.md +218 -218
- package/docs/sillyspec/file-lifecycle/stage-artifacts.md +167 -167
- package/docs/sillyspec/file-lifecycle/storage-and-state.md +148 -148
- package/docs/sillyspec/file-lifecycle/worktree-and-guard.md +211 -193
- package/docs/sillyspec/file-lifecycle.md +125 -125
- package/docs/workflow-contract-regression.md +106 -106
- package/docs/worktree-isolation.md +252 -252
- package/package.json +40 -40
- package/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -7446
- package/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -1
- package/packages/dashboard/dist/index.html +16 -16
- package/packages/dashboard/index.html +15 -15
- package/packages/dashboard/package-lock.json +2384 -2384
- package/packages/dashboard/package.json +25 -25
- package/packages/dashboard/server/executor.js +86 -86
- package/packages/dashboard/server/index.js +588 -588
- package/packages/dashboard/server/parser.js +526 -526
- package/packages/dashboard/server/watcher.js +344 -344
- package/packages/dashboard/src/App.vue +558 -558
- package/packages/dashboard/src/components/ActionBar.vue +93 -93
- package/packages/dashboard/src/components/CommandPalette.vue +96 -96
- package/packages/dashboard/src/components/DetailPanel.vue +137 -137
- package/packages/dashboard/src/components/LogStream.vue +65 -65
- package/packages/dashboard/src/components/PipelineStage.vue +95 -95
- package/packages/dashboard/src/components/PipelineView.vue +156 -156
- package/packages/dashboard/src/components/ProjectList.vue +210 -210
- package/packages/dashboard/src/components/StageBadge.vue +67 -67
- package/packages/dashboard/src/components/StepCard.vue +94 -94
- package/packages/dashboard/src/components/detail/DocsDetail.vue +48 -48
- package/packages/dashboard/src/components/detail/GitDetail.vue +61 -61
- package/packages/dashboard/src/components/detail/TechDetail.vue +43 -43
- package/packages/dashboard/src/composables/useDashboard.js +170 -170
- package/packages/dashboard/src/composables/useKeyboard.js +119 -119
- package/packages/dashboard/src/composables/useWebSocket.js +129 -129
- package/packages/dashboard/src/main.js +8 -8
- package/packages/dashboard/src/style.css +132 -132
- package/packages/dashboard/vite.config.js +18 -18
- package/src/brainstorm-postcheck.js +158 -158
- package/src/change-list.js +52 -52
- package/src/change-risk-profile.js +352 -352
- package/src/classify-change.js +73 -73
- package/src/constants.js +70 -70
- package/src/contract-matrix.js +278 -278
- package/src/db.js +201 -201
- package/src/endpoint-extractor.js +315 -315
- package/src/hooks/claude-pre-tool-use.cjs +125 -125
- package/src/hooks/worktree-guard.js +653 -653
- package/src/index.js +922 -900
- package/src/init.js +431 -431
- package/src/knowledge-match.js +130 -130
- package/src/migrate.js +117 -117
- package/src/modules.js +482 -482
- package/src/progress.js +1734 -1734
- package/src/run.js +3465 -3358
- package/src/scan-postcheck.js +387 -383
- package/src/setup.js +398 -398
- package/src/stage-contract.js +700 -700
- package/src/stages/archive.js +160 -160
- package/src/stages/brainstorm-auto.js +229 -229
- package/src/stages/brainstorm.js +645 -645
- package/src/stages/doctor.js +365 -365
- package/src/stages/execute.js +625 -625
- package/src/stages/explore.js +34 -34
- package/src/stages/index.js +29 -29
- package/src/stages/knowledge.js +498 -498
- package/src/stages/plan-postcheck.js +511 -513
- package/src/stages/plan.js +582 -582
- package/src/stages/propose.js +174 -174
- package/src/stages/quick.js +82 -82
- package/src/stages/scan.js +558 -558
- package/src/stages/status.js +65 -65
- package/src/stages/verify.js +322 -322
- package/src/sync.js +497 -497
- package/src/task-review.js +346 -346
- package/src/workflow.js +785 -785
- package/src/worktree-apply.js +549 -549
- package/src/worktree-deps.js +185 -0
- package/src/worktree.js +982 -932
- package/templates/workflows/archive-impact.yaml +79 -79
- package/templates/workflows/scan-docs.yaml +132 -132
- package/test/brainstorm-plan-contract.test.mjs +273 -273
- package/test/check-syntax.mjs +26 -26
- package/test/contract-artifacts.test.mjs +323 -323
- package/test/decision-supersede.test.mjs +277 -277
- package/test/knowledge-match.test.mjs +231 -231
- package/test/plan-execute-contract.test.mjs +330 -330
- package/test/plan-optimization.test.mjs +572 -572
- package/test/platform-artifacts.test.mjs +166 -166
- package/test/platform-failure-samples.test.mjs +199 -199
- package/test/platform-recovery-chain.test.mjs +167 -167
- package/test/platform-recovery.test.mjs +136 -136
- package/test/platform-scan-p0.test.mjs +168 -168
- package/test/revision-v1.test.mjs +1145 -1145
- package/test/run-scan-project-parse.test.mjs +200 -200
- package/test/run-tests.mjs +48 -48
- package/test/scan-knowledge.test.mjs +175 -175
- package/test/scan-paths.test.mjs +68 -68
- package/test/scan-postcheck.test.mjs +197 -197
- package/test/spec-dir.test.mjs +206 -206
- package/test/stage-contract.test.mjs +299 -299
- package/test/stage-definitions.test.mjs +39 -39
- package/test/wait-gates.test.mjs +496 -496
- package/test/worktree-deps-provision.test.mjs +148 -0
- package/test/worktree-guard.test.mjs +71 -71
- package/test/worktree-native-overlay.test.mjs +188 -188
package/src/stages/brainstorm.js
CHANGED
|
@@ -1,645 +1,645 @@
|
|
|
1
|
-
export const definition = {
|
|
2
|
-
name: 'brainstorm',
|
|
3
|
-
title: '头脑风暴',
|
|
4
|
-
description: '探索需求、分析技术方案、识别风险',
|
|
5
|
-
steps: [
|
|
6
|
-
{
|
|
7
|
-
name: '状态检查',
|
|
8
|
-
prompt: `检查当前变更的进度状态(sillyspec.db)。
|
|
9
|
-
|
|
10
|
-
### 操作
|
|
11
|
-
1. 运行 \`sillyspec progress show\`
|
|
12
|
-
2. 确认 currentStage 为 "brainstorm"
|
|
13
|
-
3. 如果有进行中的 brainstorm,提示选择继续或重新开始
|
|
14
|
-
4. 如果未初始化,提示先运行 sillyspec init
|
|
15
|
-
5. **检查变更名称是否有意义**:如果当前变更名是自动生成的(如 \`2026-06-02-new-change\`),询问用户确认实际变更名,然后运行 \`sillyspec change-rename <旧名> <新名>\` 重命名
|
|
16
|
-
|
|
17
|
-
### 输出
|
|
18
|
-
当前状态摘要(1-2 句话)
|
|
19
|
-
|
|
20
|
-
### 注意
|
|
21
|
-
- 以 CLI 返回为准,不要自行推断阶段
|
|
22
|
-
- 如果阶段不对,输出正确提示并停止
|
|
23
|
-
- **不要用 mv 命令重命名变更目录**,必须使用 \`sillyspec change-rename\`,否则 DB 和目录会脱节`,
|
|
24
|
-
outputHint: '状态摘要',
|
|
25
|
-
optional: false
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
name: '加载项目上下文',
|
|
29
|
-
prompt: `加载项目现有上下文,理解代码结构和约定。
|
|
30
|
-
|
|
31
|
-
### 操作
|
|
32
|
-
1. 读取 CODEBASE-OVERVIEW.md + 共享规范 + 子项目上下文
|
|
33
|
-
2. 加载项目信息:\`cat .sillyspec/projects/*.yaml 2>/dev/null\`
|
|
34
|
-
3. 加载本地配置:\`cat .sillyspec/local.yaml 2>/dev/null\`
|
|
35
|
-
4. 棕地项目:读取 .sillyspec/docs/<project>/scan/ 下的 STRUCTURE.md、CONVENTIONS.md、ARCHITECTURE.md
|
|
36
|
-
5. **加载模块索引**:读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(如存在)
|
|
37
|
-
- 这一步是高频操作,_module-map.yaml 回答"哪个文件属于哪个模块、模块之间怎么依赖"
|
|
38
|
-
- 用 tags/aliases 字段做需求关键词→模块的粗匹配
|
|
39
|
-
- 用 entrypoints 字段快速了解模块对外能力
|
|
40
|
-
6. 查看进行中的变更:\`ls .sillyspec/changes/ | grep -v archive\`
|
|
41
|
-
|
|
42
|
-
### 模块匹配方法
|
|
43
|
-
读取 _module-map.yaml 后,根据用户描述的需求关键词,匹配相关模块:
|
|
44
|
-
- 需求中提到"登录""认证""token" → 匹配 tags/aliases 中含这些词的模块
|
|
45
|
-
- 需求中提到特定文件路径 → 匹配 paths 字段
|
|
46
|
-
- 匹配结果用于后续 design.md 的文件变更清单
|
|
47
|
-
|
|
48
|
-
### 子项目判定
|
|
49
|
-
- 单项目:直接确认,不需要等待
|
|
50
|
-
- 多项目且用户已指定:直接确认,不需要等待
|
|
51
|
-
- 多项目且用户未指定:列出项目列表,需要用户确认本次需求属于哪个子项目
|
|
52
|
-
|
|
53
|
-
### 输出
|
|
54
|
-
项目现状理解摘要(3-5 句话,关键约定和架构决策)+ 可能涉及的模块列表 + 本次需求所属子项目
|
|
55
|
-
|
|
56
|
-
### 注意
|
|
57
|
-
- 棕地项目必须读取数据模型章节
|
|
58
|
-
- 模块匹配只是粗筛,后续步骤会细化`,
|
|
59
|
-
outputHint: '上下文摘要',
|
|
60
|
-
optional: false
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
name: '协作与复用检查',
|
|
64
|
-
prompt: `检查是否有同名变更或可复用模板。
|
|
65
|
-
|
|
66
|
-
### 操作
|
|
67
|
-
1. 检查已有变更:\`ls .sillyspec/changes/ | grep -v archive\`
|
|
68
|
-
- 有相关变更 → 提示用户,避免重复
|
|
69
|
-
2. 检查全局模板:\`ls ~/.sillyspec/templates/\`
|
|
70
|
-
- 有匹配模板 → 询问是否基于模板
|
|
71
|
-
3. 无相关内容 → 跳过,不输出
|
|
72
|
-
|
|
73
|
-
### 输出
|
|
74
|
-
检测到的相关变更和可用模板(无则输出"无冲突,继续")`,
|
|
75
|
-
outputHint: '已有变更和可用模板',
|
|
76
|
-
optional: true
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
name: '原型/设计图分析',
|
|
80
|
-
prompt: `如果用户提供了截图、图片或 HTML 原型,分析提取结构。
|
|
81
|
-
|
|
82
|
-
### 操作
|
|
83
|
-
1. 识别图片中的页面结构(区域、组件、布局)
|
|
84
|
-
2. 提取表单字段(名称、类型、必填、选项)
|
|
85
|
-
3. 提取交互流程(页面跳转、按钮行为)
|
|
86
|
-
4. 提取标注和备注(业务规则、权限说明)
|
|
87
|
-
5. 展示分析结果,请用户确认遗漏
|
|
88
|
-
|
|
89
|
-
### 输出
|
|
90
|
-
页面结构树 + 字段列表 + 交互流程图
|
|
91
|
-
|
|
92
|
-
### 注意
|
|
93
|
-
- 没有原型则跳过此步骤
|
|
94
|
-
- 多页面时逐页分析,不要一次全部输出
|
|
95
|
-
- 图片信息 > 文字描述,不要忽略视觉信息`,
|
|
96
|
-
outputHint: '页面结构和交互流程',
|
|
97
|
-
optional: true
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
name: '需求范围评估',
|
|
101
|
-
conditionalWait: true,
|
|
102
|
-
waitReason: '等待用户确认拆分/批量模式方案',
|
|
103
|
-
waitOptions: ['同意拆分', '不需要拆分', '走批量模式'],
|
|
104
|
-
prompt: `评估需求复杂度,判断是否需要拆分或走批量模式。
|
|
105
|
-
|
|
106
|
-
### 操作
|
|
107
|
-
1. 根据分析结果判断复杂度
|
|
108
|
-
2. 满足以下任意 2 条建议拆分:
|
|
109
|
-
- 3+ 个可独立交付的功能模块
|
|
110
|
-
- 3+ 种角色有不同权限和视图
|
|
111
|
-
- 跨页面状态流转(审批流、多步表单)
|
|
112
|
-
- 模块间耦合度低可独立开发
|
|
113
|
-
3. 满足以下条件建议走**批量模式**:
|
|
114
|
-
- 任务数量 > 10 且任务间有重复模式(如 100 个报表、50 个表单、N 个相似页面)
|
|
115
|
-
- 本质是「模板 × 数据」而非 N 个独立功能
|
|
116
|
-
- 直接逐个开发会导致 plan.md 膨胀和上下文溢出
|
|
117
|
-
4. 需要拆分 → 生成 MASTER.md,规划子阶段
|
|
118
|
-
5. 检测到批量模式 → 输出提示并建议用户确认
|
|
119
|
-
6. 都不需要 → 继续
|
|
120
|
-
|
|
121
|
-
### 批量模式指引
|
|
122
|
-
确认后,后续 plan/execute 按以下原则调整:
|
|
123
|
-
- **不要**把每个实例列为独立任务(不要写 100 个 checkbox)
|
|
124
|
-
- plan 设计通用架构(引擎/模板/配置格式),任务数控制在 10 个以内
|
|
125
|
-
- 数据转换用脚本完成(Excel → 配置文件),不消耗 AI 上下文
|
|
126
|
-
- execute 每个 Wave 独立模块,Wave 间通过接口定义解耦
|
|
127
|
-
- verify 用脚本全量验证 + AI 抽查边界案例
|
|
128
|
-
|
|
129
|
-
### 半批量场景
|
|
130
|
-
如果任务中大部分相似但有少量特殊任务(如 20 个任务中 15 个相似、5 个特殊):
|
|
131
|
-
- **主簇**(>10 个相似)→ 走批量模式(引擎 + 配置)
|
|
132
|
-
- **小簇**(2-5 个相似)→ 走简化版批量(基于主簇模板扩展)
|
|
133
|
-
- **孤立任务**(1 个)→ 走标准开发流程
|
|
134
|
-
- 建议用「继承 + override」配置解决特殊任务,配置解决不了的才写定制代码
|
|
135
|
-
- 架构设计时预留扩展点(hooks/overrides),让特殊任务能"挂上去"而不是"另起炉灶"
|
|
136
|
-
|
|
137
|
-
### 铁律 — 何时需要等待用户
|
|
138
|
-
- **需要拆分或批量模式时**:列出方案并暂停等待用户确认
|
|
139
|
-
- 调用:\`sillyspec run brainstorm --wait --reason "等待用户确认拆分方案" --options "同意拆分,不需要拆分" --output "拆分方案摘要"\`
|
|
140
|
-
- **不需要拆分也不需要批量模式时**:正常完成即可
|
|
141
|
-
|
|
142
|
-
### 输出
|
|
143
|
-
拆分方案 / 批量模式确认 / "无需拆分"确认
|
|
144
|
-
|
|
145
|
-
### 注意
|
|
146
|
-
- 简单 CRUD 不拆`,
|
|
147
|
-
outputHint: '拆分方案或无需拆分确认',
|
|
148
|
-
optional: true
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
name: '对话式探索',
|
|
152
|
-
requiresWait: true,
|
|
153
|
-
repeatableWait: true,
|
|
154
|
-
maxWaitRounds: 3,
|
|
155
|
-
waitReason: '等待用户回答需求问题',
|
|
156
|
-
waitOptions: ['继续补充', '信息够了,进入方案讨论'],
|
|
157
|
-
prompt: `通过对话探索需求细节。
|
|
158
|
-
|
|
159
|
-
### 操作
|
|
160
|
-
1. 从最核心的一个问题开始(用户到底想要什么?)
|
|
161
|
-
2. **提出问题后必须暂停等待用户回答**,不要替用户回答
|
|
162
|
-
3. 根据用户回答判断:信息够了 → 正常完成 / 需要追问 → 暂停等待下一个回答
|
|
163
|
-
4. 探索顺序(按需):目的 → 约束 → 边界 → 成功标准
|
|
164
|
-
|
|
165
|
-
### 铁律 — 不要自问自答
|
|
166
|
-
- **这是人机协作步骤,你必须暂停等待用户输入。**
|
|
167
|
-
- 每次提出问题后,调用:
|
|
168
|
-
\`sillyspec run brainstorm --wait --reason "等待用户回答需求问题" --options "回答见--answer" --output "你的问题"\`
|
|
169
|
-
- **绝对禁止**:在自己输出中模拟用户的回答,然后说"需求已明确"
|
|
170
|
-
- 2-3 轮问答就应进入方案讨论
|
|
171
|
-
- 多选题优于开放式问题
|
|
172
|
-
- YAGNI — 砍掉不需要的功能
|
|
173
|
-
|
|
174
|
-
### 输出
|
|
175
|
-
需求理解摘要(用户确认的需求点列表)
|
|
176
|
-
|
|
177
|
-
### 注意
|
|
178
|
-
- 第一次进入此步骤时,提出第一个问题并暂停
|
|
179
|
-
- 用户通过 \`--continue --answer "回答"\` 回答后,本步骤会再次执行,此时检查是否需要追问或可以结束`,
|
|
180
|
-
outputHint: '需求理解摘要',
|
|
181
|
-
optional: false
|
|
182
|
-
},
|
|
183
|
-
{
|
|
184
|
-
name: '需求澄清 Grill',
|
|
185
|
-
conditionalWait: true,
|
|
186
|
-
repeatableWait: true,
|
|
187
|
-
maxWaitRounds: 8,
|
|
188
|
-
waitReason: '等待用户回答需求澄清 Grill',
|
|
189
|
-
waitOptions: ['回答见--answer', '信息够了,结束需求澄清'],
|
|
190
|
-
prompt: `执行可选的需求澄清 Grill pass。
|
|
191
|
-
|
|
192
|
-
### 定位
|
|
193
|
-
这是 design.md 之前的需求澄清,不是设计后的 Design Grill。目标是把需求/术语/边界中仍需要人类判断的点问清楚;Design Grill 后续仍会默认执行,用来审查已经写出的 design.md 是否自洽。
|
|
194
|
-
|
|
195
|
-
### 入口判断
|
|
196
|
-
1. 汇总「对话式探索」后仍未稳定的歧义点,按类型列出:
|
|
197
|
-
- 术语歧义:同一个词可能指向不同实体/角色/状态
|
|
198
|
-
- 边界歧义:哪些场景做、哪些不做、失败怎么处理
|
|
199
|
-
- 前提风险:这个需求是否不该存在,是否已有更简单的现有方案
|
|
200
|
-
- 代码冲突:用户描述与现有代码/scan/module 文档不一致
|
|
201
|
-
2. 能通过代码或文档确认的不要问用户,先读取:
|
|
202
|
-
- \`.sillyspec/docs/<project>/scan/ARCHITECTURE.md\`
|
|
203
|
-
- \`.sillyspec/docs/<project>/scan/CONVENTIONS.md\`
|
|
204
|
-
- \`.sillyspec/docs/<project>/modules/_module-map.yaml\`
|
|
205
|
-
- 相关源码文件
|
|
206
|
-
3. 给每个未解决歧义分级:
|
|
207
|
-
- P0:影响数据模型、权限边界、状态机/工作流、兼容策略、不可逆架构取舍、跨模块所有权
|
|
208
|
-
- P1:影响用户场景、验收标准、错误处理、默认值
|
|
209
|
-
- P2:文案、展示细节、低风险交互偏好
|
|
210
|
-
4. 执行规则:
|
|
211
|
-
- P1/P2 歧义 0-2 个且无 P0:输出"需求澄清 Grill skipped",在后续设计中内联处理并记录依据
|
|
212
|
-
- P1/P2 歧义 >= 3 个:进入本 pass,按优先级逐个澄清
|
|
213
|
-
- 任意 P0 歧义:进入本 pass;如果需要用户判断,必须暂停问一个问题
|
|
214
|
-
5. 不要问用户"要不要 Grill"。本步骤由 AI 根据歧义风险决定是否执行;只在需要业务判断/取舍时等待用户回答。
|
|
215
|
-
|
|
216
|
-
### 追问策略
|
|
217
|
-
1. **一次只问一个问题**:按 P0 → P1 → P2 顺序,深度优先处理最关键歧义。
|
|
218
|
-
2. **能查代码就不问**:如果问题可由源码、scan 文档、模块文档回答,先查证并给出结论;只有业务判断/取舍才问用户。
|
|
219
|
-
3. **术语碰撞立即指出**:用户用词与 glossary/代码实体/模块文档冲突时,当场说明冲突并要求选择 canonical term。
|
|
220
|
-
4. **模糊词精化**:把"账户/任务/状态/会话/执行"这类多义词拆成明确实体或状态。
|
|
221
|
-
5. **场景压力测试**:用具体 case 逼出边界,例如失败重试、部分成功、历史数据、权限不足、并发修改、兼容旧配置。
|
|
222
|
-
6. **前提挑战优先**:如果现有设计或代码已有简单路径,先说明"可能不该新增",不要直接优化错误前提。
|
|
223
|
-
|
|
224
|
-
### 决策记录草稿
|
|
225
|
-
每解决一个有实现影响的问题,生成一个稳定 ID 的记录草稿。不要把闲聊都记录进去。
|
|
226
|
-
|
|
227
|
-
\`\`\`markdown
|
|
228
|
-
## D-001@v1: <短标题>
|
|
229
|
-
- type: term | boundary | premise | architecture | compatibility | risk
|
|
230
|
-
- status: accepted | rejected | superseded
|
|
231
|
-
- source: user | code | docs
|
|
232
|
-
- question: <被解决的问题>
|
|
233
|
-
- answer: <用户确认或代码查证结果>
|
|
234
|
-
- normalized_requirement: <可测试的约束>
|
|
235
|
-
- impacts: [FR-?, task-?, verify-?]
|
|
236
|
-
- evidence: <文件路径/代码位置/用户回答轮次>
|
|
237
|
-
\`\`\`
|
|
238
|
-
|
|
239
|
-
### 铁律 — 等待用户
|
|
240
|
-
- 每轮最多提出一个问题,然后调用:
|
|
241
|
-
\`sillyspec run brainstorm --wait --reason "等待用户回答需求澄清 Grill" --options "回答见--answer,信息够了,结束需求澄清" --output "你的单个问题或查证结论"\`
|
|
242
|
-
- 用户通过 \`--continue --answer "回答"\` 回答后,本步骤会再次执行;继续处理下一个最关键歧义。
|
|
243
|
-
- 达到 maxWaitRounds=8 后,必须总结已确认内容和剩余风险,不要无限追问。
|
|
244
|
-
|
|
245
|
-
### 输出
|
|
246
|
-
需求澄清结论摘要 + D-xxx@vN 决策记录草稿 + 剩余风险(如有)`,
|
|
247
|
-
outputHint: '需求澄清和决策记录草稿',
|
|
248
|
-
optional: true
|
|
249
|
-
},
|
|
250
|
-
{
|
|
251
|
-
name: '提出 2-3 种方案',
|
|
252
|
-
requiresWait: true,
|
|
253
|
-
waitReason: '等待用户选择方案',
|
|
254
|
-
waitOptions: ['方案A', '方案B', '方案C'],
|
|
255
|
-
prompt: `基于需求理解和 Grill 结果,提出 2-3 种实现方案。
|
|
256
|
-
|
|
257
|
-
### 操作
|
|
258
|
-
1. 每种方案列出:核心思路、优势、劣势
|
|
259
|
-
2. 如果 Grill 产生 D-xxx@vN 决策记录,方案必须说明覆盖/违反哪些当前版本决策
|
|
260
|
-
3. 给出推荐方案和理由
|
|
261
|
-
|
|
262
|
-
### 铁律 — 必须等待用户选择方案
|
|
263
|
-
- **不要替用户选择方案。** 列出方案对比表和推荐后,必须暂停等待用户选择。
|
|
264
|
-
- 列出方案后,调用:
|
|
265
|
-
\`sillyspec run brainstorm --wait --reason "等待用户选择方案" --options "方案A,方案B,方案C" --output "方案对比摘要"\`
|
|
266
|
-
- **绝对禁止**:在输出中自己说"推荐方案 A"然后当用户选了
|
|
267
|
-
|
|
268
|
-
### 输出
|
|
269
|
-
方案对比表 + 推荐方案
|
|
270
|
-
|
|
271
|
-
### 注意
|
|
272
|
-
- 方案差异要实质性的,不要为了凑数
|
|
273
|
-
- 推荐理由要具体`,
|
|
274
|
-
outputHint: '方案对比和推荐',
|
|
275
|
-
optional: false
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
name: '分段展示设计',
|
|
279
|
-
requiresWait: true,
|
|
280
|
-
waitReason: '等待用户确认设计方案',
|
|
281
|
-
waitOptions: ['确认', '需要修改', '推翻重来'],
|
|
282
|
-
prompt: `展示完整设计方案供用户确认。
|
|
283
|
-
|
|
284
|
-
### 操作
|
|
285
|
-
1. 简单项目:几句话整体描述
|
|
286
|
-
2. 复杂项目:按模块/Phase 分段展示,每段 200-300 字
|
|
287
|
-
3. 展示完整设计方案(不要逐段停顿,一次性展示)
|
|
288
|
-
4. 确认变更名(格式:\`YYYY-MM-DD-<简短描述>\`,例如 \`2026-05-13-user-auth\`)
|
|
289
|
-
5. 暂停等待用户确认或修改意见
|
|
290
|
-
|
|
291
|
-
### 铁律 — 必须等待用户确认设计
|
|
292
|
-
- **不要替用户确认设计。** 展示完整设计方案后,必须暂停等待用户确认。
|
|
293
|
-
- 列出设计后,调用:
|
|
294
|
-
\`sillyspec run brainstorm --wait --reason "等待用户确认设计方案" --options "确认,需要修改,推翻重来" --output "设计方案摘要"\`
|
|
295
|
-
- **绝对禁止**:在输出中自己说"设计已充分确认"然后推进
|
|
296
|
-
|
|
297
|
-
### 输出
|
|
298
|
-
完整设计方案 + 变更名
|
|
299
|
-
|
|
300
|
-
### 注意
|
|
301
|
-
- 不要一次输出大段文字,按模块/Phase 分段
|
|
302
|
-
- 变更名必须以当天日期开头(YYYY-MM-DD-),后跟英文短横线分隔的简短描述`,
|
|
303
|
-
outputHint: '用户确认的设计方案',
|
|
304
|
-
optional: false
|
|
305
|
-
},
|
|
306
|
-
{
|
|
307
|
-
name: 'HTML 原型生成',
|
|
308
|
-
prompt: `为设计方案生成可交互的 HTML 原型,帮助用户可视化确认。
|
|
309
|
-
|
|
310
|
-
### 操作
|
|
311
|
-
1. 判断本次设计是否适合生成 HTML 原型:
|
|
312
|
-
- 适合:有 UI 组件/布局/交互流程/状态转换/架构图
|
|
313
|
-
- 不适合:纯后端逻辑/配置修改/无可视化意义
|
|
314
|
-
2. 如果适合,生成一个独立的 HTML 文件(内联 CSS + JS),保存到:
|
|
315
|
-
\`.sillyspec/changes/<change-name>/prototype-<名称>.html\`(变更名格式:YYYY-MM-DD-<简短描述>)
|
|
316
|
-
3. 原型要求:
|
|
317
|
-
- 单文件,浏览器直接打开
|
|
318
|
-
- 展示关键布局结构和交互流程
|
|
319
|
-
- 不需要完整功能,重点是让用户确认设计方向
|
|
320
|
-
- 使用 ASCII/流程图/线框图风格,不需要精美 UI
|
|
321
|
-
4. 展示给用户确认设计方向
|
|
322
|
-
|
|
323
|
-
### 输出
|
|
324
|
-
HTML 原型文件路径(或"跳过"如果不适合)`,
|
|
325
|
-
outputHint: '原型文件路径或跳过',
|
|
326
|
-
optional: true
|
|
327
|
-
},
|
|
328
|
-
{
|
|
329
|
-
name: '写设计文档并自审',
|
|
330
|
-
prompt: `撰写 design 文档并进行 AI 自审。
|
|
331
|
-
|
|
332
|
-
### design.md 必须包含的章节
|
|
333
|
-
1. **背景**:为什么做、解决什么问题
|
|
334
|
-
2. **设计目标**:要达成什么
|
|
335
|
-
3. **非目标**:明确不做的事(防止 scope creep)
|
|
336
|
-
4. **拆分判断**(如适用):为什么这样组织变更、为什么不走批量模式
|
|
337
|
-
5. **总体方案**:技术方案(分 Phase/Wave)
|
|
338
|
-
6. **文件变更清单**(必填):
|
|
339
|
-
|
|
340
|
-
| 操作 | 文件路径 | 说明 |
|
|
341
|
-
|---|---|---|
|
|
342
|
-
| 新增 | src/xxx/NewFile.java | ... |
|
|
343
|
-
| 修改 | src/xxx/ExistingFile.java | 新增 xx 方法 |
|
|
344
|
-
| 删除 | src/xxx/OldFile.java | 已被 xx 替代 |
|
|
345
|
-
|
|
346
|
-
7. **接口定义**:方法签名、数据结构(代码类任务必填)
|
|
347
|
-
7.5. **生命周期契约表**(涉及以下关键词时必填,否则可省略):
|
|
348
|
-
|
|
349
|
-
如果本次变更涉及以下任何关键词:
|
|
350
|
-
session / lease / agent_run / daemon / lifecycle / state transition / complete / end / claim / heartbeat
|
|
351
|
-
|
|
352
|
-
则必须在 design.md 中包含「生命周期契约表」章节,格式如下:
|
|
353
|
-
|
|
354
|
-
| 事件 | 发起方 | 接收方 | 必需字段 | 状态变化 |
|
|
355
|
-
|---|---|---|---|---|
|
|
356
|
-
| claim lease | daemon | backend | leaseId, claimToken, agentRunId | pending → running |
|
|
357
|
-
| create session | backend | daemon | sessionId, leaseId, claimToken | session active |
|
|
358
|
-
| submit message | daemon | backend | leaseId, claimToken, agentRunId | append messages |
|
|
359
|
-
| turn result | daemon | backend | runId, status, output | running → completed/failed |
|
|
360
|
-
| session end | daemon | backend | sessionId, reason | active → ended |
|
|
361
|
-
|
|
362
|
-
判断规则:
|
|
363
|
-
- design.md 或需求中出现上述关键词 → 必须生成此表
|
|
364
|
-
- 表中的每个事件 → 必须有对应代码任务、接口任务、测试任务
|
|
365
|
-
- 表中的必需字段 → 必须出现在相关 DTO/interface 定义中
|
|
366
|
-
- 缺少任一事件 → 在 design.md 风险登记中明确记录
|
|
367
|
-
|
|
368
|
-
**判定方法**:在自审阶段,如果检测到上述关键词但 design.md 中没有此表 → 自审不通过
|
|
369
|
-
8. **数据模型**(如涉及):表结构/字段变更
|
|
370
|
-
9. **兼容策略**(brownfield 必填):
|
|
371
|
-
- 未配置新功能时行为不变
|
|
372
|
-
- 新旧逻辑的回退路径
|
|
373
|
-
- 不改变的 API / 表结构
|
|
374
|
-
10. **风险登记**:
|
|
375
|
-
|
|
376
|
-
| 编号 | 风险 | 等级 | 应对策略 |
|
|
377
|
-
|---|---|---|---|
|
|
378
|
-
| R-01 | ... | P0/P1/P2 | ... |
|
|
379
|
-
|
|
380
|
-
11. **决策追踪**(如存在 Grill/重大决策):
|
|
381
|
-
- 列出当前版本 D-xxx@vN 决策 ID
|
|
382
|
-
- 说明每个 D-xxx@vN 被哪些 FR-xxx / 设计章节覆盖
|
|
383
|
-
- 标注仍未解决的 D-xxx@vN 或剩余风险
|
|
384
|
-
12. **自审**(AI 对自身设计的校验)
|
|
385
|
-
|
|
386
|
-
### 操作
|
|
387
|
-
1. 确认变更目录存在:\`mkdir -p .sillyspec/changes/<change-name>\`(Windows 用 \`mkdir .sillyspec\\changes\\<变更名>\` 或 PowerShell \`New-Item -ItemType Directory -Force -Path .sillyspec/changes/<change-name>\`)
|
|
388
|
-
- 变更名格式必须为 \`YYYY-MM-DD-<简短描述>\`(如 \`2026-05-13-user-auth\`)
|
|
389
|
-
2. 将确认的设计写入 \`.sillyspec/changes/<change-name>/design.md\`
|
|
390
|
-
3. 如果 Grill 或方案讨论产生了实现相关决策,写入 \`.sillyspec/changes/<change-name>/decisions.md\`:
|
|
391
|
-
- decisions.md 是本次变更的决策台账,不是长期术语表
|
|
392
|
-
- 只记录有实现/验收影响的决策,闲聊和低风险偏好不记录
|
|
393
|
-
- 每条记录必须有稳定版本 ID:D-001@v1、D-002@v1 ...
|
|
394
|
-
- 若后续 Design Grill 修正该决策,新记录使用 D-001@v2,并写明 supersedes: D-001@v1
|
|
395
|
-
- 每条记录必须包含:type、status、source、question、answer、normalized_requirement、impacts、evidence、priority
|
|
396
|
-
- 长期术语只在 archive/scan 时再提升到 \`.sillyspec/docs/<project>/glossary.md\`
|
|
397
|
-
4. 自审检查:
|
|
398
|
-
- 需求覆盖:是否完整覆盖对话式探索中确认的需求
|
|
399
|
-
- Grill 覆盖:如果存在 decisions.md,design.md 是否引用所有当前版本 D-xxx@vN
|
|
400
|
-
- 约束一致性:是否与 CONVENTIONS.md、ARCHITECTURE.md 一致
|
|
401
|
-
- 真实性:表名/字段名/类名/方法名来自真实代码或标注"新增"
|
|
402
|
-
- YAGNI:是否包含不必要功能
|
|
403
|
-
- 验收标准:是否具体可测试
|
|
404
|
-
- 非目标清晰:是否明确界定了不做的事
|
|
405
|
-
- 兼容策略(brownfield):是否说明了回退路径
|
|
406
|
-
- 风险识别:是否识别了关键技术风险和对策
|
|
407
|
-
- **生命周期契约表**(如涉及 session/lease/agent_run/daemon/lifecycle/claim/heartbeat 等关键词):design.md 是否包含完整的生命周期契约表?每个事件是否有必需字段定义?字段是否出现在 DTO/interface 中?
|
|
408
|
-
5. 自审发现问题 → 修改后重新检查
|
|
409
|
-
6. 全部通过 → 进入下一步
|
|
410
|
-
|
|
411
|
-
### 输出
|
|
412
|
-
design.md 文件路径 + 自审结果
|
|
413
|
-
|
|
414
|
-
### 注意
|
|
415
|
-
- 自审不通过不要进入下一步
|
|
416
|
-
- 不确定的问题标注「⚠️ 自审存疑」`,
|
|
417
|
-
outputHint: 'design.md 文件路径 + 自审结果',
|
|
418
|
-
optional: false
|
|
419
|
-
},
|
|
420
|
-
{
|
|
421
|
-
name: 'Design Grill 交叉审查',
|
|
422
|
-
conditionalWait: true,
|
|
423
|
-
waitReason: '等待用户处理 Design Grill 发现的结构性问题',
|
|
424
|
-
waitOptions: ['按推荐修正', '补充回答', '显式跳过'],
|
|
425
|
-
prompt: `默认执行 Design Grill,对已经写出的 design.md 做交叉审查。
|
|
426
|
-
|
|
427
|
-
### 定位
|
|
428
|
-
这是设计完成后的质量门,不是需求探索。目标不是继续发散,而是找出 design.md 内部、四件套之间、文档与外部约束之间的结构性矛盾。
|
|
429
|
-
|
|
430
|
-
### 默认行为
|
|
431
|
-
1. 默认必须执行一次交叉审查;不要让用户凭主观判断决定"要不要 Grill"。
|
|
432
|
-
2. 只有以下情况可以轻量跳过,并必须记录原因:
|
|
433
|
-
- 用户明确要求 no-grill / 显式跳过
|
|
434
|
-
- 文档是一页以内、单模块、无状态流转、无 schema/API/兼容策略变更
|
|
435
|
-
- plan_level 明确为 none,且只改 1-2 个文件
|
|
436
|
-
3. 即使跳过,也要输出"Design Grill skipped"和原因,不能静默跳过。
|
|
437
|
-
|
|
438
|
-
### 输入材料
|
|
439
|
-
1. 必须读取完整 \`.sillyspec/changes/<change-name>/design.md\`
|
|
440
|
-
2. 读取 proposal.md、requirements.md、tasks.md、decisions.md(如存在)
|
|
441
|
-
3. 读取 scan/module docs:
|
|
442
|
-
- \`.sillyspec/docs/<project>/scan/ARCHITECTURE.md\`
|
|
443
|
-
- \`.sillyspec/docs/<project>/scan/CONVENTIONS.md\`
|
|
444
|
-
- \`.sillyspec/docs/<project>/modules/_module-map.yaml\`
|
|
445
|
-
- 命中的模块文档
|
|
446
|
-
4. 按 design.md 文件变更清单读取相关源码、测试、配置、schema 或样例数据;矛盾经常藏在设计与外部约束交叉处,素材宁可多读,不要只读摘要。
|
|
447
|
-
|
|
448
|
-
### 交叉审查模型
|
|
449
|
-
按三层检查并输出 cross-check matrix:
|
|
450
|
-
1. **定义层**:模糊概念是否有可测试定义。例如"高可用""异常数据""本地缓存""重试"。
|
|
451
|
-
2. **一致性层**:跨章节/跨产物是否打架。例如数据流 vs 容错策略、schema vs 输入格式、非目标 vs tasks。
|
|
452
|
-
3. **可行性层**:关键假设是否有来源。例如 P99 延迟、上游 SLA、缓存 TTL、数据量、权限模型、兼容旧配置。
|
|
453
|
-
|
|
454
|
-
### 交叉点抽取
|
|
455
|
-
重点找这些交叉点:
|
|
456
|
-
- 模块 A 依赖模块 B 的实体/状态/接口
|
|
457
|
-
- requirements.md 的 FR 与 design.md 的数据模型/API/状态机
|
|
458
|
-
- design.md 的容错策略与数据流、缓存、重试、回滚
|
|
459
|
-
- tasks.md 的执行范围与 design.md 的非目标
|
|
460
|
-
- decisions.md 的 D-xxx@vN 与 design.md 当前说法
|
|
461
|
-
- scan/module docs 或源码中的真实约束与 design.md 假设
|
|
462
|
-
|
|
463
|
-
### 问答处理
|
|
464
|
-
1. 先自动交叉审查,不要一上来问用户。
|
|
465
|
-
2. 没有结构性问题:正常完成,输出"Design Grill passed",附 cross-check matrix。
|
|
466
|
-
3. 发现问题:
|
|
467
|
-
- 对能从代码/文档确定的问题,直接给出推荐修正。
|
|
468
|
-
- 对需要业务判断的问题,每次只问一个最关键问题,然后等待用户。
|
|
469
|
-
- P0/P1 未决项必须进入 Unresolved Blockers,不能带着进入 plan。
|
|
470
|
-
4. 用户回答后,更新 design.md 和 decisions.md;如果推翻旧决策,新增版本 D-xxx@v2,而不是覆盖 D-xxx@v1。
|
|
471
|
-
|
|
472
|
-
### decisions.md 版本规则
|
|
473
|
-
\`\`\`markdown
|
|
474
|
-
## D-001@v2: 缓存异常时的 fallback 语义
|
|
475
|
-
- type: definition | consistency | feasibility | boundary | architecture | compatibility | risk
|
|
476
|
-
- priority: P0 | P1 | P2
|
|
477
|
-
- status: accepted | unresolved | rejected | superseded
|
|
478
|
-
- supersedes: D-001@v1
|
|
479
|
-
- source: design-grill
|
|
480
|
-
- question: §3 数据流与 §7 容错策略冲突时以哪个为准?
|
|
481
|
-
- answer: 采用 §7 的重试语义,缓存只作为只读 fallback。
|
|
482
|
-
- normalized_requirement: TTL 过期且上游仍异常时返回 stale 标记,不刷新缓存。
|
|
483
|
-
- impacts: [FR-02, task-03, verify-02]
|
|
484
|
-
- evidence: design.md §3/§7, src/cache/...
|
|
485
|
-
\`\`\`
|
|
486
|
-
|
|
487
|
-
### 输出格式
|
|
488
|
-
\`\`\`markdown
|
|
489
|
-
## Design Grill Result
|
|
490
|
-
status: passed | needs-user-input | blocked | skipped
|
|
491
|
-
|
|
492
|
-
## Cross-Check Matrix
|
|
493
|
-
| ID | 层级 | 交叉点 | 证据 A | 证据 B | 结论 | 决策 |
|
|
494
|
-
|---|---|---|---|---|---|---|
|
|
495
|
-
| X-001 | consistency | 数据流 vs 容错 | design §3 | design §7 | conflict | D-001@v2 |
|
|
496
|
-
|
|
497
|
-
## Question Distribution
|
|
498
|
-
| 分类 | 数量 | 含义 |
|
|
499
|
-
|---|---|---|
|
|
500
|
-
| immediately_answered | N | 心里清楚但文档缺失 |
|
|
501
|
-
| needs_thinking | N | 需要用户判断 |
|
|
502
|
-
| unresolved | N | 真正设计漏洞 |
|
|
503
|
-
|
|
504
|
-
## Unresolved Blockers
|
|
505
|
-
| ID | priority | 问题 | 阻塞原因 | 下一步 |
|
|
506
|
-
|---|---|---|---|---|
|
|
507
|
-
\`\`\`
|
|
508
|
-
|
|
509
|
-
### 铁律 — 等待用户
|
|
510
|
-
- 发现 P0/P1 结构性矛盾且需要用户判断时,调用:
|
|
511
|
-
\`sillyspec run brainstorm --wait --reason "等待用户处理 Design Grill 发现的结构性问题" --options "按推荐修正,补充回答,显式跳过" --output "Design Grill 问题摘要"\`
|
|
512
|
-
- 用户显式跳过时,必须在 decisions.md 记录 accepted risk;P0/P1 skip 仍必须写入 Unresolved Blockers。
|
|
513
|
-
- 完成前必须确认:没有 P0/P1 unresolved blocker;否则不能进入 plan。`,
|
|
514
|
-
outputHint: 'Design Grill 交叉审查结果',
|
|
515
|
-
optional: false
|
|
516
|
-
},
|
|
517
|
-
{
|
|
518
|
-
name: '用户确认并生成规范文件',
|
|
519
|
-
requiresWait: true,
|
|
520
|
-
waitReason: '等待用户最终确认设计方案',
|
|
521
|
-
waitOptions: ['确认', '需要修改', '推翻重来'],
|
|
522
|
-
prompt: `用户确认设计方案,生成规范文件。
|
|
523
|
-
|
|
524
|
-
### 操作
|
|
525
|
-
1. 展示 design.md 摘要给用户
|
|
526
|
-
2. 暂停等待用户选择:✅ 确认 / ✏️ 修改 / ❌ 推翻重来
|
|
527
|
-
3. 确认后,在 \`.sillyspec/changes/<change-name>/\` 下生成所有规范文件:
|
|
528
|
-
- **design.md**:架构决策、文件变更清单、数据模型、API 设计、兼容策略、风险登记、自审
|
|
529
|
-
- **decisions.md**(可选):Grill/重大决策台账,使用 D-001@v1 稳定版本 ID
|
|
530
|
-
- **proposal.md**:动机、关键问题(为什么现有方案不够)、变更范围、不在范围内(显式清单)、成功标准(可验证条件)
|
|
531
|
-
- **requirements.md**:角色表 + FR 编号需求 + Given/When/Then 行为规格 + 非功能需求 + D-xxx@vN 覆盖关系
|
|
532
|
-
- **tasks.md**:任务列表(只列名称、对应文件路径、覆盖的 FR-xxx/D-xxx@vN,细节在 plan 阶段展开)
|
|
533
|
-
- \`git add .sillyspec/\` — 暂存规范文件(不要 commit)
|
|
534
|
-
|
|
535
|
-
所有规范文件头部必须包含 YAML frontmatter:
|
|
536
|
-
\`\`\`\`yaml
|
|
537
|
-
---
|
|
538
|
-
author: <git-user>
|
|
539
|
-
created_at: <now-datetime>
|
|
540
|
-
---
|
|
541
|
-
\`\`\`\`
|
|
542
|
-
|
|
543
|
-
### proposal.md 格式要求
|
|
544
|
-
\`\`\`markdown
|
|
545
|
-
# Proposal
|
|
546
|
-
|
|
547
|
-
## 动机
|
|
548
|
-
为什么做、解决什么核心问题
|
|
549
|
-
|
|
550
|
-
## 关键问题
|
|
551
|
-
为什么现有方案不够(展开 2-3 个具体痛点)
|
|
552
|
-
|
|
553
|
-
## 变更范围
|
|
554
|
-
本次做什么
|
|
555
|
-
|
|
556
|
-
## 不在范围内(显式清单)
|
|
557
|
-
- 不做 X
|
|
558
|
-
- 不做 Y
|
|
559
|
-
|
|
560
|
-
## 成功标准(可验证)
|
|
561
|
-
- 旧配置默认行为不变
|
|
562
|
-
- 新功能在配置后可用
|
|
563
|
-
- ...
|
|
564
|
-
\`\`\`
|
|
565
|
-
|
|
566
|
-
### requirements.md 格式要求
|
|
567
|
-
\`\`\`markdown
|
|
568
|
-
# Requirements
|
|
569
|
-
|
|
570
|
-
## 角色
|
|
571
|
-
| 角色 | 说明 |
|
|
572
|
-
|---|---|
|
|
573
|
-
| 开发者 | ... |
|
|
574
|
-
|
|
575
|
-
## 功能需求
|
|
576
|
-
|
|
577
|
-
### FR-01: 需求名称
|
|
578
|
-
覆盖决策:D-001@v1, D-002@v1(如适用)
|
|
579
|
-
Given 前提条件
|
|
580
|
-
When 触发动作
|
|
581
|
-
Then 期望结果
|
|
582
|
-
|
|
583
|
-
(每个边界条件独立 GWT 块)
|
|
584
|
-
|
|
585
|
-
## 非功能需求
|
|
586
|
-
- 兼容性:...
|
|
587
|
-
- 可回退:...
|
|
588
|
-
- 可测试:...
|
|
589
|
-
|
|
590
|
-
## 决策覆盖矩阵(如存在 decisions.md)
|
|
591
|
-
| 决策 ID | 覆盖的 FR | 说明 |
|
|
592
|
-
|---|---|---|
|
|
593
|
-
| D-001@v1 | FR-01 | ... |
|
|
594
|
-
\`\`\`
|
|
595
|
-
|
|
596
|
-
### decisions.md 格式要求(仅在有 Grill/重大决策时生成)
|
|
597
|
-
\`\`\`markdown
|
|
598
|
-
# Decisions
|
|
599
|
-
|
|
600
|
-
## D-001@v1: 决策短标题
|
|
601
|
-
- type: definition | consistency | feasibility | term | boundary | premise | architecture | compatibility | risk
|
|
602
|
-
- priority: P0 | P1 | P2
|
|
603
|
-
- status: accepted | unresolved | rejected | superseded
|
|
604
|
-
- supersedes:
|
|
605
|
-
- source: user | code | docs
|
|
606
|
-
- question: 被解决的问题
|
|
607
|
-
- answer: 用户确认或代码查证结果
|
|
608
|
-
- normalized_requirement: 可测试的约束
|
|
609
|
-
- impacts: [FR-01, task-01, verify-01]
|
|
610
|
-
- evidence: 用户回答轮次或代码/文档路径
|
|
611
|
-
\`\`\`
|
|
612
|
-
|
|
613
|
-
### 后续变更包处理
|
|
614
|
-
如果 MASTER.md 中规划了后续变更包(拆分后的子阶段),**必须同时为每个后续包创建独立变更目录**:
|
|
615
|
-
1. 读取 MASTER.md 中的变更包列表(包名 + 边界描述)
|
|
616
|
-
2. 为每个后续包创建目录:\`mkdir -p .sillyspec/changes/<后续包名>\`
|
|
617
|
-
3. 每个目录生成骨架文件:
|
|
618
|
-
- \`proposal.md\`:从 MASTER.md 中提取该包的动机和边界
|
|
619
|
-
- \`design.md\`:从 MASTER.md 中提取该包的职责描述(标记为「待设计 - 本包 design 在该包进入 brainstorm 时完善」)
|
|
620
|
-
- \`requirements.md\`:从 MASTER.md 中提取该包的需求范围(标记为「待完善」)
|
|
621
|
-
- \`tasks.md\`:创建空任务列表,标记为「待 plan 阶段展开」
|
|
622
|
-
4. \`git add .sillyspec/\` — 暂存所有新增文件(不要 commit)
|
|
623
|
-
5. 后续变更包的骨架文件同样必须包含 \`author: <git-user>\` 和 \`created_at: <now-datetime>\`
|
|
624
|
-
|
|
625
|
-
### 铁律 — 必须等待用户最终确认
|
|
626
|
-
- **展示 design.md 摘要后,暂停等待用户确认。** 不要替用户确认。
|
|
627
|
-
- 调用:\`sillyspec run brainstorm --wait --reason "等待用户确认设计方案" --options "确认,需要修改,推翻重来" --output "design.md 摘要"\`
|
|
628
|
-
- **绝对禁止**:在输出中自己说"用户已确认"然后生成文件
|
|
629
|
-
- **只有用户通过 --continue --answer "确认" 后才生成规范文件**
|
|
630
|
-
|
|
631
|
-
### 输出
|
|
632
|
-
所有规范文件路径(含后续变更包目录列表)
|
|
633
|
-
|
|
634
|
-
### 注意
|
|
635
|
-
- 禁止在确认前推进到后续阶段
|
|
636
|
-
- 禁止自动 commit
|
|
637
|
-
- 推翻重来回到 Step 6(对话式探索)
|
|
638
|
-
- 表名/字段名/类名必须来自真实代码或标注"新增"
|
|
639
|
-
- 如果存在 decisions.md,requirements.md 必须引用全部当前版本 D-xxx@vN;没有覆盖的 D-xxx@vN 必须标注为剩余风险
|
|
640
|
-
- 如果 Design Grill 产生 P0/P1 unresolved blocker,必须回到 design 修正,不能进入 plan
|
|
641
|
-
- tasks.md 只列任务名,细节在 plan 阶段展开`,
|
|
642
|
-
|
|
643
|
-
}
|
|
644
|
-
]
|
|
645
|
-
}
|
|
1
|
+
export const definition = {
|
|
2
|
+
name: 'brainstorm',
|
|
3
|
+
title: '头脑风暴',
|
|
4
|
+
description: '探索需求、分析技术方案、识别风险',
|
|
5
|
+
steps: [
|
|
6
|
+
{
|
|
7
|
+
name: '状态检查',
|
|
8
|
+
prompt: `检查当前变更的进度状态(sillyspec.db)。
|
|
9
|
+
|
|
10
|
+
### 操作
|
|
11
|
+
1. 运行 \`sillyspec progress show\`
|
|
12
|
+
2. 确认 currentStage 为 "brainstorm"
|
|
13
|
+
3. 如果有进行中的 brainstorm,提示选择继续或重新开始
|
|
14
|
+
4. 如果未初始化,提示先运行 sillyspec init
|
|
15
|
+
5. **检查变更名称是否有意义**:如果当前变更名是自动生成的(如 \`2026-06-02-new-change\`),询问用户确认实际变更名,然后运行 \`sillyspec change-rename <旧名> <新名>\` 重命名
|
|
16
|
+
|
|
17
|
+
### 输出
|
|
18
|
+
当前状态摘要(1-2 句话)
|
|
19
|
+
|
|
20
|
+
### 注意
|
|
21
|
+
- 以 CLI 返回为准,不要自行推断阶段
|
|
22
|
+
- 如果阶段不对,输出正确提示并停止
|
|
23
|
+
- **不要用 mv 命令重命名变更目录**,必须使用 \`sillyspec change-rename\`,否则 DB 和目录会脱节`,
|
|
24
|
+
outputHint: '状态摘要',
|
|
25
|
+
optional: false
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: '加载项目上下文',
|
|
29
|
+
prompt: `加载项目现有上下文,理解代码结构和约定。
|
|
30
|
+
|
|
31
|
+
### 操作
|
|
32
|
+
1. 读取 CODEBASE-OVERVIEW.md + 共享规范 + 子项目上下文
|
|
33
|
+
2. 加载项目信息:\`cat .sillyspec/projects/*.yaml 2>/dev/null\`
|
|
34
|
+
3. 加载本地配置:\`cat .sillyspec/local.yaml 2>/dev/null\`
|
|
35
|
+
4. 棕地项目:读取 .sillyspec/docs/<project>/scan/ 下的 STRUCTURE.md、CONVENTIONS.md、ARCHITECTURE.md
|
|
36
|
+
5. **加载模块索引**:读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(如存在)
|
|
37
|
+
- 这一步是高频操作,_module-map.yaml 回答"哪个文件属于哪个模块、模块之间怎么依赖"
|
|
38
|
+
- 用 tags/aliases 字段做需求关键词→模块的粗匹配
|
|
39
|
+
- 用 entrypoints 字段快速了解模块对外能力
|
|
40
|
+
6. 查看进行中的变更:\`ls .sillyspec/changes/ | grep -v archive\`
|
|
41
|
+
|
|
42
|
+
### 模块匹配方法
|
|
43
|
+
读取 _module-map.yaml 后,根据用户描述的需求关键词,匹配相关模块:
|
|
44
|
+
- 需求中提到"登录""认证""token" → 匹配 tags/aliases 中含这些词的模块
|
|
45
|
+
- 需求中提到特定文件路径 → 匹配 paths 字段
|
|
46
|
+
- 匹配结果用于后续 design.md 的文件变更清单
|
|
47
|
+
|
|
48
|
+
### 子项目判定
|
|
49
|
+
- 单项目:直接确认,不需要等待
|
|
50
|
+
- 多项目且用户已指定:直接确认,不需要等待
|
|
51
|
+
- 多项目且用户未指定:列出项目列表,需要用户确认本次需求属于哪个子项目
|
|
52
|
+
|
|
53
|
+
### 输出
|
|
54
|
+
项目现状理解摘要(3-5 句话,关键约定和架构决策)+ 可能涉及的模块列表 + 本次需求所属子项目
|
|
55
|
+
|
|
56
|
+
### 注意
|
|
57
|
+
- 棕地项目必须读取数据模型章节
|
|
58
|
+
- 模块匹配只是粗筛,后续步骤会细化`,
|
|
59
|
+
outputHint: '上下文摘要',
|
|
60
|
+
optional: false
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: '协作与复用检查',
|
|
64
|
+
prompt: `检查是否有同名变更或可复用模板。
|
|
65
|
+
|
|
66
|
+
### 操作
|
|
67
|
+
1. 检查已有变更:\`ls .sillyspec/changes/ | grep -v archive\`
|
|
68
|
+
- 有相关变更 → 提示用户,避免重复
|
|
69
|
+
2. 检查全局模板:\`ls ~/.sillyspec/templates/\`
|
|
70
|
+
- 有匹配模板 → 询问是否基于模板
|
|
71
|
+
3. 无相关内容 → 跳过,不输出
|
|
72
|
+
|
|
73
|
+
### 输出
|
|
74
|
+
检测到的相关变更和可用模板(无则输出"无冲突,继续")`,
|
|
75
|
+
outputHint: '已有变更和可用模板',
|
|
76
|
+
optional: true
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: '原型/设计图分析',
|
|
80
|
+
prompt: `如果用户提供了截图、图片或 HTML 原型,分析提取结构。
|
|
81
|
+
|
|
82
|
+
### 操作
|
|
83
|
+
1. 识别图片中的页面结构(区域、组件、布局)
|
|
84
|
+
2. 提取表单字段(名称、类型、必填、选项)
|
|
85
|
+
3. 提取交互流程(页面跳转、按钮行为)
|
|
86
|
+
4. 提取标注和备注(业务规则、权限说明)
|
|
87
|
+
5. 展示分析结果,请用户确认遗漏
|
|
88
|
+
|
|
89
|
+
### 输出
|
|
90
|
+
页面结构树 + 字段列表 + 交互流程图
|
|
91
|
+
|
|
92
|
+
### 注意
|
|
93
|
+
- 没有原型则跳过此步骤
|
|
94
|
+
- 多页面时逐页分析,不要一次全部输出
|
|
95
|
+
- 图片信息 > 文字描述,不要忽略视觉信息`,
|
|
96
|
+
outputHint: '页面结构和交互流程',
|
|
97
|
+
optional: true
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: '需求范围评估',
|
|
101
|
+
conditionalWait: true,
|
|
102
|
+
waitReason: '等待用户确认拆分/批量模式方案',
|
|
103
|
+
waitOptions: ['同意拆分', '不需要拆分', '走批量模式'],
|
|
104
|
+
prompt: `评估需求复杂度,判断是否需要拆分或走批量模式。
|
|
105
|
+
|
|
106
|
+
### 操作
|
|
107
|
+
1. 根据分析结果判断复杂度
|
|
108
|
+
2. 满足以下任意 2 条建议拆分:
|
|
109
|
+
- 3+ 个可独立交付的功能模块
|
|
110
|
+
- 3+ 种角色有不同权限和视图
|
|
111
|
+
- 跨页面状态流转(审批流、多步表单)
|
|
112
|
+
- 模块间耦合度低可独立开发
|
|
113
|
+
3. 满足以下条件建议走**批量模式**:
|
|
114
|
+
- 任务数量 > 10 且任务间有重复模式(如 100 个报表、50 个表单、N 个相似页面)
|
|
115
|
+
- 本质是「模板 × 数据」而非 N 个独立功能
|
|
116
|
+
- 直接逐个开发会导致 plan.md 膨胀和上下文溢出
|
|
117
|
+
4. 需要拆分 → 生成 MASTER.md,规划子阶段
|
|
118
|
+
5. 检测到批量模式 → 输出提示并建议用户确认
|
|
119
|
+
6. 都不需要 → 继续
|
|
120
|
+
|
|
121
|
+
### 批量模式指引
|
|
122
|
+
确认后,后续 plan/execute 按以下原则调整:
|
|
123
|
+
- **不要**把每个实例列为独立任务(不要写 100 个 checkbox)
|
|
124
|
+
- plan 设计通用架构(引擎/模板/配置格式),任务数控制在 10 个以内
|
|
125
|
+
- 数据转换用脚本完成(Excel → 配置文件),不消耗 AI 上下文
|
|
126
|
+
- execute 每个 Wave 独立模块,Wave 间通过接口定义解耦
|
|
127
|
+
- verify 用脚本全量验证 + AI 抽查边界案例
|
|
128
|
+
|
|
129
|
+
### 半批量场景
|
|
130
|
+
如果任务中大部分相似但有少量特殊任务(如 20 个任务中 15 个相似、5 个特殊):
|
|
131
|
+
- **主簇**(>10 个相似)→ 走批量模式(引擎 + 配置)
|
|
132
|
+
- **小簇**(2-5 个相似)→ 走简化版批量(基于主簇模板扩展)
|
|
133
|
+
- **孤立任务**(1 个)→ 走标准开发流程
|
|
134
|
+
- 建议用「继承 + override」配置解决特殊任务,配置解决不了的才写定制代码
|
|
135
|
+
- 架构设计时预留扩展点(hooks/overrides),让特殊任务能"挂上去"而不是"另起炉灶"
|
|
136
|
+
|
|
137
|
+
### 铁律 — 何时需要等待用户
|
|
138
|
+
- **需要拆分或批量模式时**:列出方案并暂停等待用户确认
|
|
139
|
+
- 调用:\`sillyspec run brainstorm --wait --reason "等待用户确认拆分方案" --options "同意拆分,不需要拆分" --output "拆分方案摘要"\`
|
|
140
|
+
- **不需要拆分也不需要批量模式时**:正常完成即可
|
|
141
|
+
|
|
142
|
+
### 输出
|
|
143
|
+
拆分方案 / 批量模式确认 / "无需拆分"确认
|
|
144
|
+
|
|
145
|
+
### 注意
|
|
146
|
+
- 简单 CRUD 不拆`,
|
|
147
|
+
outputHint: '拆分方案或无需拆分确认',
|
|
148
|
+
optional: true
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
name: '对话式探索',
|
|
152
|
+
requiresWait: true,
|
|
153
|
+
repeatableWait: true,
|
|
154
|
+
maxWaitRounds: 3,
|
|
155
|
+
waitReason: '等待用户回答需求问题',
|
|
156
|
+
waitOptions: ['继续补充', '信息够了,进入方案讨论'],
|
|
157
|
+
prompt: `通过对话探索需求细节。
|
|
158
|
+
|
|
159
|
+
### 操作
|
|
160
|
+
1. 从最核心的一个问题开始(用户到底想要什么?)
|
|
161
|
+
2. **提出问题后必须暂停等待用户回答**,不要替用户回答
|
|
162
|
+
3. 根据用户回答判断:信息够了 → 正常完成 / 需要追问 → 暂停等待下一个回答
|
|
163
|
+
4. 探索顺序(按需):目的 → 约束 → 边界 → 成功标准
|
|
164
|
+
|
|
165
|
+
### 铁律 — 不要自问自答
|
|
166
|
+
- **这是人机协作步骤,你必须暂停等待用户输入。**
|
|
167
|
+
- 每次提出问题后,调用:
|
|
168
|
+
\`sillyspec run brainstorm --wait --reason "等待用户回答需求问题" --options "回答见--answer" --output "你的问题"\`
|
|
169
|
+
- **绝对禁止**:在自己输出中模拟用户的回答,然后说"需求已明确"
|
|
170
|
+
- 2-3 轮问答就应进入方案讨论
|
|
171
|
+
- 多选题优于开放式问题
|
|
172
|
+
- YAGNI — 砍掉不需要的功能
|
|
173
|
+
|
|
174
|
+
### 输出
|
|
175
|
+
需求理解摘要(用户确认的需求点列表)
|
|
176
|
+
|
|
177
|
+
### 注意
|
|
178
|
+
- 第一次进入此步骤时,提出第一个问题并暂停
|
|
179
|
+
- 用户通过 \`--continue --answer "回答"\` 回答后,本步骤会再次执行,此时检查是否需要追问或可以结束`,
|
|
180
|
+
outputHint: '需求理解摘要',
|
|
181
|
+
optional: false
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
name: '需求澄清 Grill',
|
|
185
|
+
conditionalWait: true,
|
|
186
|
+
repeatableWait: true,
|
|
187
|
+
maxWaitRounds: 8,
|
|
188
|
+
waitReason: '等待用户回答需求澄清 Grill',
|
|
189
|
+
waitOptions: ['回答见--answer', '信息够了,结束需求澄清'],
|
|
190
|
+
prompt: `执行可选的需求澄清 Grill pass。
|
|
191
|
+
|
|
192
|
+
### 定位
|
|
193
|
+
这是 design.md 之前的需求澄清,不是设计后的 Design Grill。目标是把需求/术语/边界中仍需要人类判断的点问清楚;Design Grill 后续仍会默认执行,用来审查已经写出的 design.md 是否自洽。
|
|
194
|
+
|
|
195
|
+
### 入口判断
|
|
196
|
+
1. 汇总「对话式探索」后仍未稳定的歧义点,按类型列出:
|
|
197
|
+
- 术语歧义:同一个词可能指向不同实体/角色/状态
|
|
198
|
+
- 边界歧义:哪些场景做、哪些不做、失败怎么处理
|
|
199
|
+
- 前提风险:这个需求是否不该存在,是否已有更简单的现有方案
|
|
200
|
+
- 代码冲突:用户描述与现有代码/scan/module 文档不一致
|
|
201
|
+
2. 能通过代码或文档确认的不要问用户,先读取:
|
|
202
|
+
- \`.sillyspec/docs/<project>/scan/ARCHITECTURE.md\`
|
|
203
|
+
- \`.sillyspec/docs/<project>/scan/CONVENTIONS.md\`
|
|
204
|
+
- \`.sillyspec/docs/<project>/modules/_module-map.yaml\`
|
|
205
|
+
- 相关源码文件
|
|
206
|
+
3. 给每个未解决歧义分级:
|
|
207
|
+
- P0:影响数据模型、权限边界、状态机/工作流、兼容策略、不可逆架构取舍、跨模块所有权
|
|
208
|
+
- P1:影响用户场景、验收标准、错误处理、默认值
|
|
209
|
+
- P2:文案、展示细节、低风险交互偏好
|
|
210
|
+
4. 执行规则:
|
|
211
|
+
- P1/P2 歧义 0-2 个且无 P0:输出"需求澄清 Grill skipped",在后续设计中内联处理并记录依据
|
|
212
|
+
- P1/P2 歧义 >= 3 个:进入本 pass,按优先级逐个澄清
|
|
213
|
+
- 任意 P0 歧义:进入本 pass;如果需要用户判断,必须暂停问一个问题
|
|
214
|
+
5. 不要问用户"要不要 Grill"。本步骤由 AI 根据歧义风险决定是否执行;只在需要业务判断/取舍时等待用户回答。
|
|
215
|
+
|
|
216
|
+
### 追问策略
|
|
217
|
+
1. **一次只问一个问题**:按 P0 → P1 → P2 顺序,深度优先处理最关键歧义。
|
|
218
|
+
2. **能查代码就不问**:如果问题可由源码、scan 文档、模块文档回答,先查证并给出结论;只有业务判断/取舍才问用户。
|
|
219
|
+
3. **术语碰撞立即指出**:用户用词与 glossary/代码实体/模块文档冲突时,当场说明冲突并要求选择 canonical term。
|
|
220
|
+
4. **模糊词精化**:把"账户/任务/状态/会话/执行"这类多义词拆成明确实体或状态。
|
|
221
|
+
5. **场景压力测试**:用具体 case 逼出边界,例如失败重试、部分成功、历史数据、权限不足、并发修改、兼容旧配置。
|
|
222
|
+
6. **前提挑战优先**:如果现有设计或代码已有简单路径,先说明"可能不该新增",不要直接优化错误前提。
|
|
223
|
+
|
|
224
|
+
### 决策记录草稿
|
|
225
|
+
每解决一个有实现影响的问题,生成一个稳定 ID 的记录草稿。不要把闲聊都记录进去。
|
|
226
|
+
|
|
227
|
+
\`\`\`markdown
|
|
228
|
+
## D-001@v1: <短标题>
|
|
229
|
+
- type: term | boundary | premise | architecture | compatibility | risk
|
|
230
|
+
- status: accepted | rejected | superseded
|
|
231
|
+
- source: user | code | docs
|
|
232
|
+
- question: <被解决的问题>
|
|
233
|
+
- answer: <用户确认或代码查证结果>
|
|
234
|
+
- normalized_requirement: <可测试的约束>
|
|
235
|
+
- impacts: [FR-?, task-?, verify-?]
|
|
236
|
+
- evidence: <文件路径/代码位置/用户回答轮次>
|
|
237
|
+
\`\`\`
|
|
238
|
+
|
|
239
|
+
### 铁律 — 等待用户
|
|
240
|
+
- 每轮最多提出一个问题,然后调用:
|
|
241
|
+
\`sillyspec run brainstorm --wait --reason "等待用户回答需求澄清 Grill" --options "回答见--answer,信息够了,结束需求澄清" --output "你的单个问题或查证结论"\`
|
|
242
|
+
- 用户通过 \`--continue --answer "回答"\` 回答后,本步骤会再次执行;继续处理下一个最关键歧义。
|
|
243
|
+
- 达到 maxWaitRounds=8 后,必须总结已确认内容和剩余风险,不要无限追问。
|
|
244
|
+
|
|
245
|
+
### 输出
|
|
246
|
+
需求澄清结论摘要 + D-xxx@vN 决策记录草稿 + 剩余风险(如有)`,
|
|
247
|
+
outputHint: '需求澄清和决策记录草稿',
|
|
248
|
+
optional: true
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
name: '提出 2-3 种方案',
|
|
252
|
+
requiresWait: true,
|
|
253
|
+
waitReason: '等待用户选择方案',
|
|
254
|
+
waitOptions: ['方案A', '方案B', '方案C'],
|
|
255
|
+
prompt: `基于需求理解和 Grill 结果,提出 2-3 种实现方案。
|
|
256
|
+
|
|
257
|
+
### 操作
|
|
258
|
+
1. 每种方案列出:核心思路、优势、劣势
|
|
259
|
+
2. 如果 Grill 产生 D-xxx@vN 决策记录,方案必须说明覆盖/违反哪些当前版本决策
|
|
260
|
+
3. 给出推荐方案和理由
|
|
261
|
+
|
|
262
|
+
### 铁律 — 必须等待用户选择方案
|
|
263
|
+
- **不要替用户选择方案。** 列出方案对比表和推荐后,必须暂停等待用户选择。
|
|
264
|
+
- 列出方案后,调用:
|
|
265
|
+
\`sillyspec run brainstorm --wait --reason "等待用户选择方案" --options "方案A,方案B,方案C" --output "方案对比摘要"\`
|
|
266
|
+
- **绝对禁止**:在输出中自己说"推荐方案 A"然后当用户选了
|
|
267
|
+
|
|
268
|
+
### 输出
|
|
269
|
+
方案对比表 + 推荐方案
|
|
270
|
+
|
|
271
|
+
### 注意
|
|
272
|
+
- 方案差异要实质性的,不要为了凑数
|
|
273
|
+
- 推荐理由要具体`,
|
|
274
|
+
outputHint: '方案对比和推荐',
|
|
275
|
+
optional: false
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
name: '分段展示设计',
|
|
279
|
+
requiresWait: true,
|
|
280
|
+
waitReason: '等待用户确认设计方案',
|
|
281
|
+
waitOptions: ['确认', '需要修改', '推翻重来'],
|
|
282
|
+
prompt: `展示完整设计方案供用户确认。
|
|
283
|
+
|
|
284
|
+
### 操作
|
|
285
|
+
1. 简单项目:几句话整体描述
|
|
286
|
+
2. 复杂项目:按模块/Phase 分段展示,每段 200-300 字
|
|
287
|
+
3. 展示完整设计方案(不要逐段停顿,一次性展示)
|
|
288
|
+
4. 确认变更名(格式:\`YYYY-MM-DD-<简短描述>\`,例如 \`2026-05-13-user-auth\`)
|
|
289
|
+
5. 暂停等待用户确认或修改意见
|
|
290
|
+
|
|
291
|
+
### 铁律 — 必须等待用户确认设计
|
|
292
|
+
- **不要替用户确认设计。** 展示完整设计方案后,必须暂停等待用户确认。
|
|
293
|
+
- 列出设计后,调用:
|
|
294
|
+
\`sillyspec run brainstorm --wait --reason "等待用户确认设计方案" --options "确认,需要修改,推翻重来" --output "设计方案摘要"\`
|
|
295
|
+
- **绝对禁止**:在输出中自己说"设计已充分确认"然后推进
|
|
296
|
+
|
|
297
|
+
### 输出
|
|
298
|
+
完整设计方案 + 变更名
|
|
299
|
+
|
|
300
|
+
### 注意
|
|
301
|
+
- 不要一次输出大段文字,按模块/Phase 分段
|
|
302
|
+
- 变更名必须以当天日期开头(YYYY-MM-DD-),后跟英文短横线分隔的简短描述`,
|
|
303
|
+
outputHint: '用户确认的设计方案',
|
|
304
|
+
optional: false
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
name: 'HTML 原型生成',
|
|
308
|
+
prompt: `为设计方案生成可交互的 HTML 原型,帮助用户可视化确认。
|
|
309
|
+
|
|
310
|
+
### 操作
|
|
311
|
+
1. 判断本次设计是否适合生成 HTML 原型:
|
|
312
|
+
- 适合:有 UI 组件/布局/交互流程/状态转换/架构图
|
|
313
|
+
- 不适合:纯后端逻辑/配置修改/无可视化意义
|
|
314
|
+
2. 如果适合,生成一个独立的 HTML 文件(内联 CSS + JS),保存到:
|
|
315
|
+
\`.sillyspec/changes/<change-name>/prototype-<名称>.html\`(变更名格式:YYYY-MM-DD-<简短描述>)
|
|
316
|
+
3. 原型要求:
|
|
317
|
+
- 单文件,浏览器直接打开
|
|
318
|
+
- 展示关键布局结构和交互流程
|
|
319
|
+
- 不需要完整功能,重点是让用户确认设计方向
|
|
320
|
+
- 使用 ASCII/流程图/线框图风格,不需要精美 UI
|
|
321
|
+
4. 展示给用户确认设计方向
|
|
322
|
+
|
|
323
|
+
### 输出
|
|
324
|
+
HTML 原型文件路径(或"跳过"如果不适合)`,
|
|
325
|
+
outputHint: '原型文件路径或跳过',
|
|
326
|
+
optional: true
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
name: '写设计文档并自审',
|
|
330
|
+
prompt: `撰写 design 文档并进行 AI 自审。
|
|
331
|
+
|
|
332
|
+
### design.md 必须包含的章节
|
|
333
|
+
1. **背景**:为什么做、解决什么问题
|
|
334
|
+
2. **设计目标**:要达成什么
|
|
335
|
+
3. **非目标**:明确不做的事(防止 scope creep)
|
|
336
|
+
4. **拆分判断**(如适用):为什么这样组织变更、为什么不走批量模式
|
|
337
|
+
5. **总体方案**:技术方案(分 Phase/Wave)
|
|
338
|
+
6. **文件变更清单**(必填):
|
|
339
|
+
|
|
340
|
+
| 操作 | 文件路径 | 说明 |
|
|
341
|
+
|---|---|---|
|
|
342
|
+
| 新增 | src/xxx/NewFile.java | ... |
|
|
343
|
+
| 修改 | src/xxx/ExistingFile.java | 新增 xx 方法 |
|
|
344
|
+
| 删除 | src/xxx/OldFile.java | 已被 xx 替代 |
|
|
345
|
+
|
|
346
|
+
7. **接口定义**:方法签名、数据结构(代码类任务必填)
|
|
347
|
+
7.5. **生命周期契约表**(涉及以下关键词时必填,否则可省略):
|
|
348
|
+
|
|
349
|
+
如果本次变更涉及以下任何关键词:
|
|
350
|
+
session / lease / agent_run / daemon / lifecycle / state transition / complete / end / claim / heartbeat
|
|
351
|
+
|
|
352
|
+
则必须在 design.md 中包含「生命周期契约表」章节,格式如下:
|
|
353
|
+
|
|
354
|
+
| 事件 | 发起方 | 接收方 | 必需字段 | 状态变化 |
|
|
355
|
+
|---|---|---|---|---|
|
|
356
|
+
| claim lease | daemon | backend | leaseId, claimToken, agentRunId | pending → running |
|
|
357
|
+
| create session | backend | daemon | sessionId, leaseId, claimToken | session active |
|
|
358
|
+
| submit message | daemon | backend | leaseId, claimToken, agentRunId | append messages |
|
|
359
|
+
| turn result | daemon | backend | runId, status, output | running → completed/failed |
|
|
360
|
+
| session end | daemon | backend | sessionId, reason | active → ended |
|
|
361
|
+
|
|
362
|
+
判断规则:
|
|
363
|
+
- design.md 或需求中出现上述关键词 → 必须生成此表
|
|
364
|
+
- 表中的每个事件 → 必须有对应代码任务、接口任务、测试任务
|
|
365
|
+
- 表中的必需字段 → 必须出现在相关 DTO/interface 定义中
|
|
366
|
+
- 缺少任一事件 → 在 design.md 风险登记中明确记录
|
|
367
|
+
|
|
368
|
+
**判定方法**:在自审阶段,如果检测到上述关键词但 design.md 中没有此表 → 自审不通过
|
|
369
|
+
8. **数据模型**(如涉及):表结构/字段变更
|
|
370
|
+
9. **兼容策略**(brownfield 必填):
|
|
371
|
+
- 未配置新功能时行为不变
|
|
372
|
+
- 新旧逻辑的回退路径
|
|
373
|
+
- 不改变的 API / 表结构
|
|
374
|
+
10. **风险登记**:
|
|
375
|
+
|
|
376
|
+
| 编号 | 风险 | 等级 | 应对策略 |
|
|
377
|
+
|---|---|---|---|
|
|
378
|
+
| R-01 | ... | P0/P1/P2 | ... |
|
|
379
|
+
|
|
380
|
+
11. **决策追踪**(如存在 Grill/重大决策):
|
|
381
|
+
- 列出当前版本 D-xxx@vN 决策 ID
|
|
382
|
+
- 说明每个 D-xxx@vN 被哪些 FR-xxx / 设计章节覆盖
|
|
383
|
+
- 标注仍未解决的 D-xxx@vN 或剩余风险
|
|
384
|
+
12. **自审**(AI 对自身设计的校验)
|
|
385
|
+
|
|
386
|
+
### 操作
|
|
387
|
+
1. 确认变更目录存在:\`mkdir -p .sillyspec/changes/<change-name>\`(Windows 用 \`mkdir .sillyspec\\changes\\<变更名>\` 或 PowerShell \`New-Item -ItemType Directory -Force -Path .sillyspec/changes/<change-name>\`)
|
|
388
|
+
- 变更名格式必须为 \`YYYY-MM-DD-<简短描述>\`(如 \`2026-05-13-user-auth\`)
|
|
389
|
+
2. 将确认的设计写入 \`.sillyspec/changes/<change-name>/design.md\`
|
|
390
|
+
3. 如果 Grill 或方案讨论产生了实现相关决策,写入 \`.sillyspec/changes/<change-name>/decisions.md\`:
|
|
391
|
+
- decisions.md 是本次变更的决策台账,不是长期术语表
|
|
392
|
+
- 只记录有实现/验收影响的决策,闲聊和低风险偏好不记录
|
|
393
|
+
- 每条记录必须有稳定版本 ID:D-001@v1、D-002@v1 ...
|
|
394
|
+
- 若后续 Design Grill 修正该决策,新记录使用 D-001@v2,并写明 supersedes: D-001@v1
|
|
395
|
+
- 每条记录必须包含:type、status、source、question、answer、normalized_requirement、impacts、evidence、priority
|
|
396
|
+
- 长期术语只在 archive/scan 时再提升到 \`.sillyspec/docs/<project>/glossary.md\`
|
|
397
|
+
4. 自审检查:
|
|
398
|
+
- 需求覆盖:是否完整覆盖对话式探索中确认的需求
|
|
399
|
+
- Grill 覆盖:如果存在 decisions.md,design.md 是否引用所有当前版本 D-xxx@vN
|
|
400
|
+
- 约束一致性:是否与 CONVENTIONS.md、ARCHITECTURE.md 一致
|
|
401
|
+
- 真实性:表名/字段名/类名/方法名来自真实代码或标注"新增"
|
|
402
|
+
- YAGNI:是否包含不必要功能
|
|
403
|
+
- 验收标准:是否具体可测试
|
|
404
|
+
- 非目标清晰:是否明确界定了不做的事
|
|
405
|
+
- 兼容策略(brownfield):是否说明了回退路径
|
|
406
|
+
- 风险识别:是否识别了关键技术风险和对策
|
|
407
|
+
- **生命周期契约表**(如涉及 session/lease/agent_run/daemon/lifecycle/claim/heartbeat 等关键词):design.md 是否包含完整的生命周期契约表?每个事件是否有必需字段定义?字段是否出现在 DTO/interface 中?
|
|
408
|
+
5. 自审发现问题 → 修改后重新检查
|
|
409
|
+
6. 全部通过 → 进入下一步
|
|
410
|
+
|
|
411
|
+
### 输出
|
|
412
|
+
design.md 文件路径 + 自审结果
|
|
413
|
+
|
|
414
|
+
### 注意
|
|
415
|
+
- 自审不通过不要进入下一步
|
|
416
|
+
- 不确定的问题标注「⚠️ 自审存疑」`,
|
|
417
|
+
outputHint: 'design.md 文件路径 + 自审结果',
|
|
418
|
+
optional: false
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
name: 'Design Grill 交叉审查',
|
|
422
|
+
conditionalWait: true,
|
|
423
|
+
waitReason: '等待用户处理 Design Grill 发现的结构性问题',
|
|
424
|
+
waitOptions: ['按推荐修正', '补充回答', '显式跳过'],
|
|
425
|
+
prompt: `默认执行 Design Grill,对已经写出的 design.md 做交叉审查。
|
|
426
|
+
|
|
427
|
+
### 定位
|
|
428
|
+
这是设计完成后的质量门,不是需求探索。目标不是继续发散,而是找出 design.md 内部、四件套之间、文档与外部约束之间的结构性矛盾。
|
|
429
|
+
|
|
430
|
+
### 默认行为
|
|
431
|
+
1. 默认必须执行一次交叉审查;不要让用户凭主观判断决定"要不要 Grill"。
|
|
432
|
+
2. 只有以下情况可以轻量跳过,并必须记录原因:
|
|
433
|
+
- 用户明确要求 no-grill / 显式跳过
|
|
434
|
+
- 文档是一页以内、单模块、无状态流转、无 schema/API/兼容策略变更
|
|
435
|
+
- plan_level 明确为 none,且只改 1-2 个文件
|
|
436
|
+
3. 即使跳过,也要输出"Design Grill skipped"和原因,不能静默跳过。
|
|
437
|
+
|
|
438
|
+
### 输入材料
|
|
439
|
+
1. 必须读取完整 \`.sillyspec/changes/<change-name>/design.md\`
|
|
440
|
+
2. 读取 proposal.md、requirements.md、tasks.md、decisions.md(如存在)
|
|
441
|
+
3. 读取 scan/module docs:
|
|
442
|
+
- \`.sillyspec/docs/<project>/scan/ARCHITECTURE.md\`
|
|
443
|
+
- \`.sillyspec/docs/<project>/scan/CONVENTIONS.md\`
|
|
444
|
+
- \`.sillyspec/docs/<project>/modules/_module-map.yaml\`
|
|
445
|
+
- 命中的模块文档
|
|
446
|
+
4. 按 design.md 文件变更清单读取相关源码、测试、配置、schema 或样例数据;矛盾经常藏在设计与外部约束交叉处,素材宁可多读,不要只读摘要。
|
|
447
|
+
|
|
448
|
+
### 交叉审查模型
|
|
449
|
+
按三层检查并输出 cross-check matrix:
|
|
450
|
+
1. **定义层**:模糊概念是否有可测试定义。例如"高可用""异常数据""本地缓存""重试"。
|
|
451
|
+
2. **一致性层**:跨章节/跨产物是否打架。例如数据流 vs 容错策略、schema vs 输入格式、非目标 vs tasks。
|
|
452
|
+
3. **可行性层**:关键假设是否有来源。例如 P99 延迟、上游 SLA、缓存 TTL、数据量、权限模型、兼容旧配置。
|
|
453
|
+
|
|
454
|
+
### 交叉点抽取
|
|
455
|
+
重点找这些交叉点:
|
|
456
|
+
- 模块 A 依赖模块 B 的实体/状态/接口
|
|
457
|
+
- requirements.md 的 FR 与 design.md 的数据模型/API/状态机
|
|
458
|
+
- design.md 的容错策略与数据流、缓存、重试、回滚
|
|
459
|
+
- tasks.md 的执行范围与 design.md 的非目标
|
|
460
|
+
- decisions.md 的 D-xxx@vN 与 design.md 当前说法
|
|
461
|
+
- scan/module docs 或源码中的真实约束与 design.md 假设
|
|
462
|
+
|
|
463
|
+
### 问答处理
|
|
464
|
+
1. 先自动交叉审查,不要一上来问用户。
|
|
465
|
+
2. 没有结构性问题:正常完成,输出"Design Grill passed",附 cross-check matrix。
|
|
466
|
+
3. 发现问题:
|
|
467
|
+
- 对能从代码/文档确定的问题,直接给出推荐修正。
|
|
468
|
+
- 对需要业务判断的问题,每次只问一个最关键问题,然后等待用户。
|
|
469
|
+
- P0/P1 未决项必须进入 Unresolved Blockers,不能带着进入 plan。
|
|
470
|
+
4. 用户回答后,更新 design.md 和 decisions.md;如果推翻旧决策,新增版本 D-xxx@v2,而不是覆盖 D-xxx@v1。
|
|
471
|
+
|
|
472
|
+
### decisions.md 版本规则
|
|
473
|
+
\`\`\`markdown
|
|
474
|
+
## D-001@v2: 缓存异常时的 fallback 语义
|
|
475
|
+
- type: definition | consistency | feasibility | boundary | architecture | compatibility | risk
|
|
476
|
+
- priority: P0 | P1 | P2
|
|
477
|
+
- status: accepted | unresolved | rejected | superseded
|
|
478
|
+
- supersedes: D-001@v1
|
|
479
|
+
- source: design-grill
|
|
480
|
+
- question: §3 数据流与 §7 容错策略冲突时以哪个为准?
|
|
481
|
+
- answer: 采用 §7 的重试语义,缓存只作为只读 fallback。
|
|
482
|
+
- normalized_requirement: TTL 过期且上游仍异常时返回 stale 标记,不刷新缓存。
|
|
483
|
+
- impacts: [FR-02, task-03, verify-02]
|
|
484
|
+
- evidence: design.md §3/§7, src/cache/...
|
|
485
|
+
\`\`\`
|
|
486
|
+
|
|
487
|
+
### 输出格式
|
|
488
|
+
\`\`\`markdown
|
|
489
|
+
## Design Grill Result
|
|
490
|
+
status: passed | needs-user-input | blocked | skipped
|
|
491
|
+
|
|
492
|
+
## Cross-Check Matrix
|
|
493
|
+
| ID | 层级 | 交叉点 | 证据 A | 证据 B | 结论 | 决策 |
|
|
494
|
+
|---|---|---|---|---|---|---|
|
|
495
|
+
| X-001 | consistency | 数据流 vs 容错 | design §3 | design §7 | conflict | D-001@v2 |
|
|
496
|
+
|
|
497
|
+
## Question Distribution
|
|
498
|
+
| 分类 | 数量 | 含义 |
|
|
499
|
+
|---|---|---|
|
|
500
|
+
| immediately_answered | N | 心里清楚但文档缺失 |
|
|
501
|
+
| needs_thinking | N | 需要用户判断 |
|
|
502
|
+
| unresolved | N | 真正设计漏洞 |
|
|
503
|
+
|
|
504
|
+
## Unresolved Blockers
|
|
505
|
+
| ID | priority | 问题 | 阻塞原因 | 下一步 |
|
|
506
|
+
|---|---|---|---|---|
|
|
507
|
+
\`\`\`
|
|
508
|
+
|
|
509
|
+
### 铁律 — 等待用户
|
|
510
|
+
- 发现 P0/P1 结构性矛盾且需要用户判断时,调用:
|
|
511
|
+
\`sillyspec run brainstorm --wait --reason "等待用户处理 Design Grill 发现的结构性问题" --options "按推荐修正,补充回答,显式跳过" --output "Design Grill 问题摘要"\`
|
|
512
|
+
- 用户显式跳过时,必须在 decisions.md 记录 accepted risk;P0/P1 skip 仍必须写入 Unresolved Blockers。
|
|
513
|
+
- 完成前必须确认:没有 P0/P1 unresolved blocker;否则不能进入 plan。`,
|
|
514
|
+
outputHint: 'Design Grill 交叉审查结果',
|
|
515
|
+
optional: false
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
name: '用户确认并生成规范文件',
|
|
519
|
+
requiresWait: true,
|
|
520
|
+
waitReason: '等待用户最终确认设计方案',
|
|
521
|
+
waitOptions: ['确认', '需要修改', '推翻重来'],
|
|
522
|
+
prompt: `用户确认设计方案,生成规范文件。
|
|
523
|
+
|
|
524
|
+
### 操作
|
|
525
|
+
1. 展示 design.md 摘要给用户
|
|
526
|
+
2. 暂停等待用户选择:✅ 确认 / ✏️ 修改 / ❌ 推翻重来
|
|
527
|
+
3. 确认后,在 \`.sillyspec/changes/<change-name>/\` 下生成所有规范文件:
|
|
528
|
+
- **design.md**:架构决策、文件变更清单、数据模型、API 设计、兼容策略、风险登记、自审
|
|
529
|
+
- **decisions.md**(可选):Grill/重大决策台账,使用 D-001@v1 稳定版本 ID
|
|
530
|
+
- **proposal.md**:动机、关键问题(为什么现有方案不够)、变更范围、不在范围内(显式清单)、成功标准(可验证条件)
|
|
531
|
+
- **requirements.md**:角色表 + FR 编号需求 + Given/When/Then 行为规格 + 非功能需求 + D-xxx@vN 覆盖关系
|
|
532
|
+
- **tasks.md**:任务列表(只列名称、对应文件路径、覆盖的 FR-xxx/D-xxx@vN,细节在 plan 阶段展开)
|
|
533
|
+
- \`git add .sillyspec/\` — 暂存规范文件(不要 commit)
|
|
534
|
+
|
|
535
|
+
所有规范文件头部必须包含 YAML frontmatter:
|
|
536
|
+
\`\`\`\`yaml
|
|
537
|
+
---
|
|
538
|
+
author: <git-user>
|
|
539
|
+
created_at: <now-datetime>
|
|
540
|
+
---
|
|
541
|
+
\`\`\`\`
|
|
542
|
+
|
|
543
|
+
### proposal.md 格式要求
|
|
544
|
+
\`\`\`markdown
|
|
545
|
+
# Proposal
|
|
546
|
+
|
|
547
|
+
## 动机
|
|
548
|
+
为什么做、解决什么核心问题
|
|
549
|
+
|
|
550
|
+
## 关键问题
|
|
551
|
+
为什么现有方案不够(展开 2-3 个具体痛点)
|
|
552
|
+
|
|
553
|
+
## 变更范围
|
|
554
|
+
本次做什么
|
|
555
|
+
|
|
556
|
+
## 不在范围内(显式清单)
|
|
557
|
+
- 不做 X
|
|
558
|
+
- 不做 Y
|
|
559
|
+
|
|
560
|
+
## 成功标准(可验证)
|
|
561
|
+
- 旧配置默认行为不变
|
|
562
|
+
- 新功能在配置后可用
|
|
563
|
+
- ...
|
|
564
|
+
\`\`\`
|
|
565
|
+
|
|
566
|
+
### requirements.md 格式要求
|
|
567
|
+
\`\`\`markdown
|
|
568
|
+
# Requirements
|
|
569
|
+
|
|
570
|
+
## 角色
|
|
571
|
+
| 角色 | 说明 |
|
|
572
|
+
|---|---|
|
|
573
|
+
| 开发者 | ... |
|
|
574
|
+
|
|
575
|
+
## 功能需求
|
|
576
|
+
|
|
577
|
+
### FR-01: 需求名称
|
|
578
|
+
覆盖决策:D-001@v1, D-002@v1(如适用)
|
|
579
|
+
Given 前提条件
|
|
580
|
+
When 触发动作
|
|
581
|
+
Then 期望结果
|
|
582
|
+
|
|
583
|
+
(每个边界条件独立 GWT 块)
|
|
584
|
+
|
|
585
|
+
## 非功能需求
|
|
586
|
+
- 兼容性:...
|
|
587
|
+
- 可回退:...
|
|
588
|
+
- 可测试:...
|
|
589
|
+
|
|
590
|
+
## 决策覆盖矩阵(如存在 decisions.md)
|
|
591
|
+
| 决策 ID | 覆盖的 FR | 说明 |
|
|
592
|
+
|---|---|---|
|
|
593
|
+
| D-001@v1 | FR-01 | ... |
|
|
594
|
+
\`\`\`
|
|
595
|
+
|
|
596
|
+
### decisions.md 格式要求(仅在有 Grill/重大决策时生成)
|
|
597
|
+
\`\`\`markdown
|
|
598
|
+
# Decisions
|
|
599
|
+
|
|
600
|
+
## D-001@v1: 决策短标题
|
|
601
|
+
- type: definition | consistency | feasibility | term | boundary | premise | architecture | compatibility | risk
|
|
602
|
+
- priority: P0 | P1 | P2
|
|
603
|
+
- status: accepted | unresolved | rejected | superseded
|
|
604
|
+
- supersedes:
|
|
605
|
+
- source: user | code | docs
|
|
606
|
+
- question: 被解决的问题
|
|
607
|
+
- answer: 用户确认或代码查证结果
|
|
608
|
+
- normalized_requirement: 可测试的约束
|
|
609
|
+
- impacts: [FR-01, task-01, verify-01]
|
|
610
|
+
- evidence: 用户回答轮次或代码/文档路径
|
|
611
|
+
\`\`\`
|
|
612
|
+
|
|
613
|
+
### 后续变更包处理
|
|
614
|
+
如果 MASTER.md 中规划了后续变更包(拆分后的子阶段),**必须同时为每个后续包创建独立变更目录**:
|
|
615
|
+
1. 读取 MASTER.md 中的变更包列表(包名 + 边界描述)
|
|
616
|
+
2. 为每个后续包创建目录:\`mkdir -p .sillyspec/changes/<后续包名>\`
|
|
617
|
+
3. 每个目录生成骨架文件:
|
|
618
|
+
- \`proposal.md\`:从 MASTER.md 中提取该包的动机和边界
|
|
619
|
+
- \`design.md\`:从 MASTER.md 中提取该包的职责描述(标记为「待设计 - 本包 design 在该包进入 brainstorm 时完善」)
|
|
620
|
+
- \`requirements.md\`:从 MASTER.md 中提取该包的需求范围(标记为「待完善」)
|
|
621
|
+
- \`tasks.md\`:创建空任务列表,标记为「待 plan 阶段展开」
|
|
622
|
+
4. \`git add .sillyspec/\` — 暂存所有新增文件(不要 commit)
|
|
623
|
+
5. 后续变更包的骨架文件同样必须包含 \`author: <git-user>\` 和 \`created_at: <now-datetime>\`
|
|
624
|
+
|
|
625
|
+
### 铁律 — 必须等待用户最终确认
|
|
626
|
+
- **展示 design.md 摘要后,暂停等待用户确认。** 不要替用户确认。
|
|
627
|
+
- 调用:\`sillyspec run brainstorm --wait --reason "等待用户确认设计方案" --options "确认,需要修改,推翻重来" --output "design.md 摘要"\`
|
|
628
|
+
- **绝对禁止**:在输出中自己说"用户已确认"然后生成文件
|
|
629
|
+
- **只有用户通过 --continue --answer "确认" 后才生成规范文件**
|
|
630
|
+
|
|
631
|
+
### 输出
|
|
632
|
+
所有规范文件路径(含后续变更包目录列表)
|
|
633
|
+
|
|
634
|
+
### 注意
|
|
635
|
+
- 禁止在确认前推进到后续阶段
|
|
636
|
+
- 禁止自动 commit
|
|
637
|
+
- 推翻重来回到 Step 6(对话式探索)
|
|
638
|
+
- 表名/字段名/类名必须来自真实代码或标注"新增"
|
|
639
|
+
- 如果存在 decisions.md,requirements.md 必须引用全部当前版本 D-xxx@vN;没有覆盖的 D-xxx@vN 必须标注为剩余风险
|
|
640
|
+
- 如果 Design Grill 产生 P0/P1 unresolved blocker,必须回到 design 修正,不能进入 plan
|
|
641
|
+
- tasks.md 只列任务名,细节在 plan 阶段展开`,
|
|
642
|
+
|
|
643
|
+
}
|
|
644
|
+
]
|
|
645
|
+
}
|