@chenguangyao/devflow-kit 0.1.43

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 (198) hide show
  1. package/CHANGELOG.md +232 -0
  2. package/LICENSE +21 -0
  3. package/README.md +539 -0
  4. package/bin/devflow.js +9 -0
  5. package/docs/RFC-001-devflow-kit.md +617 -0
  6. package/docs/RFC-002-workflow-kernel.md +134 -0
  7. package/docs/enterprise-integration-supplement.md +274 -0
  8. package/docs/internal-gitlab-setup.md +426 -0
  9. package/docs/marketplace-skills.md +231 -0
  10. package/docs/migration-from-arb.md +232 -0
  11. package/docs/tooling-overview.md +774 -0
  12. package/docs/workflow-orchestration.md +695 -0
  13. package/docs/workflow-ui-prototype.html +271 -0
  14. package/package.json +52 -0
  15. package/schemas/config.schema.json +51 -0
  16. package/schemas/delta.schema.json +22 -0
  17. package/schemas/state.schema.json +130 -0
  18. package/schemas/status-surface.schema.json +197 -0
  19. package/schemas/workflow-confirmation-surface.schema.json +70 -0
  20. package/schemas/workflow-picker.schema.json +94 -0
  21. package/scripts/postinstall.js +101 -0
  22. package/scripts/render-workflow-ui-prototype.js +271 -0
  23. package/skills/apply/SKILL.md +313 -0
  24. package/skills/apply/references/discipline-checklist.md +145 -0
  25. package/skills/apply/references/subagent-implementer-prompt.md +113 -0
  26. package/skills/apply/references/subagent-orchestration.md +150 -0
  27. package/skills/apply/references/subagent-reviewer-prompt.md +180 -0
  28. package/skills/apply/references/tdd-loop.md +287 -0
  29. package/skills/apply/references/when-plan-is-wrong.md +279 -0
  30. package/skills/apply/references/worktree-swarm.md +292 -0
  31. package/skills/archive/SKILL.md +229 -0
  32. package/skills/archive/references/conflict-resolution.md +336 -0
  33. package/skills/archive/references/knowledge-deposit.md +381 -0
  34. package/skills/archive/references/spec-merge.md +365 -0
  35. package/skills/brainstorm/SKILL.md +123 -0
  36. package/skills/brainstorm/references/proposal-template.md +244 -0
  37. package/skills/brainstorm/references/question-catalog.md +168 -0
  38. package/skills/brainstorm/references/session-template.md +184 -0
  39. package/skills/ci-fix/SKILL.md +63 -0
  40. package/skills/ci-fix/references/loop.md +25 -0
  41. package/skills/code-review/SKILL.md +279 -0
  42. package/skills/code-review/references/escalation-playbook.md +192 -0
  43. package/skills/code-review/references/language-cheatsheets/go.md +175 -0
  44. package/skills/code-review/references/language-cheatsheets/java-spring-mybatis.md +246 -0
  45. package/skills/code-review/references/language-cheatsheets/python.md +170 -0
  46. package/skills/code-review/references/language-cheatsheets/vue.md +199 -0
  47. package/skills/code-review/references/output-template.md +275 -0
  48. package/skills/code-review/references/review-checklist.md +251 -0
  49. package/skills/complexity-grading/SKILL.md +259 -0
  50. package/skills/deliver/SKILL.md +271 -0
  51. package/skills/deliver/references/delivery-modes.md +299 -0
  52. package/skills/deliver/references/notify.md +359 -0
  53. package/skills/deliver/references/pr-description.md +319 -0
  54. package/skills/dependency-upgrade/SKILL.md +57 -0
  55. package/skills/dependency-upgrade/references/risk-matrix.md +38 -0
  56. package/skills/df-orchestrator/SKILL.md +407 -0
  57. package/skills/df-orchestrator/references/complexity-grading.md +177 -0
  58. package/skills/df-orchestrator/references/escalation-matrix.md +191 -0
  59. package/skills/df-orchestrator/references/routing-rules.md +290 -0
  60. package/skills/df-orchestrator/references/workflow-state-machine.md +208 -0
  61. package/skills/frontend-quality/SKILL.md +61 -0
  62. package/skills/frontend-quality/references/checklist.md +35 -0
  63. package/skills/handoff-resume/SKILL.md +59 -0
  64. package/skills/handoff-resume/references/handoff-template.md +54 -0
  65. package/skills/plan/SKILL.md +166 -0
  66. package/skills/plan/references/task-breakdown.md +207 -0
  67. package/skills/plan/references/task-sequencing.md +143 -0
  68. package/skills/plan/references/task-template.md +248 -0
  69. package/skills/requirement-analysis/SKILL.md +499 -0
  70. package/skills/requirement-analysis/references/acceptance-criteria.md +183 -0
  71. package/skills/requirement-analysis/references/code-recon.md +151 -0
  72. package/skills/requirement-analysis/references/edge-case-catalog.md +164 -0
  73. package/skills/requirement-analysis/references/requirement-template.md +339 -0
  74. package/skills/requirement-analysis/references/scope-negotiation.md +162 -0
  75. package/skills/security-hardening/SKILL.md +60 -0
  76. package/skills/security-hardening/references/checklist.md +42 -0
  77. package/skills/tech-spec/SKILL.md +388 -0
  78. package/skills/tech-spec/references/api-contract-design.md +172 -0
  79. package/skills/tech-spec/references/decision-records.md +110 -0
  80. package/skills/tech-spec/references/design-template.md +301 -0
  81. package/skills/tech-spec/references/rollout-and-rollback.md +203 -0
  82. package/skills/tech-spec/references/spec-delta-conventions.md +250 -0
  83. package/skills/tech-spec/references/transaction-patterns.md +212 -0
  84. package/skills/test-spec/SKILL.md +219 -0
  85. package/skills/test-spec/references/coverage-strategy.md +218 -0
  86. package/skills/test-spec/references/edge-case-to-test.md +143 -0
  87. package/skills/test-spec/references/test-case-template.md +276 -0
  88. package/skills/verify/SKILL.md +232 -0
  89. package/skills/verify/references/nfr-verification.md +292 -0
  90. package/skills/verify/references/report-templates.md +510 -0
  91. package/skills/verify/references/self-test-guide.md +240 -0
  92. package/skills/verify/references/verify-rollback-map.md +247 -0
  93. package/src/cli/commands/_helpers.js +108 -0
  94. package/src/cli/commands/_submit.js +718 -0
  95. package/src/cli/commands/apply.js +198 -0
  96. package/src/cli/commands/archive.js +180 -0
  97. package/src/cli/commands/checkpoint.js +113 -0
  98. package/src/cli/commands/deliver.js +377 -0
  99. package/src/cli/commands/deploy.js +504 -0
  100. package/src/cli/commands/design.js +158 -0
  101. package/src/cli/commands/disable.js +21 -0
  102. package/src/cli/commands/doctor.js +178 -0
  103. package/src/cli/commands/enable.js +21 -0
  104. package/src/cli/commands/flow.js +645 -0
  105. package/src/cli/commands/help.js +93 -0
  106. package/src/cli/commands/ingest.js +602 -0
  107. package/src/cli/commands/init.js +341 -0
  108. package/src/cli/commands/knowledge.js +523 -0
  109. package/src/cli/commands/logs.js +43 -0
  110. package/src/cli/commands/new.js +202 -0
  111. package/src/cli/commands/plan.js +49 -0
  112. package/src/cli/commands/propose.js +27 -0
  113. package/src/cli/commands/provider.js +698 -0
  114. package/src/cli/commands/report.js +143 -0
  115. package/src/cli/commands/requirement.js +227 -0
  116. package/src/cli/commands/review.js +301 -0
  117. package/src/cli/commands/skills.js +457 -0
  118. package/src/cli/commands/status.js +925 -0
  119. package/src/cli/commands/switch.js +27 -0
  120. package/src/cli/commands/sync.js +47 -0
  121. package/src/cli/commands/test.js +366 -0
  122. package/src/cli/commands/uninstall.js +32 -0
  123. package/src/cli/commands/update.js +74 -0
  124. package/src/cli/commands/verify.js +354 -0
  125. package/src/cli/commands/worktree.js +78 -0
  126. package/src/cli/index.js +72 -0
  127. package/src/cli/parse-args.js +102 -0
  128. package/src/core/autodetect.js +271 -0
  129. package/src/core/change.js +208 -0
  130. package/src/core/checkpoint.js +217 -0
  131. package/src/core/config.js +60 -0
  132. package/src/core/delta.js +290 -0
  133. package/src/core/markers.js +59 -0
  134. package/src/core/paths.js +173 -0
  135. package/src/core/plan-tasks.js +36 -0
  136. package/src/core/project-routing.js +285 -0
  137. package/src/core/projects.js +200 -0
  138. package/src/core/state.js +200 -0
  139. package/src/core/workflow-check.js +177 -0
  140. package/src/core/workflow-init.js +34 -0
  141. package/src/core/workflow-picker.js +154 -0
  142. package/src/core/workflow-policy.js +119 -0
  143. package/src/core/workflow-suggest.js +181 -0
  144. package/src/core/workflow-verify.js +88 -0
  145. package/src/core/workflow.js +433 -0
  146. package/src/core/worktree.js +241 -0
  147. package/src/knowledge/categories.js +107 -0
  148. package/src/knowledge/classify.js +125 -0
  149. package/src/knowledge/deposit.js +414 -0
  150. package/src/knowledge/migrate.js +149 -0
  151. package/src/knowledge/mr.js +219 -0
  152. package/src/knowledge/query.js +131 -0
  153. package/src/knowledge/registry.js +151 -0
  154. package/src/knowledge/sync.js +179 -0
  155. package/src/providers/base.js +74 -0
  156. package/src/providers/drivers/api-yapi.js +78 -0
  157. package/src/providers/drivers/ci-jenkins.js +109 -0
  158. package/src/providers/drivers/intake-confluence.js +544 -0
  159. package/src/providers/drivers/kb-git.js +549 -0
  160. package/src/providers/drivers/kb-weknora.js +472 -0
  161. package/src/providers/drivers/notify-smtp.js +515 -0
  162. package/src/providers/drivers/observability-oss.js +43 -0
  163. package/src/providers/drivers/observability-sls.js +50 -0
  164. package/src/providers/lifecycle.js +135 -0
  165. package/src/providers/loader.js +132 -0
  166. package/src/providers/local.js +190 -0
  167. package/src/providers/userconfig.js +283 -0
  168. package/src/reports/aggregate.js +185 -0
  169. package/src/reports/coverage.js +163 -0
  170. package/src/reports/detect.js +143 -0
  171. package/src/reports/parse.js +236 -0
  172. package/src/templates/files/ci/github.yml +38 -0
  173. package/src/templates/files/ci/gitlab.yml +27 -0
  174. package/src/templates/files/design.md +63 -0
  175. package/src/templates/files/ide/devflow-workflow.md +58 -0
  176. package/src/templates/files/ide/project-overview-reference.md +1 -0
  177. package/src/templates/files/ide/project-overview.md +27 -0
  178. package/src/templates/files/knowledge-index.json +17 -0
  179. package/src/templates/files/knowledge.md +28 -0
  180. package/src/templates/files/meta.json +8 -0
  181. package/src/templates/files/plan.md +38 -0
  182. package/src/templates/files/proposal.md +33 -0
  183. package/src/templates/files/reports/contract-test.md +40 -0
  184. package/src/templates/files/reports/e2e-test.md +30 -0
  185. package/src/templates/files/reports/integration-test.md +36 -0
  186. package/src/templates/files/reports/joint-test.md +58 -0
  187. package/src/templates/files/reports/perf.md +24 -0
  188. package/src/templates/files/reports/regression.md +20 -0
  189. package/src/templates/files/reports/remote-test.md +55 -0
  190. package/src/templates/files/reports/self-test.md +43 -0
  191. package/src/templates/files/reports/smoke-test.md +22 -0
  192. package/src/templates/files/reports/unit-test.md +36 -0
  193. package/src/templates/files/requirement.md +51 -0
  194. package/src/templates/files/review.md +38 -0
  195. package/src/templates/files/tests.md +36 -0
  196. package/src/templates/files/verify.md +32 -0
  197. package/src/templates/index.js +21 -0
  198. package/src/utils/log.js +37 -0
