@namewta/speculo 1.0.2 → 1.0.4
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 +8 -3
- package/package.json +2 -2
- package/template/AGENTS.md +3 -1
- package/template/canonical/canonical-specdev-goal-plan.md +757 -225
- package/template/canonical/canonical-specdev-grill-with-docs.md +221 -133
- package/template/canonical/canonical-specdev-spec.md +73 -3
- package/template/canonical/canonical-specdev-tickets.md +681 -252
- package/template/canonical/canonical-specdev-wayfinder.md +330 -113
- package/template/commands/archive-and-consolidate.md +39 -3
- package/template/commands/git-history-squash.md +76 -0
- package/template/commands/git-repository-audit.md +3 -602
- package/template/commands/references/git-repository-audit-procedure.md +608 -0
- package/template/skills/archive-and-consolidate/SKILL.md +1 -1
- package/template/skills/archive-and-consolidate/references/entry-procedure.md +11 -3
- package/template/skills/git-history-squash/SKILL.md +2 -0
- package/template/skills/git-history-squash/references/entry-procedure.md +1 -1
- package/template/skills/writing-great-skills/SKILL.md +2 -0
- package/template/skills/writing-great-skills/references/document-contract.md +23 -0
- package/template/workflows/learning/common/rules/activation-and-memory.md +7 -3
- package/template/workflows/ops/common/rules/activation-and-memory.md +7 -3
- package/template/workflows/person/common/rules/activation-and-memory.md +7 -3
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +13 -136
- package/template/workflows/specdev/G-grill-with-docs/references/interview-procedure.md +134 -0
- package/template/workflows/specdev/I-implement/I-implement.md +15 -189
- package/template/workflows/specdev/I-implement/evidence-template.md +12 -0
- package/template/workflows/specdev/I-implement/execution-preflight.md +1 -1
- package/template/workflows/specdev/I-implement/references/implementation-procedure.md +192 -0
- package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +28 -143
- package/template/workflows/specdev/P-goal-plan/completion-control.md +1 -1
- package/template/workflows/specdev/P-goal-plan/references/goal-lifecycle.md +35 -0
- package/template/workflows/specdev/P-goal-plan/references/goal-tickets-map-template.md +15 -0
- package/template/workflows/specdev/P-goal-plan/references/map-control.md +28 -0
- package/template/workflows/specdev/{O-orchestrate-implementation/O-orchestrate-implementation.md → P-goal-plan/references/multi-change-plan.md} +21 -33
- package/template/workflows/specdev/P-goal-plan/references/replan-and-recovery.md +21 -0
- package/template/workflows/specdev/P-goal-plan/references/single-change-plan.md +149 -0
- package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +48 -53
- package/template/workflows/specdev/R-review-architecture/architecture-review-template.md +19 -10
- package/template/workflows/specdev/R-review-architecture/proposal-to-ticket.md +3 -1
- package/template/workflows/specdev/R-review-architecture/review-rubric.md +52 -0
- package/template/workflows/specdev/README.md +36 -216
- package/template/workflows/specdev/T-tickets/T-tickets.md +19 -230
- package/template/workflows/specdev/T-tickets/references/planning-procedure.md +233 -0
- package/template/workflows/specdev/T-tickets/ticket-template.md +16 -0
- package/template/workflows/specdev/T-tickets/tickets-map-template.md +14 -0
- package/template/workflows/specdev/T-triage/T-triage.md +3 -1
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +24 -118
- package/template/workflows/specdev/W-wayfinder/references/initiative-discovery.md +29 -0
- package/template/workflows/specdev/W-wayfinder/references/initiative-template.json +8 -0
- package/template/workflows/specdev/W-wayfinder/references/map-traversal.md +120 -0
- package/template/workflows/specdev/W-wayfinder/wayfinder-map-template.md +4 -0
- package/template/workflows/specdev/common/README.md +1 -1
- package/template/workflows/specdev/common/rules/activation-and-memory.md +7 -3
- package/template/workflows/specdev/common/rules/artifact-contract.md +10 -2
- package/template/workflows/specdev/common/rules/operating-governance.md +38 -0
- package/template/workflows/specdev/common/rules/parent-implementation-orchestration.md +6 -2
- package/template/workflows/specdev/common/rules/skill-invocation.md +27 -0
- package/template/workflows/specdev/common/rules/workflow-routing.md +24 -0
- package/template/workflows/specdev/common/rules/workflow-state-and-lifecycle.md +93 -0
- package/template/workflows/specdev/common/schemas/goal-tickets-map.schema.json +33 -0
- package/template/workflows/specdev/common/schemas/initiative.schema.json +94 -0
- package/template/workflows/specdev/common/schemas/ticket.schema.json +168 -1
- package/template/workflows/specdev/common/schemas/tickets-map.schema.json +74 -6
- package/template/workflows/specdev/common/skills/code-review/SKILL.md +3 -2
- package/template/workflows/specdev/common/skills/code-review/references/risk-review.md +25 -0
- package/template/workflows/specdev/common/skills/plan-quality-review/SKILL.md +10 -0
- package/template/workflows/specdev/common/skills/plan-quality-review/references/checklist.md +13 -0
- package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +5 -83
- package/template/workflows/specdev/common/skills/subagent-delivery/references/dispatch-and-accept.md +87 -0
- package/template/workflows/specdev/common/tools/README.md +14 -2
- package/template/workflows/specdev/common/tools/plan-contract.mjs +256 -0
- package/template/workflows/specdev/common/tools/ticket-control.mjs +251 -0
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +58 -40
- package/template/workflows/specdev/manifest.json +97 -1
- package/template/canonical/canonical-specdev-orchestrate-implementation.md +0 -2839
- package/template/workflows/specdev/O-orchestrate-implementation/implementation-evidence-template.md +0 -39
- package/template/workflows/specdev/O-orchestrate-implementation/implementation-map-template.md +0 -50
- package/template/workflows/specdev/O-orchestrate-implementation/implementation-plan-template.md +0 -61
- package/template/workflows/specdev/R-review-architecture/architecture-report-contract.md +0 -123
- package/template/workflows/specdev/R-review-architecture/architecture-review-report-template.html +0 -106
- /package/template/workflows/specdev/{O-orchestrate-implementation/conflict-and-drift.md → P-goal-plan/references/multi-conflict-and-drift.md} +0 -0
- /package/template/workflows/specdev/{O-orchestrate-implementation/execution-loop.md → P-goal-plan/references/multi-execution-loop.md} +0 -0
- /package/template/workflows/specdev/{O-orchestrate-implementation/input-readiness.md → P-goal-plan/references/multi-input-readiness.md} +0 -0
- /package/template/workflows/specdev/{O-orchestrate-implementation/super-dag.md → P-goal-plan/references/multi-super-dag.md} +0 -0
|
@@ -3,29 +3,26 @@ id: specdev/review-architecture
|
|
|
3
3
|
type: workflow-entry
|
|
4
4
|
workflow: specdev
|
|
5
5
|
name: 架构审查
|
|
6
|
-
description: 从用户指定范围或 Git
|
|
7
|
-
keywords: [
|
|
6
|
+
description: 从用户指定范围或 Git 热点扫描代码库中的结构性坏味道、代码 judo 机会和维护性风险,以中文 Markdown 记录高置信候选,并对用户选择的一个方案运行设计树访谈。
|
|
7
|
+
keywords: [架构审查, 维护性, 浅模块, 深模块, 局部性, 杠杆, 接缝, code-judo]
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
#
|
|
10
|
+
# 架构审查
|
|
11
11
|
|
|
12
12
|
> 激活本 Work 后,先读取 `<Path>{roots.workflows}/specdev/README.md</Path>`,再执行本入口。
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
本 work 以热核级维护性标准审查当前范围:先找会让 module 变浅的结构性坏味道,再找能删掉复杂性的 `code-judo` 机会,再找真正值得深化的 seam。行为正确不构成通过;如果存在更简单的路径,就优先把复杂性删掉,而不是搬家。
|
|
15
15
|
|
|
16
|
-
本 work
|
|
16
|
+
本 work 只审查、呈现和访谈,不直接修改产品代码。报告阶段只产出 Markdown 决策记录,不生成 HTML。
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
- 当前 change 与永久 CONTEXT 中的领域语言为好的 seam 提供名称;ADR 记录本 work 不应重新争论的决定。
|
|
20
|
-
|
|
21
|
-
本 work 只审查、呈现和访谈,不直接修改产品代码。
|
|
18
|
+
本 work 的候选筛选、排序和删除测试见 `<Path>{roots.workflows}/specdev/R-review-architecture/review-rubric.md</Path>`。审查语言必须使用 module、interface、depth、seam、adapter、leverage、locality。
|
|
22
19
|
|
|
23
20
|
## 读取范围
|
|
24
21
|
|
|
25
22
|
1. 先读取 `<Path>{roots.workflows}/specdev/README.md</Path>` 与当前 Work 的状态入口。
|
|
26
|
-
2. 再读取 `<Path>{roots.workflows}/specdev/common/rules/activation-and-memory.md</Path>`,按当前分支、状态和关键词定位最小相关工件。
|
|
23
|
+
2. 再读取 `<Path>{roots.workflows}/specdev/common/rules/activation-and-memory.md</Path>`、`<Path>{roots.workflows}/specdev/common/rules/codebase-design.md</Path>` 和 `<Path>{roots.workflows}/specdev/common/rules/evidence-and-verification.md</Path>`,按当前分支、状态和关键词定位最小相关工件。
|
|
27
24
|
3. 只在本 Work 明确要求恢复、冲突、执行安全或归档证据时扩展为全量读取;缺少匹配证据或 owner/gateway 时停止受影响分支。
|
|
28
|
-
|
|
25
|
+
4. 用户指定范围优先于 Git 热点;若未指定,则从最近 churn、重复编辑和报错/回归轨迹中找出最值得审查的 module。
|
|
29
26
|
|
|
30
27
|
## 输入与产物
|
|
31
28
|
|
|
@@ -43,61 +40,57 @@ keywords: [architecture, review, module, interface, depth, seam, adapter, levera
|
|
|
43
40
|
产物:
|
|
44
41
|
|
|
45
42
|
- `<Path>{roots.state}/specdev/changes/{change}/architecture-review.md</Path>`
|
|
46
|
-
|
|
47
|
-
-
|
|
43
|
+
|
|
44
|
+
每个候选都必须说明:files、structural problem、code-judo move、deleted complexity、dependency class、strength、ADR conflict、interview state 和 user conclusion。文件若因为本次变化接近或超过 1k lines,必须显式标注 decomposition pressure,不得默默吞掉。
|
|
48
45
|
|
|
49
46
|
## 流程
|
|
50
47
|
|
|
51
48
|
### 1. 探索
|
|
52
49
|
|
|
53
|
-
|
|
50
|
+
**先找结构压力,再找方案。** YAGNI 仍然成立,但只有真正的代码压力才值得写入报告。
|
|
54
51
|
|
|
55
|
-
-
|
|
56
|
-
- 否则翻阅足够长的 `git log --oneline
|
|
57
|
-
-
|
|
52
|
+
- 用户指明 module、子系统或痛点时直接采用,跳过热点推断;
|
|
53
|
+
- 否则翻阅足够长的 `git log --oneline`,找出反复出现的 files、call sites 和 test surfaces;
|
|
54
|
+
- 变更散落、没有明确热点时才扩大搜索范围;
|
|
55
|
+
- 只接受能通过删除测试的候选:删掉该 module 后,复杂性应集中或消失,而不是换一个地方继续蔓延;
|
|
56
|
+
- 优先挑出结构性回归、重复 special cases、wrong-layer logic、thin wrappers、identity abstractions、type boundary drift、sequential orchestration 和 file-size/decomposition pressure;
|
|
57
|
+
- 如果一个更 canonical 的 helper 已经存在,优先复用它;如果 proposal 只是 rearrange complexity,不算候选。
|
|
58
58
|
|
|
59
|
-
首先阅读项目领域词汇和接触区域的 ADR
|
|
59
|
+
首先阅读项目领域词汇和接触区域的 ADR。然后有机探索 codebase,注意哪里会让 maintenance knowledge 分散:
|
|
60
60
|
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
-
|
|
61
|
+
- 哪些 module 是 shallow,interface 几乎与 implementation 一样复杂;
|
|
62
|
+
- 哪些 seam 正在 leak;
|
|
63
|
+
- 哪些纯函数只是为了可测试性被拆出,但 bug 实际藏在缺少 locality 的调用方式中;
|
|
64
|
+
- 哪些模块因为 ad-hoc conditionals、mode flags 或 one-off branches 变得更 spaghetti;
|
|
65
|
+
- 哪些区域正在把 feature logic 泄漏进 shared path 或 canonical helper 之外;
|
|
66
|
+
- 哪些结构已经逼近或超过 1k lines,应该先 decomposition 再 review;
|
|
67
|
+
- 哪些 orchestration 本可以并行或更 atomic,却被无谓串行化。
|
|
66
68
|
|
|
67
|
-
|
|
69
|
+
对每个怀疑对象应用删除测试。候选必须有真实路径、调用或测试证据,并说明不做的实际后果。与业务目标、近期变化压力、测试改善或风险降低无关的候选过滤掉。若没有任何候选通过这条线,明确写出“没有高置信候选”,不要为了填表而硬造一个。
|
|
68
70
|
|
|
69
|
-
**完成标准**:审查范围、排除范围、领域/ADR
|
|
71
|
+
**完成标准**:审查范围、排除范围、领域/ADR 输入和每个候选的 code pressure 均可追踪;没有把行为正确但结构平庸的地方当成通过。
|
|
70
72
|
|
|
71
|
-
### 2. 生成 Markdown
|
|
73
|
+
### 2. 生成 Markdown 报告
|
|
72
74
|
|
|
73
75
|
使用 `<Path>{roots.workflows}/specdev/R-review-architecture/architecture-review-template.md</Path>` 写入 Markdown 决策记录。
|
|
74
76
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
每个候选包含:
|
|
77
|
+
每个候选以高置信 finding 的顺序展示,而不是按文件顺序排列。每个候选包含:
|
|
78
78
|
|
|
79
|
-
-
|
|
79
|
+
- **文件**——涉及的 files 和 modules;
|
|
80
80
|
- **问题**——当前架构造成的摩擦;
|
|
81
|
-
-
|
|
82
|
-
- **收益**——用 locality、leverage 和测试改善解释;
|
|
83
|
-
-
|
|
81
|
+
- **代码 judo**——保留行为但删掉什么复杂性;
|
|
82
|
+
- **收益**——用 locality、leverage、depth 和测试改善解释;
|
|
83
|
+
- **删除测试**——删掉这个 module 后复杂性是否真的消失;
|
|
84
|
+
- **前后对比**——用文本图示或 Mermaid 记录 shallow 与 deep;
|
|
84
85
|
- **建议强度**——`Strong | Worth exploring | Speculative`;
|
|
85
86
|
- **依赖类别**——`in-process | local-substitutable | ports & adapters | mock`;
|
|
86
87
|
- **ADR 冲突**——只在摩擦真实到值得重审时显示警告。
|
|
87
88
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
**完成标准**:每个候选字段完整、图表承担主要关系、最佳推荐唯一,Markdown 与 HTML 已原子写入并重读。
|
|
91
|
-
|
|
92
|
-
### 3. 持久化并打开报告
|
|
93
|
-
|
|
94
|
-
从 `$TMPDIR` 解析临时目录,回退 `/tmp`,Windows 使用 `%TEMP%`。把持久化 HTML 复制到全新的 architecture-review-<timestamp>.html,再用平台命令打开:Linux `xdg-open`、macOS `open`、Windows `start`。
|
|
95
|
-
|
|
96
|
-
打开失败不删除任一文件;向用户返回 state 主件和临时副本的绝对路径,以及失败命令。敏感值和机器路径不写回持久化报告。
|
|
89
|
+
报告以“最佳推荐”结束;若没有高置信候选,就明确写 `无高置信候选`。此时**不提出 interface**,只询问用户想探索哪一个候选,或者为何没有候选。
|
|
97
90
|
|
|
98
|
-
|
|
91
|
+
**完成标准**:每个候选字段完整、最佳推荐唯一或明确为空,Markdown 已原子写入并重读。
|
|
99
92
|
|
|
100
|
-
###
|
|
93
|
+
### 3. 访谈用户选择的一个候选
|
|
101
94
|
|
|
102
95
|
用户选择候选后,调用 `<Path>{roots.workflows}/specdev/G-grill-with-docs/G-grill-with-docs.md</Path>`,用完整 frontier 遍历约束、依赖、deep module 形状、seam 后面的内容和保留测试。
|
|
103
96
|
|
|
@@ -106,31 +99,33 @@ keywords: [architecture, review, module, interface, depth, seam, adapter, levera
|
|
|
106
99
|
- 新概念加入 change CONTEXT;永久 CONTEXT 不存在时延迟到归档提升;
|
|
107
100
|
- 模糊术语当场精炼;
|
|
108
101
|
- 用户的选择同时难以逆转、没有上下文会令人惊讶且来自真实权衡时,询问是否记录 ADR;任一条件不满足就留在 LOG/Ticket,不制造 ADR;
|
|
109
|
-
- 替代 interface 需要探索时使用 `<Path>{roots.workflows}/specdev/I-implement/design-it-twice.md</Path
|
|
102
|
+
- 替代 interface 需要探索时使用 `<Path>{roots.workflows}/specdev/I-implement/design-it-twice.md</Path>`;
|
|
103
|
+
- 如果候选最终只是把复杂性搬家,而不是删掉它,在访谈中直接回退,不把它升级成 Ticket。
|
|
110
104
|
|
|
111
|
-
将选择、访谈状态与结论同步到 Markdown
|
|
105
|
+
将选择、访谈状态与结论同步到 Markdown;每次运行只访谈用户选择的候选,不批量迫使用户决定所有卡片。
|
|
112
106
|
|
|
113
107
|
**完成标准**:被选候选的设计树达到共识或明确 blocked;领域词汇、LOG、ADR 和审查报告一致。
|
|
114
108
|
|
|
115
|
-
###
|
|
109
|
+
### 4. 转化为执行工作
|
|
116
110
|
|
|
117
|
-
只有被接受且有具体变更压力的提案进入 `<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
|
|
111
|
+
只有被接受且有具体变更压力的提案进入 `<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 治理;只有能删除复杂性的提案才继续,纯重排和 thin wrapper 不进入 Ticket。
|
|
118
112
|
|
|
119
113
|
## 完成标准
|
|
120
114
|
|
|
121
115
|
- 范围来自用户方向或 Git 热点,未进行无边界扫描;
|
|
122
116
|
- 每个候选通过删除测试并有真实代码压力;
|
|
123
117
|
- 领域使用 CONTEXT 词汇,架构严格使用共享词汇;
|
|
124
|
-
-
|
|
125
|
-
-
|
|
118
|
+
- Markdown 决策记录可重读;
|
|
119
|
+
- 每个候选有前后对比、强度、收益和 ADR 冲突处理;
|
|
126
120
|
- 报告阶段没有提前设计 interface;
|
|
127
121
|
- 用户选择的一个候选完成完整 frontier 访谈;
|
|
128
|
-
- 接受项进入 Ticket
|
|
122
|
+
- 接受项进入 Ticket 治理,没有直接修改产品代码;
|
|
123
|
+
- 没有把结构性弱候选包装成最佳推荐。
|
|
129
124
|
|
|
130
125
|
## 子文件引用
|
|
131
126
|
|
|
132
127
|
- 共享设计规则:`<Path>{roots.workflows}/specdev/common/rules/codebase-design.md</Path>`
|
|
128
|
+
- 证据与验证:`<Path>{roots.workflows}/specdev/common/rules/evidence-and-verification.md</Path>`
|
|
129
|
+
- 审查准则:`<Path>{roots.workflows}/specdev/R-review-architecture/review-rubric.md</Path>`
|
|
133
130
|
- Markdown 模板:`<Path>{roots.workflows}/specdev/R-review-architecture/architecture-review-template.md</Path>`
|
|
134
|
-
- HTML 报告合同:`<Path>{roots.workflows}/specdev/R-review-architecture/architecture-report-contract.md</Path>`
|
|
135
|
-
- HTML 模板:`<Path>{roots.workflows}/specdev/R-review-architecture/architecture-review-report-template.html</Path>`
|
|
136
131
|
- 提案转 Ticket:`<Path>{roots.workflows}/specdev/R-review-architecture/proposal-to-ticket.md</Path>`
|
|
@@ -4,10 +4,10 @@ change: <YYYY-MM-DD-topic>
|
|
|
4
4
|
status: draft
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
#
|
|
7
|
+
# 架构审查:<范围>
|
|
8
8
|
|
|
9
9
|
- **决策记录:** `<Path>{roots.state}/specdev/changes/{change}/architecture-review.md</Path>`
|
|
10
|
-
-
|
|
10
|
+
- **审查准则:** `<Path>{roots.workflows}/specdev/R-review-architecture/review-rubric.md</Path>`
|
|
11
11
|
|
|
12
12
|
## 1. 审查压力与范围
|
|
13
13
|
|
|
@@ -17,33 +17,42 @@ status: draft
|
|
|
17
17
|
- 不审查范围:
|
|
18
18
|
- 成功标准:
|
|
19
19
|
- 热点依据:用户指定 / Git 历史
|
|
20
|
+
- 结构性压力:file-size、spaghetti growth、boundary drift、wrong-layer logic、thin wrapper、sequential orchestration
|
|
20
21
|
|
|
21
22
|
## 2. 当前结构地图
|
|
22
23
|
|
|
23
|
-
###
|
|
24
|
+
### 模块与接口
|
|
24
25
|
|
|
25
|
-
### 数据、控制与错误流及
|
|
26
|
+
### 数据、控制与错误流及 seam
|
|
26
27
|
|
|
27
|
-
### 变化热点、
|
|
28
|
+
### 变化热点、locality 与测试表面
|
|
29
|
+
|
|
30
|
+
### 拆分压力
|
|
31
|
+
|
|
32
|
+
- 接近或超过 1k lines 的文件:
|
|
33
|
+
- 需要先删除还是先拆分的复杂性:
|
|
28
34
|
|
|
29
35
|
## 3. 候选提案
|
|
30
36
|
|
|
31
37
|
### AR-001: <标题>
|
|
32
38
|
|
|
33
39
|
- **文件:** `<Path>project/relative/path</Path>`
|
|
40
|
+
- **结构类别:** structural blocker / missed simplification / spaghetti growth / boundary drift / file-size pressure / wrong-layer logic
|
|
34
41
|
- **问题:** 当前架构如何造成摩擦
|
|
35
|
-
-
|
|
36
|
-
-
|
|
42
|
+
- **代码 judo:** 保留行为但删掉什么复杂性
|
|
43
|
+
- **删除复杂性:** 会消失的 branch、helper、wrapper、mode、special case
|
|
44
|
+
- **删除测试:** 删除当前 shallow module 会集中复杂性 / 只移动复杂性
|
|
45
|
+
- **收益:** locality、leverage、depth 与测试改善
|
|
37
46
|
- **建议强度:** Strong / Worth exploring / Speculative
|
|
38
47
|
- **依赖类别:** in-process / local-substitutable / ports & adapters / mock
|
|
39
|
-
- **删除测试:** 删除当前 shallow module 会集中复杂性 / 只移动复杂性
|
|
40
48
|
- **ADR 冲突:** 无 / ADR-###,值得重审因为 ...
|
|
41
49
|
|
|
42
|
-
####
|
|
50
|
+
#### 前后对比
|
|
43
51
|
|
|
44
52
|
- Before:shallow interface、leaking seam 与分散 locality。
|
|
45
53
|
- After:deep module、稳定 interface 与集中测试表面。
|
|
46
54
|
|
|
55
|
+
- **证据:** `CODE:<Path>project/relative/path</Path>`、git log、测试输出
|
|
47
56
|
- **推荐:**
|
|
48
57
|
- **访谈状态:** unselected / selected / consensus / blocked / rejected
|
|
49
58
|
- **用户结论:**
|
|
@@ -51,7 +60,7 @@ status: draft
|
|
|
51
60
|
|
|
52
61
|
## 4. 最佳推荐
|
|
53
62
|
|
|
54
|
-
首先探索:AR
|
|
63
|
+
首先探索:AR-###。原因:<一句话>。若没有高置信候选,明确写 `无高置信候选`。
|
|
55
64
|
|
|
56
65
|
## 5. 下一步
|
|
57
66
|
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
本规则由 `<Path>{roots.workflows}/specdev/R-review-architecture/R-review-architecture.md</Path>` 在候选被用户接受后加载。
|
|
4
4
|
|
|
5
5
|
- 只有有代码证据、具体收益和用户接受的提案才生成 Ticket。
|
|
6
|
-
-
|
|
6
|
+
- 先确认提案真正在删除复杂性,而不是把复杂性搬家;纯重排、纯改名或 thin wrapper 不进入 Ticket。
|
|
7
|
+
- 前置 Ticket 必须指出解除的后续阻碍、受益 Ticket 或行为,以及独立验证。
|
|
7
8
|
- 修改公共接口、schema、数据或大范围调用方时使用 Deep,并采用 expand → migrate → observe → contract。
|
|
8
9
|
- 架构报告中的项目路径只是审查证据;生成 Ticket 时重新确认当前项目路径和所有权。
|
|
9
10
|
- 不把“清理整个模块”写成单一 Ticket;按可验证安全落点拆分。
|
|
11
|
+
- 如果候选会让文件越过 1k lines、引入更多 special cases,或者只是在已经忙乱的流程里再加一层分支,先继续分解,再考虑 Ticket。
|
|
10
12
|
- 任何会改变外部行为或验收合同的提案先修订 `<Path>{roots.state}/specdev/changes/{change}/spec.md</Path>`。
|
|
11
13
|
- 任何会改变已接受架构决策的提案先更新 `<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>`。
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# 架构审查准则
|
|
2
|
+
|
|
3
|
+
本准则只在 `<Path>{roots.workflows}/specdev/R-review-architecture/R-review-architecture.md</Path>` 激活时生效。它把热核级维护性标准转成候选筛选和排序规则。
|
|
4
|
+
|
|
5
|
+
使用 `<Path>{roots.workflows}/specdev/common/rules/codebase-design.md</Path>` 的术语:module、interface、depth、seam、adapter、leverage、locality。描述架构时不要滑向更弱的替代词。
|
|
6
|
+
|
|
7
|
+
## 重点观察
|
|
8
|
+
|
|
9
|
+
优先寻找有真实代码压力的候选:
|
|
10
|
+
|
|
11
|
+
- 结构性回退:module 变浅,interface 正在向 implementation 膨胀;
|
|
12
|
+
- 代码 judo 机会:删掉一个 branch、helper、wrapper、mode 或 special case;
|
|
13
|
+
- spaghetti growth:ad-hoc conditionals、散落例外或一次性 flags;
|
|
14
|
+
- boundary drift:cast、`any`、`unknown` 或 optionality 掩盖真实不变量;
|
|
15
|
+
- 文件大小或拆分压力,尤其是把文件推到 1k lines 以上;
|
|
16
|
+
- wrong-layer logic 泄漏进共享路径或 canonical helper;
|
|
17
|
+
- 重复的 canonical helper、identity abstraction 或 pass-through wrapper;
|
|
18
|
+
- 原本可以更原子化的顺序编排或部分更新;
|
|
19
|
+
- seam 正在把测试、错误或状态处理复杂性泄漏给调用方。
|
|
20
|
+
|
|
21
|
+
## 删除测试
|
|
22
|
+
|
|
23
|
+
只有删除当前 module、helper 或 branch 后,复杂性真的消失,或者至少集中到更容易推理的位置,候选才算成立。
|
|
24
|
+
|
|
25
|
+
拒绝以下候选:
|
|
26
|
+
|
|
27
|
+
- 只是重新摆放复杂性;
|
|
28
|
+
- 只是改名;
|
|
29
|
+
- 只是把一个 shallow module 换成另一个 shallow module;
|
|
30
|
+
- 只是加一个 thin wrapper、adapter 或 identity abstraction,却没有换来 leverage;
|
|
31
|
+
- 依赖 speculative generality,而不是当前真实压力;
|
|
32
|
+
- 没有文件、调用点或测试证据。
|
|
33
|
+
|
|
34
|
+
## 排序规则
|
|
35
|
+
|
|
36
|
+
按严重度和代码压力排序:
|
|
37
|
+
|
|
38
|
+
1. 结构性阻塞;
|
|
39
|
+
2. 明显的代码 judo;
|
|
40
|
+
3. 重复 special case 和 spaghetti growth;
|
|
41
|
+
4. boundary 与 type contract 漂移;
|
|
42
|
+
5. 文件大小和拆分压力;
|
|
43
|
+
6. wrong-layer logic 和 canonical helper 重复;
|
|
44
|
+
7. 低信号的可读性问题。
|
|
45
|
+
|
|
46
|
+
## 文件大小规则
|
|
47
|
+
|
|
48
|
+
不要让一个候选轻易把文件从 1k lines 以下推到 1k lines 以上。默认把它当成拆分压力,而不是通过项。
|
|
49
|
+
|
|
50
|
+
## 报告门槛
|
|
51
|
+
|
|
52
|
+
不要把报告写成杂音集合。只保留高置信 finding。若没有候选通过门槛,就直接写 `无高置信候选`,不要硬造一个来填模板。
|