@namewta/speculo 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -4
- package/package.json +1 -1
- package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +5 -0
- package/template/canonical/canonical-specdev-goal-plan.md +366 -59
- package/template/canonical/canonical-specdev-grill-with-docs.md +153 -104
- package/template/canonical/canonical-specdev-spec.md +5 -0
- package/template/canonical/canonical-specdev-tickets.md +5 -0
- package/template/canonical/canonical-specdev-wayfinder.md +171 -249
- package/template/commands/docs-sync.md +3 -3
- package/template/skills/docs-sync/SKILL.md +4 -3
- package/template/skills/docs-sync/assets/report-template.md +1 -0
- package/template/skills/docs-sync/references/agents/agent-writing.md +75 -0
- package/template/skills/{agents-md-builder/references → docs-sync/references/agents}/claude-redirect.md +1 -1
- package/template/skills/docs-sync/references/agents-contract.md +23 -1
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +78 -73
- package/template/workflows/specdev/G-grill-with-docs/design-tree-template.json +9 -0
- package/template/workflows/specdev/G-grill-with-docs/grilling-protocol.md +16 -35
- package/template/workflows/specdev/G-grill-with-docs/log-format.md +2 -0
- package/template/workflows/specdev/I-implement/I-implement.md +12 -10
- package/template/workflows/specdev/I-implement/design-it-twice.md +45 -6
- package/template/workflows/specdev/I-implement/evidence-template.md +7 -0
- package/template/workflows/specdev/I-implement/execution-preflight.md +6 -0
- package/template/workflows/specdev/INDEX.md +11 -4
- package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +23 -10
- package/template/workflows/specdev/P-goal-plan/completion-control.md +20 -7
- package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +55 -3
- package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +42 -38
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +36 -2
- package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +67 -80
- package/template/workflows/specdev/R-review-architecture/architecture-report-contract.md +123 -0
- package/template/workflows/specdev/R-review-architecture/architecture-review-report-template.html +103 -55
- package/template/workflows/specdev/R-review-architecture/architecture-review-template.md +20 -29
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +76 -147
- package/template/workflows/specdev/W-wayfinder/investigation-ticket-template.md +8 -53
- package/template/workflows/specdev/W-wayfinder/local-tracker-contract.md +36 -0
- package/template/workflows/specdev/W-wayfinder/solution-comment-template.md +17 -0
- package/template/workflows/specdev/W-wayfinder/wayfinder-map-template.md +12 -65
- package/template/workflows/specdev/common/README.md +4 -0
- package/template/workflows/specdev/common/rules/artifact-contract.md +5 -0
- package/template/workflows/specdev/common/rules/codebase-design.md +148 -0
- package/template/workflows/specdev/common/schemas/design-tree.schema.json +35 -0
- package/template/workflows/specdev/common/schemas/wayfinder-ticket.schema.json +19 -0
- package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +61 -0
- package/template/workflows/specdev/common/skills/subagent-delivery/references/external-web-subagent.md +32 -0
- package/template/workflows/specdev/common/skills/subagent-delivery/references/github-checkpoints.md +24 -0
- package/template/workflows/specdev/common/skills/subagent-delivery/references/native-subagent.md +35 -0
- package/template/workflows/specdev/common/skills/subagent-delivery/references/source-package.md +17 -0
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +226 -5
- package/template/skills/agents-md-builder/SKILL.md +0 -30
- package/template/workflows/specdev/I-implement/codebase-design-glossary.md +0 -12
- package/template/workflows/specdev/I-implement/deepening.md +0 -17
- /package/template/skills/{agents-md-builder/references → docs-sync/references/agents}/content-contract.md +0 -0
- /package/template/skills/{agents-md-builder/references → docs-sync/references/agents}/evidence-collection.md +0 -0
- /package/template/skills/{agents-md-builder/references → docs-sync/references/agents}/manifest-discovery.md +0 -0
- /package/template/skills/{agents-md-builder/references → docs-sync/references/agents}/role-classification.md +0 -0
- /package/template/skills/{agents-md-builder/references → docs-sync/references/agents}/templates/aggregator-AGENTS.md +0 -0
- /package/template/skills/{agents-md-builder/references → docs-sync/references/agents}/templates/capability-module-AGENTS.md +0 -0
- /package/template/skills/{agents-md-builder/references → docs-sync/references/agents}/templates/contract-module-AGENTS.md +0 -0
- /package/template/skills/{agents-md-builder/references → docs-sync/references/agents}/templates/repo-root-AGENTS.md +0 -0
- /package/template/skills/{agents-md-builder/references → docs-sync/references/agents}/templates/runnable-app-AGENTS.md +0 -0
- /package/template/skills/{agents-md-builder/references → docs-sync/references/agents}/templates/scripts-docs-AGENTS.md +0 -0
- /package/template/skills/{agents-md-builder/references → docs-sync/references/agents}/writing-style.md +0 -0
|
@@ -3,13 +3,20 @@ id: specdev/review-architecture
|
|
|
3
3
|
type: workflow-entry
|
|
4
4
|
workflow: specdev
|
|
5
5
|
name: 架构审查
|
|
6
|
-
description:
|
|
7
|
-
keywords: [architecture, review, module depth,
|
|
6
|
+
description: 从用户指定范围或 Git 热点扫描代码库的深化机会,以持久化可视化 HTML 呈现候选,并对用户选择的一个方案运行设计树访谈。
|
|
7
|
+
keywords: [architecture, review, module, interface, depth, seam, adapter, leverage, locality, HTML]
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
#
|
|
10
|
+
# 改善代码库架构
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
揭示架构摩擦,提出**深化机会**——将 shallow module 转变为 deep module 的重构。目标是可测试性和 AI 可导航性。
|
|
13
|
+
|
|
14
|
+
本 work 基于项目领域模型,并建立在共享设计词汇之上:
|
|
15
|
+
|
|
16
|
+
- 读取 `<Path>{roots.workflows}/specdev/common/rules/codebase-design.md</Path>`,在每个建议中严格使用 module、interface、depth、seam、adapter、leverage、locality,不滑向含义更松散的替代词。
|
|
17
|
+
- 当前 change 与永久 CONTEXT 中的领域语言为好的 seam 提供名称;ADR 记录本 work 不应重新争论的决定。
|
|
18
|
+
|
|
19
|
+
本 work 只审查、呈现和访谈,不直接修改产品代码。
|
|
13
20
|
|
|
14
21
|
## 输入与产物
|
|
15
22
|
|
|
@@ -22,119 +29,99 @@ keywords: [architecture, review, module depth, seams, locality, HTML, refactor]
|
|
|
22
29
|
- `<Path>{roots.state}/specdev/changes/{change}/ticket/</Path>`
|
|
23
30
|
- `<Path>{roots.state}/specdev/adr/</Path>`
|
|
24
31
|
- `<Path>{roots.state}/specdev/context/</Path>`
|
|
25
|
-
-
|
|
32
|
+
- 当前代码、测试、依赖和 Git 历史。
|
|
26
33
|
|
|
27
34
|
产物:
|
|
28
35
|
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
模板:
|
|
33
|
-
|
|
34
|
-
- `<Path>{roots.workflows}/specdev/R-review-architecture/architecture-review-template.md</Path>`
|
|
35
|
-
- `<Path>{roots.workflows}/specdev/R-review-architecture/architecture-review-report-template.html</Path>`
|
|
36
|
+
- `<Path>{roots.state}/specdev/changes/{change}/architecture-review.md</Path>`
|
|
37
|
+
- `<Path>{roots.state}/specdev/changes/{change}/architecture-review.html</Path>`
|
|
38
|
+
- 系统临时目录中名称为 architecture-review-<timestamp>.html 的打开副本。
|
|
36
39
|
|
|
37
40
|
## 流程
|
|
38
41
|
|
|
39
|
-
### 1.
|
|
40
|
-
|
|
41
|
-
记录触发审查的业务目标、近期变更、缺陷、维护成本、性能或风险,不做无边界全仓巡检。明确:审查入口、相关调用路径、不审查范围和成功标准。
|
|
42
|
-
|
|
43
|
-
用户明确要求全仓架构扫描时,可以扩展范围,但仍按领域、模块或调用链分批,避免在单次上下文中生成无证据的泛化结论。
|
|
44
|
-
|
|
45
|
-
### 2. 建立当前结构地图
|
|
42
|
+
### 1. 探索
|
|
46
43
|
|
|
47
|
-
|
|
44
|
+
**扫描前先划定范围——YAGNI。** 深化一个模块的价值在于让未来变更更容易,因此特别关注近期发生过变更的部分。
|
|
48
45
|
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
- 数据、控制和错误流;
|
|
53
|
-
- 时间耦合、共享状态和跨目录跳转;
|
|
54
|
-
- 测试接缝与变更热点;
|
|
55
|
-
- 近期缺陷、重复 workaround 和高频共同修改路径。
|
|
46
|
+
- 用户指明模块、子系统或痛点时直接采用,跳过热点推断;
|
|
47
|
+
- 否则翻阅足够长的 `git log --oneline`,找出反复出现的文件和位置;
|
|
48
|
+
- 变更散落、没有明确热点时才扩大搜索范围。
|
|
56
49
|
|
|
57
|
-
|
|
50
|
+
首先阅读项目领域词汇和接触区域的 ADR。然后有机探索代码库,注意在哪里遇到摩擦:
|
|
58
51
|
|
|
59
|
-
-
|
|
60
|
-
-
|
|
52
|
+
- 理解一个概念是否需要在多个小模块间反复跳跃;
|
|
53
|
+
- 哪些模块是 shallow,interface 几乎与实现一样复杂;
|
|
54
|
+
- 哪些纯函数仅为可测试性抽出,bug 却藏在缺少 locality 的调用方式中;
|
|
55
|
+
- 哪些紧密耦合模块在 seam 泄漏;
|
|
56
|
+
- 哪些区域未经测试,或难以通过当前 interface 测试。
|
|
61
57
|
|
|
62
|
-
|
|
58
|
+
对每个怀疑对象应用删除测试。候选必须有真实路径、调用或测试证据,并说明不做的实际后果。与业务目标、近期变化压力、测试改善或风险降低无关的候选过滤掉。
|
|
63
59
|
|
|
64
|
-
|
|
60
|
+
**完成标准**:审查范围、排除范围、领域/ADR 输入和每个候选的代码压力均可追踪。
|
|
65
61
|
|
|
66
|
-
|
|
62
|
+
### 2. 生成 Markdown 与 HTML 报告
|
|
67
63
|
|
|
68
|
-
-
|
|
69
|
-
- 接缝泄漏导致多处了解同一协议或状态;
|
|
70
|
-
- 局部性差导致一个行为修改跨越过多路径;
|
|
71
|
-
- 依赖方向或生命周期不清导致测试与替换困难;
|
|
72
|
-
- 时间耦合、共享状态或错误语义造成事故半径;
|
|
73
|
-
- 缺少真正适配器导致 Mock 代替设计;
|
|
74
|
-
- 宽重构压力需要 expand-contract。
|
|
64
|
+
使用 `<Path>{roots.workflows}/specdev/R-review-architecture/architecture-review-template.md</Path>` 写入 Markdown 决策记录。
|
|
75
65
|
|
|
76
|
-
|
|
66
|
+
加载 `<Path>{roots.workflows}/specdev/R-review-architecture/architecture-report-contract.md</Path>` 和 `<Path>{roots.workflows}/specdev/R-review-architecture/architecture-review-report-template.html</Path>`,写入持久化 HTML。报告使用 Tailwind CDN 布局、Mermaid CDN 表达调用/依赖/序列,并混合手写 CSS/SVG 呈现质量图、横截面和调用图坍缩。
|
|
77
67
|
|
|
78
|
-
|
|
68
|
+
每个候选包含:
|
|
79
69
|
|
|
80
|
-
|
|
70
|
+
- **文件**——涉及的文件和 modules;
|
|
71
|
+
- **问题**——当前架构造成的摩擦;
|
|
72
|
+
- **解决方案**——简明描述会发生什么;
|
|
73
|
+
- **收益**——用 locality、leverage 和测试改善解释;
|
|
74
|
+
- **前后对比图**——并排展示 shallow 与 deep;
|
|
75
|
+
- **建议强度**——`Strong | Worth exploring | Speculative`;
|
|
76
|
+
- **依赖类别**——`in-process | local-substitutable | ports & adapters | mock`;
|
|
77
|
+
- **ADR 冲突**——只在摩擦真实到值得重审时显示警告。
|
|
81
78
|
|
|
82
|
-
|
|
83
|
-
- 最小深层化方案;
|
|
84
|
-
- 一个具有实质差异的替代方案。
|
|
79
|
+
报告以“最佳推荐”结束。此时**不提出 interface**,只询问用户想探索哪一个候选。
|
|
85
80
|
|
|
86
|
-
|
|
81
|
+
**完成标准**:每个候选字段完整、图表承担主要关系、最佳推荐唯一,Markdown 与 HTML 已原子写入并重读。
|
|
87
82
|
|
|
88
|
-
###
|
|
83
|
+
### 3. 持久化并打开报告
|
|
89
84
|
|
|
90
|
-
使用
|
|
85
|
+
从 `$TMPDIR` 解析临时目录,回退 `/tmp`,Windows 使用 `%TEMP%`。把持久化 HTML 复制到全新的 architecture-review-<timestamp>.html,再用平台命令打开:Linux `xdg-open`、macOS `open`、Windows `start`。
|
|
91
86
|
|
|
92
|
-
|
|
87
|
+
打开失败不删除任一文件;向用户返回 state 主件和临时副本的绝对路径,以及失败命令。敏感值和机器路径不写回持久化报告。
|
|
93
88
|
|
|
94
|
-
|
|
95
|
-
- 候选卡片和严重度;
|
|
96
|
-
- 证据路径;
|
|
97
|
-
- 方案对比;
|
|
98
|
-
- 影响与迁移图;
|
|
99
|
-
- 接受、延后、拒绝状态;
|
|
100
|
-
- 指向 Markdown 决策记录的完整状态路径文本。
|
|
89
|
+
**完成标准**:持久化主件可重读;临时副本名称唯一;打开成功或失败证据已报告。
|
|
101
90
|
|
|
102
|
-
|
|
91
|
+
### 4. 访谈用户选择的一个候选
|
|
103
92
|
|
|
104
|
-
|
|
93
|
+
用户选择候选后,调用 `<Path>{roots.workflows}/specdev/G-grill-with-docs/G-grill-with-docs.md</Path>`,用完整 frontier 遍历约束、依赖、deep module 形状、seam 后面的内容和保留测试。
|
|
105
94
|
|
|
106
|
-
|
|
95
|
+
决策结晶时保持领域模型同步:
|
|
107
96
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
5. 将结论写回 `<Path>{roots.state}/specdev/changes/{change}/architecture-review.md</Path>` 和 `<Path>{roots.state}/specdev/changes/{change}/architecture-review.html</Path>`;
|
|
113
|
-
6. 架构级决定同步到 `<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>`,讨论轨迹同步到 `<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>`。
|
|
97
|
+
- 新概念加入 change CONTEXT;永久 CONTEXT 不存在时延迟到归档提升;
|
|
98
|
+
- 模糊术语当场精炼;
|
|
99
|
+
- 用户以长期有效理由拒绝候选时,询问是否记录 ADR,暂时性或自明理由不制造 ADR;
|
|
100
|
+
- 替代 interface 需要探索时使用 `<Path>{roots.workflows}/specdev/I-implement/design-it-twice.md</Path>`。
|
|
114
101
|
|
|
115
|
-
|
|
102
|
+
将选择、访谈状态与结论同步到 Markdown/HTML;每次运行只访谈用户选择的候选,不批量迫使用户决定所有卡片。
|
|
116
103
|
|
|
117
|
-
|
|
104
|
+
**完成标准**:被选候选的设计树达到共识或明确 blocked;领域词汇、LOG、ADR 和审查报告一致。
|
|
118
105
|
|
|
119
|
-
|
|
106
|
+
### 5. 转化为执行工作
|
|
120
107
|
|
|
121
|
-
-
|
|
122
|
-
- 常规垂直迁移生成 Standard Ticket;
|
|
123
|
-
- 公共契约、数据、宽迁移或高风险改动生成 Deep Ticket 与 expand-contract;
|
|
124
|
-
- 进入 `<Path>{roots.workflows}/specdev/T-tickets/T-tickets.md</Path>` 完成正式拆分和 Ready 门禁。
|
|
108
|
+
只有被接受且有具体变更压力的提案进入 `<Path>{roots.workflows}/specdev/T-tickets/T-tickets.md</Path>`。加载 `<Path>{roots.workflows}/specdev/R-review-architecture/proposal-to-ticket.md</Path>`,按 Prefactor、Standard 或 Deep/expand-contract 建立 Ready 治理。
|
|
125
109
|
|
|
126
110
|
## 完成标准
|
|
127
111
|
|
|
128
|
-
-
|
|
129
|
-
-
|
|
130
|
-
-
|
|
131
|
-
- Markdown
|
|
132
|
-
-
|
|
133
|
-
-
|
|
134
|
-
-
|
|
112
|
+
- 范围来自用户方向或 Git 热点,未进行无边界扫描;
|
|
113
|
+
- 每个候选通过删除测试并有真实代码压力;
|
|
114
|
+
- 领域使用 CONTEXT 词汇,架构严格使用共享词汇;
|
|
115
|
+
- 持久化 Markdown/HTML 与临时打开副本均可定位;
|
|
116
|
+
- 每个候选有 Before/After、强度、收益和 ADR 冲突处理;
|
|
117
|
+
- 报告阶段没有提前设计 interface;
|
|
118
|
+
- 用户选择的一个候选完成完整 frontier 访谈;
|
|
119
|
+
- 接受项进入 Ticket 治理,没有直接修改产品代码。
|
|
135
120
|
|
|
136
121
|
## 子文件引用
|
|
137
122
|
|
|
123
|
+
- 共享设计规则:`<Path>{roots.workflows}/specdev/common/rules/codebase-design.md</Path>`
|
|
138
124
|
- Markdown 模板:`<Path>{roots.workflows}/specdev/R-review-architecture/architecture-review-template.md</Path>`
|
|
125
|
+
- HTML 报告合同:`<Path>{roots.workflows}/specdev/R-review-architecture/architecture-report-contract.md</Path>`
|
|
139
126
|
- HTML 模板:`<Path>{roots.workflows}/specdev/R-review-architecture/architecture-review-report-template.html</Path>`
|
|
140
127
|
- 提案转 Ticket:`<Path>{roots.workflows}/specdev/R-review-architecture/proposal-to-ticket.md</Path>`
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# HTML 报告格式
|
|
2
|
+
|
|
3
|
+
架构审查渲染为一个独立的 HTML 文件,存放在操作系统临时目录中。Tailwind 和 Mermaid 均来自 CDN。Mermaid 处理图形状的图表;手工构建的 div 和内联 SVG 处理更具编辑性的可视化(质量图、横截面图)。混合使用两者 — 不要所有事情都依赖 Mermaid,否则会变得千篇一律。
|
|
4
|
+
|
|
5
|
+
## 脚手架
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<!doctype html>
|
|
9
|
+
<html lang="en">
|
|
10
|
+
<head>
|
|
11
|
+
<meta charset="utf-8" />
|
|
12
|
+
<title>Architecture review — {{repo name}}</title>
|
|
13
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
14
|
+
<script type="module">
|
|
15
|
+
import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs";
|
|
16
|
+
mermaid.initialize({ startOnLoad: true, theme: "neutral", securityLevel: "loose" });
|
|
17
|
+
</script>
|
|
18
|
+
<style>
|
|
19
|
+
/* Tailwind 无法很好覆盖的小型自定义层:
|
|
20
|
+
虚线接缝线、手绘感箭头等。 */
|
|
21
|
+
.seam { stroke-dasharray: 4 4; }
|
|
22
|
+
.leak { stroke: #dc2626; }
|
|
23
|
+
.deep { background: linear-gradient(135deg, #0f172a, #1e293b); }
|
|
24
|
+
</style>
|
|
25
|
+
</head>
|
|
26
|
+
<body class="bg-stone-50 text-slate-900 font-sans">
|
|
27
|
+
<main class="max-w-5xl mx-auto px-6 py-12 space-y-12">
|
|
28
|
+
<header>...</header>
|
|
29
|
+
<section id="candidates" class="space-y-10">...</section>
|
|
30
|
+
<section id="top-recommendation">...</section>
|
|
31
|
+
</main>
|
|
32
|
+
</body>
|
|
33
|
+
</html>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 页头
|
|
37
|
+
|
|
38
|
+
仓库名称、日期和一个紧凑的图例:实线框 = 模块,虚线 = 接缝,红色箭头 = 泄漏,粗黑框 = 深模块。无介绍段落 — 直接进入候选。
|
|
39
|
+
|
|
40
|
+
## 候选卡片
|
|
41
|
+
|
|
42
|
+
图表承担主要分量。文字稀疏、平实,并使用来自 `<Path>{roots.workflows}/specdev/common/rules/codebase-design.md</Path>` 的术语,不刻意修饰。
|
|
43
|
+
|
|
44
|
+
每个候选是一个 `<article>`:
|
|
45
|
+
|
|
46
|
+
- **标题** — 简短,命名深化方案(例如"Collapse the Order intake pipeline")。
|
|
47
|
+
- **徽章行** — 推荐强度(`Strong` = 翡翠绿,`Worth exploring` = 琥珀色,`Speculative` = 石板灰),外加一个依赖类别标签(`in-process`、`local-substitutable`、`ports & adapters`、`mock`)。
|
|
48
|
+
- **文件** — 等宽字体列表,`font-mono text-sm`。
|
|
49
|
+
- **Before / After 图表** — 核心。两列,并排。参见下方模式。
|
|
50
|
+
- **Problem** — 一句话。痛点是什么。
|
|
51
|
+
- **Solution** — 一句话。改变了什么。
|
|
52
|
+
- **Wins** — 要点,每个不超过 6 个词。例如 "Tests hit one interface"、"Pricing logic stops leaking"、"Delete 4 shallow wrappers"。
|
|
53
|
+
- **ADR 标注**(如适用)— 一行,放在琥珀色调的框中。
|
|
54
|
+
|
|
55
|
+
无需解释段落。如果图表需要一段文字才能理解,重新画图。
|
|
56
|
+
|
|
57
|
+
## 图表模式
|
|
58
|
+
|
|
59
|
+
选择适合候选的模式。混合使用它们。不要让每个图表看起来都一样 — 多样性本身就是目的的一部分。
|
|
60
|
+
|
|
61
|
+
### Mermaid 图表(依赖/调用流的常用工具)
|
|
62
|
+
|
|
63
|
+
当重点是"X 调用 Y 调用 Z,看看这有多混乱"时,使用 Mermaid `flowchart` 或 `graph`。用 Tailwind 风格卡片包裹它,这样不会显得突兀。使用 classDef 将泄漏边缘着红色,深模块着深色。序列图适合展示"before:6 个往返;after:1 个"。
|
|
64
|
+
|
|
65
|
+
```html
|
|
66
|
+
<div class="rounded-lg border border-slate-200 bg-white p-4">
|
|
67
|
+
<pre class="mermaid">
|
|
68
|
+
flowchart LR
|
|
69
|
+
A[OrderHandler] --> B[OrderValidator]
|
|
70
|
+
B --> C[OrderRepo]
|
|
71
|
+
C -.leak.-> D[PricingClient]
|
|
72
|
+
classDef leak stroke:#dc2626,stroke-width:2px;
|
|
73
|
+
class C,D leak
|
|
74
|
+
</pre>
|
|
75
|
+
</div>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 手工绘制的框线图(当 Mermaid 的布局难以驾驭时)
|
|
79
|
+
|
|
80
|
+
模块用带边框和标签的 `<div>` 表示。箭头用绝对定位在相对容器上的内联 SVG `<line>` 或 `<path>` 元素表示。当你希望"after"图表看起来像一个粗边的深模块,内部元素灰显时使用 — Mermaid 不会以合适的权重渲染这种效果。
|
|
81
|
+
|
|
82
|
+
### 横截面图(适合分层浅度)
|
|
83
|
+
|
|
84
|
+
堆叠水平条(`h-12 border-l-4`)来展示调用经过的各层。Before:6 个薄层,每个都不做什么。After:一个厚条,标注合并后的职责。
|
|
85
|
+
|
|
86
|
+
### 质量图(适合"接口与实现一样宽"的场景)
|
|
87
|
+
|
|
88
|
+
每个模块两个矩形 — 一个表示接口表面积,一个表示实现。Before:接口矩形几乎和实现矩形一样高(浅)。After:接口矩形短,实现矩形高(深)。
|
|
89
|
+
|
|
90
|
+
### 调用图坍缩
|
|
91
|
+
|
|
92
|
+
Before:嵌套框呈现的函数调用树。After:同一棵树坍缩成一个框,内部调用在其内部以淡化形式显示。
|
|
93
|
+
|
|
94
|
+
## 样式指导
|
|
95
|
+
|
|
96
|
+
- 偏向编辑风格,而非企业仪表盘风格。宽松的留白。标题可选择衬线字体(`font-serif` 与 stone/slate 搭配效果很好)。
|
|
97
|
+
- 色彩使用克制:一种强调色(翠绿或靛蓝),加上红色用于泄漏,琥珀色用于警告。
|
|
98
|
+
- 保持图表约 320px 高,使 before/after 能够舒适地并排放置而无需滚动。
|
|
99
|
+
- 使用 `text-xs uppercase tracking-wider` 用于图表内的模块标签 — 它们应读起来像示意图,而非 UI。
|
|
100
|
+
- 唯一的脚本是 Tailwind CDN 和 Mermaid ESM 导入。除此之外报告是静态的 — 没有应用代码,除了 Mermaid 自身的渲染之外没有交互。
|
|
101
|
+
|
|
102
|
+
## 顶部推荐部分
|
|
103
|
+
|
|
104
|
+
一张更大的卡片。候选名称,一句话说明为什么,指向其卡片的锚链接。这就够了。
|
|
105
|
+
|
|
106
|
+
## 语气
|
|
107
|
+
|
|
108
|
+
平实的英语,简洁 — 但架构名词和动词直接来自 `<Path>{roots.workflows}/specdev/common/rules/codebase-design.md</Path>`。简洁不是偏离的借口。
|
|
109
|
+
|
|
110
|
+
**完全使用:** module、interface、implementation、depth、deep、shallow、seam、adapter、leverage、locality。
|
|
111
|
+
|
|
112
|
+
**绝不替代:** component、service、unit(代替 module)· API、signature(代替 interface)· boundary(代替 seam)· layer、wrapper(代替 module,当你的意思是 module 时)。
|
|
113
|
+
|
|
114
|
+
**符合风格的表达方式:**
|
|
115
|
+
|
|
116
|
+
- "Order intake module is shallow — interface nearly matches the implementation."
|
|
117
|
+
- "Pricing leaks across the seam."
|
|
118
|
+
- "Deepen: one interface, one place to test."
|
|
119
|
+
- "Two adapters justify the seam: HTTP in prod, in-memory in tests."
|
|
120
|
+
|
|
121
|
+
**Wins 要点**用术语表命名收益:*"locality: bugs concentrate in one module"*、*"leverage: one interface, N call sites"*、*"interface shrinks; implementation absorbs the wrappers"*。不要写 *"easier to maintain"* 或 *"cleaner code"* — 这些术语不在术语表中,不值得留下。
|
|
122
|
+
|
|
123
|
+
不模糊其词,不清喉咙,不说"值得注意的是……"。如果一句话可以变成一个要点,就变成要点。如果一个要点可以删除,就删除它。如果一个术语不在 `<Path>{roots.workflows}/specdev/common/rules/codebase-design.md</Path>` 中,在发明新术语之前先用术语表中已有的。
|
package/template/workflows/specdev/R-review-architecture/architecture-review-report-template.html
CHANGED
|
@@ -1,58 +1,106 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
2
|
<html lang="zh-CN">
|
|
3
|
-
<head>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
</head>
|
|
21
|
-
<body>
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
<
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
</
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Architecture review - {{repo name}}</title>
|
|
7
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
8
|
+
<script type="module">
|
|
9
|
+
import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs";
|
|
10
|
+
mermaid.initialize({ startOnLoad: true, theme: "neutral", securityLevel: "loose" });
|
|
11
|
+
</script>
|
|
12
|
+
<style>
|
|
13
|
+
* { letter-spacing: 0 !important; }
|
|
14
|
+
.seam { stroke-dasharray: 4 4; }
|
|
15
|
+
.leak { stroke: #dc2626; }
|
|
16
|
+
.module-label { font-size: 0.72rem; text-transform: uppercase; }
|
|
17
|
+
.quality-bar { min-height: 2.75rem; }
|
|
18
|
+
code { overflow-wrap: anywhere; }
|
|
19
|
+
</style>
|
|
20
|
+
</head>
|
|
21
|
+
<body class="bg-stone-50 text-slate-900 font-sans">
|
|
22
|
+
<main class="mx-auto max-w-5xl space-y-12 px-4 py-10 sm:px-6 sm:py-12">
|
|
23
|
+
<header class="space-y-4 border-b border-slate-300 pb-6">
|
|
24
|
+
<div class="flex flex-col gap-2 sm:flex-row sm:items-end sm:justify-between">
|
|
25
|
+
<div>
|
|
26
|
+
<p class="text-sm font-semibold text-emerald-700">{{repo name}} / {{date}}</p>
|
|
27
|
+
<h1 class="mt-1 font-serif text-3xl font-semibold sm:text-4xl">Architecture review</h1>
|
|
28
|
+
</div>
|
|
29
|
+
<p class="text-sm text-slate-600">{{review scope}}</p>
|
|
30
|
+
</div>
|
|
31
|
+
<div class="flex flex-wrap gap-x-5 gap-y-2 text-xs text-slate-600" aria-label="图例">
|
|
32
|
+
<span><span class="mr-1 inline-block h-3 w-5 border border-slate-700 align-middle"></span>module</span>
|
|
33
|
+
<span><span class="mr-1 inline-block h-3 w-5 border border-dashed border-slate-700 align-middle"></span>seam</span>
|
|
34
|
+
<span><span class="mr-1 inline-block h-0 w-5 border-t-2 border-red-600 align-middle"></span>leak</span>
|
|
35
|
+
<span><span class="mr-1 inline-block h-3 w-5 border-4 border-slate-900 align-middle"></span>deep module</span>
|
|
36
|
+
</div>
|
|
37
|
+
<p class="text-xs text-slate-500">
|
|
38
|
+
Decision record: <code><Path>{roots.state}/specdev/changes/{change}/architecture-review.md</Path></code>
|
|
39
|
+
</p>
|
|
40
|
+
</header>
|
|
41
|
+
|
|
42
|
+
<section id="candidates" class="space-y-10">
|
|
43
|
+
<article id="ar-001" class="rounded-lg border border-slate-300 bg-white p-5 shadow-sm sm:p-7">
|
|
44
|
+
<div class="flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between">
|
|
45
|
+
<div>
|
|
46
|
+
<p class="text-sm font-semibold text-emerald-700">AR-001</p>
|
|
47
|
+
<h2 class="mt-1 font-serif text-2xl font-semibold">Collapse the Order intake pipeline</h2>
|
|
48
|
+
</div>
|
|
49
|
+
<div class="flex flex-wrap gap-2 text-xs font-semibold">
|
|
50
|
+
<span class="rounded border border-emerald-700 bg-emerald-50 px-2 py-1 text-emerald-800">Strong</span>
|
|
51
|
+
<span class="rounded border border-slate-400 bg-slate-50 px-2 py-1 text-slate-700">in-process</span>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<div class="mt-5 border-y border-slate-200 py-3">
|
|
56
|
+
<p class="text-xs font-semibold uppercase text-slate-500">Files</p>
|
|
57
|
+
<p class="mt-1 font-mono text-sm">src/order/handler.ts · src/order/validator.ts · test/order.test.ts</p>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<div class="mt-6 grid gap-6 lg:grid-cols-2">
|
|
61
|
+
<section aria-labelledby="before-title">
|
|
62
|
+
<h3 id="before-title" class="text-sm font-semibold">Before</h3>
|
|
63
|
+
<div class="mt-2 min-h-80 rounded-lg border border-slate-200 bg-stone-50 p-4">
|
|
64
|
+
<pre class="mermaid">
|
|
65
|
+
flowchart LR
|
|
66
|
+
A[OrderHandler] --> B[OrderValidator]
|
|
67
|
+
B --> C[OrderRepo]
|
|
68
|
+
C -. leak .-> D[PricingClient]
|
|
69
|
+
classDef leaking stroke:#dc2626,stroke-width:2px
|
|
70
|
+
class C,D leaking
|
|
71
|
+
</pre>
|
|
72
|
+
</div>
|
|
73
|
+
</section>
|
|
74
|
+
<section aria-labelledby="after-title">
|
|
75
|
+
<h3 id="after-title" class="text-sm font-semibold">After</h3>
|
|
76
|
+
<div class="mt-2 flex min-h-80 flex-col justify-center rounded-lg border-4 border-slate-900 bg-white p-5">
|
|
77
|
+
<p class="module-label font-semibold text-slate-500">Interface</p>
|
|
78
|
+
<div class="quality-bar mt-2 flex items-center rounded border border-emerald-700 bg-emerald-50 px-4 text-sm font-semibold text-emerald-900">one narrow interface</div>
|
|
79
|
+
<p class="module-label mt-6 font-semibold text-slate-500">Hidden implementation</p>
|
|
80
|
+
<div class="mt-2 space-y-2 text-sm text-slate-500">
|
|
81
|
+
<div class="rounded border border-slate-200 bg-slate-50 p-3">validation</div>
|
|
82
|
+
<div class="rounded border border-slate-200 bg-slate-50 p-3">pricing protocol</div>
|
|
83
|
+
<div class="rounded border border-slate-200 bg-slate-50 p-3">persistence</div>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
</section>
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
<dl class="mt-6 grid gap-5 border-t border-slate-200 pt-5 sm:grid-cols-3">
|
|
90
|
+
<div><dt class="text-xs font-semibold uppercase text-slate-500">Problem</dt><dd class="mt-1 text-sm">Callers coordinate three shallow modules and absorb the failure order.</dd></div>
|
|
91
|
+
<div><dt class="text-xs font-semibold uppercase text-slate-500">Solution</dt><dd class="mt-1 text-sm">Move the intake policy behind one deep module.</dd></div>
|
|
92
|
+
<div><dt class="text-xs font-semibold uppercase text-slate-500">Wins</dt><dd class="mt-1 text-sm">One test surface · Local failure policy · Fewer leaking seams</dd></div>
|
|
93
|
+
</dl>
|
|
94
|
+
|
|
95
|
+
<p class="mt-5 rounded border border-amber-500 bg-amber-50 px-4 py-3 text-sm text-amber-950">ADR note: {{none or conflict explanation}}</p>
|
|
96
|
+
</article>
|
|
97
|
+
</section>
|
|
98
|
+
|
|
99
|
+
<section id="top-recommendation" class="border-t-4 border-emerald-700 pt-6">
|
|
100
|
+
<p class="text-sm font-semibold text-emerald-700">Best recommendation</p>
|
|
101
|
+
<h2 class="mt-1 font-serif text-2xl font-semibold"><a class="underline decoration-emerald-600 decoration-2 underline-offset-4" href="#ar-001">Collapse the Order intake pipeline</a></h2>
|
|
102
|
+
<p class="mt-2 max-w-3xl text-slate-700">It removes the hottest coordination seam while preserving the domain language and existing behavior.</p>
|
|
103
|
+
</section>
|
|
104
|
+
</main>
|
|
105
|
+
</body>
|
|
58
106
|
</html>
|
|
@@ -16,53 +16,44 @@ status: draft
|
|
|
16
16
|
- 相关行为或 Ticket:
|
|
17
17
|
- 不审查范围:
|
|
18
18
|
- 成功标准:
|
|
19
|
+
- 热点依据:用户指定 / Git 历史
|
|
19
20
|
|
|
20
21
|
## 2. 当前结构地图
|
|
21
22
|
|
|
22
|
-
###
|
|
23
|
+
### Modules 与 Interfaces
|
|
23
24
|
|
|
24
|
-
###
|
|
25
|
+
### 数据、控制与错误流及 Seams
|
|
25
26
|
|
|
26
|
-
###
|
|
27
|
+
### 变化热点、Locality 与测试表面
|
|
27
28
|
|
|
28
29
|
## 3. 候选提案
|
|
29
30
|
|
|
30
31
|
### AR-001: <标题>
|
|
31
32
|
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
33
|
+
- **文件:** `<Path>project/relative/path</Path>`
|
|
34
|
+
- **问题:** 当前架构如何造成摩擦
|
|
35
|
+
- **解决方案:** 将发生什么变化;报告阶段不提出具体 interface
|
|
36
|
+
- **收益:** locality、leverage 与测试改善
|
|
37
|
+
- **建议强度:** Strong / Worth exploring / Speculative
|
|
38
|
+
- **依赖类别:** in-process / local-substitutable / ports & adapters / mock
|
|
39
|
+
- **删除测试:** 删除当前 shallow module 会集中复杂性 / 只移动复杂性
|
|
40
|
+
- **ADR 冲突:** 无 / ADR-###,值得重审因为 ...
|
|
39
41
|
|
|
40
|
-
####
|
|
42
|
+
#### Before / After
|
|
41
43
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
#### 方案 C:替代方案
|
|
45
|
-
|
|
46
|
-
| 维度 | A | B | C |
|
|
47
|
-
|---|---|---|---|
|
|
48
|
-
| 调用者复杂度 | | | |
|
|
49
|
-
| 接口稳定性 | | | |
|
|
50
|
-
| 迁移与兼容 | | | |
|
|
51
|
-
| 测试与验证 | | | |
|
|
52
|
-
| 回滚 | | | |
|
|
53
|
-
| 事故半径 | | | |
|
|
44
|
+
- Before:shallow interface、leaking seam 与分散 locality。
|
|
45
|
+
- After:deep module、稳定 interface 与集中测试表面。
|
|
54
46
|
|
|
55
47
|
- **推荐:**
|
|
56
|
-
-
|
|
57
|
-
- **访谈状态:** proposed / accepted / adjusted / deferred / rejected
|
|
48
|
+
- **访谈状态:** unselected / selected / consensus / blocked / rejected
|
|
58
49
|
- **用户结论:**
|
|
59
50
|
- **ADR 影响:** 无 / `<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>` 中的 ADR-###
|
|
60
51
|
|
|
61
|
-
## 4.
|
|
52
|
+
## 4. 最佳推荐
|
|
62
53
|
|
|
63
|
-
|
|
64
|
-
|---|---|---|---|---|---|
|
|
54
|
+
首先探索:AR-###。原因:<一句话>。
|
|
65
55
|
|
|
66
56
|
## 5. 下一步
|
|
67
57
|
|
|
68
|
-
-
|
|
58
|
+
- 报告生成后询问用户选择一个候选,不批量访谈。
|
|
59
|
+
- 达成共识的接受项进入 `<Path>{roots.workflows}/specdev/T-tickets/T-tickets.md</Path>`。
|