@@ -0,0 +1,207 @@
1
+ # plan / task-breakdown
2
+
3
+ Task 拆分的 4 种手法。选对手法比"拆得细"更重要。
4
+
5
+ ---
6
+
7
+ ## 4 种手法
8
+
9
+ | 手法 | 核心 | 适用场景 | 好处 | 风险 |
10
+ | --- | --- | --- | --- | --- |
11
+ | **Vertical Slice**(竖切) | 每个 task 跨 层,做完一小块 end-to-end | 新功能、小需求 | 每 task 可独立 demo | 可能跨层 coupled,单 task 信息密度高 |
12
+ | **By Layer**(按层) | 先数据层 → 服务层 → 接口层 → UI | 重构、迁移 | 层内专注、减少 context switch | 前几个 task 不可 demo(没 UI 透出来) |
13
+ | **By F-ID**(按功能点) | 每个 F-ID 一个 task(或多个 task 聚焦一个 F-ID) | 多功能点并行的 L2 | 清晰对应需求 | 一个 F-ID 可能很大,仍需二次拆 |
14
+ | **By Behavior**(按 TDD 行为) | 每个 task 推一个具体行为(测试)通过 | TDD 严格执行、L2/L3 业务类 | 每 task 天然对应 TC | 可能产生很多小 task,依赖图杂 |
15
+
16
+ ## 手法选择决策树
17
+
18
+ ```
19
+ 本次是什么类型?
20
+ ├─ 新功能(L1-L3)
21
+ │ └─ 是否跨多个 F-ID?
22
+ │ ├─ 1-2 个 F-ID → Vertical Slice(端到端一 task 一 task 推)
23
+ │ └─ ≥ 3 个 F-ID → By F-ID(每 F-ID 一组 task)+ By Behavior(组内 TDD 拆)
24
+ ├─ 重构 / 代码迁移
25
+ │ └─ By Layer(层层推进,每层换完再下一层)
26
+ ├─ 纯 DDL / 数据迁移
27
+ │ └─ By Layer(DDL → 双写 → 切读 → 回收)
28
+ ├─ Bug fix(L1)
29
+ │ └─ 1-2 个 task 完事;By Behavior(先写失败测试)
30
+ └─ 性能优化
31
+ └─ By Behavior(每个优化对准一个 perf TC 或 profiling 结果)
32
+ ```
33
+
34
+ ---
35
+
36
+ ## Vertical Slice(竖切)详解
37
+
38
+ **理念**:每个 task 切穿所有层,做一个可 demo 的小功能。
39
+
40
+ **示例**(add-coupon-batch-grant):
41
+
42
+ ```
43
+ T-01: "空输入返回 400" (完整 Controller + validator + test)
44
+ T-02: "1001 返回 BATCH_TOO_LARGE" (扩 validator + test)
45
+ T-03: "1000 人全成功" (Controller + Service + DAO + test)
46
+ T-04: "部分失败返回 failedUsers" (Service 加部分失败逻辑 + test)
47
+ T-05: "幂等:同 batchId 再调" (DAO 唯一键 + Service 幂等处理)
48
+ ...
49
+ ```
50
+
51
+ **优**:
52
+
53
+ - 每 task 做完都有可用的行为
54
+ - TDD 友好(task = 一个测试的实现)
55
+ - 容易并行(不同 vertical 独立)
56
+
57
+ **劣**:
58
+
59
+ - 每 task 跨文件多(Controller / Service / DAO / Test)
60
+ - 需要熟悉全栈
61
+
62
+ **适合**:功能开发,尤其是 L2;不适合大型重构。
63
+
64
+ ---
65
+
66
+ ## By Layer(分层)详解
67
+
68
+ **理念**:底层稳定优先,上层构建在稳定基础上。
69
+
70
+ **示例**(数据迁移):
71
+
72
+ ```
73
+ Layer 1(DDL): T-01 新表 / T-02 索引 / T-03 约束
74
+ Layer 2(双写): T-04 写新表 / T-05 写旧表保留
75
+ Layer 3(对账): T-06 对账 job
76
+ Layer 4(切读): T-07 读切新表
77
+ Layer 5(回收): T-08 停旧写 / T-09 归档
78
+ ```
79
+
80
+ **优**:
81
+
82
+ - 逐层稳定,下层不动上层工作正常
83
+ - 层内专注,减少上下文切换
84
+
85
+ **劣**:
86
+
87
+ - 前几个 task 不可 demo(对用户不可见)
88
+ - 跨 phase 依赖多
89
+
90
+ **适合**:重构、迁移、底层变更;不适合业务功能开发。
91
+
92
+ ---
93
+
94
+ ## By F-ID 详解
95
+
96
+ **理念**:每个 F-ID 一组 task,组内按 TDD 或竖切。
97
+
98
+ **示例**:
99
+
100
+ ```
101
+ F-01 group: T-01, T-02, T-03 (批量接口)
102
+ F-02 group: T-04, T-05 (风控逐条)
103
+ F-03 group: T-06, T-07 (后台 UI)
104
+ ```
105
+
106
+ **优**:
107
+
108
+ - 对应需求清晰,code-review 时直接按 F-ID 查覆盖
109
+ - 可以按 F-ID 为单位并行(不同 F-ID 给不同人)
110
+
111
+ **劣**:
112
+
113
+ - F-ID 可能大小不均,导致 task 估时分布不平衡
114
+
115
+ **适合**:多功能点的 L2/L3。
116
+
117
+ ---
118
+
119
+ ## By Behavior(按行为)详解
120
+
121
+ **理念**:每个 task 对应一个具体行为(一个 TC),严格 TDD:先写失败测试,再最小实现。
122
+
123
+ **示例**:
124
+
125
+ ```
126
+ T-01: behavior "EMPTY_BATCH on empty userIds" 对应 TC-002
127
+ T-02: behavior "BATCH_TOO_LARGE on 1001 userIds" 对应 TC-003
128
+ T-03: behavior "success on 1000 valid userIds" 对应 TC-001
129
+ T-04: behavior "partial fail on 10 risk hit" 对应 TC-004
130
+ ...
131
+ ```
132
+
133
+ **优**:
134
+
135
+ - 最 granular 的拆法
136
+ - 测试先行,实现跟随
137
+ - 每 task 粒度稳定(都是"1 test + 最小实现")
138
+
139
+ **劣**:
140
+
141
+ - task 数量多(≥ TC 数量)
142
+ - 依赖图杂
143
+
144
+ **适合**:严格 TDD 团队;对业务复杂度高、行为多的核心 service。
145
+
146
+ ---
147
+
148
+ ## 混合策略(推荐)
149
+
150
+ 真实项目常常是**混合**:
151
+
152
+ ```
153
+ 大结构:By F-ID(F-01 / F-02 / F-03 分组)
154
+ 组内:By Behavior(每组内按 TC 拆 task)
155
+ 横切关注点:By Layer(DDL 最先、flag 最后、测试单独)
156
+ ```
157
+
158
+ 前述 L2 示例 plan.md 就是混合策略:T-01/03/04 是 F-01/F-02 的行为级 task;T-02(DDL) / T-06(flag) 是横切 layer;T-05 是 F-03 的竖切 UI。
159
+
160
+ ---
161
+
162
+ ## 拆得过细的信号(要合)
163
+
164
+ - 两个 task 改同一文件且依赖紧密
165
+ - 两个 task 的 test 在同一个 test class
166
+ - 合起来仍 < 30 分钟
167
+
168
+ → 合为一个 task,但 Implementation 列 2-4 步保留粒度。
169
+
170
+ ## 拆得过粗的信号(要拆)
171
+
172
+ - Implementation 超过 4 bullet
173
+ - Files > 3 个
174
+ - 预估 > 60 分钟
175
+ - 跨 F-ID(一个 task 同时做 F-01 和 F-02 的事)
176
+
177
+ → 拆成多个 task。
178
+
179
+ ---
180
+
181
+ ## 特殊 task 类型
182
+
183
+ ### Flag task
184
+
185
+ Feature flag 的 "加" 和 "开" 通常分两个 task:
186
+
187
+ - T-NN(较早):加 flag 默认 **off**,代码路径已齐备
188
+ - T-MM(最后):把 flag 切到 **on** 或加灰度比例逻辑
189
+
190
+ ### DDL task
191
+
192
+ 通常独立 task,估时 15-30 分钟。如果 DDL 影响 ORM mapping 或需要双写,拆为:
193
+
194
+ - DDL 加列 task
195
+ - ORM entity 更新 task
196
+ - 双写 task
197
+ - 切读 task
198
+
199
+ ### 验证 task
200
+
201
+ 独立的 integration / perf test task 通常放在最后。不要把 perf 塞进业务 task。
202
+
203
+ ---
204
+
205
+ ## 本文与 SKILL.md 的关系
206
+
207
+ SKILL.md 给了拆分规则(粒度数字、5 要素)。本文给拆分**手法**的选择与例子。agent 开始写 plan.md 前先按决策树选一个主手法,然后用混合策略细化。
@@ -0,0 +1,143 @@
1
+ # plan / task-sequencing
2
+
3
+ Task 排序 + 依赖图 + 并行化判断。
4
+
5
+ ---
6
+
7
+ ## 排序硬规则
8
+
9
+ 1. **契约变更在前**:DTO / proto / GraphQL schema 改动的 task 先,消费者 task 后
10
+ 2. **DDL 在前**:表结构变更 task 在业务代码 task 之前
11
+ 3. **每 task 后仓库 green**:task 完成后 repo 处于"所有测试都过"的状态(不允许暂时红)
12
+ 4. **Flag 开关最后**:flag 默认 off 先落,开启 / 分流比例配置最后
13
+ 5. **业务优先于基础设施**(同优先级下):业务 task 先跑出 review 价值,基础设施 task(监控 / 日志)补上
14
+ 6. **测试 task 独立或尾部**:integration / perf test 通常独立 task 放尾;unit test 嵌在对应业务 task 里
15
+
16
+ ---
17
+
18
+ ## 依赖类型
19
+
20
+ | 类型 | 符号 | 含义 |
21
+ | --- | --- | --- |
22
+ | 强依赖 | `T-01 → T-02` | T-02 必须在 T-01 完成后 |
23
+ | 弱依赖 | `T-01 ⇢ T-02` | T-02 最好在 T-01 后,但能先并行做 stub |
24
+ | 并行 | `T-01 ∥ T-02` | 无先后关系 |
25
+ | 互斥 | `T-01 ⊥ T-02` | 不能同时做(同一文件冲突) |
26
+
27
+ **真实项目中主要是强依赖 + 并行**。
28
+
29
+ ---
30
+
31
+ ## DAG 画法示例
32
+
33
+ ### 简单(线性)
34
+
35
+ ```
36
+ T-01 → T-02 → T-03 → T-04
37
+ ```
38
+
39
+ ### 中等(fan-out / fan-in)
40
+
41
+ ```
42
+ T-01
43
+ / \
44
+ T-02 T-03 (T-02 ∥ T-03)
45
+ \ /
46
+ T-04
47
+ ```
48
+
49
+ ### 复杂(多入口)
50
+
51
+ ```mermaid
52
+ flowchart TD
53
+ T-01[Controller skeleton] --> T-03[Service batch]
54
+ T-02[DDL batch_id] --> T-03
55
+ T-03 --> T-04[Risk wrapper]
56
+ T-03 --> T-05[Admin UI]
57
+ T-04 --> T-06[Flag + metric]
58
+ T-05 --> T-06
59
+ T-06 --> T-07[Integration tests]
60
+ ```
61
+
62
+ ---
63
+
64
+ ## 并行化判断决策树
65
+
66
+ 两个 task 可以并行 吗?按下表回答:
67
+
68
+ | 问题 | 答 | 含义 |
69
+ | --- | --- | --- |
70
+ | 改同一个文件? | 是 → 不能并行 | 合并或强串行 |
71
+ | 有前后依赖(A 的产出是 B 的输入)? | 是 → 不能并行 | 强依赖 |
72
+ | 改同一个数据库表?(schema 改动) | 是 → 不能并行 | DDL 串行安全 |
73
+ | 一个是契约定义,另一个是消费者? | 是 → 不能并行 | 契约必须先 |
74
+ | 以上都否 | 可以并行 |
75
+
76
+ ---
77
+
78
+ ## 并行化的实际执行
79
+
80
+ devflow-kit 的 `devflow apply --task=N` 默认给每个 task 创建一个 worktree。apply 阶段的并行度由依赖图决定:同一批 ready task 中只要有 ≥ 2 个互不依赖且无共享文件,上层 IDE/agent 就必须并行分派多个子 agent。
81
+
82
+ - **串行**:只用于强依赖、共享文件、DDL/契约先后关系等不可并行场景
83
+ - **2 路并行**:同一 ready wave 内有两个独立 task,例如 T-02 和 T-03
84
+ - **多路并行**:L3 项目中 3-5 个独立模块同时 ready 时合理
85
+
86
+ 并行时注意:
87
+
88
+ - 每路在**独立 worktree**,git 状态不冲突
89
+ - 并行启动要在同一轮 dispatch 完成,不要等 T-02 返回后才启动本可并行的 T-03
90
+ - **合并顺序**按依赖图:T-02 并行好了要先合,T-03 依赖 T-02 才能拉最新合并
91
+ - **review 仍然按 task 顺序或按合并顺序做**,不要"并行 5 个 task 一次合 5 个 commit 再 review"
92
+
93
+ ---
94
+
95
+ ## 依赖图检查
96
+
97
+ 写完 plan.md 过一遍:
98
+
99
+ - [ ] 每个 task 都在图上?(或标注 "**isolated**")
100
+ - [ ] 图有**明确起点**?(至少 1 个无依赖 task 是 "Ready")
101
+ - [ ] 图无**环**(不能 T-01 → T-02 → T-01)
102
+ - [ ] 图有**汇点**?(最后一个 task 没下游;通常是 integration test 或 deliver task)
103
+ - [ ] 并行节点确实可并行(按上面判断)
104
+
105
+ ---
106
+
107
+ ## 关键路径(critical path)
108
+
109
+ 关键路径 = 串行依赖最长的那条链。优化点:
110
+
111
+ - 关键路径上的 task 缩短 = 总工期缩短
112
+ - 关键路径上的 task 质量风险高(阻塞其他)
113
+ - 优先 review / 优先验收
114
+
115
+ 示例:
116
+
117
+ ```
118
+ T-01 → T-03 → T-06 → T-07 (关键路径)
119
+ T-02 → T-03
120
+ T-04 → T-06
121
+ T-05 → T-06
122
+ ```
123
+
124
+ 关键路径 = T-01 → T-03 → T-06 → T-07。T-02/04/05 可以并行,但它们不是关键路径,缩短它们不缩短总工期。
125
+
126
+ ---
127
+
128
+ ## 常见排序坑
129
+
130
+ | 坑 | 表现 | 对策 |
131
+ | --- | --- | --- |
132
+ | 把 DDL 放最后 | 所有业务 task 都跑在旧 schema 上,集成测试才发现 | DDL 必在业务 task 前 |
133
+ | 契约和消费者同 task | 契约改完还没合,消费者已开始用 mock,后面换真实契约又要改 | 契约独立 task,先合 |
134
+ | 测试放在业务 task 里没单独放 | 某 task 改动大,unit + integration 都塞进去,超粒度 | integration test 独立 task |
135
+ | 以 task 数量估时 | "10 task,每 30 分钟,5 小时搞定" | 按 task 复杂度加权估,且考虑并行加速 |
136
+ | Flag 在业务 task 里一起加 + 一起开 | flag 开了业务没做完,半成品上线 | Flag 先加 off、最后改 on,分两 task |
137
+ | 性能 / 压测塞进 deliver 前 | 临时抱佛脚 | perf TC 明确任务,独立 task 早跑 |
138
+
139
+ ---
140
+
141
+ ## 本文与 SKILL.md 的关系
142
+
143
+ SKILL.md 给了排序硬规则 4 条。本文给依赖类型、DAG 画法、并行化判断、关键路径、常见坑。agent 写 plan.md §1 依赖图时按本文流程来。
@@ -0,0 +1,248 @@
1
+ # plan / task-template
2
+
3
+ plan.md 完整模板 + task 5 要素的详细模板 + 正反例 + 完整 L2 示例。
4
+
5
+ ---
6
+
7
+ ## plan.md 模板
8
+
9
+ ```markdown
10
+ ---
11
+ slug: <slug>
12
+ createdAt: <ISO>
13
+ level: L1 | L2 | L3
14
+ refs:
15
+ - design.md
16
+ - tests.md
17
+ ---
18
+
19
+ # 任务计划: <一句话标题>
20
+
21
+ ## 1. 任务依赖图
22
+ ```
23
+
24
+ T-01 (Controller 骨架)
25
+
26
+ T-02 (DDL batch_id 列)
27
+
28
+ T-03 (Service batch 方法,复用 grantOne)
29
+ ↓ ↓
30
+ T-04 (RiskService 串行) [可与 T-05 并行]
31
+ ↓ ↓
32
+ T-05 (Admin UI CSV import) [可与 T-04 并行]
33
+ ↓ ↓
34
+ T-06 (Feature flag + metric)
35
+
36
+ T-07 (集成测试 + 回归扫)
37
+
38
+ ```
39
+
40
+ ## 2. 任务清单
41
+ | 任务ID | 文件 | 估时 | TC | 依赖 | 可并行 |
42
+ | --- | --- | --- | --- | --- | --- |
43
+ | T-01 | BatchGrantController.java (新建) | 30min | TC-002, TC-003 | — | — |
44
+ | T-02 | V2_add_batch_id.sql (新建) | 15min | - | — | — |
45
+ | T-03 | GrantService.java (修改) | 45min | TC-001, TC-004 | T-01, T-02 | — |
46
+ | T-04 | RiskClientWrapper.java (新建) | 30min | TC-006 | T-03 | T-05 |
47
+ | T-05 | admin-ui/BatchUploadPage.vue (新建) | 60min | TC-008 | T-01 | T-04 |
48
+ | T-06 | feature flag 配置 + 指标 | 30min | — | T-03, T-04, T-05 | — |
49
+ | T-07 | integration tests | 60min | TC-005, TC-009, NFR-PERF-001 | T-06 | — |
50
+
51
+ ## 3. 每个任务详表
52
+
53
+ ### T-01:Controller 骨架
54
+ - **文件**:
55
+ - `coupon-service/src/main/java/.../BatchGrantController.java` (新建)
56
+ - **行为**:
57
+ 新增 POST /api/v2/coupon/batch-grant,校验 userIds 长度 1-1000,返回占位响应 {code:"NOT_IMPL"}
58
+ - **测试**:
59
+ TC-002 (空 → 400 EMPTY_BATCH),TC-003 (1001 → 400 BATCH_TOO_LARGE)
60
+ - **实现**:
61
+ 1. 新建 Controller 类,加 @RestController + @RequestMapping("/api/v2/coupon")
62
+ 2. 加方法 @PostMapping("/batch-grant"),入参 DTO(userIds, couponTemplateId, batchId?)
63
+ 3. 加 @Valid + 自定义 validator(size check)
64
+ 4. 实现体暂返回 501 NOT_IMPL
65
+ - **提交**:
66
+ `feat(coupon): T-01 add batch-grant controller skeleton + input validation`
67
+
68
+ ### T-02:DDL 加 batch_id
69
+ - **文件**:
70
+ - `coupon-service/src/main/resources/db/migration/V2_add_batch_id.sql` (新建)
71
+ - **行为**:
72
+ coupon_grant 表加 batch_id VARCHAR(36) NULL + idx_grant_batch_id 索引
73
+ - **测试**:
74
+ — (DDL 不需要独立 test;Flyway 启动会自测)
75
+ - **实现**:
76
+ 1. 写 SQL:ALTER TABLE ... ADD COLUMN IF NOT EXISTS batch_id ...
77
+ 2. 写 CREATE INDEX IF NOT EXISTS ...
78
+ 3. 本地 Flyway 启动验证
79
+ 4. 回滚脚本注释到文件末尾(DROP COLUMN IF EXISTS)
80
+ - **提交**:
81
+ `feat(coupon): T-02 add batch_id column to coupon_grant`
82
+
83
+ ### T-03:Service 批量方法
84
+ - **文件**:
85
+ - `coupon-service/src/main/java/.../GrantService.java` (修改)
86
+ - **行为**:
87
+ 新增 batchGrant(userIds, templateId, batchId) 方法,逐条独立事务调 grantOne,聚合成功 / 失败
88
+ - **测试**:
89
+ TC-001 (1000 全成功),TC-004 (部分失败)
90
+ - **实现**:
91
+ 1. 新方法 public BatchResult batchGrant(...)
92
+ 2. 循环 userIds,每条包 try-catch 调 grantOneInNewTx(@Transactional(REQUIRES_NEW))
93
+ 3. 成功 → succeeded;RiskRejectedException → failed with RISK_HIT
94
+ 4. 聚合返回 BatchResult(grantedCount, failedCount, failedUsers)
95
+ - **提交**:
96
+ `feat(coupon): T-03 implement batch grant with per-user tx`
97
+
98
+ ### T-04:RiskClientWrapper
99
+ - **文件**:
100
+ - `coupon-service/src/main/java/.../RiskClientWrapper.java` (新建)
101
+ - **行为**:
102
+ 包装 RiskService,给批量场景提供带 timeout + 指标上报的 check
103
+ - **测试**:
104
+ TC-006 (timeout 降级 + failedUsers reason=RISK_TIMEOUT)
105
+ - **实现**:
106
+ 1. 新建 wrapper 类,注入原 RiskService
107
+ 2. 加 timeout 配置(riskTimeoutMs)
108
+ 3. try timeout → throw RiskTimeoutException
109
+ 4. Mmetrics.timer.record("risk.check.latency")
110
+ - **提交**:
111
+ `feat(coupon): T-04 add risk client wrapper with timeout`
112
+
113
+ ### T-05:Admin UI CSV 上传(并行 with T-04)
114
+ - **文件**:
115
+ - `admin-ui/src/pages/coupon/BatchUpload.vue` (新建)
116
+ - `admin-ui/src/api/coupon.ts` (修改)
117
+ - **行为**:
118
+ 运营后台页面:上传 CSV → 预览(前 20 行)→ 点击发放 → 调 POST /batch-grant → 展示结果
119
+ - **测试**:
120
+ TC-008(integration 端到端)
121
+ - **实现**:
122
+ 1. 新 Vue page,用 el-upload + 自定义 CSV parser(papaparse)
123
+ 2. 上传后展示表格前 20 行 + 命中风控预估(调 preview API 或本地推算)
124
+ 3. 点击"发放"弹窗确认 → 调 coupon.batchGrant API
125
+ 4. 展示 result 表(grantedCount / failedUsers list)
126
+ - **提交**:
127
+ `feat(admin-ui): T-05 add batch upload page for coupon grant`
128
+
129
+ ### T-06:Feature flag + metric
130
+ - **文件**:
131
+ - `coupon-service/src/main/resources/application.yml` (修改)
132
+ - `coupon-service/src/main/java/.../BatchGrantController.java` (修改)
133
+ - **行为**:
134
+ 加 feature flag coupon.batch.enabled,关闭时接口 503;加 coupon.batch.latency histogram
135
+ - **测试**:
136
+ —(通过 T-07 整合 TC 验证)
137
+ - **实现**:
138
+ 1. application.yml 加 feature.coupon.batch.enabled=false(默认关)
139
+ 2. Controller 入口加 flag check → throw ServiceUnavailable if disabled
140
+ 3. 入参校验后、返回前分别打 metric(MeterRegistry.timer)
141
+ 4. Apollo 对接(若项目已集成)
142
+ - **提交**:
143
+ `feat(coupon): T-06 add feature flag + latency metric`
144
+
145
+ ### T-07:集成测试 + 回归扫
146
+ - **文件**:
147
+ - `coupon-service/src/test/java/.../BatchGrantIntegrationTest.java` (新建)
148
+ - `coupon-service/src/test/java/.../GrantServiceTest.java` (修改,加回归)
149
+ - **行为**:
150
+ 跑 TC-005/009/NFR-PERF-001;加回归 TC 保证单发 path 不受影响
151
+ - **测试**:
152
+ TC-005(DB 落库), TC-009(权限), NFR-PERF-001(1000 人 P99)
153
+ - **实现**:
154
+ 1. 起 Testcontainers MySQL
155
+ 2. BatchGrantIntegrationTest:fixture 1000 用户 → POST → 断言 DB + 响应
156
+ 3. Permission test:用 mock token 无 coupon:batch_grant → 期望 403
157
+ 4. Perf(k6 / JMH 单独启动)→ P99 断言
158
+ 5. 回归扫:加几条 GrantServiceTest 确保单发不变
159
+ - **提交**:
160
+ `test(coupon): T-07 integration + perf baseline for batch grant`
161
+
162
+ ## 4. 变更日志
163
+ - 2026-04-24 初始版本,7 task
164
+ - (若后续拆 / 合 task,在此记)
165
+ ```
166
+
167
+ ---
168
+
169
+ ## 5 要素详细规则
170
+
171
+ ### 文件
172
+
173
+ - **具体路径**,绝对路径或相对 repo root 都行(保持一致)
174
+ - 标注 `(新建)` / `(修改)` / `(删除)`
175
+ - **≤ 3 个文件**;超出说明粒度不够,拆
176
+ - **Go 默认根目录 `test/`**:新增 Go 黑盒 / 接口 / 联调 / 回归测试优先写 `test/**/*.go`;只有包内白盒测试必须访问未导出符号、`internal` import 受限、或项目已有同目录测试约定时,才允许在业务包旁新增 `*_test.go`,并在 task 的 Test 中写明理由。
177
+ - 不允许 `whatever needed` / `TBD` 这种模糊表述
178
+
179
+ ### 行为
180
+
181
+ 一句话,必须满足:
182
+
183
+ - **具体**:写 "返回 400 EMPTY_BATCH",不是"处理空输入"
184
+ - **可测**:能直接对应 1+ TC
185
+ - **≤ 30 字**(不包括标点)
186
+
187
+ **反例**:
188
+
189
+ > "实现 Controller 方法处理各种情况"(不具体、不可测)
190
+
191
+ **正例**:
192
+
193
+ > "POST /batch-grant 校验 userIds 长度 1-1000,越限返回 400 + code"(具体 + 可测)
194
+
195
+ ### 测试
196
+
197
+ - 必须引用 `tests.md` 里**存在**的 TC 编号
198
+ - 允许多个 TC(这个 task 覆盖多条)
199
+ - 允许 TC 在多 task 间共享(T-01 跑一次,T-03 跑一次)
200
+ - L1 可写 inline 简述:`Test: "调 /batch-grant 空 userIds 返回 400"`
201
+
202
+ ### 实现
203
+
204
+ - **2-4 条** bullet,再多说明粒度太大
205
+ - 不写代码行(不允许 ```Java ... ```)
206
+ - 每条描述"做哪一步",粒度是"能独立执行"
207
+ - 可以引用类名 / 方法名(因为这是具体改动点)
208
+
209
+ ### 提交
210
+
211
+ - Conventional Commits 格式:`<type>(<scope>): T-NN <verb> <object>`
212
+ - `type`:feat / fix / refactor / test / docs / chore / build
213
+ - `scope`:模块或服务名
214
+ - 含 T-NN 方便追溯
215
+ - 动词 + 宾语,描述性
216
+
217
+ **反例**:
218
+
219
+ > `update code`(没有 task ID / 没动词 / 毫无信息)
220
+
221
+ **正例**:
222
+
223
+ > `feat(coupon): T-01 add batch-grant controller skeleton`
224
+
225
+ ---
226
+
227
+ ## 依赖图画法(§1)
228
+
229
+ 简单箭头链即可,不强求 mermaid。原则:
230
+
231
+ - 每个 task 一个节点
232
+ - 箭头表示"必须先完成"
233
+ - 可并行 task 并列(同一行 / 合并节点 labeled "[parallel]")
234
+ - 合并点(fan-in)用 "↓ ↓ → T-06"
235
+
236
+ 若 DAG 复杂(> 10 节点) → 用 mermaid `flowchart TD`。
237
+
238
+ ---
239
+
240
+ ## 完成状态(task level)
241
+
242
+ task 的 state 由 `devflow apply --task=N --start/--done` 驱动,不由 plan skill 自己改。plan 只定义"要做什么"。
243
+
244
+ ---
245
+
246
+ ## 本文与 SKILL.md 的关系
247
+
248
+ SKILL.md 给了 5 要素字段名 + 拆分规则数值。本文给:完整 plan.md 模板、每个 task 详表 + 5 要素写作规则 + 正反例 + 完整 L2 示例。agent 写 plan.md 时从本文开始。