dev-playbooks-cn 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +466 -0
- package/bin/devbooks.js +987 -0
- package/package.json +43 -0
- package/skills/Skills/344/275/277/347/224/250/350/257/264/346/230/216.md +446 -0
- package/skills/Skill/345/274/200/345/217/221/346/214/207/345/215/227.md +248 -0
- package/skills/_shared/context-detection-template.md +315 -0
- package/skills/_shared/mcp-enhancement-template.md +144 -0
- package/skills/_shared/references//351/200/232/347/224/250/345/256/210/351/227/250/345/215/217/350/256/256.md +114 -0
- package/skills/_template/config-discovery-template.md +126 -0
- package/skills/devbooks-brownfield-bootstrap/SKILL.md +167 -0
- package/skills/devbooks-brownfield-bootstrap/references//344/273/243/347/240/201/345/257/274/350/210/252/347/255/226/347/225/245.md +203 -0
- package/skills/devbooks-brownfield-bootstrap/references//345/255/230/351/207/217/351/241/271/347/233/256/345/210/235/345/247/213/345/214/226.md +96 -0
- package/skills/devbooks-brownfield-bootstrap/references//345/255/230/351/207/217/351/241/271/347/233/256/345/210/235/345/247/213/345/214/226/346/217/220/347/244/272/350/257/215.md +115 -0
- package/skills/devbooks-brownfield-bootstrap/references//346/234/257/350/257/255/350/241/250/346/250/241/346/235/277.md +42 -0
- package/skills/devbooks-brownfield-bootstrap/scripts/cod-update.sh +357 -0
- package/skills/devbooks-brownfield-bootstrap/templates/project-profile-template.md +172 -0
- package/skills/devbooks-c4-map/SKILL.md +151 -0
- package/skills/devbooks-c4-map/references/C4/346/236/266/346/236/204/345/234/260/345/233/276/346/217/220/347/244/272/350/257/215.md +33 -0
- package/skills/devbooks-c4-map/references//345/210/206/345/261/202/347/272/246/346/235/237/346/243/200/346/237/245/346/270/205/345/215/225.md +185 -0
- package/skills/devbooks-code-review/SKILL.md +175 -0
- package/skills/devbooks-code-review/references/PR/346/250/241/346/235/277/344/270/216/346/214/207/345/215/227.md +321 -0
- package/skills/devbooks-code-review/references//344/273/243/347/240/201/350/257/204/345/256/241/346/217/220/347/244/272/350/257/215.md +100 -0
- package/skills/devbooks-code-review/references//345/235/217/345/221/263/351/201/223/351/200/237/346/237/245/350/241/250.md +495 -0
- package/skills/devbooks-code-review/references//350/265/204/346/272/220/347/256/241/347/220/206/345/256/241/346/237/245/346/270/205/345/215/225.md +311 -0
- package/skills/devbooks-coder/SKILL.md +219 -0
- package/skills/devbooks-coder/references//344/273/243/347/240/201/345/256/236/347/216/260/346/217/220/347/244/272/350/257/215.md +70 -0
- package/skills/devbooks-coder/references//344/275/216/351/243/216/351/231/251/346/224/271/345/212/250/346/212/200/346/234/257.md +275 -0
- package/skills/devbooks-coder/references//346/227/245/345/277/227/350/247/204/350/214/203.md +329 -0
- package/skills/devbooks-coder/references//347/274/226/347/240/201/351/243/216/346/240/274/347/273/206/345/210/231.md +351 -0
- package/skills/devbooks-coder/references//351/224/231/350/257/257/347/240/201/350/247/204/350/214/203.md +463 -0
- package/skills/devbooks-delivery-workflow/SKILL.md +217 -0
- package/skills/devbooks-delivery-workflow/references//344/272/244/344/273/230/351/252/214/346/224/266/345/267/245/344/275/234/346/265/201.md +256 -0
- package/skills/devbooks-delivery-workflow/references//345/216/237/345/236/213-/347/224/237/344/272/247/345/217/214/350/275/250/346/250/241/345/274/217.md +168 -0
- package/skills/devbooks-delivery-workflow/references//345/217/230/346/233/264/351/252/214/350/257/201/344/270/216/350/277/275/346/272/257/346/250/241/346/235/277.md +133 -0
- package/skills/devbooks-delivery-workflow/scripts/ac-trace-check.sh +330 -0
- package/skills/devbooks-delivery-workflow/scripts/audit-scope.sh +262 -0
- package/skills/devbooks-delivery-workflow/scripts/change-check.sh +1040 -0
- package/skills/devbooks-delivery-workflow/scripts/change-codemod-scaffold.sh +135 -0
- package/skills/devbooks-delivery-workflow/scripts/change-evidence.sh +152 -0
- package/skills/devbooks-delivery-workflow/scripts/change-scaffold.sh +442 -0
- package/skills/devbooks-delivery-workflow/scripts/change-spec-delta-scaffold.sh +136 -0
- package/skills/devbooks-delivery-workflow/scripts/constitution-check.sh +237 -0
- package/skills/devbooks-delivery-workflow/scripts/env-match-check.sh +128 -0
- package/skills/devbooks-delivery-workflow/scripts/fitness-check.sh +387 -0
- package/skills/devbooks-delivery-workflow/scripts/guardrail-check.sh +519 -0
- package/skills/devbooks-delivery-workflow/scripts/handoff-check.sh +141 -0
- package/skills/devbooks-delivery-workflow/scripts/hygiene-check.sh +340 -0
- package/skills/devbooks-delivery-workflow/scripts/migrate-from-openspec.sh +385 -0
- package/skills/devbooks-delivery-workflow/scripts/migrate-to-v2-gates.sh +202 -0
- package/skills/devbooks-delivery-workflow/scripts/progress-dashboard.sh +319 -0
- package/skills/devbooks-delivery-workflow/scripts/prototype-promote.sh +341 -0
- package/skills/devbooks-delivery-workflow/scripts/spec-preview.sh +203 -0
- package/skills/devbooks-delivery-workflow/scripts/spec-promote.sh +118 -0
- package/skills/devbooks-delivery-workflow/scripts/spec-rollback.sh +124 -0
- package/skills/devbooks-delivery-workflow/scripts/spec-stage.sh +117 -0
- package/skills/devbooks-delivery-workflow/scripts/verify-all.sh +78 -0
- package/skills/devbooks-delivery-workflow/scripts/verify-npm-package.sh +123 -0
- package/skills/devbooks-delivery-workflow/scripts/verify-openspec-free.sh +81 -0
- package/skills/devbooks-delivery-workflow/scripts/verify-slash-commands.sh +146 -0
- package/skills/devbooks-delivery-workflow/templates/handoff.md +50 -0
- package/skills/devbooks-design-backport/SKILL.md +73 -0
- package/skills/devbooks-design-backport/references//345/233/236/345/206/231/350/256/276/350/256/241/346/226/207/346/241/243/346/217/220/347/244/272/350/257/215.md +196 -0
- package/skills/devbooks-design-doc/SKILL.md +121 -0
- package/skills/devbooks-design-doc/references//345/276/256/346/234/215/345/212/241/350/256/276/350/256/241/346/270/205/345/215/225.md +149 -0
- package/skills/devbooks-design-doc/references//350/256/276/350/256/241/346/226/207/346/241/243/346/217/220/347/244/272/350/257/215.md +189 -0
- package/skills/devbooks-design-doc/references//351/232/220/347/247/201/345/220/210/350/247/204/346/243/200/346/237/245/346/270/205/345/215/225.md +240 -0
- package/skills/devbooks-entropy-monitor/SKILL.md +188 -0
- package/skills/devbooks-entropy-monitor/references//347/206/265/345/272/246/351/207/217/346/226/271/346/263/225/350/256/272.md +223 -0
- package/skills/devbooks-entropy-monitor/scripts/entropy-measure.sh +449 -0
- package/skills/devbooks-entropy-monitor/scripts/entropy-report.sh +303 -0
- package/skills/devbooks-entropy-monitor/templates/thresholds.json +99 -0
- package/skills/devbooks-federation/SKILL.md +264 -0
- package/skills/devbooks-federation/scripts/federation-check.sh +144 -0
- package/skills/devbooks-federation/templates/federation.yaml +89 -0
- package/skills/devbooks-impact-analysis/SKILL.md +135 -0
- package/skills/devbooks-impact-analysis/references//345/275/261/345/223/215/345/210/206/346/236/220/346/217/220/347/244/272/350/257/215.md +82 -0
- package/skills/devbooks-impact-analysis/scripts/graph-cache.sh +214 -0
- package/skills/devbooks-implementation-plan/SKILL.md +83 -0
- package/skills/devbooks-implementation-plan/references//347/274/226/347/240/201/350/256/241/345/210/222/346/217/220/347/244/272/350/257/215.md +99 -0
- package/skills/devbooks-index-bootstrap/SKILL.md +240 -0
- package/skills/devbooks-proposal-author/SKILL.md +83 -0
- package/skills/devbooks-proposal-author/references//346/217/220/346/241/210/346/222/260/345/206/231/346/217/220/347/244/272/350/257/215.md +66 -0
- package/skills/devbooks-proposal-challenger/SKILL.md +86 -0
- package/skills/devbooks-proposal-challenger/references//344/274/246/347/220/206/344/270/216/345/220/210/350/247/204/346/243/200/346/237/245/346/270/205/345/215/225.md +176 -0
- package/skills/devbooks-proposal-challenger/references//346/217/220/346/241/210/350/264/250/347/226/221/346/217/220/347/244/272/350/257/215.md +57 -0
- package/skills/devbooks-proposal-debate-workflow/SKILL.md +78 -0
- package/skills/devbooks-proposal-debate-workflow/references//346/217/220/346/241/210/345/257/271/350/276/251/345/267/245/344/275/234/346/265/201.md +24 -0
- package/skills/devbooks-proposal-debate-workflow/references//346/217/220/346/241/210/345/257/271/350/276/251/346/250/241/346/235/277.md +35 -0
- package/skills/devbooks-proposal-debate-workflow/scripts/proposal-debate-check.sh +102 -0
- package/skills/devbooks-proposal-judge/SKILL.md +78 -0
- package/skills/devbooks-proposal-judge/references//346/217/220/346/241/210/350/243/201/345/206/263/346/217/220/347/244/272/350/257/215.md +37 -0
- package/skills/devbooks-router/SKILL.md +346 -0
- package/skills/devbooks-spec-contract/SKILL.md +191 -0
- package/skills/devbooks-spec-contract/references/API/350/256/276/350/256/241/346/214/207/345/215/227.md +349 -0
- package/skills/devbooks-spec-contract/references//345/245/221/347/272/246/344/270/216/346/225/260/346/215/256/345/256/232/344/271/211/346/217/220/347/244/272/350/257/215.md +85 -0
- package/skills/devbooks-spec-contract/references//350/247/204/346/240/274/345/217/230/346/233/264/346/217/220/347/244/272/350/257/215.md +63 -0
- package/skills/devbooks-spec-contract/references//351/232/220/345/274/217/345/217/230/346/233/264/346/243/200/346/265/213/346/217/220/347/244/272/350/257/215.md +183 -0
- package/skills/devbooks-spec-contract/scripts/implicit-change-detect.sh +378 -0
- package/skills/devbooks-spec-gardener/SKILL.md +72 -0
- package/skills/devbooks-spec-gardener/references//350/247/204/346/240/274/345/233/255/344/270/201/346/217/220/347/244/272/350/257/215.md +41 -0
- package/skills/devbooks-test-owner/SKILL.md +172 -0
- package/skills/devbooks-test-owner/references//345/217/230/346/233/264/351/252/214/350/257/201/344/270/216/350/277/275/346/272/257/346/250/241/346/235/277.md +228 -0
- package/skills/devbooks-test-owner/references//345/274/202/346/255/245/347/263/273/347/273/237/346/265/213/350/257/225/347/255/226/347/225/245.md +316 -0
- package/skills/devbooks-test-owner/references//346/265/213/350/257/225/344/273/243/347/240/201/346/217/220/347/244/272/350/257/215.md +208 -0
- package/skills/devbooks-test-owner/references//346/265/213/350/257/225/345/210/206/345/261/202/347/255/226/347/225/245.md +281 -0
- package/skills/devbooks-test-owner/references//346/265/213/350/257/225/351/251/261/345/212/250.md +394 -0
- package/skills/devbooks-test-owner/references//350/247/243/344/276/235/350/265/226/346/212/200/346/234/257/351/200/237/346/237/245/350/241/250.md +432 -0
- package/skills/devbooks-test-reviewer/SKILL.md +189 -0
- package/templates/.devbooks/config.yaml +88 -0
- package/templates/claude-commands/devbooks/apply.md +38 -0
- package/templates/claude-commands/devbooks/archive.md +33 -0
- package/templates/claude-commands/devbooks/backport.md +19 -0
- package/templates/claude-commands/devbooks/bootstrap.md +19 -0
- package/templates/claude-commands/devbooks/c4.md +19 -0
- package/templates/claude-commands/devbooks/challenger.md +19 -0
- package/templates/claude-commands/devbooks/code.md +19 -0
- package/templates/claude-commands/devbooks/debate.md +19 -0
- package/templates/claude-commands/devbooks/delivery.md +19 -0
- package/templates/claude-commands/devbooks/design.md +19 -0
- package/templates/claude-commands/devbooks/entropy.md +19 -0
- package/templates/claude-commands/devbooks/federation.md +19 -0
- package/templates/claude-commands/devbooks/gardener.md +19 -0
- package/templates/claude-commands/devbooks/impact.md +19 -0
- package/templates/claude-commands/devbooks/index.md +19 -0
- package/templates/claude-commands/devbooks/judge.md +19 -0
- package/templates/claude-commands/devbooks/plan.md +19 -0
- package/templates/claude-commands/devbooks/proposal.md +19 -0
- package/templates/claude-commands/devbooks/quick.md +42 -0
- package/templates/claude-commands/devbooks/review.md +19 -0
- package/templates/claude-commands/devbooks/router.md +19 -0
- package/templates/claude-commands/devbooks/spec.md +19 -0
- package/templates/claude-commands/devbooks/test-review.md +19 -0
- package/templates/claude-commands/devbooks/test.md +19 -0
- package/templates/dev-playbooks/README.md +458 -0
- package/templates/dev-playbooks/changes/.gitkeep +1 -0
- package/templates/dev-playbooks/constitution.md +116 -0
- package/templates/dev-playbooks/project.md +96 -0
- package/templates/dev-playbooks/scripts/.gitkeep +1 -0
- package/templates/dev-playbooks/specs/_meta/anti-patterns/.gitkeep +2 -0
- package/templates/dev-playbooks/specs/_meta/glossary.md +47 -0
- package/templates/dev-playbooks/specs/_meta/project-profile.md +79 -0
- package/templates/dev-playbooks/specs/architecture/fitness-rules.md +95 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: devbooks-design-doc
|
|
3
|
+
description: devbooks-design-doc:产出变更包的设计文档(design.md),只写 What/Constraints 与 AC-xxx,不写实现步骤。用户说"写设计文档/Design Doc/架构设计/约束/验收标准/AC/C4 Delta"等时使用。
|
|
4
|
+
tools:
|
|
5
|
+
- Glob
|
|
6
|
+
- Grep
|
|
7
|
+
- Read
|
|
8
|
+
- Write
|
|
9
|
+
- Edit
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# DevBooks:设计文档(Design Doc)
|
|
13
|
+
|
|
14
|
+
## 前置:配置发现(协议无关)
|
|
15
|
+
|
|
16
|
+
- `<truth-root>`:当前真理目录根
|
|
17
|
+
- `<change-root>`:变更包目录根
|
|
18
|
+
|
|
19
|
+
执行前**必须**按以下顺序查找配置(找到后停止):
|
|
20
|
+
1. `.devbooks/config.yaml`(如存在)→ 解析并使用其中的映射
|
|
21
|
+
2. `dev-playbooks/project.md`(如存在)→ DevBooks 2.0 协议,使用默认映射
|
|
22
|
+
4. `project.md`(如存在)→ template 协议,使用默认映射
|
|
23
|
+
5. 若仍无法确定 → **停止并询问用户**
|
|
24
|
+
|
|
25
|
+
**关键约束**:
|
|
26
|
+
- 如果配置中指定了 `agents_doc`(规则文档),**必须先阅读该文档**再执行任何操作
|
|
27
|
+
- 禁止猜测目录根
|
|
28
|
+
- 禁止跳过规则文档阅读
|
|
29
|
+
|
|
30
|
+
## 产物落点
|
|
31
|
+
|
|
32
|
+
- 设计文档:`<change-root>/<change-id>/design.md`
|
|
33
|
+
|
|
34
|
+
## 文档影响声明(必填)
|
|
35
|
+
|
|
36
|
+
设计文档中**必须**包含「文档影响」章节,声明本次变更对用户文档的影响。这是确保文档与代码同步的关键机制。
|
|
37
|
+
|
|
38
|
+
### 模板
|
|
39
|
+
|
|
40
|
+
```markdown
|
|
41
|
+
## Documentation Impact(文档影响)
|
|
42
|
+
|
|
43
|
+
### 需要更新的文档
|
|
44
|
+
|
|
45
|
+
| 文档 | 更新原因 | 优先级 |
|
|
46
|
+
|------|----------|--------|
|
|
47
|
+
| README.md | 新增功能 X 需要说明使用方法 | P0 |
|
|
48
|
+
| docs/使用说明书.md | 新增脚本 Y 需要补充用法 | P0 |
|
|
49
|
+
| CHANGELOG.md | 记录本次变更 | P1 |
|
|
50
|
+
|
|
51
|
+
### 无需更新的文档
|
|
52
|
+
|
|
53
|
+
- [ ] 本次变更为内部重构,不影响用户可见功能
|
|
54
|
+
- [ ] 本次变更仅修复 bug,不引入新功能或改变使用方式
|
|
55
|
+
|
|
56
|
+
### 文档更新检查清单
|
|
57
|
+
|
|
58
|
+
- [ ] 新增脚本/命令已在使用文档中说明
|
|
59
|
+
- [ ] 新增配置项已在配置文档中说明
|
|
60
|
+
- [ ] 新增工作流/流程已在指南中说明
|
|
61
|
+
- [ ] API/接口变更已在相关文档中更新
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 触发规则
|
|
65
|
+
|
|
66
|
+
以下变更类型**强制要求**更新对应文档:
|
|
67
|
+
|
|
68
|
+
| 变更类型 | 需更新文档 |
|
|
69
|
+
|----------|------------|
|
|
70
|
+
| 新增脚本(*.sh) | 使用说明、README |
|
|
71
|
+
| 新增 Skill | README、Skills 列表 |
|
|
72
|
+
| 修改工作流程 | 相关指南文档 |
|
|
73
|
+
| 新增配置项 | 配置文档 |
|
|
74
|
+
| 新增命令/CLI 参数 | 使用说明 |
|
|
75
|
+
| 对外 API 变更 | API 文档 |
|
|
76
|
+
|
|
77
|
+
## 执行方式
|
|
78
|
+
|
|
79
|
+
1) 先阅读并遵守:`_shared/references/通用守门协议.md`(可验证性 + 结构质量守门)。
|
|
80
|
+
2) 严格按完整提示词输出:`references/设计文档提示词.md`。
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 上下文感知
|
|
85
|
+
|
|
86
|
+
本 Skill 在执行前自动检测上下文,选择合适的运行模式。
|
|
87
|
+
|
|
88
|
+
检测规则参考:`skills/_shared/context-detection-template.md`
|
|
89
|
+
|
|
90
|
+
### 检测流程
|
|
91
|
+
|
|
92
|
+
1. 检测 `proposal.md` 是否存在(设计文档的输入)
|
|
93
|
+
2. 检测 `design.md` 是否已存在
|
|
94
|
+
3. 若存在,检测完整性(是否有 AC-xxx、是否有 `[TODO]`)
|
|
95
|
+
|
|
96
|
+
### 本 Skill 支持的模式
|
|
97
|
+
|
|
98
|
+
| 模式 | 触发条件 | 行为 |
|
|
99
|
+
|------|----------|------|
|
|
100
|
+
| **新建设计** | `design.md` 不存在 | 创建完整设计文档 |
|
|
101
|
+
| **补充设计** | `design.md` 存在但有 `[TODO]` | 补充缺失章节 |
|
|
102
|
+
| **添加 AC** | 设计存在但 AC 不完整 | 补充验收标准 |
|
|
103
|
+
|
|
104
|
+
### 检测输出示例
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
检测结果:
|
|
108
|
+
- proposal.md:存在
|
|
109
|
+
- design.md:存在,有 5 个 [TODO]
|
|
110
|
+
- AC 数量:8 个
|
|
111
|
+
- 运行模式:补充设计
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## MCP 增强
|
|
117
|
+
|
|
118
|
+
本 Skill 不依赖 MCP 服务,无需运行时检测。
|
|
119
|
+
|
|
120
|
+
MCP 增强规则参考:`skills/_shared/mcp-enhancement-template.md`
|
|
121
|
+
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# 微服务设计清单
|
|
2
|
+
|
|
3
|
+
> 适用场景:设计涉及微服务/分布式架构时,使用本清单检查设计完整性。
|
|
4
|
+
>
|
|
5
|
+
> 本文档为**可选参考**,仅当项目涉及微服务/分布式系统时使用。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1) RPC 位置透明性陷阱(必须检查)
|
|
10
|
+
|
|
11
|
+
**核心原则**:远程调用不等于本地函数调用,不要隐藏复杂度。
|
|
12
|
+
|
|
13
|
+
### 1.1 设计文档必须声明
|
|
14
|
+
|
|
15
|
+
- [ ] **超时策略**:每个 RPC 调用的超时时间(建议 1-5 秒)
|
|
16
|
+
- [ ] **重试策略**:最大重试次数、重试间隔、指数退避
|
|
17
|
+
- [ ] **降级方案**:依赖服务不可用时的行为(返回默认值/缓存/错误码)
|
|
18
|
+
- [ ] **熔断阈值**:失败率达到多少时触发熔断(建议 50%)
|
|
19
|
+
|
|
20
|
+
### 1.2 反模式检查
|
|
21
|
+
|
|
22
|
+
| 反模式 | 问题 | 正确做法 |
|
|
23
|
+
|--------|------|----------|
|
|
24
|
+
| 无超时 RPC | 一个慢服务拖垮整条链路 | 显式设置超时,建议 1-5 秒 |
|
|
25
|
+
| 无限重试 | 重试风暴压垮下游 | 最多 3 次,使用指数退避 |
|
|
26
|
+
| 同步链式调用 | A→B→C→D 延迟叠加 | 异步化或并行调用 |
|
|
27
|
+
| 隐藏远程调用 | 调用方不知道这是网络 IO | 接口名/返回类型体现"可失败" |
|
|
28
|
+
|
|
29
|
+
### 1.3 Test Owner 检查项
|
|
30
|
+
|
|
31
|
+
- [ ] 测试覆盖"依赖服务超时"场景(mock 超时)
|
|
32
|
+
- [ ] 测试覆盖"依赖服务返回错误"场景
|
|
33
|
+
- [ ] 测试覆盖"熔断后的降级行为"
|
|
34
|
+
- [ ] 测试覆盖"重试逻辑"(验证最大重试次数)
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 2) 分布式故障影响评估
|
|
39
|
+
|
|
40
|
+
### 2.1 故障模式清单
|
|
41
|
+
|
|
42
|
+
| 故障类型 | 影响范围 | 检测方式 | 恢复策略 |
|
|
43
|
+
|----------|----------|----------|----------|
|
|
44
|
+
| 网络分区 | 服务 A 无法访问服务 B | 健康检查超时 | 熔断 + 降级 |
|
|
45
|
+
| 节点宕机 | 单节点服务中断 | 心跳检测失败 | 负载均衡切换 |
|
|
46
|
+
| 响应变慢 | 链路延迟增加 | p99 延迟告警 | 限流 + 排队 |
|
|
47
|
+
| 数据不一致 | 多副本数据不同步 | 对账任务 | 重试 + 补偿 |
|
|
48
|
+
|
|
49
|
+
### 2.2 设计文档必须声明
|
|
50
|
+
|
|
51
|
+
- [ ] 本次变更涉及哪些服务间依赖?
|
|
52
|
+
- [ ] 每个依赖的故障影响范围是什么?
|
|
53
|
+
- [ ] 故障时的用户可见行为是什么?
|
|
54
|
+
- [ ] 是否需要补充故障演练(Chaos Engineering)?
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 3) 链路追踪(Distributed Tracing)
|
|
59
|
+
|
|
60
|
+
### 3.1 设计要求
|
|
61
|
+
|
|
62
|
+
- [ ] 所有 RPC 调用必须传递 `trace_id`
|
|
63
|
+
- [ ] 日志必须包含 `trace_id` 字段
|
|
64
|
+
- [ ] 事件/消息必须包含 `trace_id` 字段
|
|
65
|
+
|
|
66
|
+
### 3.2 实现检查
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
请求头传递: X-Trace-Id / X-Request-Id
|
|
70
|
+
日志格式: {"trace_id": "xxx", "message": "...", "timestamp": "..."}
|
|
71
|
+
消息包含: {"trace_id": "xxx", "event_type": "...", "payload": {...}}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 3.3 Test Owner 检查项
|
|
75
|
+
|
|
76
|
+
- [ ] 测试验证"跨服务调用时 trace_id 被正确传递"
|
|
77
|
+
- [ ] 测试验证"日志包含 trace_id 字段"
|
|
78
|
+
- [ ] 测试验证"异常日志可通过 trace_id 追溯到原始请求"
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 4) 服务间契约管理
|
|
83
|
+
|
|
84
|
+
### 4.1 契约定义要求
|
|
85
|
+
|
|
86
|
+
- [ ] 使用 OpenAPI/Proto/AsyncAPI 定义服务契约
|
|
87
|
+
- [ ] 契约文件纳入版本控制
|
|
88
|
+
- [ ] 契约变更需要走兼容性检查
|
|
89
|
+
|
|
90
|
+
### 4.2 契约测试要求
|
|
91
|
+
|
|
92
|
+
- [ ] Provider 侧有契约测试(验证实现符合契约)
|
|
93
|
+
- [ ] Consumer 侧有契约测试(验证消费者假设正确)
|
|
94
|
+
- [ ] 契约变更时双方测试都运行
|
|
95
|
+
|
|
96
|
+
### 4.3 破坏性变更处理
|
|
97
|
+
|
|
98
|
+
- [ ] 禁止直接删除已发布 API
|
|
99
|
+
- [ ] 新版本与旧版本并行至少 2 个发布周期
|
|
100
|
+
- [ ] 提供迁移指南和弃用时间表
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 5) exactly-once 与幂等性
|
|
105
|
+
|
|
106
|
+
### 5.1 消息处理语义选择
|
|
107
|
+
|
|
108
|
+
| 语义 | 适用场景 | 实现复杂度 |
|
|
109
|
+
|------|----------|------------|
|
|
110
|
+
| at-most-once | 日志、监控(允许丢失) | 低 |
|
|
111
|
+
| at-least-once | 通知、统计(允许重复) | 中 |
|
|
112
|
+
| exactly-once | 支付、订单(不允许丢失或重复) | 高 |
|
|
113
|
+
|
|
114
|
+
### 5.2 exactly-once 实现清单
|
|
115
|
+
|
|
116
|
+
- [ ] 消息包含唯一 `message_id`
|
|
117
|
+
- [ ] 消费者记录已处理的 `message_id`(数据库/Redis)
|
|
118
|
+
- [ ] 重复消息直接返回成功(幂等处理)
|
|
119
|
+
- [ ] 测试覆盖"同一消息消费 3 次,只执行 1 次"
|
|
120
|
+
|
|
121
|
+
### 5.3 Test Owner 检查项
|
|
122
|
+
|
|
123
|
+
- [ ] 测试验证"消息重复时不产生重复副作用"
|
|
124
|
+
- [ ] 测试验证"消息丢失时能重试成功"
|
|
125
|
+
- [ ] 测试验证"部分失败时能正确补偿"
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 6) 设计文档模板补充
|
|
130
|
+
|
|
131
|
+
在 `design.md` 的目标架构章节,增加以下小节:
|
|
132
|
+
|
|
133
|
+
```markdown
|
|
134
|
+
### 微服务设计约束(如适用)
|
|
135
|
+
|
|
136
|
+
#### 服务依赖图
|
|
137
|
+
- 本服务 → 依赖服务 A(超时 3s,重试 2 次,降级返回空列表)
|
|
138
|
+
- 本服务 → 依赖服务 B(超时 5s,重试 0 次,降级返回缓存)
|
|
139
|
+
|
|
140
|
+
#### 故障模式与降级
|
|
141
|
+
| 故障场景 | 用户可见行为 | 恢复策略 |
|
|
142
|
+
|----------|--------------|----------|
|
|
143
|
+
| 服务 A 不可用 | 显示"暂无数据" | 熔断 60 秒后重试 |
|
|
144
|
+
| 服务 B 响应慢 | 使用缓存数据 | p99 > 1s 时触发限流 |
|
|
145
|
+
|
|
146
|
+
#### 链路追踪要求
|
|
147
|
+
- 所有 API 必须传递 `X-Trace-Id`
|
|
148
|
+
- 日志格式:JSON,必须包含 `trace_id`
|
|
149
|
+
```
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# 设计文档提示词
|
|
2
|
+
|
|
3
|
+
> **角色设定**:你是软件架构领域的**最强大脑**——融合了 Eric Evans(领域驱动设计)、Martin Fowler(企业架构模式)、Gregor Hohpe(企业集成模式)的智慧。你的设计必须达到这些大师级专家的水准。
|
|
4
|
+
|
|
5
|
+
最高指示(优先级最高):
|
|
6
|
+
- 在执行本提示词前,先阅读 `_shared/references/通用守门协议.md` 并遵循其中所有协议。
|
|
7
|
+
|
|
8
|
+
你是"架构设计负责人(Design Owner)"。你的目标是产出一份可验收、可追溯、可演进的《设计文档(Design Doc)》,作为后续编码计划与验收测试的黄金真理(Golden Truth)。
|
|
9
|
+
|
|
10
|
+
产物落点(目录约定,协议无关):
|
|
11
|
+
- 该设计文档通常作为单次变更包的一部分,推荐保存为:`<change-root>/<change-id>/design.md`
|
|
12
|
+
- “当前系统真理(Current Truth)”由 `<truth-root>/` 维护;本设计文档描述的是“本次变更应达成什么”(并在归档后合并进真理源)
|
|
13
|
+
- 规格条目(Requirements/Scenarios)不在本文件中展开,交由“规格变更提示词”产出 spec delta(避免 What 与 Requirements 互相污染)
|
|
14
|
+
|
|
15
|
+
输入材料(由我提供):
|
|
16
|
+
- 业务/问题背景
|
|
17
|
+
- 现状与约束(如有)
|
|
18
|
+
- 聊天记录
|
|
19
|
+
- 统一语言表(如存在):`<truth-root>/_meta/glossary.md`
|
|
20
|
+
|
|
21
|
+
任务:
|
|
22
|
+
1) 输出设计文档(不是编码计划、不是代码实现)。
|
|
23
|
+
2) 文档必须达到“可驱动验收、可驱动计划拆解”的颗粒度:清晰边界、契约、红线、验收。
|
|
24
|
+
3) 为避免同源谬误:文档只定义 What/Constraints,不写 How/实现步骤。
|
|
25
|
+
|
|
26
|
+
输出格式(建议严格遵循):
|
|
27
|
+
|
|
28
|
+
> **Lost-in-Middle 优化**:关键信息放开头和结尾,AI 对首尾的召回率(~90%)远高于中间(~50-60%)。
|
|
29
|
+
|
|
30
|
+
### 第一部分:关键信息前置(High Attention Zone)
|
|
31
|
+
|
|
32
|
+
1) 标题 + 元信息(版本/状态/更新时间/适用范围/owner/last_verified/freshness_check)
|
|
33
|
+
|
|
34
|
+
2) **⚡ Acceptance Criteria(验收标准,前置!)**:
|
|
35
|
+
- 每条以 "AC-xxx" 编号
|
|
36
|
+
- 每条都要可观察、可验收:明确 Pass/Fail 判据
|
|
37
|
+
- 必须标注验收方式:A(机器裁判)/ B(工具+人签核)/ C(纯人工)
|
|
38
|
+
- **这是本文档最重要的部分,必须放在最前面**
|
|
39
|
+
|
|
40
|
+
3) **⚡ Goals / Non-goals + Red Lines(核心约束,前置!)**:
|
|
41
|
+
- Goals:本次变更要达成什么
|
|
42
|
+
- Non-goals:明确不做什么(Out of Scope)
|
|
43
|
+
- Red Lines:不可破的约束(如:不能破坏向后兼容)
|
|
44
|
+
|
|
45
|
+
4) 执行摘要(目标与核心矛盾,2-3 句话)
|
|
46
|
+
|
|
47
|
+
### 第二部分:背景与设计细节(Lower Attention Zone)
|
|
48
|
+
|
|
49
|
+
5) **Problem Context(问题背景)**:
|
|
50
|
+
- 为什么要解决这个问题?(业务驱动/技术债/用户痛点)
|
|
51
|
+
- 当前系统在哪里产生了摩擦或瓶颈?
|
|
52
|
+
- 若不解决会有什么后果?
|
|
53
|
+
|
|
54
|
+
6) 价值链映射(Goal → 阻碍/杠杆 → 最小方案;若目标不清晰先追问)
|
|
55
|
+
|
|
56
|
+
7) 背景与现状评估(现有资产/主要风险)
|
|
57
|
+
|
|
58
|
+
8) 设计原则(含变化点识别)
|
|
59
|
+
- **必须识别变化点(Variation Points)**:哪些部分最可能变化?如何封装?
|
|
60
|
+
|
|
61
|
+
9) 目标架构(Bounded Context、依赖方向、关键扩展点)
|
|
62
|
+
- **Testability & Seams(可测试性与接缝)**(可选,建议填写):
|
|
63
|
+
- **测试接缝(Seams)**:列出设计中预留的测试切入点
|
|
64
|
+
- 依赖注入点(如:构造器参数、工厂方法)
|
|
65
|
+
- 可替换组件(如:实现了接口的外部服务适配器)
|
|
66
|
+
- 可观察点(如:事件发布、日志钩子)
|
|
67
|
+
- **Pinch Points(汇点)**:预期的高价值测试点
|
|
68
|
+
- 哪些模块/类是多条调用路径的汇聚点?
|
|
69
|
+
- 在这些点写测试可覆盖哪些下游路径?
|
|
70
|
+
- **依赖隔离策略**:
|
|
71
|
+
- 外部依赖(DB/API/第三方)如何隔离?
|
|
72
|
+
- 是否需要 Anti-Corruption Layer?
|
|
73
|
+
- **示例格式**:
|
|
74
|
+
```
|
|
75
|
+
Seams:
|
|
76
|
+
- OrderService 构造器接受 PaymentGatewayInterface(可注入 Mock)
|
|
77
|
+
- EventBus.publish() 可被测试订阅者监听
|
|
78
|
+
|
|
79
|
+
Pinch Points:
|
|
80
|
+
- OrderService.processOrder() - 3 条路径汇聚
|
|
81
|
+
- PaymentGateway.execute() - 2 条路径汇聚
|
|
82
|
+
|
|
83
|
+
依赖隔离:
|
|
84
|
+
- PaymentGateway → 通过接口隔离,测试时用 MockGateway
|
|
85
|
+
- InventoryDB → 通过 Repository 接口隔离
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
10) **领域模型(Domain Model)**:
|
|
89
|
+
- **Data Model**:列出核心数据对象,并明确标注类型:
|
|
90
|
+
- `@Entity`:有唯一标识、可变状态、需要跟踪生命周期的对象(如 Order、Customer)
|
|
91
|
+
- `@ValueObject`:无标识、不可变、描述性的对象(如 Address、Money、DateRange)
|
|
92
|
+
- **Business Rules**:独立列出业务规则(不要混在 AC 或代码注释中)
|
|
93
|
+
- 每条规则有唯一 ID(如 BR-001)
|
|
94
|
+
- 说明触发条件、约束内容、违反时的行为
|
|
95
|
+
- **Invariants(固定规则)**:标注 `[Invariant]`,说明必须始终成立的约束
|
|
96
|
+
- 例如:`[Invariant] 订单总额 = SUM(订单项.金额)`
|
|
97
|
+
- 例如:`[Invariant] 库存数量 >= 0`
|
|
98
|
+
- **Integrations(集成边界)**:若涉及外部系统/API,定义 ACL(Anti-Corruption Layer)
|
|
99
|
+
- 说明外部模型与内部模型的转换点
|
|
100
|
+
- 标注哪些外部变更会被 ACL 隔离
|
|
101
|
+
|
|
102
|
+
11) 核心数据与事件契约(Artifacts、Event Envelope、schema_version、idempotency_key、兼容策略)
|
|
103
|
+
|
|
104
|
+
12) 关键机制(质量闸门/预算化/隔离/回放/审计等)
|
|
105
|
+
|
|
106
|
+
13) 可观测性与验收(Metrics/KPI/SLO)
|
|
107
|
+
|
|
108
|
+
14) 安全、合规与多租户隔离
|
|
109
|
+
|
|
110
|
+
15) 里程碑(设计层面的分阶段交付)
|
|
111
|
+
|
|
112
|
+
16) Deprecation Plan(如有替换/弃用,必须写清标记/警告/移除窗口)
|
|
113
|
+
|
|
114
|
+
17) **Design Rationale(设计决策理由)**(可选,大型重构或架构变更时建议填写):
|
|
115
|
+
- 为什么选择这个方案而非其他备选方案?
|
|
116
|
+
- 主要备选方案及其被否决的原因
|
|
117
|
+
- 关键技术决策及其依据(如:为什么用 Redis 而非 PostgreSQL LISTEN/NOTIFY?)
|
|
118
|
+
|
|
119
|
+
18) **Trade-offs(权衡取舍)**:
|
|
120
|
+
- 本设计放弃了什么?(如:放弃强一致性换取高可用)
|
|
121
|
+
- 接受了哪些已知的不完美?
|
|
122
|
+
- 哪些场景下本设计可能不适用?
|
|
123
|
+
|
|
124
|
+
19) **Technical Debt(技术债务,可选)**:
|
|
125
|
+
- **已知技术债务**:本设计引入或未解决的技术债务
|
|
126
|
+
- 每条债务有唯一 ID(如 TD-001)
|
|
127
|
+
- 说明债务类型(架构债务/代码债务/测试债务/文档债务)
|
|
128
|
+
- 说明产生原因(时间压力/技术限制/权宜之计)
|
|
129
|
+
- 评估影响范围和严重程度(High/Medium/Low)
|
|
130
|
+
- **偿还计划**:何时、如何偿还这些债务
|
|
131
|
+
- 短期可接受的阈值
|
|
132
|
+
- 触发偿还的条件(如:用户量超过 X、性能低于 Y)
|
|
133
|
+
- **示例格式**:
|
|
134
|
+
```
|
|
135
|
+
Technical Debt:
|
|
136
|
+
- TD-001 [Code] 订单服务硬编码了支付超时为30秒
|
|
137
|
+
- 原因:第一阶段快速验证,未抽取配置
|
|
138
|
+
- 影响:Medium - 需要改代码才能调整超时
|
|
139
|
+
- 偿还计划:Phase 2 前移入配置中心
|
|
140
|
+
- TD-002 [Test] 支付回调缺少集成测试
|
|
141
|
+
- 原因:Mock 第三方支付网关复杂度高
|
|
142
|
+
- 影响:High - 回调逻辑变更风险
|
|
143
|
+
- 偿还计划:搭建沙箱环境后补充
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
20) 风险与降级策略(Failure Modes + Degrade Paths)
|
|
147
|
+
|
|
148
|
+
### 第三部分:尾部强化(High Attention Zone)
|
|
149
|
+
|
|
150
|
+
21) **⚡ DoD 完成定义(Definition of Done,尾部强化!)**:
|
|
151
|
+
- 本设计何时算"完成"?
|
|
152
|
+
- 必须通过的闸门清单(tests / lint / build / review)
|
|
153
|
+
- 必须产出的证据(evidence/ 目录内容)
|
|
154
|
+
- 与开头 AC 的交叉引用
|
|
155
|
+
|
|
156
|
+
22) Open Questions(<=3)
|
|
157
|
+
|
|
158
|
+
Acceptance Criteria 写法要求:
|
|
159
|
+
- 每条以 "AC-xxx" 编号
|
|
160
|
+
- 每条都要可观察、可验收:明确 Pass/Fail 判据
|
|
161
|
+
- **非功能需求(NFR)强约束**:
|
|
162
|
+
- **禁止使用模糊形容词**(如"高性能"、"高可用"、"用户友好"、"很快")。
|
|
163
|
+
- **必须转化为可测阈值**(允许使用区间,如 `p99 < 200ms`)或**明确的参照锚点**(如"错误提示组件复用 auth 模块的样式与交互")。
|
|
164
|
+
- **百分位数(Percentile)说明**:
|
|
165
|
+
- `p50`(中位数):50% 的请求在此时间内完成;反映"典型用户"体验
|
|
166
|
+
- `p95`:95% 的请求在此时间内完成;反映"大多数用户"体验
|
|
167
|
+
- `p99`:99% 的请求在此时间内完成;反映"几乎所有用户"体验,暴露长尾延迟
|
|
168
|
+
- `p999`:99.9% 的请求在此时间内完成;用于高 SLA 场景
|
|
169
|
+
- **为什么用百分位数而非平均值**:平均值会被极端值拉偏,掩盖真实用户体验。例如:平均 100ms 可能意味着 99% 用户 50ms,1% 用户 5000ms。
|
|
170
|
+
- **选择建议**:
|
|
171
|
+
- 用户体验类指标:建议用 p95 或 p99
|
|
172
|
+
- SLA/合同约束:建议用 p99 或 p999
|
|
173
|
+
- 内部监控/告警:建议同时监控 p50、p95、p99
|
|
174
|
+
- 必须标注验收方式:
|
|
175
|
+
- A:机器裁判(tests/静态检查/build/smoke)
|
|
176
|
+
- B:工具证据+人签核(看板/报表/日志证据)
|
|
177
|
+
- C:纯人工验收(UX/产品走查)
|
|
178
|
+
- 若不能自动化:写明原因,并给出需要留存的证据类型
|
|
179
|
+
|
|
180
|
+
限制:
|
|
181
|
+
- 不输出实现步骤、PR 切分建议、生产代码具体文件路径与函数体代码
|
|
182
|
+
- 不输出可运行伪代码;如必须描述算法,只写 Inputs/Outputs/Invariants/复杂度上限/降级策略
|
|
183
|
+
|
|
184
|
+
补充要求(用于大型项目的“可追溯性”):
|
|
185
|
+
- 在文档中显式列出本次变更影响的“能力/模块/对外契约”(仅列名称与边界,不写实现)
|
|
186
|
+
- 若涉及对外接口/API/事件/数据结构:必须在“核心数据与事件契约”章节写清楚版本化策略(schema_version、兼容窗口、迁移/回放原则)
|
|
187
|
+
- 若涉及架构边界变化:在“目标架构”章节增加一个 **C4 Delta(可选)** 小节:说明 C1/C2/C3 哪些元素被新增/修改/移除(不要求画完整图;完整图由架构地图维护)
|
|
188
|
+
|
|
189
|
+
现在开始输出该《设计文档》Markdown,不要输出额外解释。
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# Telemetry 隐私合规检查项
|
|
2
|
+
|
|
3
|
+
借鉴 VS Code 的 `telemetry.instructions.md`,本文档定义了埋点/遥测数据的隐私合规要求。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1) GDPR 分类要求
|
|
8
|
+
|
|
9
|
+
当 design.md 或 spec-delta 涉及埋点时,**必须**填写以下字段:
|
|
10
|
+
|
|
11
|
+
```markdown
|
|
12
|
+
## Telemetry / 埋点设计
|
|
13
|
+
|
|
14
|
+
### GDPR Classification
|
|
15
|
+
|
|
16
|
+
| 字段 | 值 | 说明 |
|
|
17
|
+
|------|-----|------|
|
|
18
|
+
| **owner** | @username | 数据所有者(必须是团队成员) |
|
|
19
|
+
| **isMeasurement** | true/false | 是否为度量数据(非 PII) |
|
|
20
|
+
| **purpose** | PerformanceAndHealth / BusinessInsight / FeatureInsight | 收集目的 |
|
|
21
|
+
| **classification** | SystemMetaData / CallstackOrException / EndUserPseudonymizedInformation | 数据类型 |
|
|
22
|
+
| **retention** | 90d / 1y / permanent | 数据保留期限 |
|
|
23
|
+
| **gdprRequired** | true/false | 是否需要用户同意 |
|
|
24
|
+
|
|
25
|
+
### 埋点事件定义
|
|
26
|
+
|
|
27
|
+
| 事件名 | 触发时机 | 数据字段 | 分类 |
|
|
28
|
+
|--------|----------|----------|------|
|
|
29
|
+
| feature.used | 用户使用功能 X 时 | `{ featureId, duration }` | SystemMetaData |
|
|
30
|
+
| error.occurred | 发生异常时 | `{ errorCode, stack }` | CallstackOrException |
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 2) 数据分类说明
|
|
36
|
+
|
|
37
|
+
### SystemMetaData(系统元数据)
|
|
38
|
+
|
|
39
|
+
**定义**:不涉及用户身份的系统信息
|
|
40
|
+
|
|
41
|
+
**允许收集**:
|
|
42
|
+
- 操作系统版本
|
|
43
|
+
- 应用版本
|
|
44
|
+
- 功能开关状态
|
|
45
|
+
- 性能指标(延迟、内存)
|
|
46
|
+
- 匿名的使用频率
|
|
47
|
+
|
|
48
|
+
**示例**:
|
|
49
|
+
```typescript
|
|
50
|
+
// 合规:系统元数据
|
|
51
|
+
telemetry.log('app.startup', {
|
|
52
|
+
version: '1.0.0',
|
|
53
|
+
os: 'darwin',
|
|
54
|
+
memoryUsage: process.memoryUsage().heapUsed,
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### CallstackOrException(调用栈或异常)
|
|
59
|
+
|
|
60
|
+
**定义**:错误信息和调用栈
|
|
61
|
+
|
|
62
|
+
**允许收集**:
|
|
63
|
+
- 错误代码
|
|
64
|
+
- 错误消息(需脱敏)
|
|
65
|
+
- 调用栈(需脱敏文件路径)
|
|
66
|
+
|
|
67
|
+
**脱敏要求**:
|
|
68
|
+
- 移除用户名:`/Users/john/` → `/Users/<username>/`
|
|
69
|
+
- 移除项目路径:`/project/secret/` → `<project>/`
|
|
70
|
+
- 移除敏感文件名:`credentials.json` → `<sensitive>`
|
|
71
|
+
|
|
72
|
+
**示例**:
|
|
73
|
+
```typescript
|
|
74
|
+
// 合规:脱敏后的异常
|
|
75
|
+
telemetry.logError('app.error', {
|
|
76
|
+
errorCode: 'E001',
|
|
77
|
+
message: sanitizeMessage(error.message),
|
|
78
|
+
stack: sanitizeStack(error.stack),
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### EndUserPseudonymizedInformation(终端用户假名化信息)
|
|
83
|
+
|
|
84
|
+
**定义**:经过假名化处理的用户信息
|
|
85
|
+
|
|
86
|
+
**要求**:
|
|
87
|
+
- 必须使用单向哈希
|
|
88
|
+
- 不可逆向还原
|
|
89
|
+
- 需要用户同意
|
|
90
|
+
|
|
91
|
+
**示例**:
|
|
92
|
+
```typescript
|
|
93
|
+
// 合规:假名化用户 ID
|
|
94
|
+
telemetry.log('user.action', {
|
|
95
|
+
hashedUserId: sha256(userId + salt), // 单向哈希
|
|
96
|
+
action: 'click',
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### PublicNonPersonalData(公开非个人数据)
|
|
101
|
+
|
|
102
|
+
**定义**:完全公开、不涉及任何个人信息的数据
|
|
103
|
+
|
|
104
|
+
**允许收集**:
|
|
105
|
+
- 公开的配置选项
|
|
106
|
+
- 公开的 API 版本
|
|
107
|
+
- 公开的功能列表
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 3) 禁止收集的数据
|
|
112
|
+
|
|
113
|
+
| 类型 | 示例 | 原因 |
|
|
114
|
+
|------|------|------|
|
|
115
|
+
| 明文 PII | 姓名、邮箱、电话 | 直接识别用户 |
|
|
116
|
+
| 位置信息 | GPS、IP 地址 | 间接识别用户 |
|
|
117
|
+
| 文件内容 | 用户文档、代码 | 敏感数据 |
|
|
118
|
+
| 密码/令牌 | API keys、密码 | 安全风险 |
|
|
119
|
+
| 健康信息 | 医疗数据 | 敏感数据 |
|
|
120
|
+
| 财务信息 | 银行卡号 | 敏感数据 |
|
|
121
|
+
|
|
122
|
+
**检测规则**:
|
|
123
|
+
```bash
|
|
124
|
+
# 检测可能的 PII 收集
|
|
125
|
+
rg "email|phone|name|address|ip" --type ts -g "*telemetry*"
|
|
126
|
+
rg "password|token|secret|key" --type ts -g "*telemetry*"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 4) 事件命名规范
|
|
132
|
+
|
|
133
|
+
### 常规事件(publicLog2)
|
|
134
|
+
|
|
135
|
+
用于正常的功能使用和性能度量:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
// 命名格式:<domain>.<action>
|
|
139
|
+
publicLog2<{ duration: number }>('editor.opened', { duration: 123 });
|
|
140
|
+
publicLog2<{ count: number }>('search.performed', { count: 10 });
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 异常事件(publicLogError2)
|
|
144
|
+
|
|
145
|
+
用于错误和异常情况:
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
// 命名格式:<domain>.error 或 <domain>.failed
|
|
149
|
+
publicLogError2<{ code: string }>('editor.error', { code: 'E001' });
|
|
150
|
+
publicLogError2<{ reason: string }>('save.failed', { reason: 'disk_full' });
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 5) Code Review 检查清单
|
|
156
|
+
|
|
157
|
+
当审查涉及埋点的代码时:
|
|
158
|
+
|
|
159
|
+
### 必须检查
|
|
160
|
+
|
|
161
|
+
- [ ] **GDPR 分类是否完整?**
|
|
162
|
+
- owner 是否指定?
|
|
163
|
+
- classification 是否正确?
|
|
164
|
+
- purpose 是否明确?
|
|
165
|
+
|
|
166
|
+
- [ ] **数据是否脱敏?**
|
|
167
|
+
- 文件路径是否移除用户名?
|
|
168
|
+
- 错误消息是否过滤敏感信息?
|
|
169
|
+
- 是否存在明文 PII?
|
|
170
|
+
|
|
171
|
+
- [ ] **命名是否规范?**
|
|
172
|
+
- 事件名是否符合 `<domain>.<action>` 格式?
|
|
173
|
+
- 错误事件是否使用 `publicLogError2`?
|
|
174
|
+
|
|
175
|
+
- [ ] **用户同意是否处理?**
|
|
176
|
+
- 需要同意的数据是否检查了 `telemetryLevel`?
|
|
177
|
+
- 是否尊重用户的隐私设置?
|
|
178
|
+
|
|
179
|
+
### 自动化检查
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
# 检查是否有未分类的埋点
|
|
183
|
+
rg "publicLog2|telemetry\.log" --type ts | xargs -I {} grep -L "classification" {}
|
|
184
|
+
|
|
185
|
+
# 检查是否收集敏感数据
|
|
186
|
+
rg "(email|phone|password|token)" --type ts -g "*telemetry*"
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 6) design.md 模板
|
|
192
|
+
|
|
193
|
+
当 design.md 涉及埋点时,添加以下章节:
|
|
194
|
+
|
|
195
|
+
```markdown
|
|
196
|
+
## Telemetry Impact
|
|
197
|
+
|
|
198
|
+
### 新增埋点事件
|
|
199
|
+
|
|
200
|
+
| 事件 | owner | classification | purpose | isMeasurement |
|
|
201
|
+
|------|-------|----------------|---------|---------------|
|
|
202
|
+
| feature.x.used | @alice | SystemMetaData | FeatureInsight | true |
|
|
203
|
+
| feature.x.error | @alice | CallstackOrException | PerformanceAndHealth | false |
|
|
204
|
+
|
|
205
|
+
### 数据字段定义
|
|
206
|
+
|
|
207
|
+
```typescript
|
|
208
|
+
interface FeatureXUsedEvent {
|
|
209
|
+
duration: number; // 使用时长(ms)
|
|
210
|
+
success: boolean; // 是否成功
|
|
211
|
+
// 禁止添加: userId, filePath, etc.
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### 隐私影响评估
|
|
216
|
+
|
|
217
|
+
- [ ] 不收集 PII
|
|
218
|
+
- [ ] 已脱敏敏感路径
|
|
219
|
+
- [ ] 已检查 telemetryLevel 设置
|
|
220
|
+
- [ ] 已获得 Privacy Review(如需要)
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## 7) 合规审批流程
|
|
226
|
+
|
|
227
|
+
| 数据类型 | 审批要求 |
|
|
228
|
+
|----------|----------|
|
|
229
|
+
| SystemMetaData | 无需审批 |
|
|
230
|
+
| CallstackOrException | 无需审批(需脱敏) |
|
|
231
|
+
| EndUserPseudonymizedInformation | 需要 Privacy Review |
|
|
232
|
+
| 任何新的 PII | 需要 Legal Review |
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## 参考资料
|
|
237
|
+
|
|
238
|
+
- [GDPR 数据分类指南](https://gdpr.eu/data-protection/)
|
|
239
|
+
- [VS Code Telemetry 文档](https://code.visualstudio.com/docs/getstarted/telemetry)
|
|
240
|
+
- [Microsoft Privacy Statement](https://privacy.microsoft.com/)
|