specops 0.2.2 → 0.2.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.
Files changed (62) hide show
  1. package/.opencode/agent/demand-analyst.md +69 -18
  2. package/.opencode/agent/verifier.md +231 -0
  3. package/.opencode/skills/brainstorming/SKILL.md +105 -0
  4. package/.opencode/skills/demand-analysis/SKILL.md +261 -47
  5. package/.opencode/skills/dispatching-parallel-agents/SKILL.md +180 -0
  6. package/.opencode/skills/executing-plans/SKILL.md +90 -0
  7. package/.opencode/skills/finishing-a-development-branch/SKILL.md +222 -0
  8. package/.opencode/skills/receiving-code-review/SKILL.md +213 -0
  9. package/.opencode/skills/repo-clone-analyze/SKILL.md +371 -0
  10. package/.opencode/skills/requesting-code-review/SKILL.md +105 -0
  11. package/.opencode/skills/requesting-code-review/code-reviewer.md +146 -0
  12. package/.opencode/skills/subagent-driven-development/SKILL.md +242 -0
  13. package/.opencode/skills/subagent-driven-development/code-quality-reviewer-prompt.md +20 -0
  14. package/.opencode/skills/subagent-driven-development/implementer-prompt.md +78 -0
  15. package/.opencode/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  16. package/.opencode/skills/systematic-debugging/SKILL.md +296 -0
  17. package/.opencode/skills/systematic-debugging/condition-based-waiting.md +115 -0
  18. package/.opencode/skills/systematic-debugging/defense-in-depth.md +122 -0
  19. package/.opencode/skills/systematic-debugging/root-cause-tracing.md +169 -0
  20. package/.opencode/skills/test-driven-development/SKILL.md +399 -0
  21. package/.opencode/skills/test-driven-development/testing-anti-patterns.md +299 -0
  22. package/.opencode/skills/using-git-worktrees/SKILL.md +218 -0
  23. package/.opencode/skills/using-superpowers/SKILL.md +99 -0
  24. package/.opencode/skills/verification-before-completion/SKILL.md +150 -0
  25. package/.opencode/skills/writing-plans/SKILL.md +123 -0
  26. package/.opencode/skills/writing-skills/SKILL.md +654 -0
  27. package/dist/__e2e__/01-state-engine.e2e.test.js +1 -1
  28. package/dist/acceptance/lazyDetector.js +1 -1
  29. package/dist/acceptance/lazyDetector.test.js +1 -1
  30. package/dist/acceptance/reporter.js +1 -1
  31. package/dist/acceptance/reporter.test.js +1 -1
  32. package/dist/acceptance/runner.js +1 -1
  33. package/dist/acceptance/runner.test.js +1 -1
  34. package/dist/cli.js +1 -1
  35. package/dist/context/index.js +1 -1
  36. package/dist/context/promptTemplate.js +1 -1
  37. package/dist/context/promptTemplate.test.js +1 -1
  38. package/dist/context/techContextLoader.js +1 -1
  39. package/dist/context/techContextLoader.test.js +1 -1
  40. package/dist/engine.js +1 -1
  41. package/dist/evolution/distiller.js +1 -1
  42. package/dist/evolution/index.js +1 -1
  43. package/dist/evolution/memoryGraph.js +1 -1
  44. package/dist/evolution/selector.js +1 -1
  45. package/dist/evolution/signals.js +1 -1
  46. package/dist/evolution/solidify.js +1 -1
  47. package/dist/evolution/store.js +1 -1
  48. package/dist/evolution/types.js +1 -1
  49. package/dist/init.js +1 -1
  50. package/dist/machines/agentMachine.js +1 -1
  51. package/dist/machines/agentMachine.test.js +1 -1
  52. package/dist/machines/supervisorMachine.js +1 -1
  53. package/dist/machines/supervisorMachine.test.js +1 -1
  54. package/dist/persistence/schema.js +1 -1
  55. package/dist/persistence/stateFile.js +1 -1
  56. package/dist/persistence/stateFile.test.js +1 -1
  57. package/dist/plugin-engine.js +1 -1
  58. package/dist/plugin.js +1 -1
  59. package/dist/types/index.js +1 -1
  60. package/dist/utils/id.js +1 -1
  61. package/package.json +8 -2
  62. package/scripts/postinstall.mjs +37 -7
