@prd-improve/cli 1.1.1 → 1.6.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/dist/changelog.d.ts +13 -7
- package/dist/changelog.js +12 -15
- package/dist/changelog.js.map +1 -1
- package/dist/cli.js +55 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/_prdSource.d.ts +35 -0
- package/dist/commands/_prdSource.js +110 -0
- package/dist/commands/_prdSource.js.map +1 -0
- package/dist/commands/closeout.d.ts +9 -0
- package/dist/commands/closeout.js +293 -0
- package/dist/commands/closeout.js.map +1 -0
- package/dist/commands/context.js +11 -117
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/export.d.ts +8 -0
- package/dist/commands/export.js +179 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/freeze.d.ts +23 -0
- package/dist/commands/freeze.js +125 -32
- package/dist/commands/freeze.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +7 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate-yaml.js +94 -46
- package/dist/commands/migrate-yaml.js.map +1 -1
- package/dist/commands/reopen.d.ts +4 -0
- package/dist/commands/reopen.js +76 -0
- package/dist/commands/reopen.js.map +1 -0
- package/dist/commands/resolve.d.ts +8 -0
- package/dist/commands/resolve.js +127 -0
- package/dist/commands/resolve.js.map +1 -0
- package/dist/commands/skill.d.ts +4 -0
- package/dist/commands/skill.js +16 -1
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.js +4 -2
- package/dist/commands/validate.js.map +1 -1
- package/dist/i18n/en.js +71 -6
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/help.en.d.ts +30 -0
- package/dist/i18n/help.en.js +32 -2
- package/dist/i18n/help.en.js.map +1 -1
- package/dist/i18n/help.zh.d.ts +30 -0
- package/dist/i18n/help.zh.js +32 -2
- package/dist/i18n/help.zh.js.map +1 -1
- package/dist/i18n/helpGroups.js +1 -1
- package/dist/i18n/helpGroups.js.map +1 -1
- package/dist/i18n/peekLang.d.ts +1 -0
- package/dist/i18n/peekLang.js +19 -0
- package/dist/i18n/peekLang.js.map +1 -1
- package/dist/i18n/zh.d.ts +161 -1
- package/dist/i18n/zh.js +71 -6
- package/dist/i18n/zh.js.map +1 -1
- package/dist/renderer/context-md.d.ts +13 -2
- package/dist/renderer/context-md.js +12 -12
- package/dist/renderer/context-md.js.map +1 -1
- package/dist/renderer/spec-md.d.ts +19 -0
- package/dist/renderer/spec-md.js +206 -0
- package/dist/renderer/spec-md.js.map +1 -0
- package/dist/schema/modules.d.ts +37 -5
- package/dist/schema/modules.js +14 -1
- package/dist/schema/modules.js.map +1 -1
- package/dist/schema/prd.d.ts +93 -17
- package/dist/schema/prd.js +51 -7
- package/dist/schema/prd.js.map +1 -1
- package/dist/skill/prd-improve-forge/SKILL.md +150 -10
- package/dist/skill/prd-improve-forge/checklists/batch-import.md +2 -1
- package/dist/skill/prd-improve-forge/checklists/dimensions/integration-seam.md +131 -0
- package/dist/skill/prd-improve-forge/checklists/dimensions/state-machine-counter.md +130 -0
- package/dist/skill/prd-improve-forge/examples/import-history-prds.prd.yaml +10 -5
- package/dist/skill/prd-improve-forge/templates/prd.yaml +25 -9
- package/dist/validators/blocking.js +15 -12
- package/dist/validators/blocking.js.map +1 -1
- package/dist/validators/references.js +9 -0
- package/dist/validators/references.js.map +1 -1
- package/dist/validators/runner.js +2 -2
- package/dist/validators/runner.js.map +1 -1
- package/dist/workspace.d.ts +12 -1
- package/dist/workspace.js +12 -1
- package/dist/workspace.js.map +1 -1
- package/dist/yamlPatch.d.ts +16 -0
- package/dist/yamlPatch.js +50 -0
- package/dist/yamlPatch.js.map +1 -0
- package/package.json +1 -1
package/dist/schema/prd.js
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { metaSchema, backgroundAndGoalsSchema, userRoleSchema, inScopeItemSchema, outOfScopeItemSchema, entitySchema, mainFlowStepSchema, statePermissionSchema, businessRuleSchema, scenarioSchema, edgeCaseSchema, uiPageSchema, dataAndApiSchema, acceptanceCriterionSchema, openQuestionSchema, slugPattern, } from "./modules.js";
|
|
2
|
+
import { metaSchema, backgroundAndGoalsSchema, userRoleSchema, inScopeItemSchema, outOfScopeItemSchema, entitySchema, mainFlowStepSchema, statePermissionSchema, businessRuleSchema, scenarioSchema, edgeCaseSchema, uiPageSchema, dataAndApiSchema, acceptanceCriterionSchema, openQuestionSchema, asBuiltDeviationSchema, slugPattern, } from "./modules.js";
|
|
3
3
|
/**
|
|
4
|
-
* 当前 schema 版本(
|
|
5
|
-
* 仍接受 v0.1
|
|
4
|
+
* 当前 schema 版本(v0.3 起支持 lifecycle shipped 枚举 + open_questions resolution + as_built 模块)。
|
|
5
|
+
* 仍接受 v0.1 / v0.2 以支持存量 yaml 向后兼容(spec §3.2 backward compat)。
|
|
6
|
+
* v0.2 起强制 meta.team / project / feature 三 slug;v0.1 豁免。
|
|
6
7
|
*/
|
|
7
|
-
export const SCHEMA_VERSION_CURRENT = "v0.
|
|
8
|
+
export const SCHEMA_VERSION_CURRENT = "v0.3";
|
|
9
|
+
export const SCHEMA_VERSION_V02 = "v0.2";
|
|
8
10
|
export const SCHEMA_VERSION_LEGACY = "v0.1";
|
|
11
|
+
/** validate / runner 共用的版本白名单单一真相源(v1.21 I1:根治字面 drift)。 */
|
|
12
|
+
export const SCHEMA_VERSIONS_ACCEPTED = [SCHEMA_VERSION_LEGACY, SCHEMA_VERSION_V02, SCHEMA_VERSION_CURRENT];
|
|
9
13
|
export const PrdSchema = z
|
|
10
14
|
.object({
|
|
11
|
-
schema_version: z.enum(
|
|
15
|
+
schema_version: z.enum(SCHEMA_VERSIONS_ACCEPTED),
|
|
12
16
|
meta: metaSchema,
|
|
13
17
|
background_and_goals: backgroundAndGoalsSchema,
|
|
14
18
|
users_and_roles: z.array(userRoleSchema),
|
|
@@ -24,11 +28,36 @@ export const PrdSchema = z
|
|
|
24
28
|
data_and_api: dataAndApiSchema,
|
|
25
29
|
acceptance_criteria: z.array(acceptanceCriterionSchema),
|
|
26
30
|
open_questions: z.array(openQuestionSchema),
|
|
31
|
+
as_built: z.array(asBuiltDeviationSchema).optional(),
|
|
27
32
|
})
|
|
28
33
|
.strict()
|
|
29
34
|
.superRefine((doc, ctx) => {
|
|
30
|
-
|
|
31
|
-
|
|
35
|
+
const ver = doc.schema_version;
|
|
36
|
+
// === 1. v0.3-only 字段/枚举值降级门(v0.1 / v0.2 文件带 v0.3 内容 → 引导 migrate) ===
|
|
37
|
+
if (ver !== SCHEMA_VERSION_CURRENT) {
|
|
38
|
+
const offend = (path) => ctx.addIssue({
|
|
39
|
+
code: z.ZodIssueCode.custom,
|
|
40
|
+
path,
|
|
41
|
+
message: `该字段/值属于 schema v0.3,当前文件是 ${ver}。请先运行 prd migrate-yaml 升级`,
|
|
42
|
+
});
|
|
43
|
+
if (doc.as_built !== undefined)
|
|
44
|
+
offend(["as_built"]);
|
|
45
|
+
const lc = doc.meta.lifecycle;
|
|
46
|
+
if (lc.shipped_at !== undefined)
|
|
47
|
+
offend(["meta", "lifecycle", "shipped_at"]);
|
|
48
|
+
if (lc.landed_commit !== undefined)
|
|
49
|
+
offend(["meta", "lifecycle", "landed_commit"]);
|
|
50
|
+
if (lc.status === "shipped")
|
|
51
|
+
offend(["meta", "lifecycle", "status"]);
|
|
52
|
+
doc.open_questions.forEach((q, i) => {
|
|
53
|
+
if (q.resolution !== undefined)
|
|
54
|
+
offend(["open_questions", i, "resolution"]);
|
|
55
|
+
if (q.resolved_at !== undefined)
|
|
56
|
+
offend(["open_questions", i, "resolved_at"]);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// === 2. slug 三件套强制(v0.2 与 v0.3 同强度;v0.1 legacy 豁免) ===
|
|
60
|
+
if (ver === SCHEMA_VERSION_LEGACY)
|
|
32
61
|
return;
|
|
33
62
|
const meta = doc.meta;
|
|
34
63
|
// team 必填 + 必须是 slug
|
|
@@ -61,5 +90,20 @@ export const PrdSchema = z
|
|
|
61
90
|
message: "meta.feature 必须 kebab-case slug:首字母 a-z,只含 a-z 0-9 -,长度 2-64",
|
|
62
91
|
});
|
|
63
92
|
}
|
|
93
|
+
// === v1.23 S1:交付字段矛盾态门(shipped_at/landed_commit 是 shipped 的伴生字段) ===
|
|
94
|
+
if (ver === SCHEMA_VERSION_CURRENT) {
|
|
95
|
+
const lc = doc.meta?.lifecycle;
|
|
96
|
+
if (lc && lc.status !== "shipped") {
|
|
97
|
+
for (const f of ["shipped_at", "landed_commit"]) {
|
|
98
|
+
if (typeof lc[f] === "string" && lc[f].trim() !== "") {
|
|
99
|
+
ctx.addIssue({
|
|
100
|
+
code: z.ZodIssueCode.custom,
|
|
101
|
+
path: ["meta", "lifecycle", f],
|
|
102
|
+
message: `lifecycle.status 为 ${lc.status ?? "(missing)"} 时不应存在 ${f}(交付字段仅伴随 shipped;reopen 会自动清除)`,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
64
108
|
});
|
|
65
109
|
//# sourceMappingURL=prd.js.map
|
package/dist/schema/prd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/schema/prd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,UAAU,EACV,wBAAwB,EACxB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,yBAAyB,EACzB,kBAAkB,EAClB,WAAW,GACZ,MAAM,cAAc,CAAC;AAEtB
|
|
1
|
+
{"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/schema/prd.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: prd-improve-forge
|
|
3
|
-
description: Use when the user wants to write, refine, or structure a PRD for a specific feature — turning vague ideas, meeting notes, chat snippets, or legacy docs into a complete, edge-case-specified requirements spec. Unlike generic PRD helpers, it drives multi-round boundary questioning (P0/P1/P2 priorities) through feature-type checklists and produces a structured YAML spec, not free-form Markdown. Triggers on phrases like '写 PRD'、'整理需求'、'规范化需求'、'把 X 整理成 PRD'、'梳理功能边界'、'会议纪要整理成需求'、'聊天记录整理成 PRD'、'把这个想法变成规格'、'帮我做需求规格化' or English equivalents. Also handles refresh mode — updating an existing PRD against a new or changed PRD version — triggered by '同步新版 PRD'、'重新 sync'、'基于新版 PRD 更新'、'PRD 改了'、'PRD 升级了'、'feature 升级'、'对齐 PRD'、'incorporate PRD changes' or equivalents. DO NOT trigger for: (a) general product strategy / OKR / roadmap discussion with no specific feature scope; (b) writing code, implementation, architecture, or technical design docs; (c) editing a single field of an already-finalized PRD; (d) high-level vision documents or pitch decks; (e) a near-total rewrite of an existing PRD (start a fresh PRD instead).
|
|
3
|
+
description: Use when the user wants to write, refine, or structure a PRD for a specific feature — turning vague ideas, meeting notes, chat snippets, or legacy docs into a complete, edge-case-specified requirements spec. Unlike generic PRD helpers, it drives multi-round boundary questioning (P0/P1/P2 priorities) through feature-type checklists and produces a structured YAML spec, not free-form Markdown. Triggers on phrases like '写 PRD'、'整理需求'、'规范化需求'、'把 X 整理成 PRD'、'梳理功能边界'、'会议纪要整理成需求'、'聊天记录整理成 PRD'、'把这个想法变成规格'、'帮我做需求规格化' or English equivalents. Also handles refresh mode — updating an existing PRD against a new or changed PRD version — triggered by '同步新版 PRD'、'重新 sync'、'基于新版 PRD 更新'、'PRD 改了'、'PRD 升级了'、'feature 升级'、'对齐 PRD'、'incorporate PRD changes' or equivalents. Also handles closeout mode — closing out a delivered feature's PRD (backfilling open-question resolutions, recording as-built deviations, marking it shipped) — triggered by '收尾'、'交付收口'、'closeout'、'上线了把 PRD 收口'、'把这个 feature 收口'、'标记 shipped' or English equivalents ('close out the PRD', 'mark it shipped', 'post-delivery wrap-up'). DO NOT trigger for: (a) general product strategy / OKR / roadmap discussion with no specific feature scope; (b) writing code, implementation, architecture, or technical design docs; (c) editing a single field of an already-finalized PRD; (d) high-level vision documents or pitch decks; (e) a near-total rewrite of an existing PRD (start a fresh PRD instead).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# PRD Improve Forge
|
|
7
7
|
|
|
8
8
|
把一个功能从**模糊想法**推进到**可开发、可测试、可追溯**的结构化 PRD。
|
|
9
|
-
产出文件符合 PRD Improve schema v0.
|
|
9
|
+
产出文件符合 PRD Improve schema v0.3,可直接被 `prd validate` / `prd freeze` / `prd context` 等 CLI 命令消费。
|
|
10
10
|
|
|
11
11
|
## 适用与不适用
|
|
12
12
|
|
|
@@ -30,6 +30,8 @@ description: Use when the user wants to write, refine, or structure a PRD for a
|
|
|
30
30
|
|
|
31
31
|
按以下顺序判定:
|
|
32
32
|
|
|
33
|
+
0. **触发词 ∈ closeout 集合 + `working/prd.yaml` 存在且 frozen/ 下 ≥1 版** → closeout 模式 → 跳第 8 步
|
|
34
|
+
(working 不存在或从未 frozen → 告知用户「该 feature 还没有可收口的 PRD」,转白板/正常流程)
|
|
33
35
|
1. **触发词 ∈ refresh 集合 + `working/prd.yaml` 存在** → refresh 模式 → 跳第 7 步
|
|
34
36
|
2. **触发词 ∈ refresh 集合 + `working/prd.yaml` 不存在** →
|
|
35
37
|
询问用户「未找到现有 yaml,确认要走白板模式从 0 生成吗?」
|
|
@@ -55,7 +57,9 @@ description: Use when the user wants to write, refine, or structure a PRD for a
|
|
|
55
57
|
| 单字段修订(只改 owner / 改 AC-7) | 直接 edit yaml 或用 `prd` CLI |
|
|
56
58
|
| 现有 yaml 不存在 | fallback 白板 + 明确告知 |
|
|
57
59
|
|
|
58
|
-
|
|
60
|
+
**closeout 触发词集合**:"收尾" / "交付收口" / "closeout" / "上线了把 PRD 收口" / "把 X 收口" / "标记 shipped" / "close out" / "mark shipped" / "post-delivery wrap-up"
|
|
61
|
+
|
|
62
|
+
#### 1.2a (白板模式)识别功能主类型
|
|
59
63
|
|
|
60
64
|
从用户输入中提取特征,判定功能类型并决定加载哪份 checklist:
|
|
61
65
|
|
|
@@ -68,12 +72,47 @@ description: Use when the user wants to write, refine, or structure a PRD for a
|
|
|
68
72
|
|
|
69
73
|
若识别不出或跨多类型 → 仅依赖模板自身的 [必填] 字段驱动追问,并在 open_questions 加一条"功能类型不明,可能需要定制 checklist"。
|
|
70
74
|
|
|
75
|
+
#### 1.2b (白板模式)识别正交维度
|
|
76
|
+
|
|
77
|
+
在 1.2a 之外,再扫描一遍「横切关注点」信号,**可命中 0-N 个维度**,与功能类型独立叠加:
|
|
78
|
+
|
|
79
|
+
| 信号关键词 / 场景 | 维度 | checklist 文件 |
|
|
80
|
+
|---|---|---|
|
|
81
|
+
| 外部 API / 第三方 / 调另一(微)服务 / SDK / webhook / 回调 / 消息队列 / 异步任务 / 超时 / 重试 / 降级 / 兜底 / 离线 / 网络异常 | 集成接缝 | `checklists/dimensions/integration-seam.md` |
|
|
82
|
+
| 计数器 / 次数 / 重试上限 / 配额 / 额度 / 剩余次数 / 状态切换 / 开关 / 生命周期 / 状态机 / 流转 / 耗尽 / 达上限 / 锁定 / 冷却 / 倒计时 | 状态机·计数器 | `checklists/dimensions/state-machine-counter.md` |
|
|
83
|
+
|
|
84
|
+
- 维度与功能类型**正交**:一个 batch-import 也可能同时命中集成接缝,两类清单叠加加载。
|
|
85
|
+
- 与 1.2a 不同,**维度识别不出就不挂载**(不兜底、不强加 open_question),宁缺毋滥。
|
|
86
|
+
- 命中多个维度时,各自的「精选 P0」按 §1.2b 表自上而下顺序追加。
|
|
87
|
+
|
|
88
|
+
#### 1.3 (白板模式)体量分流:全量 vs 轻模式
|
|
89
|
+
|
|
90
|
+
判定本次是否走**轻模式**(只问核心段,跳过结构性模块):
|
|
91
|
+
|
|
92
|
+
**轻模式判据**(任两项命中即建议,由用户一票确认/否决):
|
|
93
|
+
- 预计验收标准 ≤ 8 条
|
|
94
|
+
- 单页交互或无 UI
|
|
95
|
+
- 不引入新实体(纯行为 / 展示 / 文案改动)
|
|
96
|
+
- 用户明示「小功能 / 快速过 / 别整太重」
|
|
97
|
+
|
|
98
|
+
命中 → 向用户确认:「这个 feature 体量不大,建议走轻模式:只问核心边界(目标 / 范围 / 验收 / 待定问题),跳过实体、状态机、业务规则等结构段,需要时随时补。可以吗?」
|
|
99
|
+
|
|
100
|
+
**轻模式执行差异**(全量模式不变):
|
|
101
|
+
- **第 3 步追问**:只走 P0,1-2 轮、≤ 10 题封顶;checklist 仍加载但只取 P0 行
|
|
102
|
+
- 命中的正交维度仍贡献其「精选 P0」(轻模式最不该跳的高 ROI 边界),但纳入 ≤10 题总封顶统一计数(精选 P0 优先于 feature-type 的非 Top 行)
|
|
103
|
+
- **第 4 步填充**:核心段 = `meta / background_and_goals / users_and_roles(可单条)/ in_scope / out_of_scope / acceptance_criteria / open_questions`;其余 7 模块(`entities / main_flow / state_permissions / business_rules / scenarios / edge_cases / ui_interaction`)写**显式空数组** `[]`,`data_and_api` 四子数组留空。在第一个空模块上方加一行注释 `# lite 模式略过,需要时可后补`(只加一次,不逐模块重复)
|
|
104
|
+
- **命中维度的硬约束落点**:第 3 步精选 P0 若问出硬约束(计数器上限 / 接缝失败行为 / 超时阈值等),落到 `acceptance_criteria`(可验收条款)或 `open_questions`(未定项),**不因 business_rules / edge_cases / data_and_api 在轻模式为空而丢弃**;若注入后 AC 将 > 8 条(即下方「中途升级」同一阈值)→ 转全量补 business_rules / edge_cases
|
|
105
|
+
- **收尾知会**:明示「轻模式产物,prd validate 可过(out_of_scope 为空仅 warning);后续 feature 长大可随时全量补段」
|
|
106
|
+
|
|
107
|
+
**中途升级**:问询中发现判据失效(冒出新实体 / 验收膨胀到 >8)→ 明示转全量,补问对应结构段。轻模式与 1.2a 末「类型不明」分支正交,可叠加。
|
|
108
|
+
|
|
71
109
|
### 第 2 步:强制加载资源
|
|
72
110
|
|
|
73
111
|
**必须读完以下三份文件再开始追问:**
|
|
74
112
|
|
|
75
113
|
1. `templates/prd.yaml` — 骨架结构、字段定义、标记约定
|
|
76
114
|
2. `checklists/<type>.md` — 该类型功能的边界追问清单
|
|
115
|
+
- 命中的每个正交维度:额外加载 `checklists/dimensions/<dim>.md`(相对路径同 feature-type 清单)
|
|
77
116
|
3. `examples/import-history-prds.prd.yaml` — 金标准范例(仅参考结构,**不照抄具体值**)
|
|
78
117
|
|
|
79
118
|
**资源定位协议(跨平台路径自适应,按顺序尝试):**
|
|
@@ -115,10 +154,13 @@ description: Use when the user wants to write, refine, or structure a PRD for a
|
|
|
115
154
|
- 有选项的题给选项(`A / B / C / D / 其他`),不要开放题
|
|
116
155
|
- 每轮结束做"已确认的关键决策"摘要,让用户确认或修正
|
|
117
156
|
- 用户说"够了"或"直接生成"即停止,未答问题进 `open_questions`
|
|
157
|
+
- **正交维度的精选 P0 注入**:dimension 清单挂载时,**只把它的「精选 P0」(≤3 题)注入当轮追问**;其余 P0/P1/P2 降为「可选补问」——仅当用户对该维度深入、或精选 P0 回答暴露更多边界时才展开。feature-type 清单仍走全量 P0。
|
|
158
|
+
- **多维度重叠去重**:多维度命中时各取精选 P0 顺序追加;若与 feature-type 的 P0 语义重叠,保留 feature-type 版本,维度版跳过避免重复问。
|
|
159
|
+
- **AC priority 按测试赋值**:收集到验收标准时,按规则 9 的 launch-blocker 测试逐条定 must / should / could,**不要默认 must**;可顺带问「这条不达标会不会拦住上线?」帮 PM 自己分级。
|
|
118
160
|
|
|
119
161
|
**追问数量与优先级**(优先级冲突时按以下顺序让步):
|
|
120
162
|
|
|
121
|
-
1. **P0 必须问完**(checklist 中所有 P0,通常 5-10 题,跨 1-2 轮) — 不可裁剪,P0 未答完不进 P1
|
|
163
|
+
1. **P0 必须问完**(feature-type checklist 中所有 P0,通常 5-10 题,跨 1-2 轮) — 不可裁剪,P0 未答完不进 P1;**正交维度只注入其精选 P0(≤3),见上「正交维度的精选 P0 注入」,不适用本条**
|
|
122
164
|
2. **P1 按预算挑选**(剩余轮次内挑 6-10 题最相关的) — 用户表现配合就多问,显疲态就跳过
|
|
123
165
|
3. **P2 仅当用户积极时问**(2-3 题点缀)— 用户说"够了"立即停止,P2 未答的全进 `open_questions` 标 `non_blocking`
|
|
124
166
|
|
|
@@ -137,6 +179,7 @@ description: Use when the user wants to write, refine, or structure a PRD for a
|
|
|
137
179
|
- **可删**:完成填写后的 `[必填] / [选填] / [PM 填] / [CLI 管] / [机器读]` 任务标记注释(这些是给写作者看的脚手架,定稿后无信息量)
|
|
138
180
|
- 长文本用 YAML block style `|`(如 `background`、大段 `rule`)
|
|
139
181
|
- ID 前缀严格遵守:EN / S / R / SC / E / UI / AC / Q / DC / API / PC / SEC
|
|
182
|
+
- **填完 `acceptance_criteria` 做规则 9 的 calibration 复盘**:自算 must / should / could 分布,must 占压倒比例时逐条用 launch-blocker 测试复核并向 PM 提降级建议(不擅改)。
|
|
140
183
|
|
|
141
184
|
**具体决策值必须来自用户**。用户没说的,放进 `open_questions`,不要代为决策。
|
|
142
185
|
|
|
@@ -158,9 +201,10 @@ description: Use when the user wants to write, refine, or structure a PRD for a
|
|
|
158
201
|
生成完毕后告诉用户:
|
|
159
202
|
|
|
160
203
|
1. 文件路径
|
|
161
|
-
2. 模块规模(各段填了多少条)
|
|
204
|
+
2. 模块规模(各段填了多少条);**AC priority 分布(N must / M should / K could)**——若 must 占压倒比例且未复盘,提示 PM 按 launch-blocker 测试(规则 9)再过一遍
|
|
162
205
|
3. blocking 级 open_questions 的数量和清单
|
|
163
206
|
4. 建议下一步:回答 blocking → `prd validate` → `prd freeze`
|
|
207
|
+
5. 若下游走 superpowers 执行链:freeze 后用 `prd export <slug> --out docs/specs/YYYY-MM-DD-<slug>-design.md` 生成 spec 骨架(需求段自动填好,只需续写方案评估 / 架构 / 验证清单等工程段),续写完进 writing-plans;之后需求若变更,先改 prd.yaml 再 `prd export <slug> --out <同路径> --force` 重导(会覆盖,注意保留人工续写段)
|
|
164
208
|
|
|
165
209
|
### 第 7 步:refresh 工作流
|
|
166
210
|
|
|
@@ -256,7 +300,60 @@ AI 在 7.4 完成后,**必须输出**:
|
|
|
256
300
|
|
|
257
301
|
---
|
|
258
302
|
|
|
259
|
-
|
|
303
|
+
### 第 8 步:closeout 工作流(交付收尾)
|
|
304
|
+
|
|
305
|
+
#### 8.0 前置检查
|
|
306
|
+
- `.prd/features/<slug>/working/prd.yaml` 存在且 frozen/ 下 ≥1 版,否则转出
|
|
307
|
+
- schema_version 是 v0.3?不是 → 先引导 `prd migrate-yaml <slug>`(v0.2→v0.3 是离线纯版本号变更)
|
|
308
|
+
- 定位落地 merge commit:问用户;用户不确定时从 `git log --oneline --merges -10` 提候选给用户挑
|
|
309
|
+
|
|
310
|
+
#### 8.1 决议提取(证据源分级降级,不依赖特定工作流习惯)
|
|
311
|
+
为每条 open_question 起草 resolution 草稿,注明来源指针。证据源按优先级:
|
|
312
|
+
1. dev-log(若用户有该习惯)— 最优,含决策叙事
|
|
313
|
+
2. git 考古 — commit message + frozen 版至落地 commit 的代码 diff
|
|
314
|
+
3. 当前会话上下文 — closeout 紧跟实施时
|
|
315
|
+
4. 全部缺位 → 退化为纯逐条问询:AI 只当记录员,逐条念 Q 问用户
|
|
316
|
+
起草不出的标"未找到决议"。as-built 核对(8.3)同此分级。
|
|
317
|
+
- **跨 feature 核查**:检查该 Q 是否已被**后续 feature** 解决(线索:同仓后续 PRD 的 resolution/正文、dev-log 中后续批次记录)——单 feature 证据流程不保证发现,批量收口时由编排者在各 agent prompt 里显式喂线索
|
|
318
|
+
|
|
319
|
+
#### 8.2 PM 逐条拍板(复用 7.5 范式)
|
|
320
|
+
每条 Q:**采纳草稿 / 改写 / 显式 carry-over(填 deferred_to)**。
|
|
321
|
+
拍板后逐条执行 `prd resolve <slug> <qid> --text "<决议>"`(已决)或 `prd resolve <slug> <qid> --defer "<去向>"`(carry-over)。CLI 自动写 resolved_at、保注释、长文本块标量;改判已决的加 `--force`。**不要手编 yaml**(CLI 不可用时才降级行级编辑,注意块标量缩进与防重跑)。
|
|
322
|
+
- 无论哪种,拍板即写 `resolved_at: "<今天 YYYY-MM-DD>"`(CLI 门禁的收口痕迹要求)
|
|
323
|
+
- 判定口径:resolution 非空 ⇒ 已决(起草期残留的 deferred_to 占位可保留,CLI 按此口径忽略);resolution 空 + deferred_to 非空 ⇒ carry-over
|
|
324
|
+
- carry-over 必须是 PM 显式决定,不可拿起草期 deferred_to 占位充数
|
|
325
|
+
|
|
326
|
+
#### 8.3 as-built 偏差核对
|
|
327
|
+
AI 先按 8.1 证据源自查偏差候选(实施与 AC/R 条款不一致处),逐条过用户,确认后写顶层 `as_built` 区:
|
|
328
|
+
|
|
329
|
+
as_built:
|
|
330
|
+
- id: "AB-1"
|
|
331
|
+
deviates_from: "AC-3" # 被偏离的条款 ID(引用校验会查存在性)
|
|
332
|
+
actual: "一句话竣工实况"
|
|
333
|
+
evidence: "dev-log/2026-06-09-xxx.md" # 建议仓库相对路径(可移植)
|
|
334
|
+
|
|
335
|
+
PRD 正文条款**不改**(设计决策史保留)——as_built 是竣工误差表,不是校对版。
|
|
336
|
+
|
|
337
|
+
#### 8.4 CHANGELOG
|
|
338
|
+
working/CHANGELOG.md 不存在 → 先创建(`# Changelog` + `## [Unreleased]` 骨架)。
|
|
339
|
+
往 [Unreleased] 写 closeout 条目:决议数 / carry-over 数 / 偏差数 / landed commit。
|
|
340
|
+
|
|
341
|
+
#### 8.5 执行 + 收尾
|
|
342
|
+
1. 写盘 working/prd.yaml(8.2/8.3 的全部改动)
|
|
343
|
+
2. 跑 `prd closeout <slug> --commit <hash> --auto`
|
|
344
|
+
3. 转告收口报告:竣工版号 / N 决议 / M carry-over / K 偏差 / CHANGELOG 状态
|
|
345
|
+
失败时转告 stderr(CLI 已含回滚与恢复提示),不要自行重试改盘。
|
|
346
|
+
|
|
347
|
+
#### 8.6 refresh 联动(shipped 之后再迭代)
|
|
348
|
+
refresh 一个已 shipped 的 feature 时:working 的 `lifecycle.status` 回 `"draft"`、删除 `shipped_at` / `landed_commit` 两行(上一轮交付事实由 frozen 链 + manifest 承载,不丢)。这是 `prd freeze` shipped 守卫指引的路;CLI 的 `prd refresh` 命令是索引报告,不修改 yaml。
|
|
349
|
+
|
|
350
|
+
#### 8.7 批量收口变体(N feature 一轮)
|
|
351
|
+
|
|
352
|
+
N 个 feature 同时收口时:每 feature 派一个 8.1 证据提取 agent 并行起草(prompt 附跨 feature 线索)→ 全表一轮拍板(按 feature 分组列决议草稿带证据指针,用户一次过)→ 逐 feature 执行 8.3-8.5。实测 9 feature 30 条决议 1 轮交互即可完成。
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
## 硬规则(9 条,违反即为 Skill 执行错误)
|
|
260
357
|
|
|
261
358
|
### 规则 1:不照抄范例的具体占位值
|
|
262
359
|
|
|
@@ -278,11 +375,13 @@ template 标 `[CLI 管]` 的字段由 CLI 维护,AI 不得手填具体运行值
|
|
|
278
375
|
|
|
279
376
|
| 字段 | 生成时填什么 |
|
|
280
377
|
|---|---|
|
|
281
|
-
| `schema_version` | `"v0.
|
|
378
|
+
| `schema_version` | `"v0.3"` |
|
|
282
379
|
| `meta.team` | (PM 提供的 team slug,kebab-case,如 `prd-improve`) |
|
|
283
380
|
| `meta.lifecycle.version` | `"working"` |
|
|
284
381
|
| `meta.lifecycle.status` | `"draft"` |
|
|
285
382
|
| `meta.lifecycle.updated_at` | `""` (留空,CLI 首次写入时填充) |
|
|
383
|
+
| `meta.lifecycle.shipped_at` / `landed_commit` | **不填**(closeout 收口时由 CLI 写入) |
|
|
384
|
+
| `open_questions[].resolution` / `resolved_at` | 白板期**不填**(closeout 模式 8.2 拍板时写) |
|
|
286
385
|
|
|
287
386
|
其他 `[CLI 管]` 字段一律 `""` 或 `[]`。
|
|
288
387
|
|
|
@@ -447,6 +546,33 @@ refresh 模式下,**因 PRD 删除 / 修改 + refers_to 引用关系**而产生
|
|
|
447
546
|
|
|
448
547
|
**与 7.5「批量接受」的边界**:批量接受只限**同一类同一字段**的变化(如"批量接受 12 处自动考核相关字段的删除"),**不跨字段联动**;refers_to 反向图中的"被引用字段"必须单独逐条决策。
|
|
449
548
|
|
|
549
|
+
### 规则 9:AC priority 分级纪律(防 must 通胀)
|
|
550
|
+
|
|
551
|
+
每条验收标准的 `priority` 很容易被习惯性填成 `must`,导致 **must 通胀**——当几乎所有 AC 都是 must,MoSCoW 优先级信号失效,`prd context` 的 Must Build 清单按 priority 过滤等于没过滤,排期 / 砍范围时无从取舍。
|
|
552
|
+
|
|
553
|
+
**launch-blocker 测试(逐条赋值的判定锚点):**
|
|
554
|
+
|
|
555
|
+
- `must` = 不达标就**不能发版 / 要回滚**(launch-blocker)
|
|
556
|
+
- `should` = **能发版**,但是已知且可接受的缺口
|
|
557
|
+
- `could` = 锦上添花,可以悄悄砍掉
|
|
558
|
+
|
|
559
|
+
**坏例子**(真实 dogfood):
|
|
560
|
+
```
|
|
561
|
+
81 AC = 68 must / 13 should / 0 could(84% must)
|
|
562
|
+
→ 几乎全是 must,排期取舍时无从下手,MoSCoW 等于没分级
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
**好例子**:逐条过 launch-blocker 测试,真正阻塞上线的才留 must,其余降 should / could(范例 `examples/import-history-prds.prd.yaml` 的 6 must / 3 should / 1 could 即此测试的产物,不是凑出来的配比)。
|
|
566
|
+
|
|
567
|
+
**calibration 复盘(草拟完全部 AC 后做一次):**
|
|
568
|
+
1. 自算 must / should / could 三数。
|
|
569
|
+
2. 当 must 占压倒比例(可参照范例 ~60% 作软触发线,**非门槛**)时,逐条用 launch-blocker 测试复核 must 项,把「失败也照样能发版」的挑出来。
|
|
570
|
+
3. 向 PM 提降级建议,**由 PM 拍板,AI 不擅自改 priority**(沿用硬规则总则:具体决策值来自用户)。
|
|
571
|
+
|
|
572
|
+
**不设硬配额**:AC 条数 ≠ 工作量,数字配额可被「拆 1 条 must 成 2 条 should」规避;**launch-blocker 测试本身才是锚点**,~60% 只是触发复盘的软参考,不作 pass/fail 门槛。
|
|
573
|
+
|
|
574
|
+
**轴区分**:must / should / could(这条该不该**发**)与第 3 步追问的 P0 / P1 / P2(这个问题该不该**问**)是正交两轴——一条 P0 问题(必须问)的答案,既可能落成 must AC 也可能落成 should AC。别把「P0 问题」机械等同「must AC」(这正是通胀的隐性推手)。
|
|
575
|
+
|
|
450
576
|
---
|
|
451
577
|
|
|
452
578
|
## 未回答问题的去向
|
|
@@ -588,13 +714,22 @@ refresh 模式下,**因 PRD 删除 / 修改 + refers_to 引用关系**而产生
|
|
|
588
714
|
| **ChatGPT / Custom GPT** | SKILL.md 作为 system prompt;三个子目录上传为 knowledge |
|
|
589
715
|
| **Codex / Antigravity** | SKILL.md 内容放 system prompt / rules;子目录放项目根 |
|
|
590
716
|
|
|
591
|
-
**核心工作流不变**:识别模式 + 类型 → 加载资源 → (长材料先摘要) → 分轮追问 / refresh diff → 严格遵守
|
|
717
|
+
**核心工作流不变**:识别模式 + 类型 → 加载资源 → (长材料先摘要) → 分轮追问 / refresh diff → 严格遵守 9 条硬规则 → 输出到 `.prd/features/<slug>/working/prd.yaml`(白板)或就地更新 + CHANGELOG append(refresh),或决议回填 + `prd closeout`(closeout)。
|
|
592
718
|
|
|
593
719
|
---
|
|
594
720
|
|
|
595
721
|
## 版本与维护
|
|
596
722
|
|
|
597
|
-
**当前版本:** SKILL.md v0.
|
|
723
|
+
**当前版本:** SKILL.md v0.10 · 对应 schema_version v0.3(resolve command + batch closeout 2026-06-12 + v0.6 正交维度层 + v0.7 priority 分级纪律 + v0.8 source_materials 可移植性 + v0.9 data_and_api.applies_to 注释准确化 + v0.10 轻模式×维度落点指引)
|
|
724
|
+
|
|
725
|
+
**变更历史:**
|
|
726
|
+
- v0.10 — 轻模式 × 命中维度的硬约束落点指引:精选 P0 问出的硬约束落 acceptance_criteria / open_questions(不因结构段轻模式为空而丢弃),撑不进 AC 即触发中途升级;两份 dimension 清单挂载协议同步补轻模式落点。修协议冲突
|
|
727
|
+
- v0.9 — data_and_api.applies_to 注释逐行准确化:data/api/security 明确 EN-* only + 校验失败提示;performance 明确不做引用校验
|
|
728
|
+
- v0.8 — source_materials.url 注释提示可移植路径(仓库相对 / PRD 章节锚点,避免本机绝对路径)+ 范例演示;推广 v1.21 as_built.evidence 同款提示
|
|
729
|
+
- v0.7 — 加规则 9(AC priority 分级纪律):launch-blocker 测试 + calibration 复盘,防 must 通胀;template priority 注释收紧
|
|
730
|
+
- v0.6 — 加正交维度层(1.2b 维度识别 + integration-seam/state-machine-counter 两份 dimension + 精选 P0 注入协议)
|
|
731
|
+
- v0.5 — 加轻模式体量分流(1.3) + 第 6 步 superpowers 执行链 handoff(prd export)
|
|
732
|
+
- v0.4 — resolve command + batch closeout 2026-06-12
|
|
598
733
|
|
|
599
734
|
**支持的 checklist 类型:**
|
|
600
735
|
- [x] `batch-import` (批量导入)
|
|
@@ -602,9 +737,14 @@ refresh 模式下,**因 PRD 删除 / 修改 + refers_to 引用关系**而产生
|
|
|
602
737
|
- [ ] `permission` (权限,规划中)
|
|
603
738
|
- [ ] `notification` (通知,规划中)
|
|
604
739
|
|
|
740
|
+
**支持的 dimension 维度(正交,与上面类型叠加):**
|
|
741
|
+
- [x] `integration-seam`(集成接缝)
|
|
742
|
+
- [x] `state-machine-counter`(状态机·计数器)
|
|
743
|
+
|
|
605
744
|
**何时需要更新本 Skill:**
|
|
606
745
|
|
|
607
|
-
1. **新功能类型出现** → 添加新 checklist 文件,本 SKILL.md
|
|
746
|
+
1. **新功能类型出现** → 添加新 checklist 文件,本 SKILL.md §1.2a/§1.2b 的识别表加一行
|
|
747
|
+
- **先判它是「功能类型」还是「正交维度」**:功能类型 = 与其他类型**互斥**,答「这个 feature *是* 什么」(批量导入、审批流)→ 放 `checklists/` 根 + §1.2a 表;正交维度 = 可与任意类型**叠加**,答「这个 feature *涉及* 什么横切关注点」(有外部依赖、有计数器)→ 放 `checklists/dimensions/` + §1.2b 表 + 必带「精选 P0」(≤3)。
|
|
608
748
|
2. **模板 schema 升级** → 同步升级 schema_version,检查所有 checklist 引用的字段是否还存在
|
|
609
749
|
3. **反复踩同一个坑** → 在"硬规则"段新增一条并给坏例子 / 好例子
|
|
610
750
|
4. **触发不准** → 修改 frontmatter 的 description,连续观察 2 周
|
|
@@ -147,6 +147,7 @@
|
|
|
147
147
|
|
|
148
148
|
→ 答案落到 `acceptance_criteria` / `data_and_api.security_constraints`
|
|
149
149
|
|
|
150
|
+
- 判定每条 AC 的 priority 时套用 SKILL.md 规则 9 的 launch-blocker 测试(不达标就不能发版=must),别默认全填 must。
|
|
150
151
|
- **[P0]** 怎么判断一次任务"成功"?需要达到多少成功率阈值?
|
|
151
152
|
- **[P1]** 开发需要哪些日志 / 指标来排查问题?
|
|
152
153
|
- **[P1]** 测试需要哪些固定数据样例来做回归?
|
|
@@ -192,4 +193,4 @@
|
|
|
192
193
|
3. 如果某 P1 问题频繁被用户答不上来,升级为 P0
|
|
193
194
|
4. 如果某类功能(如"跨系统同步")与批量导入差异过大,拆出独立 checklist(如 `checklists/cross-system-sync.md`)
|
|
194
195
|
|
|
195
|
-
当前版本:v0.1 · 本清单与 `templates/prd.yaml` (schema_version v0.
|
|
196
|
+
当前版本:v0.1 · 本清单与 `templates/prd.yaml` (schema_version v0.3) 对齐
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# 集成接缝 · 边界追问维度清单(正交维度)
|
|
2
|
+
|
|
3
|
+
> 本清单是「正交维度」,与功能类型清单(如 batch-import)叠加使用——一个功能可同时是某类型 + 命中本维度。
|
|
4
|
+
> 由 PRD Skill 在检测到「外部依赖 / 网络接缝」信号时自动加载。
|
|
5
|
+
> **挂载协议:只把「精选 P0(≤3 条,单条可含 2-3 个子问)」注入当轮追问;其余 P0/P1/P2 为可选补问。**
|
|
6
|
+
> 所有答案最终落到 prd.yaml 对应模块,Skill 不要凭空生成答案。
|
|
7
|
+
> **轻模式例外**:精选 P0 的硬约束落点改为 `acceptance_criteria` / `open_questions`(对应结构段在轻模式为空)。
|
|
8
|
+
> 追问执行协议(每轮 ≤3-5 题、P0 先、有选项给选项、答不上转 open_questions)沿用 batch-import.md 的「使用原则」段;本维度额外只注入精选 P0。
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 触发加载条件
|
|
13
|
+
|
|
14
|
+
当功能描述中出现以下特征之一,Skill 应加载本维度清单:
|
|
15
|
+
|
|
16
|
+
- 关键词:外部 API / 第三方 / 调另一个(微)服务 / SDK / webhook / 回调 / 消息队列 / MQ / 异步任务 / 超时 / 重试 / 降级 / 兜底 / 离线 / 网络异常 / 不可达。
|
|
17
|
+
- 功能依赖一个**不由本模块掌控的运行时**(支付网关、短信、AI 推理、对象存储、地图、推送、登录第三方)。
|
|
18
|
+
- 跨进程 / 跨服务 / 跨网络的读写。
|
|
19
|
+
- 有「在线/离线」「连通/不可达」状态切换。
|
|
20
|
+
- 典型功能:接入支付、AI 能力调用(带超时)、第三方登录、消息推送、文件传对象存储、跨服务数据同步、离线表单提交。
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Q 清单(按 prd.yaml 模块归类)
|
|
25
|
+
|
|
26
|
+
### 1. 接缝清单与契约
|
|
27
|
+
|
|
28
|
+
→ `entities` / `data_and_api.api_constraints`
|
|
29
|
+
|
|
30
|
+
- **[P0]** 本功能依赖哪些外部接缝?逐个列出(服务名 / 用途 / 同步 or 异步)。
|
|
31
|
+
- **[P0]** 每个接缝的「成功响应」长什么样?字段契约是否固定?
|
|
32
|
+
- **[P1]** 契约由谁拥有 / 可能怎么变?是否版本化?
|
|
33
|
+
- **[P2]** 是否有 mock / sandbox 环境供测试?
|
|
34
|
+
|
|
35
|
+
### 2. 失败模式枚举
|
|
36
|
+
|
|
37
|
+
→ `edge_cases` / `scenarios`
|
|
38
|
+
|
|
39
|
+
- **[P0]** 每个接缝可能怎么失败?(超时 / 5xx / 4xx / 限流 429 / 部分成功 / 返回体畸形或字段缺失 / 连接失败)
|
|
40
|
+
- **[P0]** 每种失败本功能怎么表现?(报错 / 重试 / 降级 / 静默 / 入队补偿)
|
|
41
|
+
- **[P1]** 「返回 200 但 body 语义是失败」怎么识别?
|
|
42
|
+
- **[P1]** 区分「可恢复 / 不可恢复」失败的依据?
|
|
43
|
+
|
|
44
|
+
### 3. 超时·重试·幂等
|
|
45
|
+
|
|
46
|
+
→ `business_rules` / `data_and_api.performance_constraints`
|
|
47
|
+
|
|
48
|
+
- **[P0]** 每个接缝的超时阈值?(秒)
|
|
49
|
+
- **[P0]** 失败是否重试?重试次数 / 退避策略?(与状态机·计数器维度的计数器联动)
|
|
50
|
+
- **[P0]** 重试 / 重复提交是否幂等?幂等键是什么?
|
|
51
|
+
- **[P1]** 重试期间用户看到什么?
|
|
52
|
+
|
|
53
|
+
### 4. 降级与兜底
|
|
54
|
+
|
|
55
|
+
→ `business_rules` / `scenarios`
|
|
56
|
+
|
|
57
|
+
- **[P0]** 接缝不可用时本功能能否降级运行?降级形态?(只读 / 缓存 / 本地暂存 / 排队后补 / 直接拒绝)
|
|
58
|
+
- **[P1]** 降级态如何恢复?自动重连还是用户手动?
|
|
59
|
+
- **[P1]** 降级期间产生的数据如何与恢复后对账?
|
|
60
|
+
|
|
61
|
+
### 5. 跨状态组合枚举
|
|
62
|
+
|
|
63
|
+
→ `edge_cases` / `ui_interaction`
|
|
64
|
+
|
|
65
|
+
- **[P0]** 把「连通性状态 × 业务错误类型」做成组合表,逐格定义展示与行为——防文案与按钮/行为打架、防某组合是死代码(反面教材:离线 × 识别失败 → 标题「识别失败」但只有「保存本地」按钮)。
|
|
66
|
+
- **[P1]** 每个组合的文案 / 可用操作 / 默认动作是否自洽?
|
|
67
|
+
- **[P2]** 有没有「理论上不可能但代码里能进」的组合?(死分支审计)
|
|
68
|
+
|
|
69
|
+
### 6. 接缝处鉴权与安全
|
|
70
|
+
|
|
71
|
+
→ `data_and_api.security_constraints`
|
|
72
|
+
|
|
73
|
+
- **[P0]** 接缝鉴权方式?token / 密钥怎么存、谁能访问?
|
|
74
|
+
- **[P0]** token / 凭证过期时本功能怎么处理?(自动刷新 / 报错 / 重新授权)
|
|
75
|
+
- **[P1]** 接缝传输的数据是否含敏感字段?加密 / 脱敏?
|
|
76
|
+
- **[P2]** 第三方回调如何验签防伪造?
|
|
77
|
+
|
|
78
|
+
### 7. 可观测与排查
|
|
79
|
+
|
|
80
|
+
→ `acceptance_criteria` / `data_and_api.performance_constraints`
|
|
81
|
+
|
|
82
|
+
- **[P0]** 接缝调用失败时,排查需要哪些日志 / trace?(请求 ID / 接缝名 / 耗时 / 错误码)
|
|
83
|
+
- **[P1]** 接缝健康度有无监控 / 报警?(失败率 / P99 延迟阈值)
|
|
84
|
+
- **[P2]** 是否需要熔断 / 限流保护本功能不被拖垮?
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 精选 P0(Top 3 必问)
|
|
89
|
+
|
|
90
|
+
挂载时只把这 3 条注入当轮追问;其余 P0 / P1 / P2 为可选补问。
|
|
91
|
+
|
|
92
|
+
1. **逐接缝答**:每个外部接缝失败时(超时 / 报错 / 不可达),本功能怎么表现——报错、重试、还是降级兜底?(别笼统说「会处理」)
|
|
93
|
+
2. 超时阈值、重试次数与退避、幂等键——三件各定多少?
|
|
94
|
+
3. 「连通性 × 错误类型」组合表——逐格定义展示与行为,排查有没有文案-行为打架或死分支。
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 常见答案池
|
|
99
|
+
|
|
100
|
+
| 主题 | 常见选项 |
|
|
101
|
+
|---|---|
|
|
102
|
+
| 失败处理 | 报错中断 / 自动重试 / 降级兜底 / 本地暂存补偿 / 静默忽略 |
|
|
103
|
+
| 降级形态 | 只读缓存 / 本地暂存排队 / 切手动 / 直接拒绝 + 提示 |
|
|
104
|
+
| 重试策略 | 不重试 / 固定次数 / 指数退避 / 用户手动重试 |
|
|
105
|
+
| 幂等键 | 业务唯一键 / 客户端生成 UUID / 服务端去重窗口 / 不保证 |
|
|
106
|
+
| 凭证过期 | 自动刷新 / 报错重新授权 / 静默失败 |
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Top 5 最易被漏掉的问题
|
|
111
|
+
|
|
112
|
+
本维度按挂载协议默认只注入「精选 P0(≤3)」;**一旦本维度被追问深入**(精选 P0 暴露出更多边界),这 5 个是最不该漏的补问点。届时用户答不上来转入 `open_questions`(精选 P0 相关项 `severity: blocking`,其余 `non_blocking`):
|
|
113
|
+
|
|
114
|
+
1. **「返回 200 但语义失败」**——只判 HTTP 码会漏。
|
|
115
|
+
2. **跨状态组合的死分支 / 文案打架**——离线 × 错误态这类(真实反面教材)。
|
|
116
|
+
3. **幂等**——重试 / 重复点击造成重复副作用。
|
|
117
|
+
4. **凭证过期路径**——happy path 之外几乎总被忘。
|
|
118
|
+
5. **降级态恢复后的数据对账**——暂存数据怎么回流。
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 本清单的演化约定
|
|
123
|
+
|
|
124
|
+
发现新场景或遗漏时:
|
|
125
|
+
|
|
126
|
+
1. 先写入本文件对应分类,并标 P0 / P1 / P2
|
|
127
|
+
2. 若有新选项,同步更新「常见答案池」
|
|
128
|
+
3. 如果某 P1 问题频繁被用户答不上来,升级为 P0
|
|
129
|
+
4. 本清单是「正交维度」——如果发现某类集成场景(如「消息队列专项」)与通用接缝差异过大,拆出独立维度清单(如 `checklists/dimensions/message-queue.md`)
|
|
130
|
+
|
|
131
|
+
当前版本:v0.1 · dimension(正交维度)· 与 templates/prd.yaml (schema_version v0.3) 对齐
|