@namewta/speculo 0.3.0 → 0.3.2
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 +1 -2
- package/dist/src/cli.js +40 -6
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/skills-mirror.d.ts +38 -0
- package/dist/src/skills-mirror.js +160 -0
- package/dist/src/skills-mirror.js.map +1 -0
- package/package.json +3 -2
- package/template/canonical/README.md +7 -1
- package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +2040 -0
- package/template/canonical/canonical-specdev-goal-plan.md +1379 -0
- package/template/canonical/canonical-specdev-grill-with-docs.md +848 -285
- package/template/canonical/canonical-specdev-spec.md +1061 -46
- package/template/canonical/canonical-specdev-tickets.md +1529 -175
- package/template/canonical/canonical-specdev-wayfinder.md +677 -107
- package/template/commands/git-repository-audit.md +682 -0
- package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +69 -36
- package/template/workflows/specdev/A-archive-and-consolidate/archive-checklist.md +15 -0
- package/template/workflows/specdev/A-archive-and-consolidate/knowledge-promotion-rules.md +32 -0
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +51 -51
- package/template/workflows/specdev/D-diagnose-bugs/diagnosis-template.md +64 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/E-engineering-cognitive-mentor.md +252 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/architecture-guidance.md +90 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/bug-guidance.md +80 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/codebase-guidance.md +107 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/comprehension-and-closure.md +95 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/domain-learning-guidance.md +62 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/evidence-and-options.md +132 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/interaction-protocol.md +116 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/mentor-report-template.md +135 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/mode-routing.md +47 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/persistence-and-resume.md +147 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/requirements-guidance.md +92 -0
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +100 -30
- package/template/workflows/specdev/G-grill-with-docs/adr-format.md +22 -77
- package/template/workflows/specdev/G-grill-with-docs/context-format.md +27 -53
- package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +6 -82
- package/template/workflows/specdev/G-grill-with-docs/grilling-protocol.md +32 -49
- package/template/workflows/specdev/G-grill-with-docs/log-format.md +16 -98
- package/template/workflows/specdev/I-implement/I-implement.md +168 -52
- package/template/workflows/specdev/I-implement/code-review-process.md +10 -76
- package/template/workflows/specdev/I-implement/codebase-design-glossary.md +12 -109
- package/template/workflows/specdev/I-implement/deepening.md +12 -32
- package/template/workflows/specdev/I-implement/design-it-twice.md +6 -41
- package/template/workflows/specdev/I-implement/evidence-template.md +69 -0
- package/template/workflows/specdev/I-implement/execution-preflight.md +20 -0
- package/template/workflows/specdev/I-implement/tdd-examples.md +10 -135
- package/template/workflows/specdev/I-implement/tdd-rules.md +12 -28
- package/template/workflows/specdev/I-init-setup/I-init-setup.md +81 -86
- package/template/workflows/specdev/I-init-setup/change-status-template.json +15 -0
- package/template/workflows/specdev/I-init-setup/config-template.json +26 -0
- package/template/workflows/specdev/I-init-setup/domain-layout-template.md +23 -0
- package/template/workflows/specdev/I-init-setup/status-labels-template.md +55 -0
- package/template/workflows/specdev/I-init-setup/status-template.json +7 -0
- package/template/workflows/specdev/I-init-setup/tracking-template.md +10 -0
- package/template/workflows/specdev/INDEX.md +165 -82
- package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +108 -44
- package/template/workflows/specdev/P-goal-plan/completion-control.md +79 -0
- package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +105 -0
- package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +115 -0
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +70 -0
- package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +103 -40
- package/template/workflows/specdev/R-review-architecture/architecture-review-report-template.html +58 -0
- package/template/workflows/specdev/R-review-architecture/architecture-review-template.md +68 -0
- package/template/workflows/specdev/R-review-architecture/proposal-to-ticket.md +11 -0
- package/template/workflows/specdev/S-spec/S-spec.md +103 -49
- package/template/workflows/specdev/S-spec/spec-readiness.md +16 -0
- package/template/workflows/specdev/S-spec/spec-template.md +95 -0
- package/template/workflows/specdev/T-tickets/T-tickets.md +146 -133
- package/template/workflows/specdev/T-tickets/decomposition-rules.md +56 -0
- package/template/workflows/specdev/T-tickets/ticket-readiness.md +45 -0
- package/template/workflows/specdev/T-tickets/ticket-template.md +124 -0
- package/template/workflows/specdev/T-tickets/tickets-map-template.md +52 -50
- package/template/workflows/specdev/T-triage/T-triage.md +32 -63
- package/template/workflows/specdev/T-triage/triage-template.md +29 -0
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +88 -155
- package/template/workflows/specdev/W-wayfinder/investigation-ticket-template.md +50 -0
- package/template/workflows/specdev/W-wayfinder/wayfinder-map-template.md +46 -0
- package/template/workflows/specdev/_state/status.json +1 -1
- package/template/workflows/specdev/common/README.md +47 -0
- package/template/workflows/specdev/common/rules/artifact-contract.md +57 -0
- package/template/workflows/specdev/common/rules/code-commenting-rule.md +39 -0
- package/template/workflows/specdev/common/rules/deviation-control.md +43 -0
- package/template/workflows/specdev/common/rules/evidence-and-verification.md +57 -0
- package/template/workflows/specdev/common/rules/path-ownership.md +35 -0
- package/template/workflows/specdev/common/rules/path-reference-contract.md +116 -0
- package/template/workflows/specdev/common/rules/planning-principles.md +57 -0
- package/template/workflows/specdev/common/rules/readiness-and-depth.md +51 -0
- package/template/workflows/specdev/common/schemas/change-status.schema.json +170 -0
- package/template/workflows/specdev/common/schemas/config.schema.json +54 -0
- package/template/workflows/specdev/common/schemas/goal-plan.schema.json +21 -0
- package/template/workflows/specdev/common/schemas/spec.schema.json +16 -0
- package/template/workflows/specdev/common/schemas/status.schema.json +149 -0
- package/template/workflows/specdev/common/schemas/ticket.schema.json +130 -0
- package/template/workflows/specdev/common/schemas/tickets-map.schema.json +14 -0
- package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +28 -0
- package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +30 -0
- package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +16 -0
- package/template/workflows/specdev/common/skills/research/SKILL.md +43 -0
- package/template/workflows/specdev/common/tools/README.md +16 -0
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +1155 -0
- package/template/canonical/canonical-teach.md +0 -301
- package/template/workflows/specdev/A-archive-and-consolidate/archive-rules.md +0 -49
- package/template/workflows/specdev/A-archive-and-consolidate/cleanup-rules.md +0 -80
- package/template/workflows/specdev/A-archive-and-consolidate/consolidation-rules.md +0 -122
- package/template/workflows/specdev/A-archive-and-consolidate/discrimination-guide.md +0 -96
- package/template/workflows/specdev/A-archive-and-consolidate/knowledge-graduation.md +0 -51
- package/template/workflows/specdev/D-diagnose-bugs/cleanup-postmortem.md +0 -37
- package/template/workflows/specdev/D-diagnose-bugs/feedback-loop-techniques.md +0 -84
- package/template/workflows/specdev/D-diagnose-bugs/hypothesis-format.md +0 -46
- package/template/workflows/specdev/D-diagnose-bugs/instrumentation-rules.md +0 -51
- package/template/workflows/specdev/I-init-setup/domain-layout.md +0 -55
- package/template/workflows/specdev/I-init-setup/status-labels.md +0 -53
- package/template/workflows/specdev/I-init-setup/tracking-convention.md +0 -52
- package/template/workflows/specdev/P-goal-plan/execution-sections.md +0 -126
- package/template/workflows/specdev/P-goal-plan/governance-sections.md +0 -103
- package/template/workflows/specdev/P-goal-plan/input-validation.md +0 -94
- package/template/workflows/specdev/P-goal-plan/lead-orchestration-protocol.md +0 -158
- package/template/workflows/specdev/P-goal-plan/quick-reference-table.md +0 -60
- package/template/workflows/specdev/P-goal-plan/vision-sections.md +0 -80
- package/template/workflows/specdev/R-review-architecture/exploration-guide.md +0 -103
- package/template/workflows/specdev/R-review-architecture/html-report-template.md +0 -124
- package/template/workflows/specdev/T-triage/artifact-templates.md +0 -122
- package/template/workflows/specdev/T-triage/intake-rules.md +0 -71
- package/template/workflows/specdev/T-triage/routing-rules.md +0 -70
- package/template/workflows/specdev/T-triage/understanding-rules.md +0 -102
- package/template/workflows/specdev/_state/adr/.gitkeep +0 -0
- package/template/workflows/specdev/_state/context/.gitkeep +0 -0
- package/template/workflows/specdev/_state/research/.gitkeep +0 -0
- package/template/workflows/specdev/common/dev-worktree/SKILL.md +0 -48
- package/template/workflows/specdev/common/dev-worktree/references/create.md +0 -63
- package/template/workflows/specdev/common/dev-worktree/references/finalize.md +0 -102
- package/template/workflows/specdev/common/handoff/SKILL.md +0 -42
- package/template/workflows/specdev/common/neat-freak/SKILL.md +0 -210
- package/template/workflows/specdev/common/neat-freak/references/agent-paths.md +0 -72
- package/template/workflows/specdev/common/neat-freak/references/governance.md +0 -88
- package/template/workflows/specdev/common/neat-freak/references/sync-matrix.md +0 -77
- package/template/workflows/specdev/common/neat-freak/references/verification.md +0 -92
- package/template/workflows/specdev/common/neat-freak/scripts/audit-inventory.sh +0 -106
- package/template/workflows/specdev/common/prototype/LOGIC.md +0 -89
- package/template/workflows/specdev/common/prototype/SKILL.md +0 -78
- package/template/workflows/specdev/common/prototype/UI.md +0 -120
- package/template/workflows/specdev/common/research/SKILL.md +0 -54
- package/template/workflows/specdev/common/resolving-merge-conflicts/SKILL.md +0 -14
- package/template/workflows/specdev/common/scripts/hitl-loop.template.sh +0 -41
- package/template/workflows/specdev/common/triage/AGENT-BRIEF.md +0 -204
- package/template/workflows/specdev/common/triage/OUT-OF-SCOPE.md +0 -104
- package/template/workflows/specdev/common/triage/SKILL.md +0 -112
|
@@ -1,466 +1,1029 @@
|
|
|
1
1
|
# 设计访谈(带文档)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## 网页平台运行约定
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
本文是可独立上传的单文件能力快照,不依赖 Speculo CLI 的根别名或源目录。执行时统一采用以下逻辑布局:
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- 项目根下的 `specdev/` 是状态区;全局配置与状态分别为 `specdev/config.json` 和 `specdev/status.json`。
|
|
8
|
+
- 当前 change 位于 `specdev/changes/{change}/`,其中 `{change}` 使用 `YYYY-MM-DD-<kebab-topic>`。
|
|
9
|
+
- 当前 change 的设计、规划和证据工件都写入该目录;永久 ADR、领域上下文和研究分别写入 `specdev/adr/`、`specdev/context/` 和 `specdev/research/`。
|
|
10
|
+
- `specdev/config.json` 或 `specdev/status.json` 不存在时,分别按下方 `<config-template>` 和 `<status-template>` 标签创建;新建 change 时按下方 `<change-status-template>` 标签创建 `.status.json`。对应 schema 用于结构核对。
|
|
11
|
+
- 项目代码与测试始终使用项目根相对路径;不写机器绝对路径。工件之间使用上述逻辑路径,不使用 Speculo 的运行时路径标签。
|
|
12
|
+
- 如果网页平台不能直接写项目文件,则按目标文件名输出完整内容,并在答复中明确应保存的位置;不得把“无法写文件”伪装成已经持久化。
|
|
13
|
+
- 若本地项目提供 Speculo Node 校验器,可运行它补充结构校验;纯网页环境按本文内联的 schema、Ready 清单和完成标准逐项核对,并明确记录未运行的自动校验。
|
|
14
|
+
- 提交、推送、合并、部署、发布、归档移动和不可逆迁移仍需用户明确授权。
|
|
8
15
|
|
|
9
|
-
|
|
16
|
+
本 work 保留原有的 grilling 访谈与 domain-modeling 双重能力:访谈负责沿决策树逐分支达成共识,领域建模负责在决策结晶时同步维护设计轨迹、术语与架构决策。未经用户确认,不进入实现。
|
|
10
17
|
|
|
11
|
-
|
|
18
|
+
## 输入与权威
|
|
12
19
|
|
|
13
|
-
|
|
14
|
-
- 变更目录下的 ADR.md — 架构决策记录,仅含 `# 架构决策记录` 标题
|
|
15
|
-
- 变更目录下的 LOG.md — 设计决策日志,含 `# 设计决策日志` 标题及维护规则说明
|
|
16
|
-
- 变更目录下的 CONTEXT.md — 领域词汇表,含 `# {主题} 领域词汇表` 标题及一两句描述
|
|
20
|
+
开始前按需读取:
|
|
17
21
|
|
|
18
|
-
|
|
22
|
+
- 全局配置:`specdev/config.json`
|
|
23
|
+
- 永久架构决策:`specdev/adr/`
|
|
24
|
+
- 永久领域上下文:`specdev/context/`
|
|
25
|
+
- 原始请求:`specdev/changes/{change}/source-issue.md`
|
|
26
|
+
- 分诊结果:`specdev/changes/{change}/triage.md`
|
|
27
|
+
- Bug 诊断:`specdev/changes/{change}/diagnosis.md`
|
|
28
|
+
- 当前 Spec(如已存在):`specdev/changes/{change}/spec.md`
|
|
29
|
+
- 工件职责规则:下方 `<artifact-contract>` 标签
|
|
30
|
+
- 规划原则:下方 `<planning-principles>` 标签
|
|
19
31
|
|
|
20
|
-
|
|
32
|
+
不存在的可选输入静默跳过,不把缺失文件伪装成已知事实。
|
|
21
33
|
|
|
22
|
-
|
|
34
|
+
## 流程
|
|
23
35
|
|
|
24
|
-
|
|
36
|
+
### 1. 启动或恢复 change
|
|
25
37
|
|
|
26
|
-
|
|
38
|
+
创建或恢复 `specdev/changes/{change}/`,其中 `{change}` 使用 `<YYYY-MM-DD>-<topic>`。
|
|
27
39
|
|
|
28
|
-
|
|
40
|
+
首次启动时创建:
|
|
29
41
|
|
|
30
|
-
|
|
42
|
+
- 生命周期状态:`specdev/changes/{change}/.status.json`(首次创建时使用 下方 `<change-status-template>` 标签)
|
|
43
|
+
- 架构决策:`specdev/changes/{change}/ADR.md`
|
|
44
|
+
- 设计日志:`specdev/changes/{change}/LOG.md`
|
|
45
|
+
- 领域上下文:`specdev/changes/{change}/CONTEXT.md`
|
|
31
46
|
|
|
32
|
-
|
|
47
|
+
创建和更新格式分别遵循:
|
|
33
48
|
|
|
34
|
-
|
|
49
|
+
- 下方 `<adr-format>` 标签
|
|
50
|
+
- 下方 `<log-format>` 标签
|
|
51
|
+
- 下方 `<context-format>` 标签
|
|
35
52
|
|
|
36
|
-
|
|
53
|
+
恢复已有 change 时必须先读取现有三份文档,避免重复询问已经确认的问题。
|
|
37
54
|
|
|
38
|
-
|
|
55
|
+
**完成标准**:change 目录、生命周期状态和三份设计文档均可读取;已知结论与未决问题已建立初始摘要。
|
|
39
56
|
|
|
40
|
-
|
|
57
|
+
### 2. 探索可发现事实
|
|
41
58
|
|
|
42
|
-
|
|
59
|
+
在提问前只读探索相关代码、配置、接口、schema、测试、历史 ADR 和相邻实现。将未知项分为:
|
|
43
60
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
| 下方 `<domain-modeling-rules>` 标签 | 进入步骤 3「捕获文档」时加载——包含三文件分工、对照词汇表挑战、精炼与交叉引用规程、同步规则 |
|
|
48
|
-
| 下方 `<adr-format>` 标签 | 需要创建或修改 ADR 条目时加载——单一 ADR.md 文件格式、编号规则、三条件检查、可选元素 |
|
|
49
|
-
| 下方 `<context-format>` 标签 | 需要增删改术语时加载——CONTEXT.md 结构、定义规则、增删改操作说明 |
|
|
50
|
-
| 下方 `<log-format>` 标签 | 需要记录设计结论时加载——LOG.md 格式、状态标记、编号规则、追加与修订规程 |
|
|
61
|
+
- 可发现事实:继续探索,不询问用户;
|
|
62
|
+
- 高影响偏好或取舍:进入访谈;
|
|
63
|
+
- 低影响实现细节:记录为实现者可自行决定,不升级为产品决策。
|
|
51
64
|
|
|
52
|
-
|
|
65
|
+
若涉及不熟悉的外部技术、第三方 API、标准或版本行为,调用 下方 `<research>` 标签,并把研究结论的来源和置信度写入 `specdev/changes/{change}/LOG.md`。
|
|
53
66
|
|
|
54
|
-
|
|
67
|
+
### 3. 一次一问的设计访谈
|
|
55
68
|
|
|
56
|
-
|
|
69
|
+
加载 下方 `<grilling-protocol>` 标签。每轮只处理一个会实质改变设计的问题:
|
|
57
70
|
|
|
58
|
-
|
|
71
|
+
1. 陈述已知事实与证据;
|
|
72
|
+
2. 提出唯一关键问题;
|
|
73
|
+
3. 给出 2–4 个真实选项、权衡和推荐默认值;
|
|
74
|
+
4. 等待用户确认、拒绝或延后;
|
|
75
|
+
5. 将结果立即追加到 `specdev/changes/{change}/LOG.md`。
|
|
59
76
|
|
|
60
|
-
|
|
77
|
+
不得把多个独立决策塞进同一个问题;不得为了填模板询问不会改变方案的细节;不得在用户尚未确认前执行实现。
|
|
61
78
|
|
|
62
|
-
|
|
79
|
+
**完成标准**:决策树已覆盖目标、角色、范围、主要流程、状态与失败、数据与接口、兼容与迁移、安全与隐私、性能与可观测性、验证与验收等适用分支。
|
|
63
80
|
|
|
64
|
-
###
|
|
81
|
+
### 4. 同步领域文档
|
|
65
82
|
|
|
66
|
-
|
|
83
|
+
加载 下方 `<domain-modeling-rules>` 标签,按固定顺序同步:
|
|
67
84
|
|
|
68
|
-
|
|
85
|
+
1. 先把所有确认、延后、拒绝和替代结论写入 `specdev/changes/{change}/LOG.md`;
|
|
86
|
+
2. 再把当前仍真实的术语、不变量、示例、反例和代码映射写入 `specdev/changes/{change}/CONTEXT.md`;
|
|
87
|
+
3. 最后把满足 ADR 条件的长期架构决策写入 `specdev/changes/{change}/ADR.md`。
|
|
69
88
|
|
|
70
|
-
|
|
89
|
+
历史轨迹不得写入领域上下文;尚未确认的选项不得写成已接受 ADR;已有 ADR 被替代时必须建立 supersedes 链,不重写历史。
|
|
71
90
|
|
|
72
|
-
###
|
|
91
|
+
### 5. 收敛与就绪判断
|
|
73
92
|
|
|
74
|
-
|
|
93
|
+
访谈结束时必须能明确:
|
|
75
94
|
|
|
76
|
-
|
|
95
|
+
- 目标、目标用户、成功标准;
|
|
96
|
+
- IN、REUSE、OUT;
|
|
97
|
+
- 主要行为路径、失败行为与状态转换;
|
|
98
|
+
- 公共接口、数据、不变量、兼容和迁移影响;
|
|
99
|
+
- 安全、隐私、性能、可靠性和可观测性要求;
|
|
100
|
+
- 验证接缝和可观察验收方式;
|
|
101
|
+
- 剩余未知项及其影响。
|
|
77
102
|
|
|
78
|
-
|
|
103
|
+
仍存在会改变外部行为、范围、公共接口、数据、安全、兼容、迁移或验收的未决问题时,将 `specdev/changes/{change}/.status.json` 标为 `blocked` 或保持 `active`,不得伪装为 Ready。
|
|
79
104
|
|
|
80
|
-
|
|
81
|
-
2. **边界与关系** — 概念之间的边界在哪里?它们如何关联?
|
|
82
|
-
3. **行为与规则** — 每个概念能做什么?有什么约束?
|
|
83
|
-
4. **实现映射** — 概念如何映射到代码结构、数据模型、接口?
|
|
84
|
-
5. **边界场景** — 极端情况和异常如何处理?
|
|
105
|
+
### 6. 停止与路由
|
|
85
106
|
|
|
86
|
-
|
|
107
|
+
向用户汇报三份文档的新增/修改条目、已锁定决策、延后事项和风险。根据成熟度明确给出下一步:
|
|
87
108
|
|
|
88
|
-
|
|
109
|
+
- 通常进入 “编写 Spec 阶段”;
|
|
110
|
+
- 外部行为已经完全明确时可进入 “拆分 Tickets 阶段”;
|
|
111
|
+
- 极小、局部且已经具备批准执行契约的工作,可在用户确认后进入 “实现阶段”;
|
|
112
|
+
- 路径或关键事实仍未知时进入 “寻路阶段”。
|
|
89
113
|
|
|
90
|
-
|
|
114
|
+
同步 `specdev/status.json` 的 `current_work`、`work_history` 和当前 change 状态,返回三份权威工件及下一 Work 的完整路径。
|
|
91
115
|
|
|
92
|
-
|
|
116
|
+
不得在本 work 中自动读取实现源码并开始修改代码。
|
|
93
117
|
|
|
94
|
-
|
|
95
|
-
2. **CONTEXT.md** 随后更新——从日志中提取新术语或修正的术语定义
|
|
96
|
-
3. **ADR.md** 最后更新——检查是否需要追加满足三条件的架构决策
|
|
118
|
+
## 完成标准
|
|
97
119
|
|
|
98
|
-
|
|
120
|
+
- `specdev/changes/{change}/LOG.md` 已记录全部设计结论和状态变化;
|
|
121
|
+
- `specdev/changes/{change}/CONTEXT.md` 只包含当前领域真相;
|
|
122
|
+
- `specdev/changes/{change}/ADR.md` 只包含满足条件的架构决策;
|
|
123
|
+
- 高影响未决问题已关闭或明确标记为阻塞;
|
|
124
|
+
- 状态、权威工件和下一 Work 路径已返回;
|
|
125
|
+
- 下一 work 已明确,但未自动执行实现。
|
|
99
126
|
|
|
100
|
-
|
|
127
|
+
## 子文件引用
|
|
101
128
|
|
|
102
|
-
-
|
|
103
|
-
-
|
|
104
|
-
-
|
|
129
|
+
- 访谈协议:下方 `<grilling-protocol>` 标签
|
|
130
|
+
- 领域建模规则:下方 `<domain-modeling-rules>` 标签
|
|
131
|
+
- ADR 格式:下方 `<adr-format>` 标签
|
|
132
|
+
- 领域上下文格式:下方 `<context-format>` 标签
|
|
133
|
+
- 设计日志格式:下方 `<log-format>` 标签
|
|
105
134
|
|
|
106
|
-
|
|
135
|
+
---
|
|
107
136
|
|
|
108
|
-
##
|
|
137
|
+
## 参考内容
|
|
109
138
|
|
|
110
|
-
|
|
111
|
-
- **推进**:每个回答后,识别下一个最关键的未解决问题。优先解决会阻塞其他决策的问题。
|
|
112
|
-
- **收束**:当设计树的主要分支都已遍历、且用户确认共识时,访谈结束。不要无限追问无关细节。
|
|
139
|
+
以下内容均已内联。主流程提到标签时,直接使用对应标签中的完整规则、模板或 schema。
|
|
113
140
|
|
|
114
|
-
|
|
141
|
+
<grilling-protocol>
|
|
115
142
|
|
|
116
|
-
|
|
117
|
-
- "你提到订单可以部分取消。未取消的商品怎么办——它们还能发货吗?我建议将它们标记为可发货状态,因为取消是针对商品行而非整个订单。"
|
|
118
|
-
- "你打算用事件溯源还是 CRUD?考虑到审计需求,我推荐事件溯源——虽然写路径更复杂,但天然支持完整审计日志。"
|
|
119
|
-
- "Ordering 和 Billing 之间你选择了同步 HTTP 调用。这意味着 Billing 挂了订单也创建不了。你确定要这种耦合?我建议用异步领域事件——订单创建后发出事件,Billing 异步消费。"
|
|
143
|
+
# 设计访谈协议
|
|
120
144
|
|
|
121
|
-
|
|
145
|
+
目标是关闭会影响产品行为、架构边界、风险或验收的关键决策,不是把所有可能问题都问一遍。
|
|
122
146
|
|
|
123
|
-
|
|
147
|
+
## 1. 开始前先发现事实
|
|
124
148
|
|
|
125
|
-
|
|
149
|
+
先读取代码、配置、测试、现有 Spec、ADR、CONTEXT 和 LOG。可从环境获得的事实不得转交给用户回答;只有偏好、风险承受度、业务取舍或互斥目标需要用户决策。
|
|
126
150
|
|
|
127
|
-
|
|
151
|
+
## 2. 决策树
|
|
128
152
|
|
|
129
|
-
|
|
153
|
+
按风险和信息缺口覆盖,不机械提问:
|
|
130
154
|
|
|
131
|
-
|
|
155
|
+
1. 用户问题与成功状态;
|
|
156
|
+
2. 参与者、权限与主要流程;
|
|
157
|
+
3. 范围边界和明确非目标;
|
|
158
|
+
4. 状态、数据、不变量与失败模式;
|
|
159
|
+
5. 接口、兼容、迁移和发布;
|
|
160
|
+
6. 安全、隐私、性能、可观测性;
|
|
161
|
+
7. 验收与验证接缝。
|
|
132
162
|
|
|
133
|
-
|
|
134
|
-
|------|------|----------|
|
|
135
|
-
| 变更目录下的 LOG.md | 完整设计轨迹——所有确认、延后、被替代的结论 | 持续增删改,条目可被后续决定修订 |
|
|
136
|
-
| 变更目录下的 CONTEXT.md | 精炼的规范词汇表——只保留当前有效的术语 | 增删改,保持精炼 |
|
|
137
|
-
| 变更目录下的 ADR.md | 难以逆转、令人意外、存在真实权衡的架构决策 | 只追加不删除,可标记废弃 |
|
|
163
|
+
## 3. 每轮只关闭一个关键决定
|
|
138
164
|
|
|
139
|
-
|
|
165
|
+
每轮格式:
|
|
140
166
|
|
|
141
|
-
|
|
167
|
+
1. **已知事实:** 简短说明当前共识和证据;
|
|
168
|
+
2. **唯一问题:** 不使用复合问题;
|
|
169
|
+
3. **可行选项:** 只列实质不同的方案;
|
|
170
|
+
4. **权衡:** 对范围、体验、架构、风险和未来成本的影响;
|
|
171
|
+
5. **推荐:** 明确给出默认建议及原因;
|
|
172
|
+
6. **用户结论:** confirmed / deferred / rejected;
|
|
173
|
+
7. **落盘:** 更新 LOG,并按需要更新 ADR 或 CONTEXT。
|
|
142
174
|
|
|
143
|
-
##
|
|
175
|
+
## 4. 记录规则
|
|
144
176
|
|
|
145
|
-
|
|
177
|
+
- 所有已确认或显式延后的决策写入 `specdev/changes/{change}/LOG.md`;
|
|
178
|
+
- 长期架构决策追加到 `specdev/changes/{change}/ADR.md`;
|
|
179
|
+
- 稳定领域知识追加或合并到 `specdev/changes/{change}/CONTEXT.md`;
|
|
180
|
+
- 不因追求“文档完整”而复制同一事实;工件冲突按 下方 `<artifact-contract>` 标签 裁决。
|
|
146
181
|
|
|
147
|
-
##
|
|
182
|
+
## 5. 停止条件
|
|
148
183
|
|
|
149
|
-
|
|
184
|
+
- 关键决策已关闭,足以进入 Spec;或
|
|
185
|
+
- 用户明确延后,且该延后不会伪装成 Ready;或
|
|
186
|
+
- 缺少外部信息,change 标 blocked;或
|
|
187
|
+
- 继续提问只会产生低影响实现细节,应交给 Ticket 或实现阶段决定。
|
|
150
188
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
当用户陈述某事如何工作时,检查代码是否一致。如果发现矛盾,指出来:"你的代码取消的是整个 Order,但你刚才说部分取消是可能的——哪个是正确的?"在日志中记录这种矛盾的发现和解决过程。
|
|
189
|
+
</grilling-protocol>
|
|
154
190
|
|
|
155
|
-
|
|
191
|
+
<domain-modeling-rules>
|
|
156
192
|
|
|
157
|
-
|
|
193
|
+
# 领域建模规则
|
|
158
194
|
|
|
159
|
-
|
|
195
|
+
- 使用业务语言定义概念,避免用当前类名代替领域定义。
|
|
196
|
+
- 每个术语包含:定义、边界、示例、反例、相关不变量、代码映射。
|
|
197
|
+
- 同义词选择一个规范词,其余标别名;一词多义必须拆分。
|
|
198
|
+
- CONTEXT 描述当前真相;讨论历史只留在 LOG。
|
|
199
|
+
- 与代码不一致时同时记录“期望领域模型”和“当前实现差距”,不得假装已实现。
|
|
160
200
|
|
|
161
|
-
|
|
201
|
+
</domain-modeling-rules>
|
|
162
202
|
|
|
163
|
-
-
|
|
164
|
-
- **Superseded by** — 如状态为 `superseded`,标注替代它的日志编号
|
|
165
|
-
- **Related** — 如该结论对应某个 ADR,标注 `Related: ADR-XXXX`
|
|
166
|
-
- **正文** — 背景、讨论的问题、做出的决定及原因,可以记录具体场景和交互细节
|
|
203
|
+
<adr-format>
|
|
167
204
|
|
|
168
|
-
|
|
205
|
+
# ADR 格式
|
|
206
|
+
|
|
207
|
+
只有同时满足“影响多个实现点、存在实质替代方案、结论预计长期有效”时才写 ADR。局部且可逆的实现选择留在 Ticket,不把 ADR 变成日常日志。
|
|
208
|
+
|
|
209
|
+
```markdown
|
|
210
|
+
## ADR-###: <标题>
|
|
211
|
+
- **状态:** proposed / accepted / superseded / deprecated
|
|
212
|
+
- **日期:**
|
|
213
|
+
- **决策范围:** 哪些系统、接口或工件受约束
|
|
214
|
+
- **来源:** LOG-### / 用户结论 / 外部规范
|
|
215
|
+
- **上下文:** 需要解决的长期张力,而非实现步骤
|
|
216
|
+
- **决策驱动:** 必须优化或保护的目标与约束
|
|
217
|
+
- **决策:** 清晰、可测试的规范性结论
|
|
218
|
+
- **替代方案:** 至少列出认真考虑过的可行方案
|
|
219
|
+
- **权衡理由:** 为什么选择当前方案
|
|
220
|
+
- **后果:** 正面 / 负面 / 新风险 / 组织影响
|
|
221
|
+
- **不变量与约束:** 下游 Spec、Ticket 和实现不得破坏的条件
|
|
222
|
+
- **验证方式:** 如何知道决策在真实系统中成立
|
|
223
|
+
- **迁移/采用:** 如适用
|
|
224
|
+
- **替代:** ADR-###(如适用)
|
|
225
|
+
- **被替代于:** ADR-###(如适用)
|
|
226
|
+
```
|
|
169
227
|
|
|
170
|
-
|
|
228
|
+
一个 ADR 只表达一个决策。修改已接受决策时,新建 ADR 并建立 supersedes 链;不得重写历史来掩盖决策变化。
|
|
171
229
|
|
|
172
|
-
|
|
230
|
+
</adr-format>
|
|
173
231
|
|
|
174
|
-
|
|
232
|
+
<context-format>
|
|
175
233
|
|
|
176
|
-
|
|
234
|
+
# CONTEXT 格式
|
|
177
235
|
|
|
178
|
-
|
|
179
|
-
- **修改术语**:直接更新定义文本和 `_Avoid_` 列表。
|
|
180
|
-
- **删除术语**:移除整个条目。
|
|
181
|
-
- **术语更名**:删除旧条目,新增新条目。
|
|
236
|
+
CONTEXT 保存跨 change 可复用的领域语言、关系和不变量,不保存一次性任务计划。
|
|
182
237
|
|
|
183
|
-
|
|
238
|
+
```markdown
|
|
239
|
+
# <主题> 领域上下文
|
|
184
240
|
|
|
185
|
-
|
|
241
|
+
- **Owner:**
|
|
242
|
+
- **最后核验:**
|
|
243
|
+
- **权威来源:** ADR / 代码 / 外部规范 / 用户确认
|
|
186
244
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
245
|
+
## 术语
|
|
246
|
+
### <规范术语>
|
|
247
|
+
- 定义:
|
|
248
|
+
- 边界:
|
|
249
|
+
- 示例:
|
|
250
|
+
- 反例:
|
|
251
|
+
- 不变量:
|
|
252
|
+
- 代码映射:src/example.ts / 无
|
|
253
|
+
- 别名与禁用词:
|
|
254
|
+
- 来源与最后核验:
|
|
190
255
|
|
|
191
|
-
|
|
256
|
+
## 概念关系
|
|
257
|
+
- 聚合、生命周期、依赖、拥有关系或状态转换
|
|
192
258
|
|
|
193
|
-
|
|
259
|
+
## 全局不变量
|
|
260
|
+
- 始终成立、可被验证且不属于单个 change 的规则
|
|
194
261
|
|
|
195
|
-
##
|
|
262
|
+
## 当前实现映射
|
|
263
|
+
- 领域概念与模块、接口、存储或事件之间的对应
|
|
196
264
|
|
|
197
|
-
|
|
198
|
-
-
|
|
199
|
-
- **带来锁定效应的技术选择。** 数据库、消息总线、认证提供商、部署目标。不是每个库——只是那些需要花一个季度才能替换的。
|
|
200
|
-
- **边界和范围决策。** "客户数据由 Customer 上下文拥有;其他上下文仅通过 ID 引用它。"明确的"不做"和"要做"同样有价值。
|
|
201
|
-
- **有意偏离显而易见路径的决策。** "我们使用手动 SQL 而不是 ORM,因为 X。"任何合理读者会假设相反的情况。
|
|
202
|
-
- **代码中不可见的约束。** "由于合规要求,我们不能使用 AWS。" "由于合作伙伴 API 合同,响应时间必须低于 200ms。"
|
|
203
|
-
- **拒绝的原因不明显的被拒绝替代方案。** 如果你考虑了 GraphQL 而因微妙原因选择了 REST,记录下来——否则 6 个月后有人会再次建议 GraphQL。
|
|
265
|
+
## 当前实现差距
|
|
266
|
+
- 已知偏离、历史负担和待验证假设;不得伪装成已确认事实
|
|
204
267
|
|
|
205
|
-
##
|
|
268
|
+
## 变更记录
|
|
269
|
+
- LOG-###:增加、修订或废弃了什么
|
|
270
|
+
```
|
|
206
271
|
|
|
207
|
-
|
|
272
|
+
</context-format>
|
|
208
273
|
|
|
209
|
-
|
|
274
|
+
<log-format>
|
|
210
275
|
|
|
211
|
-
|
|
276
|
+
# LOG 格式
|
|
277
|
+
|
|
278
|
+
```markdown
|
|
279
|
+
## LOG-### — <时间> — <主题>
|
|
280
|
+
- **状态:** confirmed / deferred / rejected / superseded
|
|
281
|
+
- **问题:** 本条只记录一个决策或未知
|
|
282
|
+
- **事实与来源:** 代码、测试、用户确认或外部规范
|
|
283
|
+
- **选项:** 实质可行方案及关键差异
|
|
284
|
+
- **推荐:** 默认建议与理由
|
|
285
|
+
- **结论:**
|
|
286
|
+
- **原因:**
|
|
287
|
+
- **影响工件:** CONTEXT / ADR / Spec / Ticket / Goal Plan
|
|
288
|
+
- **约束或不变量:** 无 / ...
|
|
289
|
+
- **后续:** owner、触发条件或截止门禁
|
|
290
|
+
- **替代/被替代:** LOG-### / 无
|
|
291
|
+
```
|
|
212
292
|
|
|
213
|
-
|
|
293
|
+
LOG 追加为主;结论变化时新增条目并引用旧编号,不删除历史。状态为 deferred 的条目必须说明它是否阻止 Spec 或 Ticket Ready。
|
|
214
294
|
|
|
215
|
-
|
|
295
|
+
</log-format>
|
|
216
296
|
|
|
217
|
-
>
|
|
297
|
+
<artifact-contract>
|
|
218
298
|
|
|
219
|
-
|
|
299
|
+
# 工件职责与权威裁决
|
|
220
300
|
|
|
221
|
-
|
|
222
|
-
# 架构决策记录
|
|
301
|
+
SpecDev 通过分层工件避免同一决策被多个模型反复重做。每个工件只承担自己的权威边界。
|
|
223
302
|
|
|
224
|
-
##
|
|
303
|
+
## 1. 工件职责
|
|
225
304
|
|
|
226
|
-
|
|
305
|
+
| 工件 | 具体位置 | 必须决定 | 不应决定 |
|
|
306
|
+
|---|---|---|---|
|
|
307
|
+
| 分诊 | `specdev/changes/{change}/triage.md` | 请求类别、影响、风险、缺失输入和下一 work | 详细实现方案 |
|
|
308
|
+
| 诊断 | `specdev/changes/{change}/diagnosis.md` | 复现、证据、根因、修复不变量和回归契约 | 未经验证的修复实现 |
|
|
309
|
+
| 设计日志 | `specdev/changes/{change}/LOG.md` | 讨论轨迹、确认、延后、替代与废弃结论 | 当前架构权威摘要 |
|
|
310
|
+
| 领域上下文 | `specdev/changes/{change}/CONTEXT.md` | 当前领域术语、语义和稳定不变量 | 临时会议记录 |
|
|
311
|
+
| 架构决策 | `specdev/changes/{change}/ADR.md` | 已接受架构决策、原因、后果和替代关系 | 尚未决定的方案集合 |
|
|
312
|
+
| Spec | `specdev/changes/{change}/spec.md` | 用户问题、外部行为、范围、验收合同、非功能要求和已锁定实现约束 | 文件级施工步骤 |
|
|
313
|
+
| Ticket | `specdev/changes/{change}/ticket/NN-<ticket-name>.md` | 单一垂直切片的行为、决策、范围、路径所有权、执行路线和验证证据 | 跨 Ticket 里程碑治理 |
|
|
314
|
+
| Tickets Map | `specdev/changes/{change}/tickets-map.md` | 依赖 DAG、合同覆盖、Ready 投影、并行候选和路径冲突 | 单 Ticket 的完整实现契约 |
|
|
315
|
+
| Goal Plan | `specdev/changes/{change}/goal-plan.md` | 跨 Ticket 调度、Gate、共享所有权、迁移顺序、集成和偏差治理 | 复制 Ticket 全文 |
|
|
316
|
+
| Evidence | `specdev/changes/{change}/evidence/T-NN.md` | 实际修改、命令、结果、验收映射、偏差、风险和提交引用 | 新的产品或架构决策 |
|
|
227
317
|
|
|
228
|
-
|
|
318
|
+
## 2. 权威顺序
|
|
229
319
|
|
|
230
|
-
|
|
320
|
+
同一事项冲突时按下列顺序裁决:
|
|
231
321
|
|
|
232
|
-
|
|
322
|
+
1. 用户最新明确决定;
|
|
323
|
+
2. 当前已接受架构决策:`specdev/changes/{change}/ADR.md`;
|
|
324
|
+
3. 当前外部行为权威:`specdev/changes/{change}/spec.md`;
|
|
325
|
+
4. 当前 Ticket 契约:`specdev/changes/{change}/ticket/NN-<ticket-name>.md`;
|
|
326
|
+
5. 当前跨 Ticket 编排:`specdev/changes/{change}/goal-plan.md`;
|
|
327
|
+
6. 当前代码与运行事实;
|
|
328
|
+
7. 旧计划、旧日志和未经确认的推断。
|
|
233
329
|
|
|
234
|
-
|
|
235
|
-
```
|
|
330
|
+
代码事实可以证明计划已过时,但不能静默改写用户目标或已接受契约。出现这种情况时,按 下方 `<deviation-control>` 标签 退回相应工件修订。
|
|
236
331
|
|
|
237
|
-
|
|
332
|
+
## 3. 来源追踪
|
|
238
333
|
|
|
239
|
-
|
|
334
|
+
高影响条目应带来源标识:
|
|
240
335
|
|
|
241
|
-
|
|
336
|
+
- `USER-DECISION:<date-or-summary>`;
|
|
337
|
+
- `ADR-###`;
|
|
338
|
+
- `US-###` 或 `AC-###`;
|
|
339
|
+
- `CODE:project/relative/path`;
|
|
340
|
+
- `RESEARCH:<Url>https://example.com/source</Url>`;
|
|
341
|
+
- `DIAG-###`。
|
|
242
342
|
|
|
243
|
-
|
|
244
|
-
2. 编号加 1
|
|
245
|
-
3. 在文件末尾追加 `---` 分隔线和新条目
|
|
343
|
+
来源追踪解释“为什么这样决定”,不要求为普通描述逐句加标签。
|
|
246
344
|
|
|
247
|
-
##
|
|
345
|
+
## 4. 冲突处理
|
|
248
346
|
|
|
249
|
-
|
|
347
|
+
1. 指明冲突事项和双方来源;
|
|
348
|
+
2. 判断冲突属于事实过时、产品取舍、架构取舍、Ticket 范围还是调度问题;
|
|
349
|
+
3. 按本规则的权威顺序提出裁决;
|
|
350
|
+
4. 若改变外部行为、公共契约、数据、安全、范围、迁移或验收,必须获得用户或指定批准人决定;
|
|
351
|
+
5. 更新真正拥有该决策的工件;
|
|
352
|
+
6. 在 `specdev/changes/{change}/LOG.md` 保留被替代结论和原因;
|
|
353
|
+
7. 重新执行结构校验;纯网页环境按本文的内联规则人工核对。
|
|
250
354
|
|
|
251
|
-
|
|
252
|
-
- **Status**——`**Status**: proposed | accepted | deprecated | superseded by ADR-NNNN`。当决策被重新审视时,直接修改状态标记
|
|
253
|
-
- **Considered Options**——仅当被拒绝的替代方案值得记住时
|
|
254
|
-
- **Consequences**——仅当需要指出非显而易见的下游影响时
|
|
355
|
+
不得仅在下游工件中覆盖上游权威。
|
|
255
356
|
|
|
256
|
-
|
|
357
|
+
</artifact-contract>
|
|
257
358
|
|
|
258
|
-
|
|
259
|
-
## 0003: 写模型采用事件溯源(2025-03-15)
|
|
359
|
+
<planning-principles>
|
|
260
360
|
|
|
261
|
-
|
|
361
|
+
# 规划原则
|
|
262
362
|
|
|
263
|
-
|
|
264
|
-
所有状态变更作为不可变事件存储,当前状态从中投影。
|
|
363
|
+
SpecDev 的规划目标是“决策完备、细节最小充分、能够验证”,不是把每个任务写成逐行施工脚本。
|
|
265
364
|
|
|
266
|
-
|
|
267
|
-
- 事件溯源(已选)——天然审计日志,支持时间旅行调试
|
|
268
|
-
- CRUD + 审计表——更简单,但审计日志与业务逻辑解耦,容易不同步
|
|
269
|
-
- 仅 CRUD——无审计历史,不满足合规要求
|
|
365
|
+
## 1. 先探索,后提问
|
|
270
366
|
|
|
271
|
-
|
|
272
|
-
- 写路径复杂度增加;读路径需要投影
|
|
273
|
-
- 事件 schema 演进需要显式版本策略
|
|
274
|
-
```
|
|
367
|
+
先读取相关入口、配置、schema、类型、测试、相邻实现、当前工件和历史决策。未知项分为:
|
|
275
368
|
|
|
276
|
-
|
|
369
|
+
- **可发现事实**:通过只读探索解决,不询问用户;
|
|
370
|
+
- **高影响偏好或取舍**:无法从仓库推导,且会改变行为、架构、风险、范围、迁移或验收时才询问;
|
|
371
|
+
- **低影响实现细节**:由实现者遵循现有惯例决定。
|
|
277
372
|
|
|
278
|
-
|
|
279
|
-
- **改变状态**——修改 `**Status**` 字段(如 accepted → deprecated)
|
|
280
|
-
- **废弃**——将状态改为 `deprecated`,如被新决策替代则加上 `superseded by ADR-NNNN`
|
|
281
|
-
- **不要删除**——即使决策被废弃,保留条目作为历史上下文
|
|
373
|
+
外部事实研究使用 下方 `<research>` 标签。
|
|
282
374
|
|
|
283
|
-
##
|
|
375
|
+
## 2. 决策完备
|
|
284
376
|
|
|
285
|
-
|
|
377
|
+
一个 Plan 或 Ticket 达到以下状态才可执行:
|
|
286
378
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
379
|
+
- 目标和成功标准明确;
|
|
380
|
+
- IN、REUSE、OUT 与不变量明确;
|
|
381
|
+
- 公共接口、数据和兼容策略已锁定或明确不变化;
|
|
382
|
+
- 失败行为和关键边界有结论;
|
|
383
|
+
- 依赖、路径所有权和批准点明确;
|
|
384
|
+
- 验证方式和 Evidence 位置明确;
|
|
385
|
+
- 不存在会改变上述内容的高影响未决问题。
|
|
290
386
|
|
|
291
|
-
|
|
387
|
+
决策完备不要求逐文件穷举、逐函数步骤、逐行代码、重复代码库事实或虚构未来路径。
|
|
292
388
|
|
|
293
|
-
|
|
389
|
+
## 3. 最小充分细节
|
|
294
390
|
|
|
295
|
-
|
|
391
|
+
- 局部、低风险、沿用现有模式的切片使用 Lite。
|
|
392
|
+
- 多文件或跨层垂直切片使用 Standard。
|
|
393
|
+
- 公共契约、迁移、安全、不可逆操作、共享核心路径或复杂协作使用 Deep。
|
|
296
394
|
|
|
297
|
-
|
|
395
|
+
详细条件位于 下方 `<readiness-and-depth>` 标签。
|
|
298
396
|
|
|
299
|
-
|
|
397
|
+
## 4. 计划与执行分离
|
|
300
398
|
|
|
301
|
-
|
|
399
|
+
规划阶段可以读取、搜索、静态分析和执行只读或非修改性验证,不实现产品代码。执行阶段不重新决定已锁定的产品和架构事项。计划与代码事实冲突时,按 下方 `<deviation-control>` 标签 退回修订。
|
|
302
400
|
|
|
303
|
-
|
|
304
|
-
# {项目名称} 领域词汇表
|
|
401
|
+
## 5. 以可验证目标委托
|
|
305
402
|
|
|
306
|
-
|
|
403
|
+
每个交付物至少有一种可重复证据:测试、类型检查、lint、构建、API 示例、截图对比、迁移 dry-run、查询结果或手动步骤。验证绑定外部行为或稳定接缝,不把私有实现细节当作唯一证据。
|
|
307
404
|
|
|
308
|
-
##
|
|
405
|
+
## 6. 委托而非微操
|
|
309
406
|
|
|
310
|
-
|
|
311
|
-
{对该术语的一两句话描述}
|
|
312
|
-
_Avoid_: Purchase, transaction
|
|
407
|
+
Ticket 告诉执行者:做什么、为什么、不能改变什么、按什么顺序形成安全落点、怎样证明。执行者决定:在现有代码惯例内怎样组织局部实现。只有高风险或非显然的接口、迁移和顺序需要写入执行路线。
|
|
313
408
|
|
|
314
|
-
|
|
315
|
-
发货后发送给客户的付款请求。
|
|
316
|
-
_Avoid_: Bill, payment request
|
|
409
|
+
## 7. 分层规划
|
|
317
410
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
411
|
+
- Spec 决定外部行为。
|
|
412
|
+
- Ticket 是决策完备的微型执行计划。
|
|
413
|
+
- Tickets Map 决定依赖和覆盖投影。
|
|
414
|
+
- Goal Plan 只在协调复杂度需要时决定跨 Ticket 编排。
|
|
415
|
+
- Implement 在既定契约内完成代码和 Evidence。
|
|
322
416
|
|
|
323
|
-
|
|
417
|
+
职责细节见 下方 `<artifact-contract>` 标签。
|
|
324
418
|
|
|
325
|
-
-
|
|
326
|
-
- **定义保持精炼。** 最多一两句话。定义它是什么,而不是它做什么。术语的定义描述概念的本质,而非其行为或实现。
|
|
327
|
-
- **仅包含特定于该项目上下文的术语。** 通用的编程概念(超时、错误类型、工具模式)即使项目广泛使用也不属于这里。添加术语前自问:这是该上下文独有的概念,还是一个通用编程概念?只有前者才属于这里。
|
|
328
|
-
- **当自然形成聚类时,用子标题分组术语。** 如果所有术语属于一个单一的凝聚领域,扁平列表也可以。当术语数量超过 10 个时,几乎总能找到自然分组。
|
|
329
|
-
- **随时增删改。** 模型演进时,直接修改文件:添加新术语、删除废弃术语、修正定义、术语更名。不要堆积——保持词汇表精炼且反映当前模型。
|
|
419
|
+
</planning-principles>
|
|
330
420
|
|
|
331
|
-
|
|
421
|
+
<readiness-and-depth>
|
|
332
422
|
|
|
333
|
-
|
|
423
|
+
# 规划深度与执行就绪
|
|
334
424
|
|
|
335
|
-
|
|
425
|
+
## 1. Planning Depth
|
|
336
426
|
|
|
337
|
-
|
|
338
|
-
**{术语名}**:
|
|
339
|
-
{定义}
|
|
340
|
-
_Avoid_: {避免使用的同义词,用逗号分隔}
|
|
341
|
-
```
|
|
427
|
+
### Lite
|
|
342
428
|
|
|
343
|
-
|
|
429
|
+
适用条件通常全部满足:范围局部、行为明确、沿用既有模式、无公共接口或数据迁移、无安全或高事故半径影响、易回滚、无需并行协调。
|
|
344
430
|
|
|
345
|
-
|
|
431
|
+
最低内容:目标、范围、项目路径授权、1–3 条执行路线、验收标准和验证方法。
|
|
346
432
|
|
|
347
|
-
###
|
|
433
|
+
### Standard
|
|
348
434
|
|
|
349
|
-
|
|
435
|
+
适用于大多数跨多个文件或技术层的垂直切片。
|
|
350
436
|
|
|
351
|
-
|
|
437
|
+
额外要求:锁定决策与假设、接口接缝、输入输出、不变量、失败行为、有序执行路线、验证矩阵和路径所有权。
|
|
352
438
|
|
|
353
|
-
|
|
439
|
+
### Deep
|
|
354
440
|
|
|
355
|
-
|
|
356
|
-
**Customer**:
|
|
357
|
-
下订单的个人或组织。
|
|
358
|
-
_Avoid_: Client, buyer, account
|
|
359
|
-
```
|
|
441
|
+
任一条件触发:公共 API、schema、wire format、数据迁移、认证授权、隐私、资金、不可逆操作、expand-contract、共享核心路径、多 Agent 复杂协作、多个实质架构方案或高事故半径。
|
|
360
442
|
|
|
361
|
-
|
|
443
|
+
额外要求:数据流或状态转换、兼容窗口、迁移顺序、可观测性、回滚、风险缓解、收缩条件和人工批准点。
|
|
362
444
|
|
|
363
|
-
|
|
445
|
+
## 2. Ticket Definition of Ready
|
|
364
446
|
|
|
365
|
-
|
|
447
|
+
Ticket 只有同时满足以下适用条件才可设置 `ready: true`:
|
|
366
448
|
|
|
367
|
-
|
|
449
|
+
- 外部行为和可观察产出明确;
|
|
450
|
+
- IN、REUSE、OUT 无冲突;
|
|
451
|
+
- 高影响决策已锁定;
|
|
452
|
+
- 没有会改变行为、接口、数据、兼容、安全、范围或验收的未决问题;
|
|
453
|
+
- 依赖存在且无循环;
|
|
454
|
+
- `writable_paths`、`read_only_paths` 和 `shared_paths` 使用项目根相对路径;
|
|
455
|
+
- shared path 有唯一 owner;
|
|
456
|
+
- 验收标准可判定;
|
|
457
|
+
- 验证矩阵覆盖正常、失败和回归风险,或有可信的不适用理由;
|
|
458
|
+
- Standard 或 Deep Ticket 有有序执行路线;
|
|
459
|
+
- Deep Ticket 有迁移、兼容、监控、回滚和批准点,或逐项说明不适用;
|
|
460
|
+
- 单个全新上下文可以完成,否则必须拆分。
|
|
368
461
|
|
|
369
|
-
|
|
462
|
+
详细检查位于 “拆分 Tickets 阶段的 Ticket Ready 检查”。
|
|
370
463
|
|
|
371
|
-
|
|
372
|
-
- **状态驱动。** 每个条目明确标记 `accepted`、`deferred` 或 `superseded`,让读者一眼知道当前有效性。
|
|
373
|
-
- **关联 ADR。** 如果该结论同时满足 ADR 的三个条件,在 LOG 中标注 `Related: ADR-XXXX`,并在对应 ADR 条目中也关联回 LOG。
|
|
374
|
-
- **保持可修订。** 后续决定改变既有结论时,直接更新原条目状态和正文,不要新建一条矛盾的条目。标注 `Superseded by: LOG-XXXX`。
|
|
375
|
-
- **不堆积废弃条目。** 被替代的条目保留但标记清楚;延后(deferred)的条目保留以便后续恢复讨论。
|
|
376
|
-
- **记录具体交互和边界。** 与 CONTEXT.md 的精炼不同,LOG.md 可以记录讨论中的具体场景、边界条件和交互细节。
|
|
464
|
+
## 3. Spec Readiness
|
|
377
465
|
|
|
378
|
-
|
|
466
|
+
`specdev/changes/{change}/spec.md` 只有在外部行为、范围、公共接口、数据、安全、兼容、迁移和验收合同不存在高影响未知项时,才可设置 `ready_for_tickets: true`。
|
|
379
467
|
|
|
380
|
-
|
|
381
|
-
# 设计决策日志
|
|
468
|
+
## 4. 假设规则
|
|
382
469
|
|
|
383
|
-
|
|
470
|
+
- 低影响、可逆的默认值可以作为显式假设继续;
|
|
471
|
+
- 高影响假设不得用于强行通过 Ready;
|
|
472
|
+
- 实现者发现假设不成立时,按 下方 `<deviation-control>` 标签 处理;
|
|
473
|
+
- 假设必须有适用范围和验证方式。
|
|
384
474
|
|
|
385
|
-
|
|
475
|
+
</readiness-and-depth>
|
|
386
476
|
|
|
387
|
-
-
|
|
388
|
-
- 已确认结论使用 `accepted`;暂不决定使用 `deferred`;被后续决定替代使用 `superseded`。
|
|
389
|
-
- 后续确认改变既有结论时,直接修订原日志条目,并记录替代关系,不保留互相矛盾的"现行规则"。
|
|
390
|
-
- 日志可以记录具体交互和边界;词汇表保持精炼;ADR 只记录难以逆转、令人意外且存在真实权衡的决定。
|
|
477
|
+
<deviation-control>
|
|
391
478
|
|
|
392
|
-
|
|
479
|
+
# 偏差控制
|
|
393
480
|
|
|
394
|
-
|
|
395
|
-
Related: ADR-0001
|
|
481
|
+
偏差是“当前事实或实现需要偏离已批准工件”的显式事件。偏差不是普通进度说明,也不能作为先改后补文档的许可证。
|
|
396
482
|
|
|
397
|
-
|
|
483
|
+
## 1. 偏差等级
|
|
398
484
|
|
|
399
|
-
|
|
485
|
+
- **local**:只改变局部实现,不改变 Ticket 的行为、范围、公共契约、路径所有权或验证;记录到 Evidence 后可继续。
|
|
486
|
+
- **ticket**:改变 Ticket 的执行路线、可写范围、局部契约或验收映射,但不改变 Spec;必须停止相关修改、更新 Ticket 并获得 owner 或 Lead 批准。
|
|
487
|
+
- **spec**:改变外部行为、范围、用户故事、验收合同或非功能要求;必须返回 “编写 Spec 阶段”。
|
|
488
|
+
- **architecture**:改变已接受架构决策或公共架构约束;必须返回 “设计访谈能力” 并更新 `specdev/changes/{change}/ADR.md`。
|
|
489
|
+
- **release**:改变迁移、兼容窗口、发布门禁、回滚或不可逆批准点;必须停止并获得明确人工批准。
|
|
400
490
|
|
|
401
|
-
|
|
491
|
+
## 2. 触发条件
|
|
402
492
|
|
|
403
|
-
|
|
493
|
+
以下任一情况必须建立偏差:
|
|
404
494
|
|
|
405
|
-
|
|
495
|
+
- 当前代码事实使批准路线不可行;
|
|
496
|
+
- 需要修改 Ticket 未授权的项目路径;
|
|
497
|
+
- 需要修改 shared path,但当前实现者不是 owner;
|
|
498
|
+
- 验证接缝无法证明验收合同;
|
|
499
|
+
- 发现新的安全、数据、兼容、性能或迁移风险;
|
|
500
|
+
- 依赖、合同或外部参考权威已变化;
|
|
501
|
+
- 实际行为将与 Spec 或 ADR 不一致。
|
|
406
502
|
|
|
407
|
-
|
|
408
|
-
Superseded by: LOG-0004
|
|
503
|
+
## 3. 偏差记录
|
|
409
504
|
|
|
410
|
-
{
|
|
411
|
-
```
|
|
505
|
+
偏差记录写入对应 Evidence:`specdev/changes/{change}/evidence/T-NN.md`,并至少包含:
|
|
412
506
|
|
|
413
|
-
|
|
507
|
+
- 偏差 ID 与等级;
|
|
508
|
+
- 触发事实和证据;
|
|
509
|
+
- 受影响工件与路径;
|
|
510
|
+
- 继续、回退、修订或拆分的选项;
|
|
511
|
+
- 推荐方案和风险;
|
|
512
|
+
- 批准人、批准时间和批准范围;
|
|
513
|
+
- 最终处理结果。
|
|
414
514
|
|
|
415
|
-
|
|
416
|
-
- **Status: deferred**——暂不决定,留待后续讨论。记录为什么暂不决定以及从什么角度恢复讨论,以便后续接续上下文。
|
|
417
|
-
- **Status: superseded**——被后续决定替代。标注 `Superseded by: LOG-XXXX` 指向替代条目。保留原条目作为设计演进的历史上下文。
|
|
515
|
+
需要改变上层工件时,Evidence 只记录事件;真正的权威变更必须写回对应 Spec、Ticket、ADR 或 Goal Plan。
|
|
418
516
|
|
|
419
|
-
##
|
|
517
|
+
## 4. 停止规则
|
|
420
518
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
4. 在文件末尾追加新条目
|
|
519
|
+
- 未批准的 ticket、spec、architecture 或 release 偏差不得继续实现。
|
|
520
|
+
- 不得通过扩大 `writable_paths`、删除测试、降低断言或把风险改写成“已知限制”来绕过停止。
|
|
521
|
+
- 偏差影响并发 Agent 时,Lead 必须暂停受影响 Wave,重新计算路径所有权、依赖和 Gate。
|
|
425
522
|
|
|
426
|
-
|
|
523
|
+
</deviation-control>
|
|
427
524
|
|
|
428
|
-
|
|
429
|
-
- **延后决定被重新讨论**——将状态从 `deferred` 改为 `accepted`,或新建条目替代原条目(原条目改为 `superseded`)。如果内容没有变化只是状态升级,可以直接改状态;如果结论发生了变化,使用替代模式。
|
|
430
|
-
- **补充细节**——直接编辑条目正文,不改变状态。可以追加更多场景、边界条件或交互细节。
|
|
431
|
-
- **关联 ADR**——如果后来为该日志创建了 ADR,补充 `Related: ADR-XXXX` 标注。
|
|
432
|
-
- **不要删除**——即使结论被替代,保留条目作为设计演进的历史上下文。
|
|
525
|
+
<research>
|
|
433
526
|
|
|
434
|
-
|
|
527
|
+
# SpecDev Research
|
|
435
528
|
|
|
436
|
-
|
|
529
|
+
## 触发
|
|
437
530
|
|
|
438
|
-
|
|
531
|
+
当外部 API、库版本、协议、法规、产品能力或最佳实践会改变设计/实现决策,且当前材料不足时使用。
|
|
439
532
|
|
|
440
|
-
|
|
441
|
-
## LOG-0005: accepted — 订单状态机使用三态模型
|
|
533
|
+
## 流程
|
|
442
534
|
|
|
443
|
-
|
|
535
|
+
1. 写清楚要支持的具体决策和停止条件。
|
|
536
|
+
2. 优先官方文档、规范、源代码、论文或维护者材料;技术问题优先一手来源。
|
|
537
|
+
3. 核对版本、发布日期、适用环境和已知限制。
|
|
538
|
+
4. 区分:来源明确事实、代码库事实、推断、建议。
|
|
539
|
+
5. 对关键结论至少交叉验证;来源冲突时并列呈现,不强行调和。
|
|
540
|
+
6. 记录摘要、证据、置信度、对 ADR/Spec/Ticket 的影响和仍未知项。
|
|
541
|
+
7. 长期有效且经实现验证后才可由 Archive 提升到永久 research。
|
|
542
|
+
|
|
543
|
+
## 输出模板
|
|
544
|
+
|
|
545
|
+
```markdown
|
|
546
|
+
# Research: <问题>
|
|
547
|
+
- 决策用途:
|
|
548
|
+
- 范围/版本:
|
|
549
|
+
- 停止条件:
|
|
550
|
+
|
|
551
|
+
## Findings
|
|
552
|
+
### R-001
|
|
553
|
+
- 结论:
|
|
554
|
+
- 类型:官方事实 / 代码事实 / 推断 / 建议
|
|
555
|
+
- 来源:
|
|
556
|
+
- 置信度:high / medium / low
|
|
557
|
+
- 适用限制:
|
|
558
|
+
- 对工件影响:
|
|
559
|
+
|
|
560
|
+
## Conflicts and Unknowns
|
|
561
|
+
## Recommendation
|
|
562
|
+
```
|
|
444
563
|
|
|
445
|
-
|
|
564
|
+
不得长篇复制受版权保护的来源;使用短引文和自己的准确摘要。
|
|
565
|
+
|
|
566
|
+
</research>
|
|
567
|
+
|
|
568
|
+
<config-template>
|
|
569
|
+
|
|
570
|
+
```json
|
|
571
|
+
{
|
|
572
|
+
"schema_version": 3,
|
|
573
|
+
"interaction_language": "zh-CN",
|
|
574
|
+
"artifact_language": "zh-CN",
|
|
575
|
+
"git": {
|
|
576
|
+
"auto_commit": false,
|
|
577
|
+
"default_branch": null,
|
|
578
|
+
"worktree_for_parallel": true
|
|
579
|
+
},
|
|
580
|
+
"execution": {
|
|
581
|
+
"max_parallel": 3,
|
|
582
|
+
"deep_ticket_human_approval": true,
|
|
583
|
+
"shared_path_owner": "lead"
|
|
584
|
+
},
|
|
585
|
+
"verification": {
|
|
586
|
+
"test": null,
|
|
587
|
+
"typecheck": null,
|
|
588
|
+
"lint": null,
|
|
589
|
+
"build": null
|
|
590
|
+
},
|
|
591
|
+
"planning": {
|
|
592
|
+
"default_depth": "standard",
|
|
593
|
+
"require_ready_gate": true,
|
|
594
|
+
"require_evidence": true
|
|
595
|
+
}
|
|
596
|
+
}
|
|
446
597
|
```
|
|
447
598
|
|
|
448
|
-
|
|
599
|
+
</config-template>
|
|
600
|
+
|
|
601
|
+
<config-schema>
|
|
602
|
+
|
|
603
|
+
```json
|
|
604
|
+
{
|
|
605
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
606
|
+
"$id": "urn:speculo:specdev:config:v3",
|
|
607
|
+
"title": "SpecDev Configuration",
|
|
608
|
+
"type": "object",
|
|
609
|
+
"required": ["schema_version", "interaction_language", "artifact_language", "git", "execution", "verification", "planning"],
|
|
610
|
+
"properties": {
|
|
611
|
+
"schema_version": {"const": 3},
|
|
612
|
+
"interaction_language": {"type": "string", "minLength": 1},
|
|
613
|
+
"artifact_language": {"type": "string", "minLength": 1},
|
|
614
|
+
"git": {
|
|
615
|
+
"type": "object",
|
|
616
|
+
"required": ["auto_commit", "default_branch", "worktree_for_parallel"],
|
|
617
|
+
"properties": {
|
|
618
|
+
"auto_commit": {"type": "boolean"},
|
|
619
|
+
"default_branch": {"type": ["string", "null"]},
|
|
620
|
+
"worktree_for_parallel": {"type": "boolean"}
|
|
621
|
+
},
|
|
622
|
+
"additionalProperties": true
|
|
623
|
+
},
|
|
624
|
+
"execution": {
|
|
625
|
+
"type": "object",
|
|
626
|
+
"required": ["max_parallel", "deep_ticket_human_approval", "shared_path_owner"],
|
|
627
|
+
"properties": {
|
|
628
|
+
"max_parallel": {"type": "integer", "minimum": 1},
|
|
629
|
+
"deep_ticket_human_approval": {"type": "boolean"},
|
|
630
|
+
"shared_path_owner": {"type": "string", "minLength": 1}
|
|
631
|
+
},
|
|
632
|
+
"additionalProperties": true
|
|
633
|
+
},
|
|
634
|
+
"verification": {
|
|
635
|
+
"type": "object",
|
|
636
|
+
"required": ["test", "typecheck", "lint", "build"],
|
|
637
|
+
"properties": {
|
|
638
|
+
"test": {"type": ["string", "null"]},
|
|
639
|
+
"typecheck": {"type": ["string", "null"]},
|
|
640
|
+
"lint": {"type": ["string", "null"]},
|
|
641
|
+
"build": {"type": ["string", "null"]}
|
|
642
|
+
},
|
|
643
|
+
"additionalProperties": true
|
|
644
|
+
},
|
|
645
|
+
"planning": {
|
|
646
|
+
"type": "object",
|
|
647
|
+
"required": ["default_depth", "require_ready_gate", "require_evidence"],
|
|
648
|
+
"properties": {
|
|
649
|
+
"default_depth": {"enum": ["lite", "standard", "deep"]},
|
|
650
|
+
"require_ready_gate": {"type": "boolean"},
|
|
651
|
+
"require_evidence": {"type": "boolean"}
|
|
652
|
+
},
|
|
653
|
+
"additionalProperties": true
|
|
654
|
+
}
|
|
655
|
+
},
|
|
656
|
+
"additionalProperties": true
|
|
657
|
+
}
|
|
658
|
+
```
|
|
449
659
|
|
|
450
|
-
|
|
451
|
-
## LOG-0005: superseded — 订单状态机使用三态模型
|
|
660
|
+
</config-schema>
|
|
452
661
|
|
|
453
|
-
|
|
454
|
-
Superseded by: LOG-0007
|
|
662
|
+
<status-template>
|
|
455
663
|
|
|
456
|
-
|
|
664
|
+
```json
|
|
665
|
+
{
|
|
666
|
+
"schema_version": 3,
|
|
667
|
+
"workflow": "specdev",
|
|
668
|
+
"active": [],
|
|
669
|
+
"work_history": [],
|
|
670
|
+
"completed": []
|
|
671
|
+
}
|
|
672
|
+
```
|
|
457
673
|
|
|
458
|
-
|
|
674
|
+
</status-template>
|
|
675
|
+
|
|
676
|
+
<status-schema>
|
|
677
|
+
|
|
678
|
+
```json
|
|
679
|
+
{
|
|
680
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
681
|
+
"$id": "urn:speculo:specdev:status:v3",
|
|
682
|
+
"title": "SpecDev Global Status",
|
|
683
|
+
"type": "object",
|
|
684
|
+
"required": [
|
|
685
|
+
"schema_version",
|
|
686
|
+
"workflow",
|
|
687
|
+
"active",
|
|
688
|
+
"work_history",
|
|
689
|
+
"completed"
|
|
690
|
+
],
|
|
691
|
+
"properties": {
|
|
692
|
+
"schema_version": {
|
|
693
|
+
"const": 3
|
|
694
|
+
},
|
|
695
|
+
"workflow": {
|
|
696
|
+
"const": "specdev"
|
|
697
|
+
},
|
|
698
|
+
"active": {
|
|
699
|
+
"type": "array",
|
|
700
|
+
"items": {
|
|
701
|
+
"type": "object",
|
|
702
|
+
"required": [
|
|
703
|
+
"change",
|
|
704
|
+
"current_work",
|
|
705
|
+
"works_run",
|
|
706
|
+
"result"
|
|
707
|
+
],
|
|
708
|
+
"properties": {
|
|
709
|
+
"change": {
|
|
710
|
+
"type": "string"
|
|
711
|
+
},
|
|
712
|
+
"current_work": {
|
|
713
|
+
"type": [
|
|
714
|
+
"string",
|
|
715
|
+
"null"
|
|
716
|
+
]
|
|
717
|
+
},
|
|
718
|
+
"works_run": {
|
|
719
|
+
"type": "array",
|
|
720
|
+
"items": {
|
|
721
|
+
"type": "string"
|
|
722
|
+
}
|
|
723
|
+
},
|
|
724
|
+
"result": {
|
|
725
|
+
"type": [
|
|
726
|
+
"string",
|
|
727
|
+
"null"
|
|
728
|
+
]
|
|
729
|
+
},
|
|
730
|
+
"claimed_investigations": {
|
|
731
|
+
"type": "array",
|
|
732
|
+
"items": {
|
|
733
|
+
"type": "object",
|
|
734
|
+
"required": [
|
|
735
|
+
"id",
|
|
736
|
+
"owner",
|
|
737
|
+
"claimed_at"
|
|
738
|
+
],
|
|
739
|
+
"properties": {
|
|
740
|
+
"id": {
|
|
741
|
+
"type": "string"
|
|
742
|
+
},
|
|
743
|
+
"owner": {
|
|
744
|
+
"type": "string"
|
|
745
|
+
},
|
|
746
|
+
"session": {
|
|
747
|
+
"type": [
|
|
748
|
+
"string",
|
|
749
|
+
"null"
|
|
750
|
+
]
|
|
751
|
+
},
|
|
752
|
+
"claimed_at": {
|
|
753
|
+
"type": "string"
|
|
754
|
+
}
|
|
755
|
+
},
|
|
756
|
+
"additionalProperties": true
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
},
|
|
760
|
+
"additionalProperties": true
|
|
761
|
+
}
|
|
762
|
+
},
|
|
763
|
+
"work_history": {
|
|
764
|
+
"type": "array",
|
|
765
|
+
"items": {
|
|
766
|
+
"type": "object",
|
|
767
|
+
"required": [
|
|
768
|
+
"change",
|
|
769
|
+
"work_id",
|
|
770
|
+
"started_at",
|
|
771
|
+
"completed_at",
|
|
772
|
+
"result"
|
|
773
|
+
],
|
|
774
|
+
"properties": {
|
|
775
|
+
"change": {
|
|
776
|
+
"type": "string"
|
|
777
|
+
},
|
|
778
|
+
"work_id": {
|
|
779
|
+
"type": "string",
|
|
780
|
+
"pattern": "^specdev/"
|
|
781
|
+
},
|
|
782
|
+
"started_at": {
|
|
783
|
+
"type": "string"
|
|
784
|
+
},
|
|
785
|
+
"completed_at": {
|
|
786
|
+
"type": [
|
|
787
|
+
"string",
|
|
788
|
+
"null"
|
|
789
|
+
]
|
|
790
|
+
},
|
|
791
|
+
"result": {
|
|
792
|
+
"type": [
|
|
793
|
+
"string",
|
|
794
|
+
"null"
|
|
795
|
+
]
|
|
796
|
+
}
|
|
797
|
+
},
|
|
798
|
+
"additionalProperties": true
|
|
799
|
+
}
|
|
800
|
+
},
|
|
801
|
+
"completed": {
|
|
802
|
+
"type": "array",
|
|
803
|
+
"items": {
|
|
804
|
+
"type": "object",
|
|
805
|
+
"required": [
|
|
806
|
+
"change",
|
|
807
|
+
"archived_at",
|
|
808
|
+
"archive_path"
|
|
809
|
+
],
|
|
810
|
+
"properties": {
|
|
811
|
+
"change": {
|
|
812
|
+
"type": "string"
|
|
813
|
+
},
|
|
814
|
+
"archived_at": {
|
|
815
|
+
"type": "string"
|
|
816
|
+
},
|
|
817
|
+
"archive_path": {
|
|
818
|
+
"type": "string",
|
|
819
|
+
"pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
|
|
820
|
+
}
|
|
821
|
+
},
|
|
822
|
+
"additionalProperties": true
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
},
|
|
826
|
+
"additionalProperties": true
|
|
827
|
+
}
|
|
828
|
+
```
|
|
459
829
|
|
|
460
|
-
|
|
830
|
+
</status-schema>
|
|
831
|
+
|
|
832
|
+
<change-status-template>
|
|
833
|
+
|
|
834
|
+
```json
|
|
835
|
+
{
|
|
836
|
+
"schema_version": 3,
|
|
837
|
+
"artifact": "change-status",
|
|
838
|
+
"change": "<YYYY-MM-DD-topic>",
|
|
839
|
+
"change_status": "active",
|
|
840
|
+
"current_work": null,
|
|
841
|
+
"created_at": "<ISO-8601>",
|
|
842
|
+
"updated_at": "<ISO-8601>",
|
|
843
|
+
"completed_at": null,
|
|
844
|
+
"archived": false,
|
|
845
|
+
"archive_path": null,
|
|
846
|
+
"blockers": [],
|
|
847
|
+
"deviations": [],
|
|
848
|
+
"worktrees": []
|
|
849
|
+
}
|
|
850
|
+
```
|
|
461
851
|
|
|
462
|
-
|
|
463
|
-
|
|
852
|
+
</change-status-template>
|
|
853
|
+
|
|
854
|
+
<change-status-schema>
|
|
855
|
+
|
|
856
|
+
```json
|
|
857
|
+
{
|
|
858
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
859
|
+
"$id": "urn:speculo:specdev:change-status:v3",
|
|
860
|
+
"title": "SpecDev Change Status",
|
|
861
|
+
"type": "object",
|
|
862
|
+
"required": [
|
|
863
|
+
"schema_version",
|
|
864
|
+
"artifact",
|
|
865
|
+
"change",
|
|
866
|
+
"change_status",
|
|
867
|
+
"current_work",
|
|
868
|
+
"created_at",
|
|
869
|
+
"updated_at",
|
|
870
|
+
"completed_at",
|
|
871
|
+
"archived",
|
|
872
|
+
"archive_path",
|
|
873
|
+
"blockers",
|
|
874
|
+
"deviations"
|
|
875
|
+
],
|
|
876
|
+
"properties": {
|
|
877
|
+
"schema_version": {
|
|
878
|
+
"const": 3
|
|
879
|
+
},
|
|
880
|
+
"artifact": {
|
|
881
|
+
"const": "change-status"
|
|
882
|
+
},
|
|
883
|
+
"change": {
|
|
884
|
+
"type": "string",
|
|
885
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
886
|
+
},
|
|
887
|
+
"change_status": {
|
|
888
|
+
"enum": [
|
|
889
|
+
"active",
|
|
890
|
+
"blocked",
|
|
891
|
+
"completed",
|
|
892
|
+
"archived"
|
|
893
|
+
]
|
|
894
|
+
},
|
|
895
|
+
"current_work": {
|
|
896
|
+
"type": [
|
|
897
|
+
"string",
|
|
898
|
+
"null"
|
|
899
|
+
]
|
|
900
|
+
},
|
|
901
|
+
"created_at": {
|
|
902
|
+
"type": "string",
|
|
903
|
+
"minLength": 1
|
|
904
|
+
},
|
|
905
|
+
"updated_at": {
|
|
906
|
+
"type": "string",
|
|
907
|
+
"minLength": 1
|
|
908
|
+
},
|
|
909
|
+
"completed_at": {
|
|
910
|
+
"type": [
|
|
911
|
+
"string",
|
|
912
|
+
"null"
|
|
913
|
+
]
|
|
914
|
+
},
|
|
915
|
+
"archived": {
|
|
916
|
+
"type": "boolean"
|
|
917
|
+
},
|
|
918
|
+
"archive_path": {
|
|
919
|
+
"anyOf": [
|
|
920
|
+
{
|
|
921
|
+
"type": "null"
|
|
922
|
+
},
|
|
923
|
+
{
|
|
924
|
+
"type": "string",
|
|
925
|
+
"pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
|
|
926
|
+
}
|
|
927
|
+
]
|
|
928
|
+
},
|
|
929
|
+
"blockers": {
|
|
930
|
+
"type": "array",
|
|
931
|
+
"items": {
|
|
932
|
+
"type": "string"
|
|
933
|
+
}
|
|
934
|
+
},
|
|
935
|
+
"deviations": {
|
|
936
|
+
"type": "array",
|
|
937
|
+
"items": {
|
|
938
|
+
"type": "string"
|
|
939
|
+
}
|
|
940
|
+
},
|
|
941
|
+
"worktrees": {
|
|
942
|
+
"type": "array",
|
|
943
|
+
"items": {
|
|
944
|
+
"type": "object",
|
|
945
|
+
"required": [
|
|
946
|
+
"ticket_id",
|
|
947
|
+
"owner",
|
|
948
|
+
"provider",
|
|
949
|
+
"base_sha",
|
|
950
|
+
"branch",
|
|
951
|
+
"workspace_ref",
|
|
952
|
+
"status",
|
|
953
|
+
"updated_at"
|
|
954
|
+
],
|
|
955
|
+
"properties": {
|
|
956
|
+
"ticket_id": {
|
|
957
|
+
"type": "string",
|
|
958
|
+
"pattern": "^T-[0-9]{2,}$"
|
|
959
|
+
},
|
|
960
|
+
"owner": {
|
|
961
|
+
"type": "string",
|
|
962
|
+
"minLength": 1
|
|
963
|
+
},
|
|
964
|
+
"provider": {
|
|
965
|
+
"enum": [
|
|
966
|
+
"native",
|
|
967
|
+
"git",
|
|
968
|
+
"external"
|
|
969
|
+
]
|
|
970
|
+
},
|
|
971
|
+
"base_sha": {
|
|
972
|
+
"type": "string",
|
|
973
|
+
"minLength": 1
|
|
974
|
+
},
|
|
975
|
+
"branch": {
|
|
976
|
+
"type": "string",
|
|
977
|
+
"minLength": 1
|
|
978
|
+
},
|
|
979
|
+
"workspace_ref": {
|
|
980
|
+
"type": "string",
|
|
981
|
+
"minLength": 1,
|
|
982
|
+
"pattern": "^(?!/)(?![A-Za-z]:[\\\\/]).+"
|
|
983
|
+
},
|
|
984
|
+
"status": {
|
|
985
|
+
"enum": [
|
|
986
|
+
"planned",
|
|
987
|
+
"active",
|
|
988
|
+
"review",
|
|
989
|
+
"integrated",
|
|
990
|
+
"removed",
|
|
991
|
+
"blocked"
|
|
992
|
+
]
|
|
993
|
+
},
|
|
994
|
+
"updated_at": {
|
|
995
|
+
"type": "string",
|
|
996
|
+
"minLength": 1
|
|
997
|
+
}
|
|
998
|
+
},
|
|
999
|
+
"additionalProperties": true
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
},
|
|
1003
|
+
"allOf": [
|
|
1004
|
+
{
|
|
1005
|
+
"if": {
|
|
1006
|
+
"properties": {
|
|
1007
|
+
"change_status": {
|
|
1008
|
+
"const": "archived"
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
},
|
|
1012
|
+
"then": {
|
|
1013
|
+
"properties": {
|
|
1014
|
+
"archived": {
|
|
1015
|
+
"const": true
|
|
1016
|
+
},
|
|
1017
|
+
"archive_path": {
|
|
1018
|
+
"type": "string",
|
|
1019
|
+
"pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
],
|
|
1025
|
+
"additionalProperties": true
|
|
1026
|
+
}
|
|
464
1027
|
```
|
|
465
1028
|
|
|
466
|
-
</
|
|
1029
|
+
</change-status-schema>
|