@@ -0,0 +1,242 @@
1
+ ---
2
+ name: subagent-driven-development
3
+ description: 在当前会话中执行实现计划,适用于包含多个独立任务的场景
4
+ ---
5
+
6
+ # 子 Agent 驱动开发
7
+
8
+ 通过为每个任务派发全新的子 agent 来执行计划,每个任务完成后进行两阶段审查:先审查规格合规性,再审查代码质量。
9
+
10
+ **核心原则:** 每个任务一个全新子 agent + 两阶段审查(规格 → 质量)= 高质量、快速迭代
11
+
12
+ ## 何时使用
13
+
14
+ ```dot
15
+ digraph when_to_use {
16
+ "有实现计划吗?" [shape=diamond];
17
+ "任务大多独立吗?" [shape=diamond];
18
+ "留在当前会话?" [shape=diamond];
19
+ "子 agent 驱动开发" [shape=box];
20
+ "执行计划" [shape=box];
21
+ "手动执行或先头脑风暴" [shape=box];
22
+
23
+ "有实现计划吗?" -> "任务大多独立吗?" [label="是"];
24
+ "有实现计划吗?" -> "手动执行或先头脑风暴" [label="否"];
25
+ "任务大多独立吗?" -> "留在当前会话?" [label="是"];
26
+ "任务大多独立吗?" -> "手动执行或先头脑风暴" [label="否 - 紧密耦合"];
27
+ "留在当前会话?" -> "子 agent 驱动开发" [label="是"];
28
+ "留在当前会话?" -> "执行计划" [label="否 - 并行会话"];
29
+ }
30
+ ```
31
+
32
+ **对比执行计划(并行会话):**
33
+ - 同一会话(无上下文切换)
34
+ - 每个任务全新子 agent(无上下文污染)
35
+ - 每个任务完成后两阶段审查:先规格合规性,再代码质量
36
+ - 更快迭代(任务之间无需人工介入)
37
+
38
+ ## 流程
39
+
40
+ ```dot
41
+ digraph process {
42
+ rankdir=TB;
43
+
44
+ subgraph cluster_per_task {
45
+ label="每个任务";
46
+ "派发实现子 agent(./implementer-prompt.md)" [shape=box];
47
+ "实现子 agent 有问题?" [shape=diamond];
48
+ "回答问题,提供上下文" [shape=box];
49
+ "实现子 agent 实现、测试、提交、自审" [shape=box];
50
+ "派发规格审查子 agent(./spec-reviewer-prompt.md)" [shape=box];
51
+ "规格审查子 agent 确认代码符合规格?" [shape=diamond];
52
+ "实现子 agent 修复规格差距" [shape=box];
53
+ "派发代码质量审查子 agent(./code-quality-reviewer-prompt.md)" [shape=box];
54
+ "代码质量审查子 agent 通过?" [shape=diamond];
55
+ "实现子 agent 修复质量问题" [shape=box];
56
+ "在 TodoWrite 中标记任务完成" [shape=box];
57
+ }
58
+
59
+ "读取计划,提取所有任务全文,记录上下文,创建 TodoWrite" [shape=box];
60
+ "还有剩余任务?" [shape=diamond];
61
+ "派发最终代码审查子 agent 审查整体实现" [shape=box];
62
+ "使用 specops:finishing-a-development-branch" [shape=box style=filled fillcolor=lightgreen];
63
+
64
+ "读取计划,提取所有任务全文,记录上下文,创建 TodoWrite" -> "派发实现子 agent(./implementer-prompt.md)";
65
+ "派发实现子 agent(./implementer-prompt.md)" -> "实现子 agent 有问题?";
66
+ "实现子 agent 有问题?" -> "回答问题,提供上下文" [label="是"];
67
+ "回答问题,提供上下文" -> "派发实现子 agent(./implementer-prompt.md)";
68
+ "实现子 agent 有问题?" -> "实现子 agent 实现、测试、提交、自审" [label="否"];
69
+ "实现子 agent 实现、测试、提交、自审" -> "派发规格审查子 agent(./spec-reviewer-prompt.md)";
70
+ "派发规格审查子 agent(./spec-reviewer-prompt.md)" -> "规格审查子 agent 确认代码符合规格?";
71
+ "规格审查子 agent 确认代码符合规格?" -> "实现子 agent 修复规格差距" [label="否"];
72
+ "实现子 agent 修复规格差距" -> "派发规格审查子 agent(./spec-reviewer-prompt.md)" [label="重新审查"];
73
+ "规格审查子 agent 确认代码符合规格?" -> "派发代码质量审查子 agent(./code-quality-reviewer-prompt.md)" [label="是"];
74
+ "派发代码质量审查子 agent(./code-quality-reviewer-prompt.md)" -> "代码质量审查子 agent 通过?";
75
+ "代码质量审查子 agent 通过?" -> "实现子 agent 修复质量问题" [label="否"];
76
+ "实现子 agent 修复质量问题" -> "派发代码质量审查子 agent(./code-quality-reviewer-prompt.md)" [label="重新审查"];
77
+ "代码质量审查子 agent 通过?" -> "在 TodoWrite 中标记任务完成" [label="是"];
78
+ "在 TodoWrite 中标记任务完成" -> "还有剩余任务?";
79
+ "还有剩余任务?" -> "派发实现子 agent(./implementer-prompt.md)" [label="是"];
80
+ "还有剩余任务?" -> "派发最终代码审查子 agent 审查整体实现" [label="否"];
81
+ "派发最终代码审查子 agent 审查整体实现" -> "使用 specops:finishing-a-development-branch";
82
+ }
83
+ ```
84
+
85
+ ## 提示词模板
86
+
87
+ - `./implementer-prompt.md` - 派发实现子 agent
88
+ - `./spec-reviewer-prompt.md` - 派发规格合规审查子 agent
89
+ - `./code-quality-reviewer-prompt.md` - 派发代码质量审查子 agent
90
+
91
+ ## 示例工作流
92
+
93
+ ```
94
+ 你:我正在使用子 Agent 驱动开发来执行这个计划。
95
+
96
+ [读取计划文件:docs/plans/feature-plan.md]
97
+ [提取全部 5 个任务的完整文本和上下文]
98
+ [创建 TodoWrite 包含所有任务]
99
+
100
+ 任务 1:Hook 安装脚本
101
+
102
+ [获取任务 1 的文本和上下文(已提取)]
103
+ [派发实现子 agent,附带完整任务文本 + 上下文]
104
+
105
+ 实现者:"开始之前想确认一下,hook 应该安装在用户级别还是系统级别?"
106
+
107
+ 你:"用户级别(~/.config/specops/hooks/)"
108
+
109
+ 实现者:"明白了。开始实现..."
110
+ [稍后] 实现者:
111
+ - 实现了 install-hook 命令
112
+ - 添加了测试,5/5 通过
113
+ - 自审:发现遗漏了 --force 标志,已补充
114
+ - 已提交
115
+
116
+ [派发规格合规审查子 agent]
117
+ 规格审查者:✅ 符合规格 - 所有需求已满足,没有多余内容
118
+
119
+ [获取 git SHA,派发代码质量审查子 agent]
120
+ 代码审查者:优点:测试覆盖好,代码干净。问题:无。通过。
121
+
122
+ [标记任务 1 完成]
123
+
124
+ 任务 2:恢复模式
125
+
126
+ [获取任务 2 的文本和上下文(已提取)]
127
+ [派发实现子 agent,附带完整任务文本 + 上下文]
128
+
129
+ 实现者:[没有问题,直接开始]
130
+ 实现者:
131
+ - 添加了 verify/repair 模式
132
+ - 8/8 测试通过
133
+ - 自审:一切正常
134
+ - 已提交
135
+
136
+ [派发规格合规审查子 agent]
137
+ 规格审查者:❌ 问题:
138
+ - 缺失:进度报告(规格要求"每 100 项报告一次")
139
+ - 多余:添加了 --json 标志(未要求)
140
+
141
+ [实现者修复问题]
142
+ 实现者:移除了 --json 标志,添加了进度报告
143
+
144
+ [规格审查者重新审查]
145
+ 规格审查者:✅ 现在符合规格
146
+
147
+ [派发代码质量审查子 agent]
148
+ 代码审查者:优点:扎实。问题(重要):魔法数字(100)
149
+
150
+ [实现者修复]
151
+ 实现者:提取了 PROGRESS_INTERVAL 常量
152
+
153
+ [代码审查者重新审查]
154
+ 代码审查者:✅ 通过
155
+
156
+ [标记任务 2 完成]
157
+
158
+ ...
159
+
160
+ [所有任务完成后]
161
+ [派发最终代码审查子 agent]
162
+ 最终审查者:所有需求已满足,可以合并
163
+
164
+ 完成!
165
+ ```
166
+
167
+ ## 优势
168
+
169
+ **对比手动执行:**
170
+ - 子 agent 自然遵循 TDD
171
+ - 每个任务全新上下文(不会混淆)
172
+ - 并行安全(子 agent 互不干扰)
173
+ - 子 agent 可以提问(工作前和工作中都可以)
174
+
175
+ **对比执行计划:**
176
+ - 同一会话(无交接)
177
+ - 持续推进(无需等待)
178
+ - 审查检查点自动触发
179
+
180
+ **效率提升:**
181
+ - 无文件读取开销(控制器提供完整文本)
182
+ - 控制器精确筛选所需上下文
183
+ - 子 agent 一开始就获得完整信息
184
+ - 问题在工作开始前浮现(而非之后)
185
+
186
+ **质量关卡:**
187
+ - 自审在交接前捕获问题
188
+ - 两阶段审查:规格合规性,然后代码质量
189
+ - 审查循环确保修复确实有效
190
+ - 规格合规防止过度/不足构建
191
+ - 代码质量确保实现质量过关
192
+
193
+ **成本:**
194
+ - 更多子 agent 调用(每个任务需要实现者 + 2 个审查者)
195
+ - 控制器需要更多准备工作(预先提取所有任务)
196
+ - 审查循环增加迭代次数
197
+ - 但能早期发现问题(比后期调试更划算)
198
+
199
+ ## 红线
200
+
201
+ **绝对不要:**
202
+ - 未经用户明确同意就在 main/master 分支上开始实现
203
+ - 跳过审查(规格合规或代码质量都不行)
204
+ - 带着未修复的问题继续推进
205
+ - 并行派发多个实现子 agent(会冲突)
206
+ - 让子 agent 自己读计划文件(应提供完整文本)
207
+ - 跳过场景设定上下文(子 agent 需要理解任务在整体中的位置)
208
+ - 忽略子 agent 的问题(让他们继续之前先回答)
209
+ - 在规格合规上接受"差不多就行"(规格审查者发现问题 = 未完成)
210
+ - 跳过审查循环(审查者发现问题 = 实现者修复 = 再次审查)
211
+ - 让实现者的自审替代正式审查(两者都需要)
212
+ - **在规格合规通过 ✅ 之前就开始代码质量审查**(顺序错误)
213
+ - 在任一审查有未解决问题时就进入下一个任务
214
+
215
+ **如果子 agent 提问:**
216
+ - 清晰完整地回答
217
+ - 需要时提供额外上下文
218
+ - 不要催促他们赶紧实现
219
+
220
+ **如果审查者发现问题:**
221
+ - 实现者(同一个子 agent)修复
222
+ - 审查者重新审查
223
+ - 重复直到通过
224
+ - 不要跳过重新审查
225
+
226
+ **如果子 agent 任务失败:**
227
+ - 派发修复子 agent,附带具体指令
228
+ - 不要手动修复(上下文污染)
229
+
230
+ ## 集成
231
+
232
+ **必需的工作流 skill:**
233
+ - **specops:using-git-worktrees** - 必需:开始前设置隔离工作区
234
+ - **specops:writing-plans** - 创建本 skill 执行的计划
235
+ - **specops:requesting-code-review** - 审查子 agent 使用的代码审查模板
236
+ - **specops:finishing-a-development-branch** - 所有任务完成后收尾
237
+
238
+ **子 agent 应使用:**
239
+ - **specops:test-driven-development** - 子 agent 对每个任务遵循 TDD
240
+
241
+ **替代工作流:**
242
+ - **specops:executing-plans** - 用于并行会话而非同会话执行
@@ -0,0 +1,20 @@
1
+ # 代码质量审查子 Agent 提示词模板
2
+
3
+ 派发代码质量审查子 agent 时使用此模板。
4
+
5
+ **目的:** 验证实现质量过关(干净、有测试、可维护)
6
+
7
+ **仅在规格合规审查通过后才派发。**
8
+
9
+ ```
10
+ task() 工具(specops:code-reviewer):
11
+ 使用 requesting-code-review/code-reviewer.md 中的模板
12
+
13
+ WHAT_WAS_IMPLEMENTED: [来自实现者的汇报]
14
+ PLAN_OR_REQUIREMENTS: [计划文件]中的任务 N
15
+ BASE_SHA: [任务开始前的提交]
16
+ HEAD_SHA: [当前提交]
17
+ DESCRIPTION: [任务摘要]
18
+ ```
19
+
20
+ **代码审查者返回:** 优点、问题(严重/重要/次要)、评估结论
@@ -0,0 +1,78 @@
1
+ # 实现子 Agent 提示词模板
2
+
3
+ 派发实现子 agent 时使用此模板。
4
+
5
+ ```
6
+ task() 工具(通用):
7
+ description: "实现任务 N:[任务名称]"
8
+ prompt: |
9
+ 你正在实现任务 N:[任务名称]
10
+
11
+ ## 任务描述
12
+
13
+ [计划中任务的完整文本 - 粘贴在这里,不要让子 agent 自己读文件]
14
+
15
+ ## 上下文
16
+
17
+ [场景设定:这个任务在整体中的位置、依赖关系、架构上下文]
18
+
19
+ ## 开始之前
20
+
21
+ 如果你对以下内容有疑问:
22
+ - 需求或验收标准
23
+ - 方法或实现策略
24
+ - 依赖或假设
25
+ - 任务描述中任何不清楚的地方
26
+
27
+ **现在就问。** 开始工作前提出所有顾虑。
28
+
29
+ ## 你的任务
30
+
31
+ 确认需求清楚后:
32
+ 1. 严格按照任务规格实现
33
+ 2. 编写测试(如果任务要求则遵循 TDD)
34
+ 3. 验证实现可用
35
+ 4. 提交你的工作
36
+ 5. 自审(见下方)
37
+ 6. 汇报结果
38
+
39
+ 工作目录:[目录]
40
+
41
+ **工作过程中:** 如果遇到意外情况或不确定的地方,**提问**。
42
+ 随时可以暂停并澄清。不要猜测或做假设。
43
+
44
+ ## 汇报前:自审
45
+
46
+ 用全新的视角审视你的工作。问自己:
47
+
48
+ **完整性:**
49
+ - 我是否完整实现了规格中的所有内容?
50
+ - 是否遗漏了任何需求?
51
+ - 是否有未处理的边界情况?
52
+
53
+ **质量:**
54
+ - 这是我最好的工作吗?
55
+ - 命名是否清晰准确(反映功能而非实现方式)?
56
+ - 代码是否干净且可维护?
57
+
58
+ **纪律:**
59
+ - 是否避免了过度构建(YAGNI)?
60
+ - 是否只构建了被要求的内容?
61
+ - 是否遵循了代码库中的现有模式?
62
+
63
+ **测试:**
64
+ - 测试是否真正验证了行为(而非只是 mock 行为)?
65
+ - 如果要求了 TDD,是否遵循了?
66
+ - 测试是否全面?
67
+
68
+ 如果自审中发现问题,在汇报前立即修复。
69
+
70
+ ## 汇报格式
71
+
72
+ 完成后,汇报:
73
+ - 实现了什么
74
+ - 测试了什么以及测试结果
75
+ - 修改了哪些文件
76
+ - 自审发现(如有)
77
+ - 任何问题或顾虑
78
+ ```
@@ -0,0 +1,61 @@
1
+ # 规格合规审查子 Agent 提示词模板
2
+
3
+ 派发规格合规审查子 agent 时使用此模板。
4
+
5
+ **目的:** 验证实现者是否构建了被要求的内容(不多不少)
6
+
7
+ ```
8
+ task() 工具(通用):
9
+ description: "审查任务 N 的规格合规性"
10
+ prompt: |
11
+ 你正在审查一个实现是否符合其规格。
12
+
13
+ ## 被要求的内容
14
+
15
+ [任务需求的完整文本]
16
+
17
+ ## 实现者声称构建了什么
18
+
19
+ [来自实现者的汇报]
20
+
21
+ ## 关键:不要信任汇报
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
+
58
+ 汇报:
59
+ - ✅ 符合规格(如果代码检查后一切匹配)
60
+ - ❌ 发现问题:[具体列出缺失或多余的内容,附带 file:line 引用]
61
+ ```
@@ -0,0 +1,296 @@
1
+ ---
2
+ name: systematic-debugging
3
+ description: 遇到任何bug、测试失败或意外行为时使用,在提出修复之前
4
+ ---
5
+
6
+ # 系统化调试
7
+
8
+ ## 概述
9
+
10
+ 随机修复浪费时间,还会制造新 bug。快速补丁掩盖底层问题。
11
+
12
+ **核心原则:** 在尝试修复之前,必须先找到根因。修复症状就是失败。
13
+
14
+ **违反这个流程的字面意思就是违反调试的精神。**
15
+
16
+ ## 铁律
17
+
18
+ ```
19
+ 没有先做根因调查,就不能提出修复方案
20
+ ```
21
+
22
+ 如果你没有完成第一阶段,你不能提出修复方案。
23
+
24
+ ## 何时使用
25
+
26
+ 用于任何技术问题:
27
+ - 测试失败
28
+ - 生产环境 bug
29
+ - 意外行为
30
+ - 性能问题
31
+ - 构建失败
32
+ - 集成问题
33
+
34
+ **尤其在以下情况使用:**
35
+ - 时间压力下(紧急情况让猜测变得诱人)
36
+ - "就一个快速修复"看起来很明显
37
+ - 你已经尝试了多次修复
38
+ - 上一次修复没有用
39
+ - 你没有完全理解问题
40
+
41
+ **不要跳过,即使:**
42
+ - 问题看起来很简单(简单 bug 也有根因)
43
+ - 你很赶时间(赶工保证返工)
44
+ - 领导要求立刻修好(系统化比瞎折腾快)
45
+
46
+ ## 四个阶段
47
+
48
+ 你必须完成每个阶段才能进入下一个。
49
+
50
+ ### 第一阶段:根因调查
51
+
52
+ **在尝试任何修复之前:**
53
+
54
+ 1. **仔细阅读错误信息**
55
+ - 不要跳过错误或警告
56
+ - 它们通常包含确切的解决方案
57
+ - 完整阅读堆栈跟踪
58
+ - 记下行号、文件路径、错误代码
59
+
60
+ 2. **稳定复现**
61
+ - 你能可靠地触发它吗?
62
+ - 确切的步骤是什么?
63
+ - 每次都会发生吗?
64
+ - 如果无法复现 → 收集更多数据,不要猜
65
+
66
+ 3. **检查最近的变更**
67
+ - 什么变更可能导致了这个问题?
68
+ - Git diff,最近的提交
69
+ - 新依赖、配置变更
70
+ - 环境差异
71
+
72
+ 4. **在多组件系统中收集证据**
73
+
74
+ **当系统有多个组件时(CI → 构建 → 签名,API → 服务 → 数据库):**
75
+
76
+ **在提出修复之前,添加诊断埋点:**
77
+ ```
78
+ 对每个组件边界:
79
+ - 记录进入组件的数据
80
+ - 记录离开组件的数据
81
+ - 验证环境/配置的传播
82
+ - 检查每一层的状态
83
+
84
+ 运行一次收集证据,展示在哪里断裂
85
+ 然后分析证据,定位失败的组件
86
+ 然后调查那个特定组件
87
+ ```
88
+
89
+ **示例(多层系统):**
90
+ ```bash
91
+ # 第 1 层:工作流
92
+ echo "=== 工作流中可用的密钥: ==="
93
+ echo "IDENTITY: ${IDENTITY:+SET}${IDENTITY:-UNSET}"
94
+
95
+ # 第 2 层:构建脚本
96
+ echo "=== 构建脚本中的环境变量: ==="
97
+ env | grep IDENTITY || echo "IDENTITY not in environment"
98
+
99
+ # 第 3 层:签名脚本
100
+ echo "=== 钥匙串状态: ==="
101
+ security list-keychains
102
+ security find-identity -v
103
+
104
+ # 第 4 层:实际签名
105
+ codesign --sign "$IDENTITY" --verbose=4 "$APP"
106
+ ```
107
+
108
+ **这揭示了:** 哪一层失败(密钥 → 工作流 ✓,工作流 → 构建 ✗)
109
+
110
+ 5. **追踪数据流**
111
+
112
+ **当错误深在调用栈中时:**
113
+
114
+ 参见本目录中的 `root-cause-tracing.md` 了解完整的反向追踪技术。
115
+
116
+ **快速版本:**
117
+ - 错误值从哪里来?
118
+ - 谁用错误值调用了这里?
119
+ - 继续向上追踪直到找到源头
120
+ - 在源头修复,不是在症状处
121
+
122
+ ### 第二阶段:模式分析
123
+
124
+ **在修复之前找到模式:**
125
+
126
+ 1. **找到可用的示例**
127
+ - 在同一代码库中找到类似的可用代码
128
+ - 什么类似的东西是能用的?
129
+
130
+ 2. **与参考实现对比**
131
+ - 如果在实现某个模式,完整阅读参考实现
132
+ - 不要略读,每一行都要读
133
+ - 在应用之前完全理解这个模式
134
+
135
+ 3. **识别差异**
136
+ - 能用的和坏的之间有什么不同?
137
+ - 列出每一个差异,不管多小
138
+ - 不要假设"那个不可能有影响"
139
+
140
+ 4. **理解依赖关系**
141
+ - 这需要哪些其他组件?
142
+ - 需要什么设置、配置、环境?
143
+ - 它做了什么假设?
144
+
145
+ ### 第三阶段:假设与测试
146
+
147
+ **科学方法:**
148
+
149
+ 1. **形成单一假设**
150
+ - 清楚地陈述:"我认为 X 是根因,因为 Y"
151
+ - 写下来
152
+ - 要具体,不要模糊
153
+
154
+ 2. **最小化测试**
155
+ - 做最小的可能变更来测试假设
156
+ - 一次只改一个变量
157
+ - 不要同时修复多个问题
158
+
159
+ 3. **继续之前先验证**
160
+ - 有效了?是 → 第四阶段
161
+ - 没有效?形成新假设
162
+ - 不要在上面叠加更多修复
163
+
164
+ 4. **当你不知道时**
165
+ - 说"我不理解 X"
166
+ - 不要假装知道
167
+ - 寻求帮助
168
+ - 做更多研究
169
+
170
+ ### 第四阶段:实施
171
+
172
+ **修复根因,不是症状:**
173
+
174
+ 1. **创建失败测试用例**
175
+ - 最简单的可能复现
176
+ - 如果可能,写自动化测试
177
+ - 没有框架就写一次性测试脚本
178
+ - 修复之前必须有
179
+ - 使用 `specops:test-driven-development` skill 来写正确的失败测试
180
+
181
+ 2. **实施单一修复**
182
+ - 解决已识别的根因
183
+ - 一次只改一处
184
+ - 不要"顺便"改进
185
+ - 不要捆绑重构
186
+
187
+ 3. **验证修复**
188
+ - 测试现在通过了?
189
+ - 其他测试没有挂?
190
+ - 问题真的解决了?
191
+
192
+ 4. **如果修复没有用**
193
+ - 停下来
194
+ - 数一数:你已经尝试了多少次修复?
195
+ - 如果 < 3:回到第一阶段,用新信息重新分析
196
+ - **如果 ≥ 3:停下来,质疑架构(见下面第 5 步)**
197
+ - 不要在没有架构讨论的情况下尝试第 4 次修复
198
+
199
+ 5. **如果 3 次以上修复失败:质疑架构**
200
+
201
+ **表明架构问题的模式:**
202
+ - 每次修复都在不同地方暴露新的共享状态/耦合/问题
203
+ - 修复需要"大规模重构"才能实施
204
+ - 每次修复在其他地方产生新症状
205
+
206
+ **停下来,质疑根本问题:**
207
+ - 这个模式从根本上是合理的吗?
208
+ - 我们是不是"纯粹因为惯性在坚持"?
209
+ - 应该重构架构还是继续修复症状?
210
+
211
+ **在尝试更多修复之前与你的人类搭档讨论**
212
+
213
+ 这不是假设失败,这是架构错误。
214
+
215
+ ## 危险信号 - 停下来,遵循流程
216
+
217
+ 如果你发现自己在想:
218
+ - "先快速修一下,之后再调查"
219
+ - "试试改一下 X 看看行不行"
220
+ - "加多个改动,跑测试"
221
+ - "跳过测试,我手动验证"
222
+ - "大概是 X,让我修一下"
223
+ - "我不完全理解但这可能有用"
224
+ - "模式说的是 X 但我换个方式"
225
+ - "主要问题是这些:[没有调查就列出修复方案]"
226
+ - 在追踪数据流之前就提出解决方案
227
+ - **"再试一次修复"(已经试了 2 次以上)**
228
+ - **每次修复都在不同地方暴露新问题**
229
+
230
+ **以上所有都意味着:停下来。回到第一阶段。**
231
+
232
+ **如果 3 次以上修复失败:** 质疑架构(见第四阶段第 5 步)
233
+
234
+ ## 你的人类搭档暗示你做错了
235
+
236
+ **注意这些纠正:**
237
+ - "那不是没发生吗?" - 你假设了但没验证
238
+ - "它会告诉我们...吗?" - 你应该添加证据收集
239
+ - "别猜了" - 你在没有理解的情况下提出修复
240
+ - "深入思考一下" - 质疑根本问题,不只是症状
241
+ - "我们卡住了?"(沮丧) - 你的方法不管用
242
+
243
+ **当你看到这些时:** 停下来。回到第一阶段。
244
+
245
+ ## 常见的自我合理化
246
+
247
+ | 借口 | 现实 |
248
+ |------|------|
249
+ | "问题很简单,不需要流程" | 简单问题也有根因。流程对简单 bug 很快。 |
250
+ | "紧急情况,没时间走流程" | 系统化调试比猜测-检查式瞎折腾更快。 |
251
+ | "先试这个,然后再调查" | 第一次修复定下了模式。从一开始就做对。 |
252
+ | "确认修复有效后再写测试" | 没测试的修复不可靠。先写测试来证明。 |
253
+ | "同时修多个省时间" | 无法隔离哪个有效。会引入新 bug。 |
254
+ | "参考太长了,我改编一下模式" | 部分理解保证出 bug。完整阅读。 |
255
+ | "我看到问题了,让我修" | 看到症状 ≠ 理解根因。 |
256
+ | "再试一次修复"(2 次以上失败后) | 3 次以上失败 = 架构问题。质疑模式,不要再修。 |
257
+
258
+ ## 快速参考
259
+
260
+ | 阶段 | 关键活动 | 成功标准 |
261
+ |------|----------|----------|
262
+ | **1. 根因** | 阅读错误、复现、检查变更、收集证据 | 理解是什么以及为什么 |
263
+ | **2. 模式** | 找到可用示例、对比 | 识别差异 |
264
+ | **3. 假设** | 形成理论、最小化测试 | 确认或新假设 |
265
+ | **4. 实施** | 创建测试、修复、验证 | Bug 解决,测试通过 |
266
+
267
+ ## 当流程揭示"没有根因"
268
+
269
+ 如果系统化调查揭示问题确实是环境相关、时序依赖或外部因素:
270
+
271
+ 1. 你已经完成了流程
272
+ 2. 记录你调查了什么
273
+ 3. 实施适当的处理(重试、超时、错误信息)
274
+ 4. 添加监控/日志用于未来调查
275
+
276
+ **但是:** 95% 的"没有根因"情况是调查不充分。
277
+
278
+ ## 辅助技术
279
+
280
+ 这些技术是系统化调试的一部分,在本目录中可用:
281
+
282
+ - **`root-cause-tracing.md`** - 通过调用栈反向追踪 bug,找到原始触发点
283
+ - **`defense-in-depth.md`** - 找到根因后在多个层添加验证
284
+ - **`condition-based-waiting.md`** - 用条件轮询替代任意超时
285
+
286
+ **相关 skill:**
287
+ - **specops:test-driven-development** - 用于创建失败测试用例(第四阶段,第 1 步)
288
+ - **specops:verification-before-completion** - 在声称成功之前验证修复有效
289
+
290
+ ## 真实世界的影响
291
+
292
+ 来自调试实践:
293
+ - 系统化方法:15-30 分钟修复
294
+ - 随机修复方法:2-3 小时瞎折腾
295
+ - 一次修复成功率:95% vs 40%
296
+ - 引入新 bug:接近零 vs 常见