Skip to content

Commit 2e67d77

Browse files
committed
refactor(aisee-srs): 收紧下游交接提示边界
1 parent 18199ea commit 2e67d77

9 files changed

Lines changed: 54 additions & 122 deletions

File tree

plugins/aisee-plugin/skills/aisee-srs/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ description: 通过结构化对话充分澄清软件类业务需求,并生成
3838
- 异常、失败、兼容、验收方向和待确认事项
3939
- 交付形态信号,例如 App、小程序、Web 管理后台、桌面 GUI、后端服务、CLI、导入导出、通知、异步处理
4040
- 现有项目二开时的新增 / 修改 / 移除 / 兼容行为,以及受影响 baseline 引用
41-
- 后续是否需要 UI Content、Architecture 或特殊 change artifact 的提示
41+
- 后续是否需要 UI Content、Architecture 的简短提示,以及仍待确认的关键问题
4242

4343
可以记录但不得展开设计:
4444

@@ -109,7 +109,7 @@ Reference loading:
109109
- 功能需求不得包含实现决策,例如框架选择、具体 API endpoint、数据库 schema、服务拆分或代码文件结构。
110110
- 不要把 SRS 写成 UI 设计文档。页面字段、列表列、操作和空状态只作为功能合约;视觉布局和详细页面构成留给 UI 内容 / 设计步骤。
111111
- 不要把 baseline-aware 写成技术设计。已有基线只用于描述业务行为变化、兼容约束和影响范围。
112-
- 不要把后续交接提示写成实现方案。Section 8 只能说明后续需要哪些上下文、哪些 FR/PAGE/业务对象值得关注
112+
- 不要把下游建议写成实现方案或 change-plan 预结果。可选的下游建议只说明是否建议进入 UI Content / Architecture,以及仍待确认的关键问题
113113
- 单份 SRS 文档不得超过 20 条 FR;如果总范围超过 20 条 FR,标记为 Epic 并进入 Epic 模式。
114114
- Epic 模式下,每份模块文档必须包含足够的模块上下文摘要,确保可被 `aisee:change-plan` 单独处理。
115115
- 模块划分依据业务能力边界,不按输入材料章节、技术层、页面类型、设计规范、架构主题、测试计划或任务阶段直接划分。

plugins/aisee-plugin/skills/aisee-srs/assets/srs-template-epic-main.md

Lines changed: 4 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -163,44 +163,9 @@ change_refs: []
163163

164164
---
165165

166-
## 7. 变更候选清单(全局
166+
## 7. 下游建议(可选
167167

