@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
|
@@ -3,57 +3,127 @@ id: specdev/grill-with-docs
|
|
|
3
3
|
type: workflow-entry
|
|
4
4
|
workflow: specdev
|
|
5
5
|
name: 设计访谈(带文档)
|
|
6
|
-
description:
|
|
7
|
-
keywords: [
|
|
6
|
+
description: 通过一次一问的设计访谈打磨方案,同时持续维护设计日志、领域上下文和架构决策。
|
|
7
|
+
keywords: [设计访谈, ADR, LOG, CONTEXT, 决策, 领域建模]
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# 设计访谈(带文档)
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
本 work 保留原有的 grilling 访谈与 domain-modeling 双重能力:访谈负责沿决策树逐分支达成共识,领域建模负责在决策结晶时同步维护设计轨迹、术语与架构决策。未经用户确认,不进入实现。
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
## 输入与权威
|
|
15
|
+
|
|
16
|
+
开始前按需读取:
|
|
17
|
+
|
|
18
|
+
- 全局配置:`<Path>{roots.state}/specdev/config.json</Path>`
|
|
19
|
+
- 永久架构决策:`<Path>{roots.state}/specdev/adr/</Path>`
|
|
20
|
+
- 永久领域上下文:`<Path>{roots.state}/specdev/context/</Path>`
|
|
21
|
+
- 原始请求:`<Path>{roots.state}/specdev/changes/{change}/source-issue.md</Path>`
|
|
22
|
+
- 分诊结果:`<Path>{roots.state}/specdev/changes/{change}/triage.md</Path>`
|
|
23
|
+
- Bug 诊断:`<Path>{roots.state}/specdev/changes/{change}/diagnosis.md</Path>`
|
|
24
|
+
- 当前 Spec(如已存在):`<Path>{roots.state}/specdev/changes/{change}/spec.md</Path>`
|
|
25
|
+
- 工件职责规则:`<Path>{roots.workflows}/specdev/common/rules/artifact-contract.md</Path>`
|
|
26
|
+
- 规划原则:`<Path>{roots.workflows}/specdev/common/rules/planning-principles.md</Path>`
|
|
27
|
+
|
|
28
|
+
不存在的可选输入静默跳过,不把缺失文件伪装成已知事实。
|
|
15
29
|
|
|
16
30
|
## 流程
|
|
17
31
|
|
|
18
|
-
### 1.
|
|
32
|
+
### 1. 启动或恢复 change
|
|
19
33
|
|
|
20
|
-
|
|
34
|
+
创建或恢复 `<Path>{roots.state}/specdev/changes/{change}/</Path>`,其中 `{change}` 使用 `<YYYY-MM-DD>-<topic>`。
|
|
21
35
|
|
|
22
|
-
|
|
23
|
-
- `<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>` — 架构决策记录,仅含 `# 架构决策记录` 标题
|
|
24
|
-
- `<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>` — 设计决策日志,含 `# 设计决策日志` 标题及维护规则说明
|
|
25
|
-
- `<Path>{roots.state}/specdev/changes/{change}/CONTEXT.md</Path>` — 领域词汇表,含 `# {主题} 领域词汇表` 标题及一两句描述
|
|
36
|
+
首次启动时创建:
|
|
26
37
|
|
|
27
|
-
|
|
38
|
+
- 生命周期状态:`<Path>{roots.state}/specdev/changes/{change}/.status.json</Path>`(首次创建时使用 `<Path>{roots.workflows}/specdev/I-init-setup/change-status-template.json</Path>`)
|
|
39
|
+
- 架构决策:`<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>`
|
|
40
|
+
- 设计日志:`<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>`
|
|
41
|
+
- 领域上下文:`<Path>{roots.state}/specdev/changes/{change}/CONTEXT.md</Path>`
|
|
28
42
|
|
|
29
|
-
|
|
43
|
+
创建和更新格式分别遵循:
|
|
30
44
|
|
|
31
|
-
|
|
45
|
+
- `<Path>{roots.workflows}/specdev/G-grill-with-docs/adr-format.md</Path>`
|
|
46
|
+
- `<Path>{roots.workflows}/specdev/G-grill-with-docs/log-format.md</Path>`
|
|
47
|
+
- `<Path>{roots.workflows}/specdev/G-grill-with-docs/context-format.md</Path>`
|
|
32
48
|
|
|
33
|
-
|
|
49
|
+
恢复已有 change 时必须先读取现有三份文档,避免重复询问已经确认的问题。
|
|
34
50
|
|
|
35
|
-
|
|
51
|
+
**完成标准**:change 目录、生命周期状态和三份设计文档均可读取;已知结论与未决问题已建立初始摘要。
|
|
36
52
|
|
|
37
|
-
###
|
|
53
|
+
### 2. 探索可发现事实
|
|
38
54
|
|
|
39
|
-
|
|
55
|
+
在提问前只读探索相关代码、配置、接口、schema、测试、历史 ADR 和相邻实现。将未知项分为:
|
|
40
56
|
|
|
41
|
-
|
|
57
|
+
- 可发现事实:继续探索,不询问用户;
|
|
58
|
+
- 高影响偏好或取舍:进入访谈;
|
|
59
|
+
- 低影响实现细节:记录为实现者可自行决定,不升级为产品决策。
|
|
42
60
|
|
|
43
|
-
|
|
61
|
+
若涉及不熟悉的外部技术、第三方 API、标准或版本行为,调用 `<Path>{roots.workflows}/specdev/common/skills/research/SKILL.md</Path>`,并把研究结论的来源和置信度写入 `<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>`。
|
|
44
62
|
|
|
45
|
-
|
|
63
|
+
### 3. 一次一问的设计访谈
|
|
46
64
|
|
|
47
|
-
|
|
65
|
+
加载 `<Path>{roots.workflows}/specdev/G-grill-with-docs/grilling-protocol.md</Path>`。每轮只处理一个会实质改变设计的问题:
|
|
48
66
|
|
|
49
|
-
|
|
67
|
+
1. 陈述已知事实与证据;
|
|
68
|
+
2. 提出唯一关键问题;
|
|
69
|
+
3. 给出 2–4 个真实选项、权衡和推荐默认值;
|
|
70
|
+
4. 等待用户确认、拒绝或延后;
|
|
71
|
+
5. 将结果立即追加到 `<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>`。
|
|
72
|
+
|
|
73
|
+
不得把多个独立决策塞进同一个问题;不得为了填模板询问不会改变方案的细节;不得在用户尚未确认前执行实现。
|
|
74
|
+
|
|
75
|
+
**完成标准**:决策树已覆盖目标、角色、范围、主要流程、状态与失败、数据与接口、兼容与迁移、安全与隐私、性能与可观测性、验证与验收等适用分支。
|
|
76
|
+
|
|
77
|
+
### 4. 同步领域文档
|
|
78
|
+
|
|
79
|
+
加载 `<Path>{roots.workflows}/specdev/G-grill-with-docs/domain-modeling-rules.md</Path>`,按固定顺序同步:
|
|
80
|
+
|
|
81
|
+
1. 先把所有确认、延后、拒绝和替代结论写入 `<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>`;
|
|
82
|
+
2. 再把当前仍真实的术语、不变量、示例、反例和代码映射写入 `<Path>{roots.state}/specdev/changes/{change}/CONTEXT.md</Path>`;
|
|
83
|
+
3. 最后把满足 ADR 条件的长期架构决策写入 `<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>`。
|
|
84
|
+
|
|
85
|
+
历史轨迹不得写入领域上下文;尚未确认的选项不得写成已接受 ADR;已有 ADR 被替代时必须建立 supersedes 链,不重写历史。
|
|
86
|
+
|
|
87
|
+
### 5. 收敛与就绪判断
|
|
50
88
|
|
|
51
|
-
|
|
89
|
+
访谈结束时必须能明确:
|
|
90
|
+
|
|
91
|
+
- 目标、目标用户、成功标准;
|
|
92
|
+
- IN、REUSE、OUT;
|
|
93
|
+
- 主要行为路径、失败行为与状态转换;
|
|
94
|
+
- 公共接口、数据、不变量、兼容和迁移影响;
|
|
95
|
+
- 安全、隐私、性能、可靠性和可观测性要求;
|
|
96
|
+
- 验证接缝和可观察验收方式;
|
|
97
|
+
- 剩余未知项及其影响。
|
|
98
|
+
|
|
99
|
+
仍存在会改变外部行为、范围、公共接口、数据、安全、兼容、迁移或验收的未决问题时,将 `<Path>{roots.state}/specdev/changes/{change}/.status.json</Path>` 标为 `blocked` 或保持 `active`,不得伪装为 Ready。
|
|
100
|
+
|
|
101
|
+
### 6. 停止与路由
|
|
102
|
+
|
|
103
|
+
向用户汇报三份文档的新增/修改条目、已锁定决策、延后事项和风险。根据成熟度明确给出下一步:
|
|
104
|
+
|
|
105
|
+
- 通常进入 `<Path>{roots.workflows}/specdev/S-spec/S-spec.md</Path>`;
|
|
106
|
+
- 外部行为已经完全明确时可进入 `<Path>{roots.workflows}/specdev/T-tickets/T-tickets.md</Path>`;
|
|
107
|
+
- 极小、局部且已经具备批准执行契约的工作,可在用户确认后进入 `<Path>{roots.workflows}/specdev/I-implement/I-implement.md</Path>`;
|
|
108
|
+
- 路径或关键事实仍未知时进入 `<Path>{roots.workflows}/specdev/W-wayfinder/W-wayfinder.md</Path>`。
|
|
109
|
+
|
|
110
|
+
同步 `<Path>{roots.state}/specdev/status.json</Path>` 的 `current_work`、`work_history` 和当前 change 状态,返回三份权威工件及下一 Work 的完整路径。
|
|
111
|
+
|
|
112
|
+
不得在本 work 中自动读取实现源码并开始修改代码。
|
|
113
|
+
|
|
114
|
+
## 完成标准
|
|
115
|
+
|
|
116
|
+
- `<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>` 已记录全部设计结论和状态变化;
|
|
117
|
+
- `<Path>{roots.state}/specdev/changes/{change}/CONTEXT.md</Path>` 只包含当前领域真相;
|
|
118
|
+
- `<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>` 只包含满足条件的架构决策;
|
|
119
|
+
- 高影响未决问题已关闭或明确标记为阻塞;
|
|
120
|
+
- 状态、权威工件和下一 Work 路径已返回;
|
|
121
|
+
- 下一 work 已明确,但未自动执行实现。
|
|
122
|
+
|
|
123
|
+
## 子文件引用
|
|
52
124
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
| `<Path>{roots.workflows}/specdev/G-grill-with-docs/context-format.md</Path>` | 需要增删改术语时加载——CONTEXT.md 结构、定义规则、增删改操作说明 |
|
|
59
|
-
| `<Path>{roots.workflows}/specdev/G-grill-with-docs/log-format.md</Path>` | 需要记录设计结论时加载——LOG.md 格式、状态标记、编号规则、追加与修订规程 |
|
|
125
|
+
- 访谈协议:`<Path>{roots.workflows}/specdev/G-grill-with-docs/grilling-protocol.md</Path>`
|
|
126
|
+
- 领域建模规则:`<Path>{roots.workflows}/specdev/G-grill-with-docs/domain-modeling-rules.md</Path>`
|
|
127
|
+
- ADR 格式:`<Path>{roots.workflows}/specdev/G-grill-with-docs/adr-format.md</Path>`
|
|
128
|
+
- 领域上下文格式:`<Path>{roots.workflows}/specdev/G-grill-with-docs/context-format.md</Path>`
|
|
129
|
+
- 设计日志格式:`<Path>{roots.workflows}/specdev/G-grill-with-docs/log-format.md</Path>`
|
|
@@ -1,79 +1,24 @@
|
|
|
1
|
-
# ADR
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
---
|
|
1
|
+
# ADR 格式
|
|
2
|
+
|
|
3
|
+
只有同时满足“影响多个实现点、存在实质替代方案、结论预计长期有效”时才写 ADR。局部且可逆的实现选择留在 Ticket,不把 ADR 变成日常日志。
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
## ADR-###: <标题>
|
|
7
|
+
- **状态:** proposed / accepted / superseded / deprecated
|
|
8
|
+
- **日期:**
|
|
9
|
+
- **决策范围:** 哪些系统、接口或工件受约束
|
|
10
|
+
- **来源:** LOG-### / 用户结论 / 外部规范
|
|
11
|
+
- **上下文:** 需要解决的长期张力,而非实现步骤
|
|
12
|
+
- **决策驱动:** 必须优化或保护的目标与约束
|
|
13
|
+
- **决策:** 清晰、可测试的规范性结论
|
|
14
|
+
- **替代方案:** 至少列出认真考虑过的可行方案
|
|
15
|
+
- **权衡理由:** 为什么选择当前方案
|
|
16
|
+
- **后果:** 正面 / 负面 / 新风险 / 组织影响
|
|
17
|
+
- **不变量与约束:** 下游 Spec、Ticket 和实现不得破坏的条件
|
|
18
|
+
- **验证方式:** 如何知道决策在真实系统中成立
|
|
19
|
+
- **迁移/采用:** 如适用
|
|
20
|
+
- **替代:** ADR-###(如适用)
|
|
21
|
+
- **被替代于:** ADR-###(如适用)
|
|
23
22
|
```
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
就这样。一个 ADR 条目可以就是一个段落。其价值在于记录*已经*做出了决策以及*为什么*——而不是填满各个部分。
|
|
28
|
-
|
|
29
|
-
## 追加新决策
|
|
30
|
-
|
|
31
|
-
1. 读取 `<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>`,找到最高现有编号
|
|
32
|
-
2. 编号加 1
|
|
33
|
-
3. 在文件末尾追加 `---` 分隔线和新条目
|
|
34
|
-
|
|
35
|
-
## 可选附加元素
|
|
36
|
-
|
|
37
|
-
仅当它们真正增加价值时才包含这些。大多数 ADR 不需要它们:
|
|
38
|
-
|
|
39
|
-
- **日期**——在标题行的 `{标题}` 后面加 `(YYYY-MM-DD)`
|
|
40
|
-
- **Status**——`**Status**: proposed | accepted | deprecated | superseded by ADR-NNNN`。当决策被重新审视时,直接修改状态标记
|
|
41
|
-
- **Considered Options**——仅当被拒绝的替代方案值得记住时
|
|
42
|
-
- **Consequences**——仅当需要指出非显而易见的下游影响时
|
|
43
|
-
|
|
44
|
-
### 带可选元素的示例
|
|
45
|
-
|
|
46
|
-
```md
|
|
47
|
-
## 0003: 写模型采用事件溯源(2025-03-15)
|
|
48
|
-
|
|
49
|
-
**Status**: accepted
|
|
50
|
-
|
|
51
|
-
Order 聚合需要完整的变更历史用于审计和补偿。我们选择事件溯源——
|
|
52
|
-
所有状态变更作为不可变事件存储,当前状态从中投影。
|
|
53
|
-
|
|
54
|
-
**Considered Options**:
|
|
55
|
-
- 事件溯源(已选)——天然审计日志,支持时间旅行调试
|
|
56
|
-
- CRUD + 审计表——更简单,但审计日志与业务逻辑解耦,容易不同步
|
|
57
|
-
- 仅 CRUD——无审计历史,不满足合规要求
|
|
58
|
-
|
|
59
|
-
**Consequences**:
|
|
60
|
-
- 写路径复杂度增加;读路径需要投影
|
|
61
|
-
- 事件 schema 演进需要显式版本策略
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## 修改已有决策
|
|
65
|
-
|
|
66
|
-
- **澄清或补充后果**——直接编辑条目正文
|
|
67
|
-
- **改变状态**——修改 `**Status**` 字段(如 accepted → deprecated)
|
|
68
|
-
- **废弃**——将状态改为 `deprecated`,如被新决策替代则加上 `superseded by ADR-NNNN`
|
|
69
|
-
- **不要删除**——即使决策被废弃,保留条目作为历史上下文
|
|
70
|
-
|
|
71
|
-
## 三条件检查
|
|
72
|
-
|
|
73
|
-
在创建 ADR 之前,确认以下三个条件同时为真:
|
|
74
|
-
|
|
75
|
-
1. **难以逆转**——以后改变主意的成本是实质性的。容易逆转的决策跳过——你反正会逆转的。
|
|
76
|
-
2. **没有上下文的话令人惊讶**——未来的读者会看着代码想"他们到底为什么这样做?"。不令人惊讶的决策没人会追问,不需要记录。
|
|
77
|
-
3. **真实权衡的结果**——确实存在替代方案,你基于特定原因选择了一个。没有真正的替代方案就没有可记录的,除了"我们做了显而易见的事"。
|
|
78
|
-
|
|
79
|
-
如果决策不满足全部三个条件,只记入 LOG.md,不追加 ADR。
|
|
24
|
+
一个 ADR 只表达一个决策。修改已接受决策时,新建 ADR 并建立 supersedes 链;不得重写历史来掩盖决策变化。
|
|
@@ -1,63 +1,37 @@
|
|
|
1
|
-
# CONTEXT
|
|
1
|
+
# CONTEXT 格式
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
CONTEXT 保存跨 change 可复用的领域语言、关系和不变量,不保存一次性任务计划。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
```markdown
|
|
6
|
+
# <主题> 领域上下文
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
- **Owner:**
|
|
9
|
+
- **最后核验:**
|
|
10
|
+
- **权威来源:** ADR / 代码 / 外部规范 / 用户确认
|
|
9
11
|
|
|
10
|
-
|
|
12
|
+
## 术语
|
|
13
|
+
### <规范术语>
|
|
14
|
+
- 定义:
|
|
15
|
+
- 边界:
|
|
16
|
+
- 示例:
|
|
17
|
+
- 反例:
|
|
18
|
+
- 不变量:
|
|
19
|
+
- 代码映射:<Path>src/example.ts</Path> / 无
|
|
20
|
+
- 别名与禁用词:
|
|
21
|
+
- 来源与最后核验:
|
|
11
22
|
|
|
12
|
-
##
|
|
23
|
+
## 概念关系
|
|
24
|
+
- 聚合、生命周期、依赖、拥有关系或状态转换
|
|
13
25
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
_Avoid_: Purchase, transaction
|
|
26
|
+
## 全局不变量
|
|
27
|
+
- 始终成立、可被验证且不属于单个 change 的规则
|
|
17
28
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
_Avoid_: Bill, payment request
|
|
29
|
+
## 当前实现映射
|
|
30
|
+
- 领域概念与模块、接口、存储或事件之间的对应
|
|
21
31
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
_Avoid_: Client, buyer, account
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## 规则
|
|
28
|
-
|
|
29
|
-
- **要有主见。** 当同一概念存在多个词时,选择最好的那个,并将其他的列在 `_Avoid_` 下。不要犹豫——明确选定一个规范术语。
|
|
30
|
-
- **定义保持精炼。** 最多一两句话。定义它是什么,而不是它做什么。术语的定义描述概念的本质,而非其行为或实现。
|
|
31
|
-
- **仅包含特定于该项目上下文的术语。** 通用的编程概念(超时、错误类型、工具模式)即使项目广泛使用也不属于这里。添加术语前自问:这是该上下文独有的概念,还是一个通用编程概念?只有前者才属于这里。
|
|
32
|
-
- **当自然形成聚类时,用子标题分组术语。** 如果所有术语属于一个单一的凝聚领域,扁平列表也可以。当术语数量超过 10 个时,几乎总能找到自然分组。
|
|
33
|
-
- **随时增删改。** 模型演进时,直接修改文件:添加新术语、删除废弃术语、修正定义、术语更名。不要堆积——保持词汇表精炼且反映当前模型。
|
|
34
|
-
|
|
35
|
-
## 增删改操作
|
|
36
|
-
|
|
37
|
-
### 新增术语
|
|
38
|
-
|
|
39
|
-
在合适的子标题下追加条目。如果现有子标题都不匹配,新建一个子标题。格式:
|
|
40
|
-
|
|
41
|
-
```md
|
|
42
|
-
**{术语名}**:
|
|
43
|
-
{定义}
|
|
44
|
-
_Avoid_: {避免使用的同义词,用逗号分隔}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### 修改术语
|
|
48
|
-
|
|
49
|
-
直接更新定义文本和 `_Avoid_` 列表。如果术语的含义已经变化,更新定义以反映当前理解。在 `_Avoid_` 中添加新出现的同义词,移除不再使用的同义词。
|
|
50
|
-
|
|
51
|
-
### 删除术语
|
|
52
|
-
|
|
53
|
-
移除整个条目(术语名、定义、`_Avoid_` 行)。如果术语已不再使用或已被其他术语替代,直接删除,不要保留废弃标记。词汇表只反映当前模型。
|
|
54
|
-
|
|
55
|
-
### 术语更名
|
|
56
|
-
|
|
57
|
-
删除旧条目,新增新条目。在 `_Avoid_` 中保留旧名称作为新术语的避免项——这样未来的读者能理解新旧术语的对应关系。例如,将 "Client" 更名为 "Customer":
|
|
32
|
+
## 当前实现差距
|
|
33
|
+
- 已知偏离、历史负担和待验证假设;不得伪装成已确认事实
|
|
58
34
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
下订单的个人或组织。
|
|
62
|
-
_Avoid_: Client, buyer, account
|
|
35
|
+
## 变更记录
|
|
36
|
+
- LOG-###:增加、修订或废弃了什么
|
|
63
37
|
```
|
|
@@ -1,83 +1,7 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 领域建模规则
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
| 文件 | 职责 | 维护方式 |
|
|
10
|
-
|------|------|----------|
|
|
11
|
-
| `<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>` | 完整设计轨迹——所有确认、延后、被替代的结论 | 持续增删改,条目可被后续决定修订 |
|
|
12
|
-
| `<Path>{roots.state}/specdev/changes/{change}/CONTEXT.md</Path>` | 精炼的规范词汇表——只保留当前有效的术语 | 增删改,保持精炼 |
|
|
13
|
-
| `<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>` | 难以逆转、令人意外、存在真实权衡的架构决策 | 只追加不删除,可标记废弃 |
|
|
14
|
-
|
|
15
|
-
## 对照词汇表挑战
|
|
16
|
-
|
|
17
|
-
当用户使用的术语与 `CONTEXT.md` 中的现有语言冲突时,立即指出。"你的词汇表将 'cancellation' 定义为 X,但你似乎指的是 Y——到底是哪个?"如果用户确认应修改词汇表,更新 `CONTEXT.md` 中的定义并追加日志。
|
|
18
|
-
|
|
19
|
-
## 精炼模糊语言
|
|
20
|
-
|
|
21
|
-
当用户使用含糊或重载的术语时,提出一个精确的规范术语。"你在说 'account'——你指的是 Customer 还是 User?它们是不同的东西。"在 `CONTEXT.md` 中为新术语添加条目,将模糊的同义词列入 `_Avoid_`。
|
|
22
|
-
|
|
23
|
-
## 讨论具体场景
|
|
24
|
-
|
|
25
|
-
当讨论领域关系时,用具体场景进行压力测试。发明探索边界情况的场景,迫使用户精确界定概念之间的边界。"你说订单可以部分取消——未取消的商品怎么办?它们还能发货吗?"
|
|
26
|
-
|
|
27
|
-
## 与代码交叉引用
|
|
28
|
-
|
|
29
|
-
当用户陈述某事如何工作时,检查代码是否一致。如果发现矛盾,指出来:"你的代码取消的是整个 Order,但你刚才说部分取消是可能的——哪个是正确的?"在日志中记录这种矛盾的发现和解决过程。
|
|
30
|
-
|
|
31
|
-
## 及时更新 LOG.md
|
|
32
|
-
|
|
33
|
-
当设计问答中形成任何结论时,当场更新 `LOG.md`。它是完整的设计轨迹——记录"当时讨论了什么、最终固定了什么行为以及对应哪个 ADR"。不要批量处理——发生时立即捕获。具体格式参见 `<Path>{roots.workflows}/specdev/G-grill-with-docs/log-format.md</Path>`。
|
|
34
|
-
|
|
35
|
-
### 日志条目格式
|
|
36
|
-
|
|
37
|
-
每条日志使用 `## LOG-XXXX: {标题}` 二级标题,编号从 `0001` 开始顺序递增。每个条目包含:
|
|
38
|
-
|
|
39
|
-
- **Status** — `accepted`(已确认)、`deferred`(暂不决定)、`superseded`(被后续决定替代)
|
|
40
|
-
- **Superseded by** — 如状态为 `superseded`,标注替代它的日志编号
|
|
41
|
-
- **Related** — 如该结论对应某个 ADR,标注 `Related: ADR-XXXX`
|
|
42
|
-
- **正文** — 背景、讨论的问题、做出的决定及原因,可以记录具体场景和交互细节
|
|
43
|
-
|
|
44
|
-
### 维护规则
|
|
45
|
-
|
|
46
|
-
完整维护规则(状态、修订、关联 ADR)见 `<Path>{roots.workflows}/specdev/G-grill-with-docs/log-format.md</Path>` 模板内的「维护规则」块;本文件只规定同步时机:每次完成设计问答后立即同步,不批量延后。
|
|
47
|
-
|
|
48
|
-
## 及时更新 CONTEXT.md
|
|
49
|
-
|
|
50
|
-
当术语确定时,当场更新 `CONTEXT.md`。不要批量处理——发生时立即捕获。具体格式参见 `<Path>{roots.workflows}/specdev/G-grill-with-docs/context-format.md</Path>`。
|
|
51
|
-
|
|
52
|
-
`CONTEXT.md` 应该完全不包含实现细节。不要将 `CONTEXT.md` 当作规范、草稿纸或实现决策的仓库。它只是词汇表,别无其他。
|
|
53
|
-
|
|
54
|
-
- **新增术语**:在合适的子标题下追加条目。
|
|
55
|
-
- **修改术语**:直接更新定义文本和 `_Avoid_` 列表。
|
|
56
|
-
- **删除术语**:移除整个条目。
|
|
57
|
-
- **术语更名**:删除旧条目,新增新条目。
|
|
58
|
-
|
|
59
|
-
## 谨慎更新 ADR.md
|
|
60
|
-
|
|
61
|
-
仅在以下三个条件全部满足时才向 `ADR.md` 追加一条决策记录:
|
|
62
|
-
|
|
63
|
-
1. **难以逆转**——以后改变主意的成本是实质性的
|
|
64
|
-
2. **没有上下文会令人惊讶**——未来的读者会疑惑"他们为什么这样做?"
|
|
65
|
-
3. **真实权衡的结果**——存在真正的替代方案,你出于特定原因选择了一个
|
|
66
|
-
|
|
67
|
-
如果缺少任何一个条件,跳过 ADR。具体格式参见 `<Path>{roots.workflows}/specdev/G-grill-with-docs/adr-format.md</Path>`。
|
|
68
|
-
|
|
69
|
-
`ADR.md` 中每个决策是一个 `## NNNN: {标题}` 二级标题,编号顺序递增,条目之间用 `---` 分隔。可以修改已有条目、标记废弃——但不要删除。
|
|
70
|
-
|
|
71
|
-
## 什么算 ADR
|
|
72
|
-
|
|
73
|
-
- **架构形态。** "我们使用 monorepo。" "写模型采用事件溯源,读模型投影到 Postgres。"
|
|
74
|
-
- **上下文间的集成模式。** "Ordering 和 Billing 通过领域事件通信,而非同步 HTTP。"
|
|
75
|
-
- **带来锁定效应的技术选择。** 数据库、消息总线、认证提供商、部署目标。不是每个库——只是那些需要花一个季度才能替换的。
|
|
76
|
-
- **边界和范围决策。** "客户数据由 Customer 上下文拥有;其他上下文仅通过 ID 引用它。"明确的"不做"和"要做"同样有价值。
|
|
77
|
-
- **有意偏离显而易见路径的决策。** "我们使用手动 SQL 而不是 ORM,因为 X。"任何合理读者会假设相反的情况。
|
|
78
|
-
- **代码中不可见的约束。** "由于合规要求,我们不能使用 AWS。" "由于合作伙伴 API 合同,响应时间必须低于 200ms。"
|
|
79
|
-
- **拒绝的原因不明显的被拒绝替代方案。** 如果你考虑了 GraphQL 而因微妙原因选择了 REST,记录下来——否则 6 个月后有人会再次建议 GraphQL。
|
|
80
|
-
|
|
81
|
-
## 三文件同步规则
|
|
82
|
-
|
|
83
|
-
访谈中每完成一轮设计问答,按顺序同步:LOG.md → CONTEXT.md → ADR.md。完整时机与触发条件见 `<Path>{roots.workflows}/specdev/G-grill-with-docs/grilling-protocol.md</Path>`「访谈中维护三文件」。
|
|
3
|
+
- 使用业务语言定义概念,避免用当前类名代替领域定义。
|
|
4
|
+
- 每个术语包含:定义、边界、示例、反例、相关不变量、代码映射。
|
|
5
|
+
- 同义词选择一个规范词,其余标别名;一词多义必须拆分。
|
|
6
|
+
- CONTEXT 描述当前真相;讨论历史只留在 LOG。
|
|
7
|
+
- 与代码不一致时同时记录“期望领域模型”和“当前实现差距”,不得假装已实现。
|
|
@@ -1,62 +1,45 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 设计访谈协议
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
目标是关闭会影响产品行为、架构边界、风险或验收的关键决策,不是把所有可能问题都问一遍。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 1. 开始前先发现事实
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
先读取代码、配置、测试、现有 Spec、ADR、CONTEXT 和 LOG。可从环境获得的事实不得转交给用户回答;只有偏好、风险承受度、业务取舍或互斥目标需要用户决策。
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## 2. 决策树
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
按风险和信息缺口覆盖,不机械提问:
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
1. 用户问题与成功状态;
|
|
14
|
+
2. 参与者、权限与主要流程;
|
|
15
|
+
3. 范围边界和明确非目标;
|
|
16
|
+
4. 状态、数据、不变量与失败模式;
|
|
17
|
+
5. 接口、兼容、迁移和发布;
|
|
18
|
+
6. 安全、隐私、性能、可观测性;
|
|
19
|
+
7. 验收与验证接缝。
|
|
14
20
|
|
|
15
|
-
|
|
21
|
+
## 3. 每轮只关闭一个关键决定
|
|
16
22
|
|
|
17
|
-
|
|
23
|
+
每轮格式:
|
|
18
24
|
|
|
19
|
-
|
|
25
|
+
1. **已知事实:** 简短说明当前共识和证据;
|
|
26
|
+
2. **唯一问题:** 不使用复合问题;
|
|
27
|
+
3. **可行选项:** 只列实质不同的方案;
|
|
28
|
+
4. **权衡:** 对范围、体验、架构、风险和未来成本的影响;
|
|
29
|
+
5. **推荐:** 明确给出默认建议及原因;
|
|
30
|
+
6. **用户结论:** confirmed / deferred / rejected;
|
|
31
|
+
7. **落盘:** 更新 LOG,并按需要更新 ADR 或 CONTEXT。
|
|
20
32
|
|
|
21
|
-
|
|
33
|
+
## 4. 记录规则
|
|
22
34
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
5. **边界场景** — 极端情况和异常如何处理?
|
|
35
|
+
- 所有已确认或显式延后的决策写入 `<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>`;
|
|
36
|
+
- 长期架构决策追加到 `<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>`;
|
|
37
|
+
- 稳定领域知识追加或合并到 `<Path>{roots.state}/specdev/changes/{change}/CONTEXT.md</Path>`;
|
|
38
|
+
- 不因追求“文档完整”而复制同一事实;工件冲突按 `<Path>{roots.workflows}/specdev/common/rules/artifact-contract.md</Path>` 裁决。
|
|
28
39
|
|
|
29
|
-
|
|
40
|
+
## 5. 停止条件
|
|
30
41
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
访谈中每完成一轮设计问答,按 `<Path>{roots.workflows}/specdev/G-grill-with-docs/domain-modeling-rules.md</Path>` 规定的顺序同步三个文件:
|
|
36
|
-
|
|
37
|
-
1. **LOG.md** 先更新——立即追加日志条目,记录本次讨论的结论
|
|
38
|
-
2. **CONTEXT.md** 随后更新——从日志中提取新术语或修正的术语定义
|
|
39
|
-
3. **ADR.md** 最后更新——检查是否需要追加满足三条件的架构决策
|
|
40
|
-
|
|
41
|
-
在访谈过程中,每当一个结论被确认、延后或被替代时,当场更新 `<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>`。不要等访谈结束再批量写入——发生时立即捕获。具体格式参见 `<Path>{roots.workflows}/specdev/G-grill-with-docs/log-format.md</Path>`。
|
|
42
|
-
|
|
43
|
-
写入三文件的时机:
|
|
44
|
-
|
|
45
|
-
- **结论被确认** — 用户明确同意某个设计决定时,立即追加一条 `accepted` 日志,随后检查是否需要新增/修改 CONTEXT 术语,最后检查是否满足三条件追加 ADR
|
|
46
|
-
- **决定被延后** — 用户说"先不定"或"后面再讨论"时,追加一条 `deferred` 日志,记录为什么暂不决定以及从什么角度恢复讨论
|
|
47
|
-
- **结论被替代** — 后续讨论推翻了之前的决定时,将原条目状态改为 `superseded`,标注 `Superseded by: LOG-XXXX`,再新建替代条目;同时检查 CONTEXT 和 ADR 是否需要对应更新
|
|
48
|
-
|
|
49
|
-
每次 LOG 更新后,立即检查 CONTEXT 和 ADR 是否需要同步更新。不要将 CONTEXT 和 ADR 的更新推迟到访谈结束后批量处理——与 LOG 一样在结论结晶的瞬间立即捕获。
|
|
50
|
-
|
|
51
|
-
## 访谈节奏
|
|
52
|
-
|
|
53
|
-
- **开场**:先理解用户想打磨的方案是什么。问清楚范围和目标,然后开始沿设计树推进。
|
|
54
|
-
- **推进**:每个回答后,识别下一个最关键的未解决问题。优先解决会阻塞其他决策的问题。
|
|
55
|
-
- **收束**:当设计树的主要分支都已遍历、且用户确认共识时,访谈结束。不要无限追问无关细节。
|
|
56
|
-
|
|
57
|
-
## 好的访谈问题范例
|
|
58
|
-
|
|
59
|
-
- "你把 X 称为 'account'——你指的是 Customer 还是 User?它们在代码中是不同的概念。我建议用 Customer,因为它更精确地描述了购买关系。"
|
|
60
|
-
- "你提到订单可以部分取消。未取消的商品怎么办——它们还能发货吗?我建议将它们标记为可发货状态,因为取消是针对商品行而非整个订单。"
|
|
61
|
-
- "你打算用事件溯源还是 CRUD?考虑到审计需求,我推荐事件溯源——虽然写路径更复杂,但天然支持完整审计日志。"
|
|
62
|
-
- "Ordering 和 Billing 之间你选择了同步 HTTP 调用。这意味着 Billing 挂了订单也创建不了。你确定要这种耦合?我建议用异步领域事件——订单创建后发出事件,Billing 异步消费。"
|
|
42
|
+
- 关键决策已关闭,足以进入 Spec;或
|
|
43
|
+
- 用户明确延后,且该延后不会伪装成 Ready;或
|
|
44
|
+
- 缺少外部信息,change 标 blocked;或
|
|
45
|
+
- 继续提问只会产生低影响实现细节,应交给 Ticket 或实现阶段决定。
|