@namewta/speculo 0.6.0 → 0.7.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 +11 -11
- package/dist/src/cli.js +36 -128
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.d.ts +2 -4
- package/dist/src/index.js +173 -151
- package/dist/src/index.js.map +1 -1
- package/package.json +6 -4
- package/template/.speculo/README.md +4 -0
- package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +133 -141
- package/template/canonical/canonical-specdev-goal-plan.md +394 -377
- package/template/canonical/canonical-specdev-grill-with-docs.md +241 -178
- package/template/canonical/canonical-specdev-spec.md +132 -122
- package/template/canonical/canonical-specdev-tickets.md +176 -156
- package/template/canonical/canonical-specdev-wayfinder.md +106 -108
- package/template/commands/archive-and-consolidate.md +10 -8
- package/template/commands/handoff.md +2 -0
- package/template/commands/retro.md +3 -3
- package/template/commands/status.md +5 -4
- package/template/skills/archive-and-consolidate/SKILL.md +5 -9
- package/template/skills/archive-and-consolidate/assets/archive-plan-template.md +1 -1
- package/template/skills/archive-and-consolidate/references/archive-rules.md +4 -4
- package/template/skills/archive-and-consolidate/references/consolidation-rules.md +7 -8
- package/template/skills/archive-and-consolidate/references/knowledge-graduation.md +5 -2
- package/template/skills/github-npm-ops/SKILL.md +4 -2
- package/template/skills/github-npm-ops/references/issue-transport.md +26 -0
- package/template/skills/github-npm-ops/references/preflight-checklist.md +1 -1
- package/template/skills/github-npm-ops/scripts/issue-transport.mjs +227 -0
- package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +31 -145
- package/template/workflows/specdev/A-archive-and-consolidate/consolidation-interview.md +4 -6
- package/template/workflows/specdev/C-code-review/C-code-review.md +42 -0
- package/template/workflows/specdev/C-code-review/code-review-template.md +42 -0
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +45 -48
- package/template/workflows/specdev/D-diagnose-bugs/diagnosis-template.md +44 -40
- package/template/workflows/specdev/D-diagnose-bugs/feedback-loop.md +41 -0
- package/template/workflows/specdev/D-diagnose-bugs/hypothesis-and-instrumentation.md +32 -0
- package/template/workflows/specdev/D-diagnose-bugs/scripts/hitl-loop.template.sh +26 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/E-engineering-cognitive-mentor.md +3 -3
- package/template/workflows/specdev/E-engineering-cognitive-mentor/persistence-and-resume.md +5 -20
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +17 -10
- package/template/workflows/specdev/G-grill-with-docs/adr-format.md +31 -17
- package/template/workflows/specdev/G-grill-with-docs/context-format.md +9 -29
- package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +10 -5
- package/template/workflows/specdev/G-grill-with-docs/stakeholder-questionnaire.md +45 -0
- package/template/workflows/specdev/I-implement/I-implement.md +29 -14
- package/template/workflows/specdev/I-implement/delegated-evidence-template.md +11 -0
- package/template/workflows/specdev/I-implement/evidence-template.md +24 -10
- package/template/workflows/specdev/I-implement/execution-preflight.md +4 -4
- package/template/workflows/specdev/I-implement/merge-conflict-protocol.md +20 -0
- package/template/workflows/specdev/I-implement/tdd-mocking.md +19 -0
- package/template/workflows/specdev/I-implement/tdd-rules.md +14 -12
- package/template/workflows/specdev/I-implement/tdd-test-design.md +25 -0
- package/template/workflows/specdev/I-init-setup/I-init-setup.md +12 -9
- package/template/workflows/specdev/I-init-setup/config-template.json +1 -1
- package/template/workflows/specdev/I-init-setup/domain-layout-template.md +2 -2
- package/template/workflows/specdev/I-init-setup/status-template.json +2 -3
- package/template/workflows/specdev/I-init-setup/tracking-template.md +3 -0
- package/template/workflows/specdev/INDEX.md +64 -26
- package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +48 -38
- package/template/workflows/specdev/P-goal-plan/completion-control.md +19 -53
- package/template/workflows/specdev/P-goal-plan/delegated-execution-template.md +33 -0
- package/template/workflows/specdev/P-goal-plan/delegated-execution.md +53 -0
- package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +9 -40
- package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +16 -68
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +20 -48
- package/template/workflows/specdev/P-prototype/P-prototype.md +46 -0
- package/template/workflows/specdev/P-prototype/logic-prototype.md +24 -0
- package/template/workflows/specdev/P-prototype/prototype-record-template.md +46 -0
- package/template/workflows/specdev/P-prototype/ui-prototype.md +21 -0
- package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +1 -1
- package/template/workflows/specdev/S-spec/S-spec.md +2 -1
- package/template/workflows/specdev/T-tickets/T-tickets.md +3 -2
- package/template/workflows/specdev/T-tickets/ticket-readiness.md +1 -1
- package/template/workflows/specdev/T-tickets/ticket-template.md +1 -1
- package/template/workflows/specdev/T-tickets/tickets-map-template.md +1 -1
- package/template/workflows/specdev/T-triage/T-triage.md +65 -26
- package/template/workflows/specdev/T-triage/intake-protocol.md +32 -0
- package/template/workflows/specdev/T-triage/reconcile-protocol.md +34 -0
- package/template/workflows/specdev/T-triage/source-template.md +30 -0
- package/template/workflows/specdev/T-triage/triage-template.md +38 -24
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +3 -1
- package/template/workflows/specdev/_state/status.json +2 -3
- package/template/workflows/specdev/common/README.md +9 -2
- package/template/workflows/specdev/common/rules/artifact-contract.md +20 -9
- package/template/workflows/specdev/common/rules/change-completion.md +33 -0
- package/template/workflows/specdev/common/rules/deviation-control.md +2 -2
- package/template/workflows/specdev/common/rules/evidence-and-verification.md +1 -1
- package/template/workflows/specdev/common/rules/path-ownership.md +3 -3
- package/template/workflows/specdev/common/schemas/change-status.schema.json +43 -0
- package/template/workflows/specdev/common/schemas/code-review.schema.json +22 -0
- package/template/workflows/specdev/common/schemas/diagnosis.schema.json +19 -0
- package/template/workflows/specdev/common/schemas/prototype-record.schema.json +24 -0
- package/template/workflows/specdev/common/schemas/source.schema.json +20 -0
- package/template/workflows/specdev/common/schemas/status.schema.json +20 -78
- package/template/workflows/specdev/common/schemas/triage.schema.json +21 -0
- package/template/workflows/specdev/common/skills/code-review/SKILL.md +49 -0
- package/template/workflows/specdev/common/skills/code-review/references/fowler-smells.md +18 -0
- package/template/workflows/specdev/common/skills/code-review/references/reviewer-contracts.md +13 -0
- package/template/workflows/specdev/common/skills/code-review/references/source-discovery.md +22 -0
- package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +12 -9
- package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +18 -13
- package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +8 -6
- package/template/workflows/specdev/common/skills/research/SKILL.md +38 -26
- package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +3 -5
- package/template/workflows/specdev/common/tools/README.md +3 -0
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +496 -30
- package/dist/src/migrate.d.ts +0 -38
- package/dist/src/migrate.js +0 -642
- package/dist/src/migrate.js.map +0 -1
- package/dist/src/skills-mirror.d.ts +0 -38
- package/dist/src/skills-mirror.js +0 -160
- package/dist/src/skills-mirror.js.map +0 -1
- package/template/workflows/specdev/A-archive-and-consolidate/archive-checklist.md +0 -15
- package/template/workflows/specdev/A-archive-and-consolidate/knowledge-promotion-rules.md +0 -32
- package/template/workflows/specdev/I-implement/code-review-process.md +0 -17
- package/template/workflows/specdev/I-implement/tdd-examples.md +0 -14
- package/template/workflows/specdev/I-init-setup/status-labels-template.md +0 -55
|
@@ -17,16 +17,16 @@
|
|
|
17
17
|
|
|
18
18
|
按**轮次**推进这棵树。**前沿(frontier)** 是所有前置条件已经确定的决策——那些现在就能问、不必猜测尚未得到答案的问题。每轮询问完整 frontier;用户的答案会重塑设计树并解除下一层问题的阻塞。
|
|
19
19
|
|
|
20
|
-
本 work
|
|
20
|
+
本 work 只把访谈写成当前 change 的可恢复工件:设计树保存进度,LOG 保存讨论轨迹,CONTEXT 保存本 change 已确认的规范语言,ADR 保存已成为本 change 下游合同的架构决定。这些工件不等于项目永久知识,也不构成实现授权;永久 namespace 对 G 只读,只有 “归档与沉淀阶段” 能在实现证据、毕业评估和用户确认通过后执行提升。
|
|
21
21
|
|
|
22
22
|
## 输入与产物
|
|
23
23
|
|
|
24
24
|
按存在情况读取:
|
|
25
25
|
|
|
26
26
|
- `specdev/config.json`
|
|
27
|
-
- `specdev/adr
|
|
28
|
-
- `specdev/context
|
|
29
|
-
- `specdev/changes/{change}/source
|
|
27
|
+
- `specdev/adr/`(只读永久基线)
|
|
28
|
+
- `specdev/context/`(只读永久基线)
|
|
29
|
+
- `specdev/changes/{change}/source.md`
|
|
30
30
|
- `specdev/changes/{change}/triage.md`
|
|
31
31
|
- `specdev/changes/{change}/diagnosis.md`
|
|
32
32
|
- `specdev/changes/{change}/spec.md`
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
- `specdev/changes/{change}/LOG.md`
|
|
40
40
|
- `specdev/changes/{change}/CONTEXT.md`
|
|
41
41
|
- `specdev/changes/{change}/ADR.md`
|
|
42
|
+
- `specdev/changes/{change}/questionnaires/`,仅在第三方 stakeholder 持有阻塞答案时延迟创建。
|
|
42
43
|
|
|
43
44
|
不存在的可选输入静默跳过,不把缺失文件伪装成已知事实。
|
|
44
45
|
|
|
@@ -71,6 +72,8 @@
|
|
|
71
72
|
- 高影响决策:进入设计树;
|
|
72
73
|
- 低影响实现细节:记录为实现者可自行决定,不制造决策节点。
|
|
73
74
|
|
|
75
|
+
阻塞答案既不可发现、当前用户也无法回答、但另一个明确 stakeholder 掌握时,加载 下方 `<stakeholder-questionnaire>` 标签,生成问卷并保存恢复条件;不在本轮继续猜测该分支。
|
|
76
|
+
|
|
74
77
|
**完成标准**:每个候选问题已分类;用户只接收无法从环境发现的真实决策。
|
|
75
78
|
|
|
76
79
|
### 3. 建立设计树
|
|
@@ -96,18 +99,20 @@
|
|
|
96
99
|
|
|
97
100
|
**完成标准**:本轮开始时的完整 frontier 每个节点都有回答、明确延后或阻塞记录;所有状态已原子写入并重读。
|
|
98
101
|
|
|
99
|
-
### 5.
|
|
102
|
+
### 5. 同步 change-local 领域模型
|
|
100
103
|
|
|
101
|
-
加载 下方 `<domain-modeling-rules>` 标签。每轮先写 LOG
|
|
104
|
+
加载 下方 `<domain-modeling-rules>` 标签。每轮先写 LOG,再把已确认且本 change 下游必须使用的项目规范术语同步到 change CONTEXT,最后把同时满足三个准入条件、已成为本 change 合同的架构决定写入 change ADR。
|
|
102
105
|
|
|
103
|
-
历史轨迹只留在 LOG;未确认选项不写成已接受 ADR;已有 ADR 被替代时建立 supersedes
|
|
106
|
+
历史轨迹只留在 LOG;未确认选项不写成已接受 ADR;已有 change ADR 被替代时建立 supersedes 链。同步只更新本 change 工件,不创建、合并或改写永久 `context/`、`adr/`;它记录共识生长过程,不授权产品实现。
|
|
104
107
|
|
|
105
|
-
**完成标准**:LOG、CONTEXT、ADR 和 design tree
|
|
108
|
+
**完成标准**:LOG、CONTEXT、ADR 和 design tree 无冲突;每个同步结论都有用户回答或事实来源;永久 namespace 未被修改。
|
|
106
109
|
|
|
107
110
|
### 6. 共识确认与路由
|
|
108
111
|
|
|
109
112
|
frontier 为空时,向用户确认设计树的每个分支均已走过且已经达成共识。用户指出遗漏时新增节点并继续;只有明确确认后把 design tree 标为 `consensus`。
|
|
110
113
|
|
|
114
|
+
路由前使用 Speculo Node 校验器 的 `--stage grill` 校验当前 change;失败时保持本 Work 可恢复状态,不发布共识。
|
|
115
|
+
|
|
111
116
|
随后按成熟度路由:
|
|
112
117
|
|
|
113
118
|
- 通常进入 “编写 Spec 阶段”;
|
|
@@ -123,7 +128,8 @@ frontier 为空时,向用户确认设计树的每个分支均已走过且已
|
|
|
123
128
|
- 每轮询问的是完整 frontier,依赖未关闭的问题没有提前出现;
|
|
124
129
|
- 可发现事实由 Agent 查找,没有转交用户;
|
|
125
130
|
- design tree 通过 schema,LOG 指针完整;
|
|
126
|
-
- CONTEXT
|
|
131
|
+
- CONTEXT 只包含当前 change 已确认的规范语言,ADR 只包含满足条件且已成为本 change 合同的架构决定;
|
|
132
|
+
- 永久 `context/`、`adr/` 保持只读,未在 G 中执行知识提升;
|
|
127
133
|
- frontier 为空且用户明确确认共识;
|
|
128
134
|
- 状态、权威工件和下一 work 路径已返回;
|
|
129
135
|
- 未执行产品实现。
|
|
@@ -136,6 +142,7 @@ frontier 为空时,向用户确认设计树的每个分支均已走过且已
|
|
|
136
142
|
- ADR 格式:下方 `<adr-format>` 标签
|
|
137
143
|
- CONTEXT 格式:下方 `<context-format>` 标签
|
|
138
144
|
- LOG 格式:下方 `<log-format>` 标签
|
|
145
|
+
- Stakeholder 问卷:下方 `<stakeholder-questionnaire>` 标签
|
|
139
146
|
|
|
140
147
|
---
|
|
141
148
|
|
|
@@ -193,11 +200,16 @@ frontier 为空时,向用户确认设计树的每个分支均已走过且已
|
|
|
193
200
|
|
|
194
201
|
# 领域建模规则
|
|
195
202
|
|
|
196
|
-
-
|
|
197
|
-
|
|
198
|
-
-
|
|
199
|
-
-
|
|
200
|
-
-
|
|
203
|
+
本规则只规范当前 change 内的候选领域知识。G 和 A 的 consolidate-from-code 模式都可以用它整理 change 工件,但它不授权写入永久 namespace;永久知识只能由 “归档与沉淀阶段” 在完成证据、毕业评估和用户确认全部通过后提升。
|
|
204
|
+
|
|
205
|
+
- 当前 change 的 CONTEXT 只保存已确认、供本 change 下游使用的项目规范语言,不保存普通编程概念、代码导航、一次性状态或讨论历史。
|
|
206
|
+
- 每个术语使用规范名称和 1–2 句定义;不推荐的同义词写入 `_Avoid_`。
|
|
207
|
+
- 一词多义必须拆分;多个 bounded context 使用独立 Context Map 描述关系,不把关系塞进术语定义。
|
|
208
|
+
- 讨论、替代和历史只留在 LOG;稳定行为进入 Spec;符合准入条件的取舍写入当前 change 的 ADR,`accepted` 只表示已成为本 change 的下游合同。
|
|
209
|
+
- 当前代码位置按需从仓库发现。只有发现成本被证明很高时,另建有 owner 和刷新策略的缓存工件,CONTEXT 不承担该职责。
|
|
210
|
+
- G 只读永久 `specdev/context/` 与 `specdev/adr/`,用于发现冲突和避免重复;不得创建、合并或改写其中内容。
|
|
211
|
+
|
|
212
|
+
完成标准:每个 change CONTEXT 条目都是本 change 下游必须使用的项目规范语言;每个 change ADR 都有明确来源和当前 change 的适用范围;没有把候选结论写成永久知识。
|
|
201
213
|
|
|
202
214
|
</domain-modeling-rules>
|
|
203
215
|
|
|
@@ -205,28 +217,42 @@ frontier 为空时,向用户确认设计树的每个分支均已走过且已
|
|
|
205
217
|
|
|
206
218
|
# ADR 格式
|
|
207
219
|
|
|
208
|
-
|
|
220
|
+
本格式用于 `specdev/changes/{change}/ADR.md`。这里的 ADR 是当前 change 的架构决定合同,不是已经提升到永久 `specdev/adr/` 的项目 ADR。
|
|
221
|
+
|
|
222
|
+
只有一个决定同时满足以下三个条件才写 ADR:
|
|
223
|
+
|
|
224
|
+
1. 难以逆转;
|
|
225
|
+
2. 没有上下文会令后续维护者惊讶;
|
|
226
|
+
3. 来自真实可行方案之间的权衡。
|
|
227
|
+
|
|
228
|
+
局部、可逆或没有实质替代方案的选择留在 Ticket/代码。一个 ADR 只表达一个决定。
|
|
209
229
|
|
|
210
230
|
```markdown
|
|
211
231
|
## ADR-###: <标题>
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
232
|
+
|
|
233
|
+
**Status:** proposed / accepted / superseded / deprecated
|
|
234
|
+
**Source:** LOG-### / user decision / external specification
|
|
235
|
+
**Supersedes:** none / ADR-###
|
|
236
|
+
|
|
237
|
+
### Context
|
|
238
|
+
<缺少什么背景会让这个决定令人惊讶。>
|
|
239
|
+
|
|
240
|
+
### Decision
|
|
241
|
+
<清晰、规范且可验证的结论。>
|
|
242
|
+
|
|
243
|
+
### Trade-off
|
|
244
|
+
<认真考虑的替代方案,以及为什么接受当前代价。>
|
|
245
|
+
|
|
246
|
+
### Consequences
|
|
247
|
+
<真正重要的正面、负面和风险。>
|
|
248
|
+
|
|
249
|
+
### Verification / Migration
|
|
250
|
+
<仅在适用时出现。>
|
|
227
251
|
```
|
|
228
252
|
|
|
229
|
-
|
|
253
|
+
`accepted` 只表示用户已接受该决定作为当前 change 的下游合同;它不证明实现已经落地,也不代表永久知识毕业。修改已接受决定时新建 change ADR 并建立 supersedes 链,不重写历史。
|
|
254
|
+
|
|
255
|
+
只有 A 在 change 完成后对照代码、测试和 Evidence 重新验证,并通过毕业评估与用户确认,才能把决定写为永久 ADR;不通过的决定随归档 change 保留。
|
|
230
256
|
|
|
231
257
|
</adr-format>
|
|
232
258
|
|
|
@@ -234,41 +260,21 @@ frontier 为空时,向用户确认设计树的每个分支均已走过且已
|
|
|
234
260
|
|
|
235
261
|
# CONTEXT 格式
|
|
236
262
|
|
|
237
|
-
CONTEXT
|
|
263
|
+
本格式用于 `specdev/changes/{change}/CONTEXT.md`。它是当前 change 已确认、供本 change 下游使用的项目规范语言表,不是 workflow 级永久领域知识。每个文件只描述一个 bounded context;多个 context 的关系写入单独 Context Map。
|
|
238
264
|
|
|
239
265
|
```markdown
|
|
240
|
-
#
|
|
241
|
-
|
|
242
|
-
- **Owner:**
|
|
243
|
-
- **最后核验:**
|
|
244
|
-
- **权威来源:** ADR / 代码 / 外部规范 / 用户确认
|
|
245
|
-
|
|
246
|
-
## 术语
|
|
247
|
-
### <规范术语>
|
|
248
|
-
- 定义:
|
|
249
|
-
- 边界:
|
|
250
|
-
- 示例:
|
|
251
|
-
- 反例:
|
|
252
|
-
- 不变量:
|
|
253
|
-
- 代码映射:src/example.ts / 无
|
|
254
|
-
- 别名与禁用词:
|
|
255
|
-
- 来源与最后核验:
|
|
266
|
+
# <Bounded Context>
|
|
256
267
|
|
|
257
|
-
|
|
258
|
-
|
|
268
|
+
**<规范术语>**:<一到两句项目特有定义。>
|
|
269
|
+
_Avoid_: <会造成歧义或已废弃的同义词>
|
|
259
270
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
## 当前实现映射
|
|
264
|
-
- 领域概念与模块、接口、存储或事件之间的对应
|
|
271
|
+
**<另一个术语>**:<一到两句定义。>
|
|
272
|
+
_Avoid_: none
|
|
273
|
+
```
|
|
265
274
|
|
|
266
|
-
|
|
267
|
-
- 已知偏离、历史负担和待验证假设;不得伪装成已确认事实
|
|
275
|
+
不包含 owner、最后核验、代码路径、实现差距、change 历史、示例大表、普通编程概念或临时假设。来源和演进历史由 LOG/ADR/Spec 保存。
|
|
268
276
|
|
|
269
|
-
|
|
270
|
-
- LOG-###:增加、修订或废弃了什么
|
|
271
|
-
```
|
|
277
|
+
G 不把该文件复制或合并到永久 `specdev/context/`。只有 A 在 change 完成后验证实现证据、应用毕业标准并获得用户确认,才生成或更新永久术语文件;未毕业内容随归档 change 保留。
|
|
272
278
|
|
|
273
279
|
</context-format>
|
|
274
280
|
|
|
@@ -297,6 +303,56 @@ LOG 追加为主;结论变化时新增条目并引用旧编号,不删除历
|
|
|
297
303
|
|
|
298
304
|
</log-format>
|
|
299
305
|
|
|
306
|
+
<stakeholder-questionnaire>
|
|
307
|
+
|
|
308
|
+
# Stakeholder Questionnaire
|
|
309
|
+
|
|
310
|
+
只有阻塞决定无法从仓库/外部事实发现、当前用户无法回答、且另一个明确 stakeholder 掌握答案时加载。问卷是输入收集工具,不是决策权威。
|
|
311
|
+
|
|
312
|
+
## 流程
|
|
313
|
+
|
|
314
|
+
1. 只询问当前用户“发给谁”和“需要对方回什么”:接收者角色/背景/关系,以及用户必须据此行动的具体事实或决定。
|
|
315
|
+
2. 写入 `specdev/changes/{change}/questionnaires/{slug}.md`。问题按重要性排序,每个问题只表达一个差距;超过合理数量时按主题分组。
|
|
316
|
+
3. 把 change 置为 blocked,记录接收者、发送 owner、恢复条件和问卷 Path。Spec/Ticket 不得在答案回来前伪装成 Ready。
|
|
317
|
+
4. 回收答案后逐项验证覆盖情况,把事实和决定分别写入 LOG/design-tree 节点;问卷本身保留原始回答,不直接成为 ADR/Spec 权威。
|
|
318
|
+
5. 未回答项继续 blocked;已解决项不重复询问。
|
|
319
|
+
|
|
320
|
+
## 模板
|
|
321
|
+
|
|
322
|
+
```markdown
|
|
323
|
+
# <问卷标题>
|
|
324
|
+
|
|
325
|
+
**目的:** <承载的决定>
|
|
326
|
+
**来自:** <用户> — **送达:** <接收者>
|
|
327
|
+
**回答将用于:** <Spec/ADR/design-tree 路径>
|
|
328
|
+
|
|
329
|
+
## 背景
|
|
330
|
+
<足以给出可靠回答的一段上下文>
|
|
331
|
+
|
|
332
|
+
## 如何回答
|
|
333
|
+
<截止时间、投入量;允许部分回答和“不知道”>
|
|
334
|
+
|
|
335
|
+
## <主题>
|
|
336
|
+
|
|
337
|
+
### <一个事实或决定差距>
|
|
338
|
+
_为什么重要:<对行为/风险/范围的影响>_
|
|
339
|
+
|
|
340
|
+
>
|
|
341
|
+
|
|
342
|
+
## 还有别的吗?
|
|
343
|
+
<遗漏但接收者认为应知道的事项>
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
## 完成标准
|
|
347
|
+
|
|
348
|
+
- 用户要求的每个事实/决定恰有至少一个问题覆盖;
|
|
349
|
+
- 不询问仓库可发现事实;
|
|
350
|
+
- 问题不复合且按重要性排序;
|
|
351
|
+
- blocked/resume 条件可从本地工件恢复;
|
|
352
|
+
- 回答被转录到真正 owning 工件后才解除 blocker。
|
|
353
|
+
|
|
354
|
+
</stakeholder-questionnaire>
|
|
355
|
+
|
|
300
356
|
<artifact-contract>
|
|
301
357
|
|
|
302
358
|
# 工件职责与权威裁决
|
|
@@ -307,33 +363,44 @@ SpecDev 通过分层工件避免同一决策被多个模型反复重做。每个
|
|
|
307
363
|
|
|
308
364
|
| 工件 | 具体位置 | 必须决定 | 不应决定 |
|
|
309
365
|
|---|---|---|---|
|
|
310
|
-
|
|
|
366
|
+
| 来源快照 | `specdev/changes/{change}/source.md` | 原始请求、捕获时间、locator、hash 和关闭能力 | 当前产品合同或实现状态 |
|
|
367
|
+
| 分诊 | `specdev/changes/{change}/triage.md` | 请求类别、影响、风险、缺失输入、下一 work 和远程 reconcile 状态 | 详细实现方案或开发进度 |
|
|
311
368
|
| 诊断 | `specdev/changes/{change}/diagnosis.md` | 复现、证据、根因、修复不变量和回归契约 | 未经验证的修复实现 |
|
|
312
369
|
| 设计日志 | `specdev/changes/{change}/LOG.md` | 讨论轨迹、确认、延后、替代与废弃结论 | 当前架构权威摘要 |
|
|
313
370
|
| 设计树 | `specdev/changes/{change}/design-tree.json` | 决策节点、依赖、当前 frontier、轮次与共识状态 | 领域真相或架构决定正文 |
|
|
314
|
-
| 领域上下文 | `specdev/changes/{change}/CONTEXT.md` |
|
|
315
|
-
| 架构决策 | `specdev/changes/{change}/ADR.md` |
|
|
371
|
+
| Change 领域上下文 | `specdev/changes/{change}/CONTEXT.md` | 本 change 已确认、供下游使用的领域术语和语义 | 永久领域知识或临时会议记录 |
|
|
372
|
+
| Change 架构决策 | `specdev/changes/{change}/ADR.md` | 已成为本 change 下游合同的架构决策、原因、后果和替代关系 | 永久项目 ADR 或尚未决定的方案集合 |
|
|
316
373
|
| Spec | `specdev/changes/{change}/spec.md` | 用户问题、外部行为、范围、验收合同、非功能要求和已锁定实现约束 | 文件级施工步骤 |
|
|
317
374
|
| Ticket | `specdev/changes/{change}/ticket/NN-<ticket-name>.md` | 单一垂直切片的行为、决策、范围、路径所有权、执行路线和验证证据 | 跨 Ticket 里程碑治理 |
|
|
318
375
|
| Tickets Map | `specdev/changes/{change}/tickets-map.md` | 依赖 DAG、合同覆盖、Ready 投影、并行候选和路径冲突 | 单 Ticket 的完整实现契约 |
|
|
319
376
|
| Goal Plan | `specdev/changes/{change}/goal-plan.md` | 跨 Ticket 调度、Gate、共享所有权、迁移顺序、集成和偏差治理 | 复制 Ticket 全文 |
|
|
320
377
|
| Evidence | `specdev/changes/{change}/evidence/T-NN.md` | 实际修改、命令、结果、验收映射、偏差、风险和提交引用 | 新的产品或架构决策 |
|
|
378
|
+
| 代码审查 | `specdev/changes/{change}/reviews/CR-###.md` | 固定点、标准轴和规范轴 finding | 实施修复或合并两轴排名 |
|
|
379
|
+
| 原型记录 | `specdev/changes/{change}/prototypes/{prototype-id}/record.md` | 一个问题、分支、资产、答案、promotion 和清理 | 生产实现或多个问题的计划 |
|
|
380
|
+
| Stakeholder 问卷 | `specdev/changes/{change}/questionnaires/{slug}.md` | 第三方原始回答和恢复条件 | 未经转录确认的产品/架构决定 |
|
|
321
381
|
| Wayfinder 地图 | `specdev/changes/{change}/wayfinder-map.md` | 目的地、说明、已关闭决策索引、战争迷雾和范围之外 | 开放 Ticket 正文或答案详情 |
|
|
322
382
|
| Wayfinder Ticket | `specdev/changes/{change}/investigation/{investigation-id}.md` | 一个可精确陈述的问题、类型、阻塞和关闭状态 | 解决方案评论或交付目标 |
|
|
323
383
|
| Wayfinder solution comment | `specdev/changes/{change}/investigation/comments/{investigation-id}/NN-solution.md` | Ticket 的答案、结果事实和资产指针 | 地图索引或产品实现 |
|
|
324
384
|
| 架构审查 | `specdev/changes/{change}/architecture-review.md` 与 `specdev/changes/{change}/architecture-review.html` | 深化候选、证据、可视化、选择和访谈状态 | 未经用户选择的执行契约 |
|
|
325
385
|
|
|
386
|
+
Change CONTEXT/ADR 是 active change 内的执行权威,不是 workflow 级永久知识。G 和其他设计/执行 Works 只读 `specdev/context/` 与 `specdev/adr/`;只有 A 在 change 完成、实现证据验证、毕业评估和用户确认后才能写入永久 namespace。未毕业内容随归档 change 保留,不能从 change 工件消失。
|
|
387
|
+
|
|
326
388
|
## 2. 权威顺序
|
|
327
389
|
|
|
328
390
|
同一事项冲突时按下列顺序裁决:
|
|
329
391
|
|
|
330
392
|
1. 用户最新明确决定;
|
|
331
|
-
2.
|
|
332
|
-
3.
|
|
333
|
-
4.
|
|
334
|
-
5.
|
|
335
|
-
6.
|
|
336
|
-
7.
|
|
393
|
+
2. 当前 change 已接受的架构决策:`specdev/changes/{change}/ADR.md`;
|
|
394
|
+
3. 永久 ADR 与领域上下文:`specdev/adr/`、`specdev/context/`;
|
|
395
|
+
4. 当前外部行为权威:`specdev/changes/{change}/spec.md`;
|
|
396
|
+
5. 当前 Ticket 契约:`specdev/changes/{change}/ticket/NN-<ticket-name>.md`;
|
|
397
|
+
6. 当前跨 Ticket 编排:`specdev/changes/{change}/goal-plan.md`;
|
|
398
|
+
7. 当前代码与运行事实;
|
|
399
|
+
8. 旧计划、旧日志和未经确认的推断。
|
|
400
|
+
|
|
401
|
+
当前 change 决定与永久知识冲突时,必须在 LOG/ADR 中显式说明替代关系;它只约束当前 change,直到 A 决定是否提升并更新永久版本。
|
|
402
|
+
|
|
403
|
+
`specdev/changes/{change}/source.md` 只对“原始输入是什么”具有权威;后续用户决定、ADR 和 Spec 可以显式演进该意图。远程来源在摄入后发生变化不会自动改写本地合同,必须重新 Triage。
|
|
337
404
|
|
|
338
405
|
代码事实可以证明计划已过时,但不能静默改写用户目标或已接受契约。出现这种情况时,按 下方 `<deviation-control>` 标签 退回相应工件修订。
|
|
339
406
|
|
|
@@ -491,7 +558,7 @@ Ticket 只有同时满足以下适用条件才可设置 `ready: true`:
|
|
|
491
558
|
## 1. 偏差等级
|
|
492
559
|
|
|
493
560
|
- **local**:只改变局部实现,不改变 Ticket 的行为、范围、公共契约、路径所有权或验证;记录到 Evidence 后可继续。
|
|
494
|
-
- **ticket**:改变 Ticket 的执行路线、可写范围、局部契约或验收映射,但不改变 Spec;必须停止相关修改、更新 Ticket
|
|
561
|
+
- **ticket**:改变 Ticket 的执行路线、可写范围、局部契约或验收映射,但不改变 Spec;必须停止相关修改、更新 Ticket 并获得该 Ticket 或计划明确的批准 owner 同意。
|
|
495
562
|
- **spec**:改变外部行为、范围、用户故事、验收合同或非功能要求;必须返回 “编写 Spec 阶段”。
|
|
496
563
|
- **architecture**:改变已接受架构决策或公共架构约束;必须返回 “设计访谈能力” 并更新 `specdev/changes/{change}/ADR.md`。
|
|
497
564
|
- **release**:改变迁移、兼容窗口、发布门禁、回滚或不可逆批准点;必须停止并获得明确人工批准。
|
|
@@ -526,7 +593,7 @@ Ticket 只有同时满足以下适用条件才可设置 `ready: true`:
|
|
|
526
593
|
|
|
527
594
|
- 未批准的 ticket、spec、architecture 或 release 偏差不得继续实现。
|
|
528
595
|
- 不得通过扩大 `writable_paths`、删除测试、降低断言或把风险改写成“已知限制”来绕过停止。
|
|
529
|
-
-
|
|
596
|
+
- 偏差影响普通并行执行时,当前集成 owner 必须暂停受影响 Wave,重新计算路径所有权、依赖和 Gate;委派执行由 Lead 承担同一责任。
|
|
530
597
|
|
|
531
598
|
</deviation-control>
|
|
532
599
|
|
|
@@ -534,42 +601,54 @@ Ticket 只有同时满足以下适用条件才可设置 `ready: true`:
|
|
|
534
601
|
|
|
535
602
|
# SpecDev Research
|
|
536
603
|
|
|
537
|
-
##
|
|
604
|
+
## 输入
|
|
605
|
+
|
|
606
|
+
- `decision`:研究要支持的一个具体决定;
|
|
607
|
+
- `questions`:需要回答的穷尽问题集;
|
|
608
|
+
- `stop_condition`:何时证据已足够;
|
|
609
|
+
- `caller`:D、G、S、W、R、T 或 I;
|
|
610
|
+
- `target_artifact`:调用方拥有且将接收结果的完整 Path。
|
|
538
611
|
|
|
539
|
-
|
|
612
|
+
缺少 owner 或 target 时返回阻塞,不创建 `{change}/research/` 等共享 namespace。
|
|
540
613
|
|
|
541
614
|
## 流程
|
|
542
615
|
|
|
543
|
-
1.
|
|
544
|
-
2.
|
|
545
|
-
3.
|
|
546
|
-
4.
|
|
547
|
-
5.
|
|
548
|
-
6.
|
|
549
|
-
7. 长期有效且经实现验证后才可由 Archive 提升到永久 research。
|
|
616
|
+
1. 固定问题、版本、环境和停止条件。
|
|
617
|
+
2. 优先官方文档、规范、源代码、论文或维护者材料;技术问题使用一手来源。
|
|
618
|
+
3. 核对发布日期、版本、适用环境、限制和已知冲突。
|
|
619
|
+
4. 对每个会改变决定的实质声明就近给出来源;关键结论交叉验证,来源冲突时并列呈现。
|
|
620
|
+
5. 区分来源事实、代码库事实、推断、建议和未知项。
|
|
621
|
+
6. 返回一个 Markdown block,由 caller 原子写入 `target_artifact`;本 Skill 不自行写 state。
|
|
550
622
|
|
|
551
|
-
##
|
|
623
|
+
## 输出
|
|
552
624
|
|
|
553
625
|
```markdown
|
|
554
|
-
|
|
555
|
-
-
|
|
556
|
-
-
|
|
557
|
-
-
|
|
626
|
+
## Research: <问题>
|
|
627
|
+
- Decision / target:
|
|
628
|
+
- Scope / version:
|
|
629
|
+
- Stop condition:
|
|
558
630
|
|
|
559
|
-
## Findings
|
|
560
631
|
### R-001
|
|
561
|
-
-
|
|
562
|
-
-
|
|
563
|
-
-
|
|
564
|
-
-
|
|
565
|
-
-
|
|
566
|
-
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
632
|
+
- Claim:
|
|
633
|
+
- Type: official fact / code fact / inference / recommendation
|
|
634
|
+
- Source:
|
|
635
|
+
- Confidence:
|
|
636
|
+
- Limits:
|
|
637
|
+
- Artifact impact:
|
|
638
|
+
|
|
639
|
+
### Conflicts and Unknowns
|
|
640
|
+
### Recommendation
|
|
570
641
|
```
|
|
571
642
|
|
|
572
|
-
|
|
643
|
+
不得长篇复制受版权保护内容。长期有效且经实现验证的结论只能由 Archive 从调用方工件提升到永久 research。
|
|
644
|
+
|
|
645
|
+
## 完成标准
|
|
646
|
+
|
|
647
|
+
- 每个输入问题有答案或明确未知;
|
|
648
|
+
- 每个实质声明就近引用一手来源;
|
|
649
|
+
- 版本、限制、冲突和置信度已记录;
|
|
650
|
+
- 结果有唯一 owning artifact;
|
|
651
|
+
- 本 Skill 没有创建自己的 state 路径。
|
|
573
652
|
|
|
574
653
|
</research>
|
|
575
654
|
|
|
@@ -588,7 +667,7 @@ Ticket 只有同时满足以下适用条件才可设置 `ready: true`:
|
|
|
588
667
|
"execution": {
|
|
589
668
|
"max_parallel": 3,
|
|
590
669
|
"deep_ticket_human_approval": true,
|
|
591
|
-
"shared_path_owner": "
|
|
670
|
+
"shared_path_owner": "explicit"
|
|
592
671
|
},
|
|
593
672
|
"verification": {
|
|
594
673
|
"test": null,
|
|
@@ -671,11 +750,10 @@ Ticket 只有同时满足以下适用条件才可设置 `ready: true`:
|
|
|
671
750
|
|
|
672
751
|
```json
|
|
673
752
|
{
|
|
674
|
-
"schema_version":
|
|
753
|
+
"schema_version": 4,
|
|
675
754
|
"workflow": "specdev",
|
|
676
755
|
"active": [],
|
|
677
|
-
"
|
|
678
|
-
"completed": []
|
|
756
|
+
"archived": []
|
|
679
757
|
}
|
|
680
758
|
```
|
|
681
759
|
|
|
@@ -686,19 +764,18 @@ Ticket 只有同时满足以下适用条件才可设置 `ready: true`:
|
|
|
686
764
|
```json
|
|
687
765
|
{
|
|
688
766
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
689
|
-
"$id": "urn:speculo:specdev:status:
|
|
767
|
+
"$id": "urn:speculo:specdev:status:v4",
|
|
690
768
|
"title": "SpecDev Global Status",
|
|
691
769
|
"type": "object",
|
|
692
770
|
"required": [
|
|
693
771
|
"schema_version",
|
|
694
772
|
"workflow",
|
|
695
773
|
"active",
|
|
696
|
-
"
|
|
697
|
-
"completed"
|
|
774
|
+
"archived"
|
|
698
775
|
],
|
|
699
776
|
"properties": {
|
|
700
777
|
"schema_version": {
|
|
701
|
-
"const":
|
|
778
|
+
"const": 4
|
|
702
779
|
},
|
|
703
780
|
"workflow": {
|
|
704
781
|
"const": "specdev"
|
|
@@ -710,30 +787,27 @@ Ticket 只有同时满足以下适用条件才可设置 `ready: true`:
|
|
|
710
787
|
"required": [
|
|
711
788
|
"change",
|
|
712
789
|
"current_work",
|
|
713
|
-
"works_run"
|
|
714
|
-
"result"
|
|
790
|
+
"works_run"
|
|
715
791
|
],
|
|
716
792
|
"properties": {
|
|
717
793
|
"change": {
|
|
718
|
-
"type": "string"
|
|
794
|
+
"type": "string",
|
|
795
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
719
796
|
},
|
|
720
797
|
"current_work": {
|
|
721
798
|
"type": [
|
|
722
799
|
"string",
|
|
723
800
|
"null"
|
|
724
|
-
]
|
|
801
|
+
],
|
|
802
|
+
"pattern": "^specdev/"
|
|
725
803
|
},
|
|
726
804
|
"works_run": {
|
|
727
805
|
"type": "array",
|
|
728
806
|
"items": {
|
|
729
|
-
"type": "string"
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
"type": [
|
|
734
|
-
"string",
|
|
735
|
-
"null"
|
|
736
|
-
]
|
|
807
|
+
"type": "string",
|
|
808
|
+
"pattern": "^specdev/"
|
|
809
|
+
},
|
|
810
|
+
"uniqueItems": true
|
|
737
811
|
},
|
|
738
812
|
"claimed_investigations": {
|
|
739
813
|
"type": "array",
|
|
@@ -761,77 +835,23 @@ Ticket 只有同时满足以下适用条件才可设置 `ready: true`:
|
|
|
761
835
|
"type": "string"
|
|
762
836
|
}
|
|
763
837
|
},
|
|
764
|
-
"additionalProperties":
|
|
838
|
+
"additionalProperties": false
|
|
765
839
|
}
|
|
766
840
|
}
|
|
767
841
|
},
|
|
768
|
-
"additionalProperties":
|
|
769
|
-
}
|
|
770
|
-
},
|
|
771
|
-
"work_history": {
|
|
772
|
-
"type": "array",
|
|
773
|
-
"items": {
|
|
774
|
-
"type": "object",
|
|
775
|
-
"required": [
|
|
776
|
-
"change",
|
|
777
|
-
"work_id",
|
|
778
|
-
"started_at",
|
|
779
|
-
"completed_at",
|
|
780
|
-
"result"
|
|
781
|
-
],
|
|
782
|
-
"properties": {
|
|
783
|
-
"change": {
|
|
784
|
-
"type": "string"
|
|
785
|
-
},
|
|
786
|
-
"work_id": {
|
|
787
|
-
"type": "string",
|
|
788
|
-
"pattern": "^specdev/"
|
|
789
|
-
},
|
|
790
|
-
"started_at": {
|
|
791
|
-
"type": "string"
|
|
792
|
-
},
|
|
793
|
-
"completed_at": {
|
|
794
|
-
"type": [
|
|
795
|
-
"string",
|
|
796
|
-
"null"
|
|
797
|
-
]
|
|
798
|
-
},
|
|
799
|
-
"result": {
|
|
800
|
-
"type": [
|
|
801
|
-
"string",
|
|
802
|
-
"null"
|
|
803
|
-
]
|
|
804
|
-
}
|
|
805
|
-
},
|
|
806
|
-
"additionalProperties": true
|
|
842
|
+
"additionalProperties": false
|
|
807
843
|
}
|
|
808
844
|
},
|
|
809
|
-
"
|
|
845
|
+
"archived": {
|
|
810
846
|
"type": "array",
|
|
811
847
|
"items": {
|
|
812
|
-
"type": "
|
|
813
|
-
"
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
"archive_path"
|
|
817
|
-
],
|
|
818
|
-
"properties": {
|
|
819
|
-
"change": {
|
|
820
|
-
"type": "string"
|
|
821
|
-
},
|
|
822
|
-
"archived_at": {
|
|
823
|
-
"type": "string"
|
|
824
|
-
},
|
|
825
|
-
"archive_path": {
|
|
826
|
-
"type": "string",
|
|
827
|
-
"pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
|
|
828
|
-
}
|
|
829
|
-
},
|
|
830
|
-
"additionalProperties": true
|
|
831
|
-
}
|
|
848
|
+
"type": "string",
|
|
849
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
850
|
+
},
|
|
851
|
+
"uniqueItems": true
|
|
832
852
|
}
|
|
833
853
|
},
|
|
834
|
-
"additionalProperties":
|
|
854
|
+
"additionalProperties": false
|
|
835
855
|
}
|
|
836
856
|
```
|
|
837
857
|
|
|
@@ -1009,6 +1029,49 @@ Ticket 只有同时满足以下适用条件才可设置 `ready: true`:
|
|
|
1009
1029
|
}
|
|
1010
1030
|
},
|
|
1011
1031
|
"allOf": [
|
|
1032
|
+
{
|
|
1033
|
+
"if": {
|
|
1034
|
+
"properties": {
|
|
1035
|
+
"worktrees": {
|
|
1036
|
+
"contains": {
|
|
1037
|
+
"properties": {
|
|
1038
|
+
"provider": {
|
|
1039
|
+
"const": "git"
|
|
1040
|
+
}
|
|
1041
|
+
},
|
|
1042
|
+
"required": [
|
|
1043
|
+
"provider"
|
|
1044
|
+
]
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
},
|
|
1049
|
+
"then": {
|
|
1050
|
+
"properties": {
|
|
1051
|
+
"worktrees": {
|
|
1052
|
+
"items": {
|
|
1053
|
+
"if": {
|
|
1054
|
+
"properties": {
|
|
1055
|
+
"provider": {
|
|
1056
|
+
"const": "git"
|
|
1057
|
+
}
|
|
1058
|
+
},
|
|
1059
|
+
"required": [
|
|
1060
|
+
"provider"
|
|
1061
|
+
]
|
|
1062
|
+
},
|
|
1063
|
+
"then": {
|
|
1064
|
+
"properties": {
|
|
1065
|
+
"workspace_ref": {
|
|
1066
|
+
"pattern": "^specdev-worktree/T-[0-9]{2,}$"
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
},
|
|
1012
1075
|
{
|
|
1013
1076
|
"if": {
|
|
1014
1077
|
"properties": {
|