168-
> 以下功能需求按优先级和依赖关系排列,可作为 `aisee:change-plan` 的输入。FR ID 链接到对应模块文档。
169-
170-
| 优先级 | 需求 ID | 标题 | 变更类型 | 影响基线 | 所属模块 | 估计规模 | 依赖 |
171-
|--------|---------|------|----------|----------|----------|----------|------|
172-
| P0 | [{scope}:FR-001](./01-{module-a}.md#fr-001) | {title} | 新增 / 修改 / 移除 / 兼容 | {baseline ref or 无} | {模块 A} | M ||
173-
| P0 | [{scope}:FR-002](./01-{module-a}.md#fr-002) | {title} | 修改 | {openspec/specs/...} | {模块 A} | S | {scope}:FR-001 |
174-
| P1 | [{scope}:FR-003](./02-{module-b}.md#fr-003) | {title} | 新增 || {模块 B} | L ||
175-
176-
---
177-
178-
## 8. 后续交接提示
179-
180-
### 8.1 UI Content 建议
181-
182-
| 模块 / FR | 是否建议生成 UI Content | 原因 | 关注点 |
183-
|-----------|--------------------------|------|--------|
184-
| {模块 / FR-xxx} | 是/否 | {多页面 / 多角色 / 多端 / 状态反馈复杂 / 无 UI} | {页面入口、状态、权限、流程等} |
185-
186-
### 8.2 Architecture 建议
187-
188-
| 关注点 | 是否需要补充 | 原因 |
189-
|--------|--------------|------|
190-
| 技术栈状态 | 是/否 | {已明确 / 未明确 / 既有项目需扫描} |
191-
| 既有能力复用 | 是/否 | {鉴权、权限、文件、通知、队列、审计等} |
192-
| 外部系统 / 异步处理 / 数据迁移 | 是/否 | {原因} |
193-
194-
### 8.3 Change Plan 输入提示
195-
196-
- 建议优先拆分的业务边界:{module / flow / role / state}
197-
- 不建议拆散的能力:{reason}
198-
- 需要在 change authoring 前确认的问题:{Q-xxx or 无}
199-
200-
**下一步**:将各模块文档路径传入 `aisee:change-plan`,进行 Change 边界规划:
201-
202-
\`\`\`
203-
aisee:change-plan aisee/docs/requirements/{slug}/01-{module-a}.md
204-
aisee:change-plan aisee/docs/requirements/{slug}/02-{module-b}.md
205-
\`\`\`
168+
- UI Content:需要 / 不需要;关注模块:{模块 A / 模块 B / N/A}
169+
- Architecture:需要 / 不需要;关注点:{共享能力复用、权限模型、外部系统、异步处理或 N/A}
170+
- 进入后续规划前仍需确认:{Q-xxx / 无}
206171
```

plugins/aisee-plugin/skills/aisee-srs/assets/srs-template-epic-module.md

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -108,28 +108,9 @@ change_refs: []
108108

109109
---
110110

111-
## 7. 模块变更候选清单
111+
## 7. 本模块下游建议(可选)
112112

113-
> 以下功能需求按优先级和依赖关系排列,可作为 `aisee:change-plan` 的输入。只列出本模块范围内的 FR。
114-
115-
| 优先级 | 需求 ID | 标题 | 变更类型 | 影响基线 | 估计规模 | 依赖 |
116-
|--------|---------|------|----------|----------|----------|------|
117-
| P0 | {scope}:FR-{XXX} | {title} | 新增 / 修改 / 移除 / 兼容 | {baseline ref or 无} | M ||
118-
| P1 | {scope}:FR-{YYY} | {title} | 修改 | {openspec/specs/...} | S | {scope}:FR-{XXX} |
119-
120-
---
121-
122-
## 8. 本模块后续交接提示
123-
124-
| 后续环节 | 建议 | 原因 / 关注点 |
125-
|----------|------|---------------|
126-
| UI Content | 需要 / 不需要 | {页面、窗口、状态、权限、多端差异等} |
127-
| Architecture | 需要 / 不需要 | {既有系统、技术栈、外部系统、异步任务、数据迁移等} |
128-
| Change Plan | 注意事项 | {建议边界、不可拆散的流程、关键依赖、Open Questions} |
129-
130-
**下一步**:将本文档路径传入 `aisee:change-plan`,进行 Change 边界规划:
131-
132-
\`\`\`
133-
aisee:change-plan aisee/docs/requirements/{slug}/{module-file}.md
134-
\`\`\`
113+
- 是否建议生成 UI Content:是/否;关注点:{页面入口、表单、列表、权限、状态或 N/A}
114+
- 是否建议补充 Architecture:是/否;关注点:{共享能力、外部系统、异步处理、权限模型或 N/A}
115+
- 仍待确认的问题:{Q-xxx or 无}
135116
```

plugins/aisee-plugin/skills/aisee-srs/assets/srs-template-standard.md

Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -181,43 +181,9 @@ change_refs: []
181181

182182
---
183183

184-
## 7. 变更候选清单
184+
## 7. 下游建议(可选)
185185

186-
> 以下功能需求按优先级和依赖关系排列,可作为 `aisee:change-plan` 的输入。
187-
188-
| 优先级 | 需求 ID | 标题 | 变更类型 | 影响基线 | 估计规模 | 依赖 |
189-
|--------|---------|------|----------|----------|----------|------|
190-
| P0 | {scope}:FR-001 | {title} | 新增 / 修改 / 移除 / 兼容 | {baseline ref or 无} | M ||
191-
| P0 | {scope}:FR-002 | {title} | 修改 | {openspec/specs/...} | S | {scope}:FR-001 |
192-
| P1 | {scope}:FR-003 | {title} | 新增 || L ||
193-
194-
---
195-
196-
## 8. 后续交接提示
197-
198-
### 8.1 UI Content 建议
199-
200-
| 模块 / FR | 是否建议生成 UI Content | 原因 | 关注点 |
201-
|-----------|--------------------------|------|--------|
202-
| {模块 / FR-xxx} | 是/否 | {多页面 / 多角色 / 多端 / 状态反馈复杂 / 无 UI} | {页面入口、状态、权限、流程等} |
203-
204-
### 8.2 Architecture 建议
205-
206-
| 关注点 | 是否需要补充 | 原因 |
207-
|--------|--------------|------|
208-
| 技术栈状态 | 是/否 | {已明确 / 未明确 / 既有项目需扫描} |
209-
| 既有能力复用 | 是/否 | {鉴权、权限、文件、通知、队列、审计等} |
210-
| 外部系统 / 异步处理 / 数据迁移 | 是/否 | {原因} |
211-
212-
### 8.3 Change Plan 输入提示
213-
214-
- 建议优先拆分的业务边界:{module / flow / role / state}
215-
- 不建议拆散的能力:{reason}
216-
- 需要在 change authoring 前确认的问题:{Q-xxx or 无}
217-
218-
**下一步**:将本文档路径传入 `aisee:change-plan`,进行 Change 边界规划:
219-
220-
\`\`\`
221-
aisee:change-plan aisee/docs/requirements/{filename}.md
222-
\`\`\`
186+
- UI Content:需要 / 不需要;关注点:{页面入口、状态反馈、权限可见性、跨页面流程或 N/A}
187+
- Architecture:需要 / 不需要;关注点:{既有能力复用、外部系统、权限模型、异步处理或 N/A}
188+
- 实施前仍需确认:{Q-xxx / 无}
223189
```

plugins/aisee-plugin/skills/aisee-srs/evals/evals.json

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
"用户只给出初步业务范围,没有完整规则、权限、异常和 MVP 边界。"
1919
]
2020
},
21-
"expected_output": "应先做业务需求澄清,确认用户、业务目标、MVP、规则、权限和异常;生成的 SRS 应包含 FR、业务对象与状态、变更候选清单和后续交接提示;不得输出 API path、数据库表字段、前端组件或实现任务",
21+
"expected_output": "应先做业务需求澄清,确认用户、业务目标、MVP、规则、权限和异常;生成的 SRS 应包含 FR、业务对象与状态,以及精简的下游建议(如是否需要 UI Content / Architecture);不得输出 API path、数据库表字段、前端组件、实现任务或 change-plan 预结果",
2222
"expected_outputs": [
2323
"先澄清优惠券类型、领取/使用/停用规则、权限、异常和 MVP 范围。",
24-
"生成 SRS 时包含功能需求、业务对象与状态、验收方向、变更候选清单和后续交接提示",
25-
" UI Content、Architecturechange-plan 的后续输入提示分开说明"
24+
"生成 SRS 时包含功能需求、业务对象与状态、验收方向,以及精简的下游建议",
25+
"只简要说明 UI Content、Architecture 是否需要,不预写 change-plan 结果"
2626
],
2727
"must_ask": [
2828
"优惠券类型、面额、门槛、有效期、发放数量和停用规则是否有业务限制?",
@@ -32,8 +32,7 @@
3232
"must_include": [
3333
"FR 列表",
3434
"业务对象与状态",
35-
"变更候选清单",
36-
"后续交接提示"
35+
"精简下游建议"
3736
],
3837
"must_not": [
3938
"不得输出 API path。",
@@ -60,11 +59,11 @@
6059
"用户明确说明没有页面。"
6160
]
6261
},
63-
"expected_output": "应识别为非 UI 型需求,SRS 应覆盖业务对象、等级规则、定时触发、通知、异常和验收方向;Section 8 应标注 UI Content 不需要、Architecture 需要,change-plan 可能需要 job/service contract;不得硬造页面。",
62+
"expected_output": "应识别为非 UI 型需求,SRS 应覆盖业务对象、等级规则、定时触发、通知、异常和验收方向;精简下游建议应标注 UI Content 不需要、Architecture 需要,并可提示后续可能涉及 job/service contract;不得硬造页面。",
6463
"expected_outputs": [
6564
"识别为后端/定时任务型需求,不生成页面清单。",
6665
"覆盖会员等级、消费统计窗口、升级/降级规则、定时触发、通知、异常和验收方向。",
67-
"交接提示中说明 UI Content 可标为 N/A,Architecture 和后续 service/job contract 需要"
66+
"精简下游建议中说明 UI Content 可标为 N/A,Architecture 需要,并提示后续可能涉及 service/job contract。"
6867
],
6968
"must_ask": [
7069
"等级规则、升级和降级是否都在本期?",

plugins/aisee-plugin/skills/aisee-srs/references/domain-rules.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525

2626
## 交付形态信号
2727

28-
根据交付形态决定后续交接提示
28+
根据交付形态决定是否给出精简下游建议
2929

30-
| 信号 | 后续提示 |
30+
| 信号 | 下游建议 |
3131
|------|----------|
3232
| 屏幕、页面、弹窗、表单、导航、角色可见 UI | 通常需要 UI Content |
3333
| 组件库、视觉方向、Design Tokens、参考截图 | 通常需要 Design Spec |

plugins/aisee-plugin/skills/aisee-srs/references/workflow.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ Baseline-aware 模式不得:
9393
- 待确认假设:{list or "无"}
9494
- 已识别风险:{list or "无"}
9595
- 基线感知:启用 / 未启用(如启用,列出主要影响基线)
96-
- 后续建议:UI Content 需要 / 不需要;Architecture 需要 / 不需要;change-plan 输入是否已充足
96+
- 后续建议:UI Content 需要 / 不需要;Architecture 需要 / 不需要;仍待确认的关键问题
9797
- 输出模式:标准模式 / Epic 模式
9898
9999
主流程预览:
@@ -105,7 +105,7 @@ Baseline-aware 模式不得:
105105

106106
```text
107107
需求体量较大,将生成 1 份主文档 + {N} 份模块文档。
108-
主文档:系统概述、跨模块约束、术语表、变更候选清单
108+
主文档:系统概述、跨模块约束、术语表和全局约束
109109
模块文档:{模块 1} / {模块 2} / ...
110110
```
111111

@@ -125,7 +125,7 @@ Baseline-aware 模式不得:
125125
4. 只读取 `references/scenario-extension-blocks.md` 中与当前场景相关的块。
126126
5.`FR / NFR / RULE / FLOW / STATE` 预留正式 ID,或在工具不可用时标注临时 ID。
127127
6. 填写所有已确认需求、假设、Open Questions 和 baseline-aware 字段。
128-
7. 在交接章节写明给 `aisee:ui-content``aisee:architecture``aisee:change-plan` 的规划提示;不得补实现级设计
128+
7. 仅在有价值时追加精简下游建议:是否建议进入 `aisee:ui-content``aisee:architecture`,以及仍待确认的关键问题;不得预写 `aisee:change-plan` 结果或实现级设计
129129

130130
### Epic 模式
131131

@@ -134,7 +134,7 @@ Baseline-aware 模式不得:
134134
Step 1:生成主文档。
135135

136136
- 读取 `assets/srs-template.md``references/writing-rules.md``assets/srs-template-epic-main.md`
137-
- 包含系统概述、全局上下文、非功能需求、约束、假设、Open Questions、模块索引和变更候选索引
137+
- 包含系统概述、全局上下文、非功能需求、约束、假设、Open Questions 和模块索引
138138
- 详细 FR 放入模块文档;主文档中每个 FR 都链接到对应模块文档。
139139
- 如果启用 baseline-aware 模式,写明全局基线影响,并在可用时标注每个 FR 的变更类型和影响基线。
140140

@@ -144,7 +144,7 @@ Step 2:逐个生成模块文档。
144144

145145
- 读取 `assets/srs-template-epic-module.md`
146146
- 只读取该模块需要的场景扩展块。
147-
- 每份模块文档都必须包含足够的局部上下文,确保能单独传给 `aisee:change-plan`:模块目的、相关用户、业务对象 / 状态、关键规则、非目标、FR 详情、模块假设、Open Questions 和交接提示
147+
- 每份模块文档都必须包含足够的局部上下文,确保能单独传给 `aisee:change-plan`:模块目的、相关用户、业务对象 / 状态、关键规则、非目标、FR 详情、模块假设和 Open Questions;下游建议仅在确有价值时精简保留
148148
- 如果启用 baseline-aware 模式,每条 FR 都必须包含变更类型和影响基线。
149149

150150
每份模块文档生成后暂停,并询问是否继续。

plugins/aisee-plugin/skills/aisee-srs/references/writing-rules.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,17 +70,17 @@
7070
- 仅在 baseline-aware 模式下填写;没有可识别基线时写“未发现可信基线来源”,不要猜。
7171
- 只记录用户可观察业务行为、角色权限、状态、流程、入口、兼容要求的影响。
7272
- 不写 API endpoint、数据库表字段、ORM、代码模块、迁移脚本或实现方案。
73-
- 每条受影响 FR 必须在 FR 正文和 Section 7 中标注“变更类型”和“影响基线”。
73+
- 每条受影响 FR 必须在 FR 正文中标注“变更类型”和“影响基线”。
7474
- 影响基线来源优先级:`openspec/specs/` > active change artifacts > `aisee/docs/spec-migration/` > 历史 SRS > 用户明确说明 > 从代码推断(低可信,必须标注)。
7575

7676
### Section 6:Open Questions
7777

7878
- 对话中提及但未解决的事项放这里,不放进 FR 正文。
7979
- 用户未提及但实现时必须明确的事项也放这里,注明:`(未在需求中提及 — 实施前请确认)`
8080

81-
### Section 7:变更候选清单
81+
### Section 7:下游建议(可选)
8282

83-
- 规模估算是粗估,`aisee:change-plan` 会细化
84-
- 依赖关系与 FR 正文中的“依赖”字段保持一致
85-
- Epic 模式下,主文档 Section 7 中的 FR ID 必须附相对路径链接指向对应模块文档
86-
- baseline-aware 模式下,必须包含“变更类型”和“影响基线”列,便于 `aisee:change-plan` 生成 source-map seed
83+
- 这一节是可选的;只在确实能帮助后续交接时保留
84+
- 只说明是否建议进入 `aisee:ui-content``aisee:architecture`,以及实施前仍待确认的关键问题
85+
- 不写 change 边界拆分、规模估算、依赖排序、source-map seed 或其它 `aisee:change-plan` 预结果
86+
- 不把 UI Content、Architecture 或后续 artifact 的详细内容提前写进本节

tests/test_skill_cli_preflight.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,27 @@ def test_planning_doc_output_templates_use_frontmatter_without_duplicate_header_
118118
assert marker not in text
119119

120120

121+
def test_srs_skill_keeps_downstream_hints_minimal() -> None:
122+
expected_present = {
123+
"plugins/aisee-plugin/skills/aisee-srs/assets/srs-template-standard.md": "## 7. 下游建议(可选)",
124+
"plugins/aisee-plugin/skills/aisee-srs/assets/srs-template-epic-main.md": "## 7. 下游建议(可选)",
125+
"plugins/aisee-plugin/skills/aisee-srs/assets/srs-template-epic-module.md": "## 7. 本模块下游建议(可选)",
126+
"plugins/aisee-plugin/skills/aisee-srs/references/writing-rules.md": "### Section 7:下游建议(可选)",
127+
}
128+
forbidden_markers = [
129+
"变更候选清单",
130+
"Change Plan 输入提示",
131+
"change-plan 输入是否已充足",
132+
"规模估算是粗估",
133+
]
134+
135+
for relative_path, required_marker in expected_present.items():
136+
text = (ROOT / relative_path).read_text(encoding="utf-8")
137+
assert required_marker in text
138+
for marker in forbidden_markers:
139+
assert marker not in text
140+
141+
121142
def test_cli_outputs_keep_marketplace_recovery_hints() -> None:
122143
import sys
123144

0 commit comments

Comments
 (0)