@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.
- package/CHANGELOG.md +232 -0
- package/LICENSE +21 -0
- package/README.md +539 -0
- package/bin/devflow.js +9 -0
- package/docs/RFC-001-devflow-kit.md +617 -0
- package/docs/RFC-002-workflow-kernel.md +134 -0
- package/docs/enterprise-integration-supplement.md +274 -0
- package/docs/internal-gitlab-setup.md +426 -0
- package/docs/marketplace-skills.md +231 -0
- package/docs/migration-from-arb.md +232 -0
- package/docs/tooling-overview.md +774 -0
- package/docs/workflow-orchestration.md +695 -0
- package/docs/workflow-ui-prototype.html +271 -0
- package/package.json +52 -0
- package/schemas/config.schema.json +51 -0
- package/schemas/delta.schema.json +22 -0
- package/schemas/state.schema.json +130 -0
- package/schemas/status-surface.schema.json +197 -0
- package/schemas/workflow-confirmation-surface.schema.json +70 -0
- package/schemas/workflow-picker.schema.json +94 -0
- package/scripts/postinstall.js +101 -0
- package/scripts/render-workflow-ui-prototype.js +271 -0
- package/skills/apply/SKILL.md +313 -0
- package/skills/apply/references/discipline-checklist.md +145 -0
- package/skills/apply/references/subagent-implementer-prompt.md +113 -0
- package/skills/apply/references/subagent-orchestration.md +150 -0
- package/skills/apply/references/subagent-reviewer-prompt.md +180 -0
- package/skills/apply/references/tdd-loop.md +287 -0
- package/skills/apply/references/when-plan-is-wrong.md +279 -0
- package/skills/apply/references/worktree-swarm.md +292 -0
- package/skills/archive/SKILL.md +229 -0
- package/skills/archive/references/conflict-resolution.md +336 -0
- package/skills/archive/references/knowledge-deposit.md +381 -0
- package/skills/archive/references/spec-merge.md +365 -0
- package/skills/brainstorm/SKILL.md +123 -0
- package/skills/brainstorm/references/proposal-template.md +244 -0
- package/skills/brainstorm/references/question-catalog.md +168 -0
- package/skills/brainstorm/references/session-template.md +184 -0
- package/skills/ci-fix/SKILL.md +63 -0
- package/skills/ci-fix/references/loop.md +25 -0
- package/skills/code-review/SKILL.md +279 -0
- package/skills/code-review/references/escalation-playbook.md +192 -0
- package/skills/code-review/references/language-cheatsheets/go.md +175 -0
- package/skills/code-review/references/language-cheatsheets/java-spring-mybatis.md +246 -0
- package/skills/code-review/references/language-cheatsheets/python.md +170 -0
- package/skills/code-review/references/language-cheatsheets/vue.md +199 -0
- package/skills/code-review/references/output-template.md +275 -0
- package/skills/code-review/references/review-checklist.md +251 -0
- package/skills/complexity-grading/SKILL.md +259 -0
- package/skills/deliver/SKILL.md +271 -0
- package/skills/deliver/references/delivery-modes.md +299 -0
- package/skills/deliver/references/notify.md +359 -0
- package/skills/deliver/references/pr-description.md +319 -0
- package/skills/dependency-upgrade/SKILL.md +57 -0
- package/skills/dependency-upgrade/references/risk-matrix.md +38 -0
- package/skills/df-orchestrator/SKILL.md +407 -0
- package/skills/df-orchestrator/references/complexity-grading.md +177 -0
- package/skills/df-orchestrator/references/escalation-matrix.md +191 -0
- package/skills/df-orchestrator/references/routing-rules.md +290 -0
- package/skills/df-orchestrator/references/workflow-state-machine.md +208 -0
- package/skills/frontend-quality/SKILL.md +61 -0
- package/skills/frontend-quality/references/checklist.md +35 -0
- package/skills/handoff-resume/SKILL.md +59 -0
- package/skills/handoff-resume/references/handoff-template.md +54 -0
- package/skills/plan/SKILL.md +166 -0
- package/skills/plan/references/task-breakdown.md +207 -0
- package/skills/plan/references/task-sequencing.md +143 -0
- package/skills/plan/references/task-template.md +248 -0
- package/skills/requirement-analysis/SKILL.md +499 -0
- package/skills/requirement-analysis/references/acceptance-criteria.md +183 -0
- package/skills/requirement-analysis/references/code-recon.md +151 -0
- package/skills/requirement-analysis/references/edge-case-catalog.md +164 -0
- package/skills/requirement-analysis/references/requirement-template.md +339 -0
- package/skills/requirement-analysis/references/scope-negotiation.md +162 -0
- package/skills/security-hardening/SKILL.md +60 -0
- package/skills/security-hardening/references/checklist.md +42 -0
- package/skills/tech-spec/SKILL.md +388 -0
- package/skills/tech-spec/references/api-contract-design.md +172 -0
- package/skills/tech-spec/references/decision-records.md +110 -0
- package/skills/tech-spec/references/design-template.md +301 -0
- package/skills/tech-spec/references/rollout-and-rollback.md +203 -0
- package/skills/tech-spec/references/spec-delta-conventions.md +250 -0
- package/skills/tech-spec/references/transaction-patterns.md +212 -0
- package/skills/test-spec/SKILL.md +219 -0
- package/skills/test-spec/references/coverage-strategy.md +218 -0
- package/skills/test-spec/references/edge-case-to-test.md +143 -0
- package/skills/test-spec/references/test-case-template.md +276 -0
- package/skills/verify/SKILL.md +232 -0
- package/skills/verify/references/nfr-verification.md +292 -0
- package/skills/verify/references/report-templates.md +510 -0
- package/skills/verify/references/self-test-guide.md +240 -0
- package/skills/verify/references/verify-rollback-map.md +247 -0
- package/src/cli/commands/_helpers.js +108 -0
- package/src/cli/commands/_submit.js +718 -0
- package/src/cli/commands/apply.js +198 -0
- package/src/cli/commands/archive.js +180 -0
- package/src/cli/commands/checkpoint.js +113 -0
- package/src/cli/commands/deliver.js +377 -0
- package/src/cli/commands/deploy.js +504 -0
- package/src/cli/commands/design.js +158 -0
- package/src/cli/commands/disable.js +21 -0
- package/src/cli/commands/doctor.js +178 -0
- package/src/cli/commands/enable.js +21 -0
- package/src/cli/commands/flow.js +645 -0
- package/src/cli/commands/help.js +93 -0
- package/src/cli/commands/ingest.js +602 -0
- package/src/cli/commands/init.js +341 -0
- package/src/cli/commands/knowledge.js +523 -0
- package/src/cli/commands/logs.js +43 -0
- package/src/cli/commands/new.js +202 -0
- package/src/cli/commands/plan.js +49 -0
- package/src/cli/commands/propose.js +27 -0
- package/src/cli/commands/provider.js +698 -0
- package/src/cli/commands/report.js +143 -0
- package/src/cli/commands/requirement.js +227 -0
- package/src/cli/commands/review.js +301 -0
- package/src/cli/commands/skills.js +457 -0
- package/src/cli/commands/status.js +925 -0
- package/src/cli/commands/switch.js +27 -0
- package/src/cli/commands/sync.js +47 -0
- package/src/cli/commands/test.js +366 -0
- package/src/cli/commands/uninstall.js +32 -0
- package/src/cli/commands/update.js +74 -0
- package/src/cli/commands/verify.js +354 -0
- package/src/cli/commands/worktree.js +78 -0
- package/src/cli/index.js +72 -0
- package/src/cli/parse-args.js +102 -0
- package/src/core/autodetect.js +271 -0
- package/src/core/change.js +208 -0
- package/src/core/checkpoint.js +217 -0
- package/src/core/config.js +60 -0
- package/src/core/delta.js +290 -0
- package/src/core/markers.js +59 -0
- package/src/core/paths.js +173 -0
- package/src/core/plan-tasks.js +36 -0
- package/src/core/project-routing.js +285 -0
- package/src/core/projects.js +200 -0
- package/src/core/state.js +200 -0
- package/src/core/workflow-check.js +177 -0
- package/src/core/workflow-init.js +34 -0
- package/src/core/workflow-picker.js +154 -0
- package/src/core/workflow-policy.js +119 -0
- package/src/core/workflow-suggest.js +181 -0
- package/src/core/workflow-verify.js +88 -0
- package/src/core/workflow.js +433 -0
- package/src/core/worktree.js +241 -0
- package/src/knowledge/categories.js +107 -0
- package/src/knowledge/classify.js +125 -0
- package/src/knowledge/deposit.js +414 -0
- package/src/knowledge/migrate.js +149 -0
- package/src/knowledge/mr.js +219 -0
- package/src/knowledge/query.js +131 -0
- package/src/knowledge/registry.js +151 -0
- package/src/knowledge/sync.js +179 -0
- package/src/providers/base.js +74 -0
- package/src/providers/drivers/api-yapi.js +78 -0
- package/src/providers/drivers/ci-jenkins.js +109 -0
- package/src/providers/drivers/intake-confluence.js +544 -0
- package/src/providers/drivers/kb-git.js +549 -0
- package/src/providers/drivers/kb-weknora.js +472 -0
- package/src/providers/drivers/notify-smtp.js +515 -0
- package/src/providers/drivers/observability-oss.js +43 -0
- package/src/providers/drivers/observability-sls.js +50 -0
- package/src/providers/lifecycle.js +135 -0
- package/src/providers/loader.js +132 -0
- package/src/providers/local.js +190 -0
- package/src/providers/userconfig.js +283 -0
- package/src/reports/aggregate.js +185 -0
- package/src/reports/coverage.js +163 -0
- package/src/reports/detect.js +143 -0
- package/src/reports/parse.js +236 -0
- package/src/templates/files/ci/github.yml +38 -0
- package/src/templates/files/ci/gitlab.yml +27 -0
- package/src/templates/files/design.md +63 -0
- package/src/templates/files/ide/devflow-workflow.md +58 -0
- package/src/templates/files/ide/project-overview-reference.md +1 -0
- package/src/templates/files/ide/project-overview.md +27 -0
- package/src/templates/files/knowledge-index.json +17 -0
- package/src/templates/files/knowledge.md +28 -0
- package/src/templates/files/meta.json +8 -0
- package/src/templates/files/plan.md +38 -0
- package/src/templates/files/proposal.md +33 -0
- package/src/templates/files/reports/contract-test.md +40 -0
- package/src/templates/files/reports/e2e-test.md +30 -0
- package/src/templates/files/reports/integration-test.md +36 -0
- package/src/templates/files/reports/joint-test.md +58 -0
- package/src/templates/files/reports/perf.md +24 -0
- package/src/templates/files/reports/regression.md +20 -0
- package/src/templates/files/reports/remote-test.md +55 -0
- package/src/templates/files/reports/self-test.md +43 -0
- package/src/templates/files/reports/smoke-test.md +22 -0
- package/src/templates/files/reports/unit-test.md +36 -0
- package/src/templates/files/requirement.md +51 -0
- package/src/templates/files/review.md +38 -0
- package/src/templates/files/tests.md +36 -0
- package/src/templates/files/verify.md +32 -0
- package/src/templates/index.js +21 -0
- package/src/utils/log.js +37 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# requirement-analysis / scope-negotiation
|
|
2
|
+
|
|
3
|
+
Scope 的加 / 减 / 改优先级,决策树 + 话术 + 审计留档方式。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 为什么 scope 谈判专门出一份
|
|
8
|
+
|
|
9
|
+
- requirement-analysis 阶段用户很容易说"再加一个"或"先把 X 挪出去";不处理好会导致:
|
|
10
|
+
- 加:无限 scope creep,工期失控
|
|
11
|
+
- 减:核心路径被抽,AC 空洞
|
|
12
|
+
- 改优先级:F-01 变 F-03,test 和 plan 全部重新映射
|
|
13
|
+
- 决策要**显式**,不要默默改;要**留审计**,不要事后扯皮
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 决策树(用户提出要"加一个")
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
用户:再加一个 <新功能>
|
|
21
|
+
|
|
22
|
+
Q: 这个新功能还在 proposal.md 的 Problem 范围内吗?
|
|
23
|
+
├─ 是
|
|
24
|
+
│ Q: 加进来后 Recommended level 是否要升?
|
|
25
|
+
│ ├─ 升(L2 → L3)
|
|
26
|
+
│ │ → 提醒用户:"加进来会让复杂度升 L3,deadline 和工作量重估。确认要加吗?"
|
|
27
|
+
│ │ ├─ 确认 → 加到 §3 + 更新 §1 业务背景 + 更新 state.level + 重估 proposal
|
|
28
|
+
│ │ └─ 放弃 → 标记 Out of scope + 记在 §9 Open issues
|
|
29
|
+
│ └─ 不升
|
|
30
|
+
│ → 加到 §3,F-<next-id>,补 AC
|
|
31
|
+
└─ 否(超出 proposal.md 的 Problem)
|
|
32
|
+
→ 拒绝加入本次 requirement
|
|
33
|
+
→ 建议:"这是个新方向,要不要另开一个 slug?(devflow new <new-slug>)"
|
|
34
|
+
→ 在 §9 Risks 里记:"stakeholder X 提议 Y,建议下个迭代做,无 JIRA 跟进风险"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 决策树(用户提出要"减一个" / "下次做")
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
用户:F-03 本次先不做,下个迭代
|
|
41
|
+
|
|
42
|
+
Q: F-03 是否是 P0(proposal 的 Success criteria 依赖它)?
|
|
43
|
+
├─ 是 → 拒绝减
|
|
44
|
+
│ → 话术:"F-03 是 Success criteria 的 #2 的核心,减掉后 Success 无法验收"
|
|
45
|
+
│ → 引导:"要不改 Success criteria?(需要 stakeholder 同意)"
|
|
46
|
+
└─ 否 → 允许减
|
|
47
|
+
→ 动作:
|
|
48
|
+
1. F-03 从 §3 移到 §9 Risks(标注原因)
|
|
49
|
+
2. 同时扫 §8 边界是否引用 F-03,同步清理
|
|
50
|
+
3. 如果有对应 refs(PRD 里写了) → 在 requirement.md 顶部加 note "本次仅实现 F-01/F-02,F-03 移下期"
|
|
51
|
+
4. 审计:state.audit[] 加条目 type=scope_reduce
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 决策树(用户提出改优先级)
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
用户:把 F-02 提到 P0
|
|
58
|
+
|
|
59
|
+
Q: 升/降的依据?
|
|
60
|
+
├─ 业务紧急度变化 → 允许
|
|
61
|
+
│ → 更新 F-02 优先级,重排 §3
|
|
62
|
+
│ → 如果涉及 AC 收紧 → 同步 Round 1 Q&A 新增一行记录原因
|
|
63
|
+
│ └─ 记 audit
|
|
64
|
+
└─ 无明确依据(只是"感觉重要") → 追问
|
|
65
|
+
→ 话术:"这个改动会影响 plan / test,有没有新信息让你觉得它该升?"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Scope 冻结时机
|
|
71
|
+
|
|
72
|
+
| Phase | Scope 状态 |
|
|
73
|
+
| --- | --- |
|
|
74
|
+
| brainstorm | 液态(随时调整 proposal) |
|
|
75
|
+
| requirement Round 1 | 半液态(可增删改) |
|
|
76
|
+
| requirement Round 2 | 固态(只改实现相关的澄清,业务 scope 冻结) |
|
|
77
|
+
| design / plan / apply | 冻结(任何改动要**回退到 requirement** 修改) |
|
|
78
|
+
| code-review | 冻结 + 任何变更视为 **Path A**(见 code-review escalation-playbook) |
|
|
79
|
+
| verify 及以后 | 冻结 + 任何变更 **下期处理** |
|
|
80
|
+
|
|
81
|
+
**关键**:Round 2 之后想加 scope → orchestrator 应阻止,除非用户明确走"回退到 Round 1 + 审计"流程。
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 审计留档
|
|
86
|
+
|
|
87
|
+
每次 scope 变更必须在 `§6 Round 1 Q&A` 或 `§7 Round 2 Q&A` 加一行:
|
|
88
|
+
|
|
89
|
+
| # | 问题 / 触发 | 回答 / 决策 | 影响 |
|
|
90
|
+
| --- | --- | --- | --- |
|
|
91
|
+
| Q10 | 用户:本次要不要加 F-04 导出功能? | 决定:加,Recommended level 不变 | §3 +F-04, §8 +边界 |
|
|
92
|
+
|
|
93
|
+
同时在 `state.json.audit[]` 记:
|
|
94
|
+
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"type": "scope_change",
|
|
98
|
+
"action": "add | reduce | reprioritize",
|
|
99
|
+
"target": "F-04",
|
|
100
|
+
"reason": "...",
|
|
101
|
+
"requestedBy": "user",
|
|
102
|
+
"at": "<ISO>"
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 谈判话术模板
|
|
109
|
+
|
|
110
|
+
### 拒绝加(超出 Problem 范围)
|
|
111
|
+
|
|
112
|
+
> "听起来是个好想法。不过它和当前 slug 的 Problem('批量发券')目标不同 —— 它更像'优惠券发放历史查询'。
|
|
113
|
+
>
|
|
114
|
+
> 建议:
|
|
115
|
+
> 1. 如果是下个迭代做 → 我在 §9 Risks 里记一条,后续运营来提就有依据。
|
|
116
|
+
> 2. 如果现在就要做 → 另开一个 slug(`devflow new query-coupon-grant`),两边并行。
|
|
117
|
+
>
|
|
118
|
+
> 你倾向哪个?"
|
|
119
|
+
|
|
120
|
+
### 拒绝减(P0 功能)
|
|
121
|
+
|
|
122
|
+
> "F-02 是 Problem 的核心 —— Success criteria 的第 2 条'成功率 ≥ 单发水平'必须靠 F-02(逐条风控)才能保证。
|
|
123
|
+
>
|
|
124
|
+
> 如果 F-02 本次不做,Success criteria 需要调整(比如接受'批量场景下成功率 ≥ 95%'),这需要 stakeholder 确认。
|
|
125
|
+
>
|
|
126
|
+
> 要不要先找 @张三 确认?"
|
|
127
|
+
|
|
128
|
+
### 引导"降级为 Open issue"
|
|
129
|
+
|
|
130
|
+
> "听起来 F-04 的价值不是立刻就要。考虑:
|
|
131
|
+
> - 记在 §9 Open issues,本次不做,但留一个位置
|
|
132
|
+
> - 如果之后优先级上来,另开 slug
|
|
133
|
+
>
|
|
134
|
+
> 比硬塞进当前 requirement 好 —— 塞进来会让 deadline 失控,AC 也不好立即评估。"
|
|
135
|
+
|
|
136
|
+
### 升 Level 提醒
|
|
137
|
+
|
|
138
|
+
> "加进 F-04 后,Recommended level 从 L2 升到 L3(原因:跨服务 + 新增分布式锁场景)。
|
|
139
|
+
>
|
|
140
|
+
> L3 意味着:
|
|
141
|
+
> - tech-spec 要写 ≥2 alternatives + 完整灰度方案
|
|
142
|
+
> - test-spec 要加 e2e + 性能基线
|
|
143
|
+
> - verify 要加 perf 报告
|
|
144
|
+
>
|
|
145
|
+
> 工作量大约 +3 天。接受这个权衡吗?"
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 常见谈判陷阱
|
|
150
|
+
|
|
151
|
+
| 陷阱 | 对策 |
|
|
152
|
+
| --- | --- |
|
|
153
|
+
| "就加一点点,不影响" | 每次加都说"一点点";累积 3 次就变 L3。用"3 条累积规则":累计加 3 次就要强制升 level 重估 |
|
|
154
|
+
| 把 decision 推回给你("你觉得呢") | brainstorm-style 反问,给 2 个选项让用户选 |
|
|
155
|
+
| Scope creep 到 phase 后期才暴露 | Round 2 结束前要求用户"通读一次 requirement.md 并确认",生成 sign-off 记录 |
|
|
156
|
+
| 用"下期做"作为搪塞 | 建议:不是模糊的"下期",而是 "SCRUM-XXX issue + deadline"(没 issue 就开一个) |
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 本文与 SKILL.md 的关系
|
|
161
|
+
|
|
162
|
+
SKILL.md 提了加 / 减 / 改优先级要判断和留档。本文给:决策树 + 话术模板 + 审计格式 + 常见陷阱。requirement-analysis 阶段遇到 scope 谈判时直接套决策树。
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: devflow-security-hardening
|
|
3
|
+
description: |
|
|
4
|
+
devflow-kit 安全加固专项 skill。当改动涉及 L3、安全/支付/隐私/鉴权/回调/文件上传/外部依赖/日志脱敏/OSS/SLS/YAPI token 时触发。
|
|
5
|
+
接入 code-review 与 verify,补充安全 checklist、敏感信息检查、依赖漏洞、权限绕过、注入、SSRF、XSS、回调验签和日志脱敏证据。
|
|
6
|
+
when_to_use: |
|
|
7
|
+
L3 默认使用;任何支付、隐私、权限、鉴权、外部回调、文件上传、SQL/NoSQL、OSS/SLS、token/cookie/password、依赖漏洞任务都必须使用。
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# security-hardening
|
|
11
|
+
|
|
12
|
+
安全加固专项 skill。它不把 devflow 变成安全扫描器,但要求高风险改动在 review/verify 中有明确安全结论。
|
|
13
|
+
|
|
14
|
+
## 触发条件
|
|
15
|
+
|
|
16
|
+
- L3。
|
|
17
|
+
- 支付、签约、资金、隐私、会员、权限、登录、鉴权。
|
|
18
|
+
- 外部回调、Webhook、redirect、returnUrl、callback。
|
|
19
|
+
- 文件上传、OSS、SLS、对象存储、日志检索。
|
|
20
|
+
- SQL、NoSQL、模板渲染、HTML 富文本。
|
|
21
|
+
- token、cookie、password、secret、accessKey。
|
|
22
|
+
- 依赖漏洞修复。
|
|
23
|
+
|
|
24
|
+
## 接入点
|
|
25
|
+
|
|
26
|
+
| phase | 行为 |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| requirement-analysis | 标出安全/隐私/合规约束和 owner |
|
|
29
|
+
| tech-spec | 写鉴权、验签、脱敏、权限边界、回滚策略 |
|
|
30
|
+
| code-review | 使用 `references/checklist.md` 做安全 review |
|
|
31
|
+
| verify | 按风险补 `test-report.md#security` subsection 或写入 `#self-test` |
|
|
32
|
+
| deliver | 确认报告和 PR 描述不含敏感信息 |
|
|
33
|
+
|
|
34
|
+
## 最低检查
|
|
35
|
+
|
|
36
|
+
1. 敏感信息不得进入仓库、日志、报告、PR 描述。
|
|
37
|
+
2. 外部输入必须校验和限制。
|
|
38
|
+
3. 回调/redirect/returnUrl 必须有白名单或签名策略。
|
|
39
|
+
4. 权限检查不能只在前端做。
|
|
40
|
+
5. SQL/NoSQL/模板/命令执行不得拼接未信任输入。
|
|
41
|
+
6. 文件上传必须限制类型、大小、路径和访问权限。
|
|
42
|
+
7. 依赖漏洞修复必须记录漏洞来源和验证。
|
|
43
|
+
|
|
44
|
+
详细清单见 `references/checklist.md`。
|
|
45
|
+
|
|
46
|
+
## 输出要求
|
|
47
|
+
|
|
48
|
+
- `review.md` 中有 security 结论。
|
|
49
|
+
- `verify.md` 中记录安全验证是否完成。
|
|
50
|
+
- 若接受风险,必须写明风险 owner 和原因。
|
|
51
|
+
- 任何安全 bypass 必须有 `--reason` 审计记录或明确人工签收。
|
|
52
|
+
|
|
53
|
+
## 反模式
|
|
54
|
+
|
|
55
|
+
- 只说"没有安全问题",没有检查项。
|
|
56
|
+
- 为了调试把 token/cookie/request body 全量写进日志。
|
|
57
|
+
- 回调只校验参数存在,不校验来源或签名。
|
|
58
|
+
- OSS 对象默认公开。
|
|
59
|
+
- 依赖漏洞修复后不跑回归。
|
|
60
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# security hardening checklist
|
|
2
|
+
|
|
3
|
+
## 敏感信息
|
|
4
|
+
|
|
5
|
+
- token、cookie、password、secret、accessKey 不进代码、报告、日志、PR 描述。
|
|
6
|
+
- provider 凭证使用 `${env:VAR}`。
|
|
7
|
+
- 日志中的手机号、身份证号、邮箱、地址做脱敏。
|
|
8
|
+
|
|
9
|
+
## 鉴权 / 权限
|
|
10
|
+
|
|
11
|
+
- 后端接口有权限校验。
|
|
12
|
+
- 用户只能访问自己的资源或授权资源。
|
|
13
|
+
- 管理端操作有角色/租户/组织边界。
|
|
14
|
+
- IDOR 风险已检查。
|
|
15
|
+
|
|
16
|
+
## 输入校验
|
|
17
|
+
|
|
18
|
+
- SQL / NoSQL / shell / 模板不拼接未信任输入。
|
|
19
|
+
- 文件上传限制类型、大小、扩展名、MIME、存储路径。
|
|
20
|
+
- URL、redirect、callback 有白名单。
|
|
21
|
+
- SSRF 风险已检查。
|
|
22
|
+
|
|
23
|
+
## 回调 / 支付 / 签约
|
|
24
|
+
|
|
25
|
+
- 回调验签。
|
|
26
|
+
- 幂等处理。
|
|
27
|
+
- 重放攻击防护。
|
|
28
|
+
- 金额、渠道、订单状态不信任前端。
|
|
29
|
+
- 异步状态有对账或补偿。
|
|
30
|
+
|
|
31
|
+
## 前端安全
|
|
32
|
+
|
|
33
|
+
- 用户输入不直接 `v-html` / `dangerouslySetInnerHTML`。
|
|
34
|
+
- URL 参数不直接拼接跳转。
|
|
35
|
+
- 敏感字段不放 localStorage,除非已有安全约定。
|
|
36
|
+
|
|
37
|
+
## 依赖
|
|
38
|
+
|
|
39
|
+
- 漏洞来源记录(CVE/Snyk/Dependabot/内部扫描)。
|
|
40
|
+
- 升级影响已验证。
|
|
41
|
+
- major/minor 风险有回滚说明。
|
|
42
|
+
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: devflow-tech-spec
|
|
3
|
+
description: |
|
|
4
|
+
devflow-kit design 阶段把签收的 `requirement.md` 翻译成**可实施**的 `design.md`(技术方案)。当本次改动会改变"系统能
|
|
5
|
+
做什么"时,还要写 `delta/<capability>.md` 存下本次的规格增量 —— archive 阶段按 frontmatter
|
|
6
|
+
`capability: <域>/<能力名>` 合入对应 `devflow/specs/<域>/spec.md`(按业务域分目录)。
|
|
7
|
+
触发时机:`devflow design [--with-tests] [--with-spec]` 或 `/df:design`;也在
|
|
8
|
+
code-review 发现 design 级缺陷(Path B)时由 `devflow tech-spec --revise` 重入本 skill 产出
|
|
9
|
+
design.v2。绝对禁止越过本 skill 直接 plan / apply。
|
|
10
|
+
when_to_use: |
|
|
11
|
+
requirement 的硬闸全部满足后。L1 可产精简版 design;L2 走标准 11 段;L3 必须含 ≥2
|
|
12
|
+
alternatives + 完整灰度 / 回滚章节。
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# tech-spec
|
|
16
|
+
|
|
17
|
+
写下"**怎么做**"。上游 `requirement.md` 回答"做什么 / 为谁做 / 怎样算做完";本 skill 回答:
|
|
18
|
+
**系统里哪些组件要动、要怎么动、为什么这么动(alternatives 取舍)、出问题怎么兜底**。
|
|
19
|
+
|
|
20
|
+
## Step 0:自动查询知识库(必须,在写 design.md 之前)
|
|
21
|
+
|
|
22
|
+
> 先查 KB 中的历史决策(ADR)、服务契约、已知方案,避免重复设计已解决的问题。
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# 按本次涉及的能力域查询
|
|
26
|
+
devflow knowledge query "<本次技术改动的核心词,如:order-initializer factory member-type>"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**查询结果处理:**
|
|
30
|
+
- **命中 `架构决策`(历史 ADR)**:在 design.md §备选方案中引用,说明是否沿用或偏离原决策及理由
|
|
31
|
+
- **命中 `接口契约`(服务契约)**:在 design.md 契约定义中引用,确保新契约与历史保持兼容
|
|
32
|
+
- **命中 `服务说明`(服务描述)**:在 design.md 架构影响中引用
|
|
33
|
+
- **命中 `运行手册` / `事故复盘`**:在 design.md 错误处理中引用历史事故教训
|
|
34
|
+
- **无命中**:正常继续
|
|
35
|
+
|
|
36
|
+
## 前置检查
|
|
37
|
+
|
|
38
|
+
| 输入 | 必需 | 缺失时 |
|
|
39
|
+
| --- | --- | --- |
|
|
40
|
+
| `requirement.md` 且硬闸通过(每条 F-ID 有 AC、边界 ≥ 4 条、Round 1/2 完成) | 是 | orchestrator 回退到 requirement |
|
|
41
|
+
| Round 2 的"代码侦察结论" | 是(L2/L3);L1 可宽 | 先补侦察再进 |
|
|
42
|
+
| `state.level` | 是 | 缺则按 L2 展开 |
|
|
43
|
+
| 项目 detect(语言 / 框架) | 否(有更佳) | 用于挑选 architectural patterns |
|
|
44
|
+
|
|
45
|
+
## 产物
|
|
46
|
+
|
|
47
|
+
编辑 `devflow/changes/<slug>/design.md`。若有规格增量,显式使用 `devflow design --with-spec` 或手动创建 `delta/<capability>.md`。
|
|
48
|
+
|
|
49
|
+
### design.md 格式规范(对齐 arb 技术方案.md)
|
|
50
|
+
|
|
51
|
+
```markdown
|
|
52
|
+
# 技术方案:<标题>
|
|
53
|
+
|
|
54
|
+
> 结构化需求:`devflow/changes/<slug>/requirement.md` | JIRA/URL: <引用>
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 一、功能拆解
|
|
59
|
+
|
|
60
|
+
| 序号 | 功能点 | 改动类型 | 说明 |
|
|
61
|
+
|------|--------|---------|------|
|
|
62
|
+
| C1 | <能力名> | 新增/修改/删除 | <文件 + 核心改动一句话> |
|
|
63
|
+
| C2 | ... | ... | ... |
|
|
64
|
+
|
|
65
|
+
> C-ID 与 requirement.md 的 F-ID 对应关系:C1→F1, C2→F2(多对多时注明)
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 二、技术实现
|
|
70
|
+
|
|
71
|
+
### C1:<能力名>
|
|
72
|
+
|
|
73
|
+
**改动文件**:`path/to/file.go`
|
|
74
|
+
|
|
75
|
+
```go
|
|
76
|
+
// 核心改动示意(伪代码或关键片段)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**实现步骤**:
|
|
80
|
+
1. ...
|
|
81
|
+
2. ...
|
|
82
|
+
|
|
83
|
+
**契约**(如有接口变更):
|
|
84
|
+
- Request: `{ field: type, ... }`
|
|
85
|
+
- Response: `{ field: type, ... }`
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### C2:<能力名>
|
|
90
|
+
|
|
91
|
+
...(同上结构)
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 三、数据层(如有 DDL 变更)
|
|
96
|
+
|
|
97
|
+
```sql
|
|
98
|
+
-- DDL(幂等,可重入)
|
|
99
|
+
ALTER TABLE xxx ADD COLUMN yyy ...;
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 四、关键流程
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
用户 → 接口入口 → ServiceA → ServiceB → DB
|
|
108
|
+
↘ 异常路径 → 返回错误码
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
若存在 API 契约变化,必须说明是否同步 YAPI / OpenAPI;若存在跨服务调用、回调、跳转、异步链路,必须设计调用链一致性验证方式,并列出 traceId / requestId / 关键日志检索点(SLS/OSS)。
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 五、错误处理 / 事务边界
|
|
116
|
+
|
|
117
|
+
| 场景 | 处理方式 | 错误码 |
|
|
118
|
+
|------|---------|--------|
|
|
119
|
+
| ... | ... | ... |
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 六、兼容性 / 灰度 / 回滚(L2/L3 必填)
|
|
124
|
+
|
|
125
|
+
- 灰度策略:...
|
|
126
|
+
- 回滚方案:...
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 七、备选方案(L2 ≥1,L3 ≥2)
|
|
131
|
+
|
|
132
|
+
| 方案 | 优点 | 缺点 | 结论 |
|
|
133
|
+
|------|------|------|------|
|
|
134
|
+
| A(选定) | ... | ... | 采用 |
|
|
135
|
+
| B | ... | ... | 放弃,原因:... |
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**段落按级别要求:**
|
|
139
|
+
|
|
140
|
+
| 段 | L1 | L2 | L3 |
|
|
141
|
+
| --- | --- | --- | --- |
|
|
142
|
+
| 一、功能拆解(C-ID 表) | 必 | 必 | 必 |
|
|
143
|
+
| 二、技术实现(每 C-ID 一节) | 必 | 必 | 必 |
|
|
144
|
+
| 三、数据层 | 有变必 | 必 | 必(含容量评估) |
|
|
145
|
+
| 四、关键流程 | 简 | 必 | 必(sequence diagram) |
|
|
146
|
+
| 五、错误处理 / 事务 | 必 | 必 | 必(完整事务边界) |
|
|
147
|
+
| 六、兼容性 / 灰度 / 回滚 | 简 | 必 | 必(灰度步骤 + 回滚预案) |
|
|
148
|
+
| 七、备选方案 | 可略 | 必 ≥1 | 必 ≥2 + trade-off 表 |
|
|
149
|
+
|
|
150
|
+
完整字段语义、正反例见 [`references/design-template.md`](references/design-template.md)。
|
|
151
|
+
|
|
152
|
+
## 按语言自动加载 cheatsheet(全语言)
|
|
153
|
+
|
|
154
|
+
通用模板是架构 / 契约 / 事务 / 灰度的语言无关骨架。每门语言有自己的"工程落地习语",挑 1-2 份一起读:
|
|
155
|
+
|
|
156
|
+
### 挑选规则(与 code-review 一致)
|
|
157
|
+
|
|
158
|
+
1. 读 `devflow/config.json` 的 `detect.language`
|
|
159
|
+
2. 看当次改动涉及哪些语言(多语言一起做的 monorepo,每种语言各挑一份)
|
|
160
|
+
3. 同语言内按下表选具体 cheatsheet:
|
|
161
|
+
|
|
162
|
+
| detect.language | 信号 | 挑选 |
|
|
163
|
+
| --- | --- | --- |
|
|
164
|
+
| `java` | `pom.xml` 含 `spring-boot` + `mybatis` / `*Mapper.xml` | `java-spring-mybatis.md` |
|
|
165
|
+
| `java` | 含 `spring-data-jpa` / `@Entity` 广用 | `java-spring-mybatis.md` 的 §1/§4/§5/§6/§7(跳 §2/§3) |
|
|
166
|
+
| `go` | 任意 | `go.md` |
|
|
167
|
+
| `python` | 任意 | `python.md` |
|
|
168
|
+
| `node` | 含 `vue` | `vue.md` |
|
|
169
|
+
| 其他 | — | 仅用通用模板 + 在 design.md 开头 note `language-cheatsheet: missing` |
|
|
170
|
+
|
|
171
|
+
详细 cheatsheet 内容与 code-review skill 共享:[`../code-review/references/language-cheatsheets/`](../code-review/references/language-cheatsheets/)。tech-spec 阶段挑同样的 1-2 份一起读,但关注点不同 —— code-review 是"审查时要扫的踩坑习语",tech-spec 是"设计时要提前规避的框架特性"。
|
|
172
|
+
|
|
173
|
+
## 关键方法论:决策 vs 记账
|
|
174
|
+
|
|
175
|
+
design.md 不是"代码说明书",它是**决策文档**。字段多不多,不如**决策清不清**。
|
|
176
|
+
|
|
177
|
+
每个关键设计点要回答:
|
|
178
|
+
|
|
179
|
+
1. **选了什么**(1 句话)
|
|
180
|
+
2. **为什么选它**(对比 ≥1 备选,说 trade-off)
|
|
181
|
+
3. **什么情况下这个决策会反向**(降级 / 回滚触发条件)
|
|
182
|
+
|
|
183
|
+
例子见 `references/decision-records.md`,含 ADR-lite 模板(适合 design.md 内嵌使用,也适合抽出来独立存档)。
|
|
184
|
+
|
|
185
|
+
## 实现细节收敛协议(减少设计后追问)
|
|
186
|
+
|
|
187
|
+
> **HARD RULE**:tech-spec 阶段必须尽量把实现细节自己收敛掉,不能在 design 完成后把大量代码实现问题甩给用户。
|
|
188
|
+
|
|
189
|
+
### 谁来决定
|
|
190
|
+
|
|
191
|
+
| 问题类型 | 谁决定 | 处理方式 |
|
|
192
|
+
| --- | --- | --- |
|
|
193
|
+
| 业务语义 / 验收口径 / 对外承诺 | 用户 / PO | 回 requirement-analysis,一次性批量问清 |
|
|
194
|
+
| 合规、安全、资金、不可逆数据迁移 | 用户 / owner | BLOCKED 或回 requirement-analysis,不能默认 |
|
|
195
|
+
| 外部系统是否支持、接口 owner 是否承诺 | 用户 / owner | 作为 P0 open issue,不能假设 |
|
|
196
|
+
| 代码落点、缓存键、调用链、状态字段、参数透传、渠道枚举、复用哪个 helper | agent | 通过代码侦察 + KB + 现有模式自行选择 |
|
|
197
|
+
| 多个实现都可行且业务效果一致 | agent | 选最贴近现有模式的一种,在 design.md 写 assumption + rejected alternative |
|
|
198
|
+
|
|
199
|
+
### 默认决策顺序
|
|
200
|
+
|
|
201
|
+
遇到实现细节不明确时,按以下顺序自动收敛:
|
|
202
|
+
|
|
203
|
+
1. **沿用现有代码路径**:优先复用当前服务已经使用的 service/helper/factory/channel 字段。
|
|
204
|
+
2. **保持外部契约最小变化**:能后端补齐就不新增前端参数;能兼容旧参数就不 breaking。
|
|
205
|
+
3. **缓存/幂等优先可恢复**:本地缓存 key、幂等 key、状态字段必须能从已有返回或 DB 重新推导。
|
|
206
|
+
4. **多渠道以真实返回为准**:如 `bf/jd`、`pay_channel`、签约码等渠道分支,优先读现有响应字段和枚举,不要求用户再解释代码细节。
|
|
207
|
+
5. **不确定但风险低**:写入 design.md 的 `Assumptions`,并在 tests.md 加验证用例。
|
|
208
|
+
6. **不确定且会改变业务承诺**:停止,回 requirement-analysis 批量提问。
|
|
209
|
+
|
|
210
|
+
### design.md 必须显式记录
|
|
211
|
+
|
|
212
|
+
每个实现决策点至少写清:
|
|
213
|
+
|
|
214
|
+
```markdown
|
|
215
|
+
**Decision**: 采用 <方案>。
|
|
216
|
+
**Evidence**: 代码位置 / KB / 既有模式。
|
|
217
|
+
**Assumption**: <如果有,写明可被测试验证的假设>。
|
|
218
|
+
**Fallback**: 假设不成立时怎么降级 / 回滚 / 改为备选。
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### 禁止行为
|
|
222
|
+
|
|
223
|
+
- 禁止在 design 完成后再问用户"这个字段从哪里取 / 这个渠道走哪个分支 / 要不要查缓存"这类实现细节。
|
|
224
|
+
- 禁止输出"实现时再确认"、"后续开发时判断"、"需要用户补充技术细节"。
|
|
225
|
+
- 禁止带着未决实现问题进入 `test-spec` / `plan`;若确实无法自行收敛,必须回到 requirement-analysis,并一次性列出所有会影响业务承诺的问题。
|
|
226
|
+
|
|
227
|
+
## 契约设计(§5)
|
|
228
|
+
|
|
229
|
+
契约是**外部承诺**,改了就要考虑兼容。原则:
|
|
230
|
+
|
|
231
|
+
- 只 **加字段**(客户端忽略未知字段),不删不改语义
|
|
232
|
+
- 新字段在 DTO 层 **默认可空**,降低迁移负担
|
|
233
|
+
- Breaking change 一律新版本(v2 / breakingVersion header),不要就地改
|
|
234
|
+
- 错误码集中管理,不要散在各 Controller
|
|
235
|
+
|
|
236
|
+
契约设计的完整方法论(REST / GraphQL / gRPC / 事件)、字段设计原则、版本化策略见 [`references/api-contract-design.md`](references/api-contract-design.md)。
|
|
237
|
+
|
|
238
|
+
### 契约消费者影响矩阵(必须)
|
|
239
|
+
|
|
240
|
+
> **HARD RULE**:任何契约变化都必须写"提供方 + 消费方"双向设计。只写后端接口怎么改、不写前端/调用方/轮询页怎么适配,design 不算完成。
|
|
241
|
+
|
|
242
|
+
必须覆盖:
|
|
243
|
+
|
|
244
|
+
| 契约变化 | 提供方改动 | 消费方/页面/任务 | 旧依赖 | 新设计 | 兼容/迁移 |
|
|
245
|
+
| --- | --- | --- | --- | --- | --- |
|
|
246
|
+
| `returnUrl` 不再带订单号参数 | 后端生成无参回跳 URL | 前端签约结果/轮询页 | 从 query 读取订单号轮询 | 改为从本地缓存 / 后端状态接口 / bfState 查询 | 老链接兼容读取 query;新链路走新策略 |
|
|
247
|
+
|
|
248
|
+
设计要求:
|
|
249
|
+
|
|
250
|
+
- 对每个 request/response/URL/query/status/enum 变化,列出所有已发现消费者。
|
|
251
|
+
- 前端项目同时改动时,必须设计页面状态来源、刷新/回退、无参数直达、老链接兼容。
|
|
252
|
+
- 轮询页必须说明轮询 key 从哪里来;如果 URL 不再携带参数,必须有替代来源(本地缓存、后端状态接口、一次性 state token 等)。
|
|
253
|
+
- 如果消费者不在本次 scope,必须说明为什么不受影响,或回 requirement-analysis 补项目确认。
|
|
254
|
+
- 对无法确认的消费者,不允许写"实现时再看";必须继续代码侦察或 BLOCKED。
|
|
255
|
+
|
|
256
|
+
## 事务 / 并发 / 一致性(§8)
|
|
257
|
+
|
|
258
|
+
最容易出 P0 的地方。常见决策:
|
|
259
|
+
|
|
260
|
+
| 场景 | 推荐模式 | 备注 |
|
|
261
|
+
| --- | --- | --- |
|
|
262
|
+
| 单库单事务 | `@Transactional`(本地事务) | 默认选择;注意传播行为 |
|
|
263
|
+
| 分布式 / 跨服务 | Saga + 补偿 / TCC / 最终一致 | 设计"补偿/回滚"操作 |
|
|
264
|
+
| 读多写少 + 一致性弱 | 主从读 + 延迟容忍 | 明确 RPO/RTO |
|
|
265
|
+
| 幂等接口 | 唯一键 + Upsert / nonce | 必须设计重复请求的返回值 |
|
|
266
|
+
| 乐观锁 | `version` 列 + CAS | 适合低冲突 |
|
|
267
|
+
| 分布式锁 | Redis/zk 锁 + 超时 | 注意锁放手的兜底(TTL) |
|
|
268
|
+
|
|
269
|
+
具体 pattern 的决策矩阵与踩坑点见 [`references/transaction-patterns.md`](references/transaction-patterns.md)。
|
|
270
|
+
|
|
271
|
+
## 灰度 / 回滚(§10)
|
|
272
|
+
|
|
273
|
+
**硬规则**:L2/L3 的 design.md 必须有可操作的灰度步骤和回滚预案。不允许"上线后观察"这种笼统说法。
|
|
274
|
+
|
|
275
|
+
完整模板(Feature flag / 灰度阶段 / 指标对照 / 回滚脚本 / 数据迁移双写)见 [`references/rollout-and-rollback.md`](references/rollout-and-rollback.md)。
|
|
276
|
+
|
|
277
|
+
## Spec Delta(OpenSpec 格式,按需)
|
|
278
|
+
|
|
279
|
+
> `delta/` 不再默认生成。只有当本次 change 改变系统长期能力、接口契约或业务规则时,才运行 `devflow design --with-spec` 生成 `delta/sample-capability.md`,或手动创建 `delta/<capability>.md`。
|
|
280
|
+
> agent 在写完 design.md 后,若确认有规格增量,**必须**:
|
|
281
|
+
> 1. 修改 frontmatter `capability: <域>/<能力名>`(例:`coupon/grant`、`order/create`)
|
|
282
|
+
> 2. 重命名文件为 `<能力名>.md`(便于阅读)
|
|
283
|
+
> 3. 按 OpenSpec 格式填充真实内容
|
|
284
|
+
> 纯 bugfix / 内部重构 / 测试补充可不生成 delta,并在完成状态里写 `deltaFiles: "none"`。
|
|
285
|
+
>
|
|
286
|
+
> 落盘路径 = `devflow/specs/<域>/spec.md`,同一业务域的多个 Requirement 合并到同一个 spec。
|
|
287
|
+
> 纯 bug fix 且确认无 capability 变更时,删除 sample 文件并在 design.md 注明理由;
|
|
288
|
+
> 但不允许留着空的 sample 文件不处理。
|
|
289
|
+
|
|
290
|
+
**格式要求(OpenSpec Requirements 风格)**:
|
|
291
|
+
|
|
292
|
+
```markdown
|
|
293
|
+
## ADDED Requirements
|
|
294
|
+
|
|
295
|
+
### Requirement: <业务能力名>
|
|
296
|
+
|
|
297
|
+
系统 SHALL <描述该业务能力对外承诺>。
|
|
298
|
+
|
|
299
|
+
1. 系统 MUST <约束 1>
|
|
300
|
+
2. 系统 MUST <约束 2>
|
|
301
|
+
3. 系统 SHOULD <约束 3>
|
|
302
|
+
|
|
303
|
+
#### Scenario: <场景名>
|
|
304
|
+
- **WHEN** <触发条件>
|
|
305
|
+
- **THEN** 系统 MUST <结果>
|
|
306
|
+
- **AND** <补充断言>
|
|
307
|
+
|
|
308
|
+
## MODIFIED Requirements
|
|
309
|
+
### Requirement: <既有业务能力名> <!-- heading 必须与 spec 中一字不差 -->
|
|
310
|
+
- ~~旧约束~~
|
|
311
|
+
- 新约束
|
|
312
|
+
|
|
313
|
+
## REMOVED Requirements
|
|
314
|
+
### Requirement: <废弃业务能力名>
|
|
315
|
+
下线原因 / 时间
|
|
316
|
+
|
|
317
|
+
## REJECTED Alternatives
|
|
318
|
+
### 备选方案名
|
|
319
|
+
**否决原因**:...
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**为什么用 OpenSpec Requirements 风格**:
|
|
323
|
+
|
|
324
|
+
- `SHALL/MUST/SHOULD` 明确系统承诺,方便评审和验收
|
|
325
|
+
- `Scenario` 直接映射测试用例,比接口字段流水账更接近业务能力
|
|
326
|
+
- 按业务域写入 `specs/<域>/spec.md`,同域能力不会散落成多个文件
|
|
327
|
+
- `REJECTED Alternatives` 保留重要取舍,防止未来重蹈覆辙
|
|
328
|
+
|
|
329
|
+
详细格式规范见 [`references/spec-delta-conventions.md`](references/spec-delta-conventions.md)(Scenario 写法、接口契约补充写法、heading 对齐规则)。
|
|
330
|
+
|
|
331
|
+
archive 阶段 `devflow archive` 会自动合入规格真源:workspace 的 `changes/delta/` 与各服务局部 delta 最终合入对应项目仓的 `<repo>/devflow/specs/<域>/spec.md`。`specs/` 不放 workspace;workspace 只保存本次需求过程文件和归档快照。**knowledge deposit 统一写入当前需求 workspace 的 `knowledge/`**,不需要再手动跑。
|
|
332
|
+
|
|
333
|
+
## 硬闸(Done Criteria)
|
|
334
|
+
|
|
335
|
+
| # | 闸门 | L1 | L2 | L3 |
|
|
336
|
+
| --- | --- | --- | --- | --- |
|
|
337
|
+
| 1 | 所有 F-ID 在 §4 有对应改动点 | ✓ | ✓ | ✓ |
|
|
338
|
+
| 2 | 所有契约变更在 §5 有条目 | ✓ | ✓ | ✓ |
|
|
339
|
+
| 3 | DDL 幂等 + 可回滚 | ✓ | ✓ | ✓ |
|
|
340
|
+
| 4 | 关键流程 happy + 1 failure path 画出来 | ✓ | ✓ | ✓ |
|
|
341
|
+
| 5 | ≥1 alternative + trade-off 书面化 | — | ✓ | ≥2 |
|
|
342
|
+
| 6 | 灰度 + 回滚步骤可执行 | 简 | ✓ | ✓ |
|
|
343
|
+
| 7 | §9 至少 1 个关键指标 + 告警阈值 | — | ✓ | ✓ |
|
|
344
|
+
| 8 | 所有实现决策点已收敛,或以 Assumption + Fallback 记录并有测试覆盖 | ✓ | ✓ | ✓ |
|
|
345
|
+
| 9 | 不存在"待用户补充实现细节"类 Open issue | ✓ | ✓ | ✓ |
|
|
346
|
+
| 10 | 契约变化已完成消费者影响矩阵,前端/调用方/轮询页适配方案明确 | ✓ | ✓ | ✓ |
|
|
347
|
+
|
|
348
|
+
未达标 → 继续写;都达标 → 输出 DONE,交给 `plan`(L1) 或 `test-spec`(L2/L3)。
|
|
349
|
+
|
|
350
|
+
## 反模式(高频翻车点)
|
|
351
|
+
|
|
352
|
+
- **"实现时再想"**:design.md 空洞到下游没法拆 plan。打回让 reviewer 把决策点逐条列出来问。
|
|
353
|
+
- **把 requirement 抄一遍当 design**:design 是 HOW,不是 WHAT;如果你在 design 写"用户可以 X"就错了 —— 那是 requirement 的事。
|
|
354
|
+
- **Alternatives 全部写"想过但是放弃了"**:alternatives 要有**具体对比维度**(性能 / 开发量 / 风险),不是装样子。
|
|
355
|
+
- **契约改 breaking 不升版**:改现有接口字段语义 → 必须 v2 或显式 breaking 版本号;否则客户端灾难。
|
|
356
|
+
- **只看提供方不看消费者**:例如 `returnUrl` 不再带参数,却没重设计前端签约轮询页。任何 URL/query/response/status 变化都必须追踪消费者和页面状态来源。
|
|
357
|
+
- **DDL 写成一次性脚本**:必须 `IF NOT EXISTS / IF EXISTS`,否则重跑失败。
|
|
358
|
+
- **没写事务边界**:哪些 步骤在一个事务、哪些是独立事务 / 最终一致,必须画清楚;不写 → apply 阶段临时拍。
|
|
359
|
+
- **把实现细节留给用户补**:如"缓存怎么查 / 渠道怎么判 / 签约码哪里取 / returnUrl 带不带参数"。这些默认由 agent 读代码收敛;只有业务承诺变化才回 requirement-analysis。
|
|
360
|
+
- **灰度写成"先放 1% 再放量"一句话**:具体是按 userId hash?按机房?按版本?多久观测?必须明确。
|
|
361
|
+
- **§10 没有回滚预案**:没回滚 = 不敢上线。
|
|
362
|
+
- **Spec delta 的 heading 自创**:`### <heading>` 必须与 `devflow/specs/<capability>.md` 的既有 heading **逐字对齐**,否则 archive 会冲突。
|
|
363
|
+
|
|
364
|
+
## 完成状态协议
|
|
365
|
+
|
|
366
|
+
```
|
|
367
|
+
---STATUS---
|
|
368
|
+
result: DONE | DONE_WITH_CONCERNS | BLOCKED | NEEDS_INPUT
|
|
369
|
+
outputs:
|
|
370
|
+
- devflow/changes/<slug>/design.md
|
|
371
|
+
- devflow/changes/<slug>/tests.md # 仅 L3 或 --with-tests
|
|
372
|
+
- devflow/changes/<slug>/delta/<capability>.md # 仅 --with-spec 或确认有能力变更
|
|
373
|
+
alternativesConsidered: N
|
|
374
|
+
hasRollbackPlan: true | false
|
|
375
|
+
deltaFiles: ["<capability>.md"] | "none (pure bug-fix, no capability change)"
|
|
376
|
+
nextAction: devflow test-spec (--with-tests/L3) | devflow plan
|
|
377
|
+
---END_STATUS---
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
## 参考
|
|
381
|
+
|
|
382
|
+
- [`references/design-template.md`](references/design-template.md) — 11 段完整模板 + 字段语义 + 正反例 + 完整示例
|
|
383
|
+
- [`references/decision-records.md`](references/decision-records.md) — ADR-lite(Architecture Decision Record)模板与写法
|
|
384
|
+
- [`references/api-contract-design.md`](references/api-contract-design.md) — REST/GraphQL/gRPC/事件契约设计原则 + 版本化策略
|
|
385
|
+
- [`references/transaction-patterns.md`](references/transaction-patterns.md) — 事务 / 并发 / 一致性的决策矩阵与坑
|
|
386
|
+
- [`references/rollout-and-rollback.md`](references/rollout-and-rollback.md) — 灰度 / 回滚 / 双写的完整模板
|
|
387
|
+
- [`references/spec-delta-conventions.md`](references/spec-delta-conventions.md) — OpenSpec delta 标记、heading 对齐、冲突预防
|
|
388
|
+
- [`../code-review/references/language-cheatsheets/`](../code-review/references/language-cheatsheets/) — 按语言挑 1-2 份(与 code-review 共享,避免重复维护)
|