@namewta/speculo 0.2.2 → 0.2.6
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 -15
- package/dist/src/index.js +72 -8
- package/dist/src/index.js.map +1 -1
- package/dist/src/migrate.js +8 -8
- package/dist/src/migrate.js.map +1 -1
- package/dist/src/workflows.js +2 -2
- package/dist/src/workflows.js.map +1 -1
- package/package.json +1 -1
- package/template/.speculo/README.md +3 -3
- package/template/AGENTS.md +4 -0
- package/template/CLAUDE.md +3 -0
- package/template/canonical/README.md +114 -0
- package/template/canonical/canonical-domain-modeling.md +289 -0
- package/template/canonical/canonical-skill-example.md +608 -0
- package/template/canonical/canonical-teach.md +296 -0
- package/template/commands/archive-and-consolidate.md +49 -0
- package/template/commands/docs-sync.md +2 -2
- package/template/commands/retro.md +9 -7
- package/template/commands/status.md +2 -2
- package/template/skills/archive-and-consolidate/SKILL.md +179 -0
- package/template/skills/archive-and-consolidate/assets/archive-plan-template.md +34 -0
- package/template/skills/archive-and-consolidate/assets/cleanup-candidate-template.md +69 -0
- package/template/skills/archive-and-consolidate/assets/consolidation-plan-template.md +67 -0
- package/template/skills/archive-and-consolidate/references/archive-rules.md +48 -0
- package/template/skills/archive-and-consolidate/references/cleanup-rules.md +73 -0
- package/template/skills/archive-and-consolidate/references/consolidation-rules.md +70 -0
- package/template/skills/archive-and-consolidate/references/knowledge-graduation.md +50 -0
- package/template/skills/docs-sync/SKILL.md +1 -1
- package/template/skills/docs-sync/references/readme-contract.md +2 -0
- package/template/skills/docs-sync/references/readme-writing-guide.md +294 -0
- package/template/skills/docs-sync/references/workflow-scope-contract.md +3 -3
- package/template/skills/speculo-retro/SKILL.md +1 -1
- package/template/skills/speculo-retro/references/issue-drafting-sop.md +1 -1
- package/template/skills/worktree-isolation/references/merge-and-cleanup.md +2 -2
- package/template/vendor/README.md +3 -3
- package/template/vendor/khazix-skills/neat-freak/SKILL.md +210 -0
- package/template/vendor/khazix-skills/neat-freak/references/agent-paths.md +72 -0
- package/template/vendor/khazix-skills/neat-freak/references/governance.md +88 -0
- package/template/vendor/khazix-skills/neat-freak/references/sync-matrix.md +77 -0
- package/template/vendor/khazix-skills/neat-freak/references/verification.md +92 -0
- package/template/vendor/khazix-skills/neat-freak/scripts/audit-inventory.sh +106 -0
- package/template/workflows/person/INDEX.md +12 -0
- package/template/workflows/person/M-mao-zedong-cognitive-os/M-mao-zedong-cognitive-os.md +73 -74
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +85 -0
- package/template/workflows/specdev/D-diagnose-bugs/cleanup-postmortem.md +37 -0
- package/template/workflows/specdev/D-diagnose-bugs/feedback-loop-techniques.md +84 -0
- package/template/workflows/specdev/D-diagnose-bugs/hypothesis-format.md +46 -0
- package/template/workflows/specdev/D-diagnose-bugs/instrumentation-rules.md +51 -0
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +54 -0
- package/template/workflows/specdev/G-grill-with-docs/adr-format.md +77 -0
- package/template/workflows/specdev/G-grill-with-docs/context-format.md +63 -0
- package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +93 -0
- package/template/workflows/specdev/G-grill-with-docs/grilling-protocol.md +54 -0
- package/template/workflows/specdev/G-grill-with-docs/log-format.md +99 -0
- package/template/workflows/specdev/I-implement/I-implement.md +85 -0
- package/template/workflows/specdev/I-implement/code-review-process.md +83 -0
- package/template/workflows/specdev/I-implement/codebase-design-glossary.md +109 -0
- package/template/workflows/specdev/I-implement/deepening.md +37 -0
- package/template/workflows/specdev/I-implement/design-it-twice.md +44 -0
- package/template/workflows/specdev/I-implement/tdd-examples.md +139 -0
- package/template/workflows/specdev/I-implement/tdd-rules.md +31 -0
- package/template/workflows/specdev/I-init-setup/I-init-setup.md +132 -0
- package/template/workflows/specdev/I-init-setup/domain-layout.md +90 -0
- package/template/workflows/specdev/I-init-setup/status-labels.md +54 -0
- package/template/workflows/specdev/I-init-setup/tracking-convention.md +58 -0
- package/template/workflows/specdev/INDEX.md +81 -0
- package/template/workflows/specdev/S-spec/S-spec.md +91 -0
- package/template/workflows/specdev/T-tickets/T-tickets.md +241 -0
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +209 -0
- package/template/workflows/specdev/_state/adr/.gitkeep +0 -0
- package/template/workflows/specdev/_state/archive/.gitkeep +0 -0
- package/template/workflows/specdev/_state/changes/.gitkeep +0 -0
- package/template/workflows/specdev/_state/context/.gitkeep +0 -0
- package/template/workflows/{matt-pocock → specdev}/_state/status.json +1 -1
- package/template/commands/finalize.md +0 -37
- package/template/commands/knowledge-prune.md +0 -20
- package/template/skills/change-lifecycle/SKILL.md +0 -25
- package/template/skills/change-lifecycle/assets/completion-summary-template.md +0 -25
- package/template/skills/change-lifecycle/assets/completion-verification-template.md +0 -29
- package/template/skills/change-lifecycle/references/completion-gate.md +0 -19
- package/template/skills/change-lifecycle/references/finalize-archive.md +0 -32
- package/template/skills/knowledge-prune/SKILL.md +0 -29
- package/template/skills/knowledge-prune/references/audit-rules.md +0 -24
- package/template/skills/runtime-context/SKILL.md +0 -54
- package/template/skills/runtime-context/references/path-resolution.md +0 -41
- package/template/workflows/matt-pocock/PERSISTENCE.md +0 -80
- package/template/workflows/matt-pocock/WORKFLOW.md +0 -103
- package/template/workflows/matt-pocock/_state/archive/.gitkeep +0 -1
- package/template/workflows/matt-pocock/_state/changes/.gitkeep +0 -1
- package/template/workflows/matt-pocock/atomic-skills/ask-matt.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/claude-handoff.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/code-review.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/codebase-design.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/diagnosing-bugs.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/domain-modeling.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/grill-me.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/grill-with-docs.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/grilling.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/handoff.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/implement.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/improve-codebase-architecture.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/loop-me.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/prototype.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/research.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/resolving-merge-conflicts.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/setup-matt-pocock-skills.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/tdd.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/teach.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/to-spec.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/to-tickets.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/triage.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/wayfinder.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/wizard.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/writing-beats.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/writing-fragments.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/writing-great-skills.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/writing-shape.md +0 -20
- package/template/workflows/matt-pocock/routes/architecture.md +0 -24
- package/template/workflows/matt-pocock/routes/diagnose.md +0 -22
- package/template/workflows/matt-pocock/routes/experimental.md +0 -18
- package/template/workflows/matt-pocock/routes/idea-to-delivery.md +0 -63
- package/template/workflows/matt-pocock/routes/merge-conflicts.md +0 -19
- package/template/workflows/matt-pocock/routes/productivity.md +0 -25
- package/template/workflows/matt-pocock/routes/research-prototype.md +0 -20
- package/template/workflows/matt-pocock/routes/review.md +0 -19
- package/template/workflows/matt-pocock/routes/setup.md +0 -42
- package/template/workflows/matt-pocock/routes/triage.md +0 -25
- package/template/workflows/matt-pocock/routes/wayfinder.md +0 -27
- package/template/workflows/person/PERSISTENCE.md +0 -56
- package/template/workflows/person/WORKFLOW.md +0 -50
- package/template/workflows/person/_state/.config/LESSONS.md +0 -3
- package/template/workflows/person/_state/.config/RULES.md +0 -3
- package/template/workflows/person/_state/.config/context/.gitkeep +0 -1
- package/template/workflows/person/_templates/mao-consultation-output-template.md +0 -55
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
# 领域建模
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
name: domain-modeling
|
|
6
|
+
description: 通过无情面试打磨领域模型。挑战术语、发明边界场景、在决策结晶的瞬间写入 CONTEXT.md、ADR.md 和 LOG.md。当用户想要确定领域术语或通用语言、记录架构决策,或当其他技能需要维护领域模型时使用。
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. 面试(Grilling)
|
|
11
|
+
|
|
12
|
+
请对我进行无情的面试,深入探讨该方案的每一个方面,直到我们达成共识。沿设计树的每个分支逐步推进,逐个解决决策之间的依赖关系。每个问题都给出你的推荐答案。
|
|
13
|
+
|
|
14
|
+
一次只问一个问题,等待我对每个问题给出反馈后再继续。一次问多个问题会让人困惑。
|
|
15
|
+
|
|
16
|
+
如果某个*事实*可以通过探索代码库找到,请自行查找,不要来问我。但*决策*由我来做 —— 将每个决策提交给我并等待我的回答。
|
|
17
|
+
|
|
18
|
+
在我确认我们已达成共识之前,不要执行该方案。
|
|
19
|
+
|
|
20
|
+
## 2. 领域建模规程
|
|
21
|
+
|
|
22
|
+
在设计过程中积极构建和精炼项目的领域模型。这是*主动*规程 — 挑战术语、发明边界场景、并在决策结晶的那一刻立即写下词汇表和决策。仅仅_阅读_ `CONTEXT.md` 获取词汇不是本技能 — 那是任何技能都可以做到的一行习惯。本技能用于当你正在_改变_模型,而不仅仅是消费它时。
|
|
23
|
+
|
|
24
|
+
### 文件结构
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
/
|
|
28
|
+
├── CONTEXT.md
|
|
29
|
+
├── ADR.md
|
|
30
|
+
└── LOG.md
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
只维护这三个文件。没有 `docs/adr/` 目录下的编号文件,没有 `CONTEXT-MAP.md`。随着模型演进,在文件内部增、删、改条目。
|
|
34
|
+
|
|
35
|
+
### 对照词汇表挑战
|
|
36
|
+
|
|
37
|
+
当用户使用的术语与 `CONTEXT.md` 中的现有语言冲突时,立即指出。"你的词汇表将 'cancellation' 定义为 X,但你似乎指的是 Y — 到底是哪个?"
|
|
38
|
+
|
|
39
|
+
### 精炼模糊语言
|
|
40
|
+
|
|
41
|
+
当用户使用含糊或重载的术语时,提出一个精确的规范术语。"你在说 'account' — 你指的是 Customer 还是 User?它们是不同的东西。"
|
|
42
|
+
|
|
43
|
+
### 讨论具体场景
|
|
44
|
+
|
|
45
|
+
当讨论领域关系时,用具体场景进行压力测试。发明探索边界情况的场景,迫使用户精确界定概念之间的边界。"你说订单可以部分取消 — 未取消的商品怎么办?它们还能发货吗?"
|
|
46
|
+
|
|
47
|
+
### 与代码交叉引用
|
|
48
|
+
|
|
49
|
+
当用户陈述某事如何工作时,检查代码是否一致。如果发现矛盾,指出来:"你的代码取消的是整个 Order,但你刚才说部分取消是可能的 — 哪个是正确的?"
|
|
50
|
+
|
|
51
|
+
### 及时更新 LOG.md
|
|
52
|
+
|
|
53
|
+
当设计问答中形成任何结论时,当场更新 `LOG.md`。它是完整的设计轨迹 — 记录"当时讨论了什么、最终固定了什么行为以及对应哪个 ADR"。
|
|
54
|
+
|
|
55
|
+
**三个文件的分工**:
|
|
56
|
+
|
|
57
|
+
| 文件 | 职责 | 维护方式 |
|
|
58
|
+
|------|------|----------|
|
|
59
|
+
| `LOG.md` | 完整设计轨迹 — 所有确认、延后、被替代的结论 | 持续增删改,条目可被后续决定修订 |
|
|
60
|
+
| `CONTEXT.md` | 精炼的规范词汇表 — 只保留当前有效的术语 | 增删改,保持精炼 |
|
|
61
|
+
| `ADR.md` | 难以逆转、令人意外、存在真实权衡的架构决策 | 只追加不删除,可标记废弃 |
|
|
62
|
+
|
|
63
|
+
三者关系:LOG.md 是最完整的记录 → CONTEXT.md 从中提取术语定义 → ADR.md 从中筛选同时满足三个条件的架构决策。
|
|
64
|
+
|
|
65
|
+
**日志条目格式**:每条日志使用 `## LOG-XXXX: {标题}` 二级标题,编号从 `0001` 开始顺序递增。
|
|
66
|
+
|
|
67
|
+
**状态标记**:
|
|
68
|
+
- `Status: accepted` — 已确认的现行结论
|
|
69
|
+
- `Status: deferred` — 暂不决定,留待后续讨论
|
|
70
|
+
- `Status: superseded` — 被后续决定替代,标注 `Superseded by: LOG-XXXX`
|
|
71
|
+
|
|
72
|
+
**维护规则**:
|
|
73
|
+
- 每次完成设计问答,同步更新 `LOG.md`、`CONTEXT.md` 与 `ADR.md`。
|
|
74
|
+
- 后续确认改变既有结论时,直接修订原日志条目,并记录替代关系,不保留互相矛盾的"现行规则"。
|
|
75
|
+
- 日志可以记录具体交互和边界场景;词汇表保持精炼;ADR 只记录难以逆转、令人意外且存在真实权衡的决定。
|
|
76
|
+
- 每个日志条目应关联对应的 ADR(如有):`Related: ADR-XXXX`。
|
|
77
|
+
- 状态为 `deferred` 的条目保留,以便后续恢复讨论时知道从什么问题开始。
|
|
78
|
+
|
|
79
|
+
### 及时更新 CONTEXT.md
|
|
80
|
+
|
|
81
|
+
当术语确定时,当场更新 `CONTEXT.md`。不要批量处理 — 发生时立即捕获。
|
|
82
|
+
|
|
83
|
+
`CONTEXT.md` 应该完全不包含实现细节。不要将 `CONTEXT.md` 当作规范、草稿纸或实现决策的仓库。它只是词汇表,别无其他。
|
|
84
|
+
|
|
85
|
+
- **新增术语**:在合适的子标题下追加条目。
|
|
86
|
+
- **修改术语**:直接更新定义文本和 `_Avoid_` 列表。
|
|
87
|
+
- **删除术语**:移除整个条目。
|
|
88
|
+
- **术语更名**:删除旧条目,新增新条目。
|
|
89
|
+
|
|
90
|
+
### 谨慎更新 ADR.md
|
|
91
|
+
|
|
92
|
+
仅在以下三个条件全部满足时才向 `ADR.md` 追加一条决策记录:
|
|
93
|
+
|
|
94
|
+
1. **难以逆转** — 以后改变主意的成本是有意义的
|
|
95
|
+
2. **没有上下文会令人惊讶** — 未来的读者会疑惑"他们为什么这样做?"
|
|
96
|
+
3. **真实权衡的结果** — 存在真正的替代方案,你出于特定原因选择了一个
|
|
97
|
+
|
|
98
|
+
如果缺少任何一个条件,跳过 ADR。
|
|
99
|
+
|
|
100
|
+
`ADR.md` 中每个决策是一个 `## NNNN: {标题}` 二级标题,编号顺序递增,条目之间用 `---` 分隔。可以修改已有条目、标记废弃 — 但不要删除。
|
|
101
|
+
|
|
102
|
+
### 什么算 ADR
|
|
103
|
+
|
|
104
|
+
- **架构形态。** "我们使用 monorepo。" "写模型采用事件溯源,读模型投影到 Postgres。"
|
|
105
|
+
- **上下文间的集成模式。** "Ordering 和 Billing 通过领域事件通信,而非同步 HTTP。"
|
|
106
|
+
- **带来锁定效应的技术选择。** 数据库、消息总线、认证提供商、部署目标。不是每个库 — 只是那些需要花一个季度才能替换的。
|
|
107
|
+
- **边界和范围决策。** "客户数据由 Customer 上下文拥有;其他上下文仅通过 ID 引用它。"明确的"不做"和"要做"同样有价值。
|
|
108
|
+
- **有意偏离显而易见路径的决策。** "我们使用手动 SQL 而不是 ORM,因为 X。"
|
|
109
|
+
- **代码中不可见的约束。** "由于合规要求,我们不能使用 AWS。" "由于合作伙伴 API 合同,响应时间必须低于 200ms。"
|
|
110
|
+
- **拒绝的原因不明显的被拒绝替代方案。** 如果你考虑了 GraphQL 而因微妙原因选择了 REST,记录下来 — 否则 6 个月后有人会再次建议 GraphQL。
|
|
111
|
+
|
|
112
|
+
## 3. CONTEXT.md 格式
|
|
113
|
+
|
|
114
|
+
### 规则
|
|
115
|
+
|
|
116
|
+
- **要有主见。** 当同一概念存在多个词时,选择最好的那个,并将其他的列在 `_Avoid_` 下。
|
|
117
|
+
- **定义保持精炼。** 最多一两句话。定义它是什么,而不是它做什么。
|
|
118
|
+
- **仅包含特定于该项目上下文的术语。** 通用的编程概念(超时、错误类型、工具模式)即使项目广泛使用也不属于这里。添加术语前自问:这是该上下文独有的概念,还是一个通用编程概念?只有前者才属于这里。
|
|
119
|
+
- **当自然形成聚类时,用子标题分组术语。** 如果所有术语属于一个单一的凝聚领域,扁平列表也可以。
|
|
120
|
+
- **随时增删改。** 模型演进时,直接修改文件:添加新术语、删除废弃术语、修正定义、术语更名。不要堆积 — 保持词汇表精炼且反映当前模型。
|
|
121
|
+
|
|
122
|
+
### 模板
|
|
123
|
+
|
|
124
|
+
<context_template>
|
|
125
|
+
# {项目名称} 领域词汇表
|
|
126
|
+
|
|
127
|
+
{对该上下文是什么以及为什么存在的一两句话描述。}
|
|
128
|
+
|
|
129
|
+
## {术语分组}
|
|
130
|
+
|
|
131
|
+
**Order**:
|
|
132
|
+
{对该术语的一两句话描述}
|
|
133
|
+
_Avoid_: Purchase, transaction
|
|
134
|
+
|
|
135
|
+
**Invoice**:
|
|
136
|
+
发货后发送给客户的付款请求。
|
|
137
|
+
_Avoid_: Bill, payment request
|
|
138
|
+
|
|
139
|
+
**Customer**:
|
|
140
|
+
下订单的个人或组织。
|
|
141
|
+
_Avoid_: Client, buyer, account
|
|
142
|
+
</context_template>
|
|
143
|
+
|
|
144
|
+
## 4. ADR.md 格式
|
|
145
|
+
|
|
146
|
+
所有架构决策记录存放在仓库根目录的单一 `ADR.md` 文件中。
|
|
147
|
+
|
|
148
|
+
### 模板
|
|
149
|
+
|
|
150
|
+
<adr_template>
|
|
151
|
+
# 架构决策记录
|
|
152
|
+
|
|
153
|
+
## 0001: {决策的简短标题}
|
|
154
|
+
|
|
155
|
+
{1-3 句话:背景是什么,我们做了什么决策,以及为什么。}
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 0002: {另一决策标题}
|
|
160
|
+
|
|
161
|
+
{1-3 句话描述。}
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
</adr_template>
|
|
165
|
+
|
|
166
|
+
每个决策是一个 `##` 二级标题,编号从 `0001` 开始顺序递增。决策之间用 `---` 分隔。
|
|
167
|
+
|
|
168
|
+
就这样。一个 ADR 条目可以就是一个段落。其价值在于记录*已经*做出了决策以及*为什么* — 而不是填满各个部分。
|
|
169
|
+
|
|
170
|
+
### 追加新决策
|
|
171
|
+
|
|
172
|
+
1. 读取 `ADR.md`,找到最高现有编号
|
|
173
|
+
2. 编号加 1
|
|
174
|
+
3. 在文件末尾追加新条目
|
|
175
|
+
|
|
176
|
+
### 可选附加元素
|
|
177
|
+
|
|
178
|
+
仅当它们真正增加价值时才包含这些。大多数 ADR 不需要它们:
|
|
179
|
+
|
|
180
|
+
- **日期** — 在标题行的 `{标题}` 后面加 `(YYYY-MM-DD)`
|
|
181
|
+
- **Status** — `**Status**: proposed | accepted | deprecated | superseded by ADR-NNNN`。当决策被重新审视时,直接修改状态标记
|
|
182
|
+
- **Considered Options** — 仅当被拒绝的替代方案值得记住时
|
|
183
|
+
- **Consequences** — 仅当需要指出非显而易见的下游影响时
|
|
184
|
+
|
|
185
|
+
### 带可选元素的示例
|
|
186
|
+
|
|
187
|
+
<adr_example>
|
|
188
|
+
## 0003: 写模型采用事件溯源(2025-03-15)
|
|
189
|
+
|
|
190
|
+
**Status**: accepted
|
|
191
|
+
|
|
192
|
+
Order 聚合需要完整的变更历史用于审计和补偿。我们选择事件溯源 —
|
|
193
|
+
所有状态变更作为不可变事件存储,当前状态从中投影。
|
|
194
|
+
|
|
195
|
+
**Considered Options**:
|
|
196
|
+
- 事件溯源(已选)— 天然审计日志,支持时间旅行调试
|
|
197
|
+
- CRUD + 审计表 — 更简单,但审计日志与业务逻辑解耦,容易不同步
|
|
198
|
+
- 仅 CRUD — 无审计历史,不满足合规要求
|
|
199
|
+
|
|
200
|
+
**Consequences**:
|
|
201
|
+
- 写路径复杂度增加;读路径需要投影
|
|
202
|
+
- 事件 schema 演进需要显式版本策略
|
|
203
|
+
</adr_example>
|
|
204
|
+
|
|
205
|
+
### 修改已有决策
|
|
206
|
+
|
|
207
|
+
- **澄清或补充后果** — 直接编辑条目正文
|
|
208
|
+
- **改变状态** — 修改 `**Status**` 字段(如 accepted → deprecated)
|
|
209
|
+
- **废弃** — 将状态改为 `deprecated`,如被新决策替代则加上 `superseded by ADR-NNNN`
|
|
210
|
+
- **不要删除** — 即使决策被废弃,保留条目作为历史上下文
|
|
211
|
+
|
|
212
|
+
### 何时提供 ADR
|
|
213
|
+
|
|
214
|
+
以下三个条件必须同时为真:
|
|
215
|
+
|
|
216
|
+
1. **难以逆转** — 以后改变主意的成本是实质性的
|
|
217
|
+
2. **没有上下文的话令人惊讶** — 未来的读者会看着代码想"他们到底为什么这样做?"
|
|
218
|
+
3. **真实权衡的结果** — 确实存在替代方案,你基于特定原因选择了一个
|
|
219
|
+
|
|
220
|
+
如果决策容易逆转,跳过它 — 你反正会逆转的。如果不令人惊讶,没人会想为什么。如果没有真正的替代方案,那就没有可记录的,除了"我们做了显而易见的事"。
|
|
221
|
+
|
|
222
|
+
### 什么算作
|
|
223
|
+
|
|
224
|
+
- **架构形态。** "我们使用 monorepo。" "写模型采用事件溯源,读模型投影到 Postgres。"
|
|
225
|
+
- **上下文间的集成模式。** "Ordering 和 Billing 通过领域事件通信,而非同步 HTTP。"
|
|
226
|
+
- **带来锁定效应的技术选择。** 数据库、消息总线、认证提供商、部署目标。不是每个库 — 只是那些需要花一个季度才能替换的。
|
|
227
|
+
- **边界和范围决策。** "客户数据由 Customer 上下文拥有;其他上下文仅通过 ID 引用它。"明确的"不做"和"要做"同样有价值。
|
|
228
|
+
- **有意偏离显而易见路径的决策。** "我们使用手动 SQL 而不是 ORM,因为 X。"
|
|
229
|
+
- **代码中不可见的约束。** "由于合规要求,我们不能使用 AWS。" "由于合作伙伴 API 合同,响应时间必须低于 200ms。"
|
|
230
|
+
- **拒绝的原因不明显的被拒绝替代方案。** 如果你考虑了 GraphQL 而因微妙原因选择了 REST,记录下来 — 否则 6 个月后有人会再次建议 GraphQL。
|
|
231
|
+
|
|
232
|
+
## 5. LOG.md 格式
|
|
233
|
+
|
|
234
|
+
### 规则
|
|
235
|
+
|
|
236
|
+
- **记录每一次设计结论。** 无论大小,只要在访谈中确认、延后或被替代,都写入 LOG.md。宁可多记,不要遗漏。
|
|
237
|
+
- **状态驱动。** 每个条目明确标记 `accepted`、`deferred` 或 `superseded`,让读者一眼知道当前有效性。
|
|
238
|
+
- **关联 ADR。** 如果该结论同时满足 ADR 的三个条件,在 LOG 中标注 `Related: ADR-XXXX`,并在对应 ADR 条目中也关联回 LOG。
|
|
239
|
+
- **保持可修订。** 后续决定改变既有结论时,直接更新原条目状态和正文,不要新建一条矛盾的条目。标注 `Superseded by: LOG-XXXX`。
|
|
240
|
+
- **不堆积废弃条目。** 被替代的条目保留但标记清楚;延后(deferred)的条目保留以便后续恢复讨论。
|
|
241
|
+
- **记录具体交互和边界。** 与 CONTEXT.md 的精炼不同,LOG.md 可以记录讨论中的具体场景、边界条件和交互细节。
|
|
242
|
+
|
|
243
|
+
### 模板
|
|
244
|
+
|
|
245
|
+
<log_template>
|
|
246
|
+
# 设计决策日志
|
|
247
|
+
|
|
248
|
+
本文件记录设计访谈中已经确认、延后或被替代的具体结论。它保存"当时讨论了什么、最终固定了什么行为以及对应哪个 ADR";`CONTEXT.md` 是规范词汇表,`ADR.md` 是难以逆转的架构决策,本文件则是可持续增删改的完整设计轨迹。
|
|
249
|
+
|
|
250
|
+
## 维护规则
|
|
251
|
+
|
|
252
|
+
- 每次完成一个设计问答,同步更新 `LOG.md`、`CONTEXT.md` 与 `ADR.md`。
|
|
253
|
+
- 已确认结论使用 `accepted`;暂不决定使用 `deferred`;被后续决定替代使用 `superseded`。
|
|
254
|
+
- 后续确认改变既有结论时,直接修订原日志条目,并记录替代关系,不保留互相矛盾的"现行规则"。
|
|
255
|
+
- 日志可以记录具体交互和边界;词汇表保持精炼;ADR 只记录难以逆转、令人意外且存在真实权衡的决定。
|
|
256
|
+
|
|
257
|
+
## LOG-0001: {决策的简短标题}
|
|
258
|
+
|
|
259
|
+
Status: accepted
|
|
260
|
+
Related: ADR-0001
|
|
261
|
+
|
|
262
|
+
{背景:讨论了什么问题,做出了什么决定,以及为什么。可以记录具体的交互过程、边界场景和固定行为。}
|
|
263
|
+
|
|
264
|
+
## LOG-0002: {另一决策标题}
|
|
265
|
+
|
|
266
|
+
Status: deferred
|
|
267
|
+
|
|
268
|
+
{为什么暂不决定,以及后续恢复讨论时应从什么问题开始。}
|
|
269
|
+
|
|
270
|
+
## LOG-0003: {被替代的决策标题}
|
|
271
|
+
|
|
272
|
+
Status: superseded
|
|
273
|
+
Superseded by: LOG-0004
|
|
274
|
+
|
|
275
|
+
{原决策内容,以及为什么被替代。保留作为设计演进的历史上下文。}
|
|
276
|
+
</log_template>
|
|
277
|
+
|
|
278
|
+
### 追加新日志
|
|
279
|
+
|
|
280
|
+
1. 读取 `LOG.md`,找到最高现有编号
|
|
281
|
+
2. 编号加 1
|
|
282
|
+
3. 在文件末尾追加新条目
|
|
283
|
+
|
|
284
|
+
### 修改已有日志
|
|
285
|
+
|
|
286
|
+
- **改变结论** — 将原条目状态改为 `superseded`,标注 `Superseded by: LOG-XXXX`,在新条目中说明替代原因
|
|
287
|
+
- **延后决定被重新讨论** — 将状态从 `deferred` 改为 `accepted`,或新建条目替代原条目
|
|
288
|
+
- **补充细节** — 直接编辑条目正文,不改变状态
|
|
289
|
+
- **不要删除** — 即使结论被替代,保留条目作为设计演进的历史上下文
|