Skip to content

Commit 079d883

Browse files
committed
refactor(aisee-change-plan): 增加输出一致性自检契约
1 parent 2a246bc commit 079d883

4 files changed

Lines changed: 32 additions & 2 deletions

File tree

plugins/aisee-plugin/skills/aisee-change-plan/SKILL.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ SRS 模块名、页面类型、设计材料、架构层、技术层和 schema ar
108108
4.`change-boundary-algorithm.md` 划分可独立交付边界、依赖和并行关系。
109109
5.`source-map-rules.md` 生成 source-map seed;不生成 `source-map.md` 的 schema 写 N/A。
110110
6.`output-template.md` 输出完整 change plan。
111+
7. 输出前执行一致性自检:摘要中的 change/phase 计数、Mermaid phase 数、change 详情块数、`/opsx:new` 命令数、以及每个 change 的 `Metadata gate` 两条内容必须一致完整。
111112

112113
## 保护规则
113114

plugins/aisee-plugin/skills/aisee-change-plan/evals/evals.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@
1919
"邀请链接过期规则仍是待确认业务规则。"
2020
]
2121
},
22-
"expected_output": "输出 change 边界、依赖、复杂度、In Scope/Out of Scope 和执行顺序。依赖顺序和并行关系必须使用 Mermaid 语法块表达。所有命令必须使用 /opsx:new \"<change>\" --schema <schema>,不得输出 /opsx:propose。应保留 architecture 中的 RBAC 复用事实和邀请链接规则待确认项,并说明后续通过 aisee:change-author(必要时配合 /opsx:continue)按 schema 补齐 artifacts;不得建议使用旧的 change design skill 作为固定后续步骤。",
22+
"expected_output": "输出 change 边界、依赖、复杂度、In Scope/Out of Scope 和执行顺序。依赖顺序和并行关系必须使用 Mermaid 语法块表达。摘要中的 change/phase 数量、Mermaid phase 数量、change 详情块数量和 `/opsx:new` 命令数量必须一致。所有命令必须使用 /opsx:new \"<change>\" --schema <schema>,不得输出 /opsx:propose。应保留 architecture 中的 RBAC 复用事实和邀请链接规则待确认项,并说明后续通过 aisee:change-author(必要时配合 /opsx:continue)按 schema 补齐 artifacts;不得建议使用旧的 change design skill 作为固定后续步骤。",
2323
"expected_outputs": [
2424
"输出可独立交付的 change 边界、依赖、复杂度、In Scope/Out of Scope 和执行顺序。",
2525
"使用 Mermaid 语法块表达依赖顺序和并行关系。",
26+
"保持摘要、Mermaid 图、change 详情块和命令区的 change/phase 数量一致。",
2627
"使用 /opsx:new \"<change>\" --schema <schema>。",
2728
"保留 RBAC 复用事实和邀请链接过期规则待确认项。",
2829
"说明后续通过 aisee:change-author 或 /opsx:continue 补齐 artifacts。"
@@ -35,6 +36,7 @@
3536
"change 边界",
3637
"Mermaid 依赖图",
3738
"依赖顺序",
39+
"Metadata gate",
3840
"source-map seed",
3941
"/opsx:new 命令"
4042
],
@@ -63,10 +65,11 @@
6365
"已有项目、权限和列表页存在。"
6466
]
6567
},
66-
"expected_output": "判断这是单个小 change,不为了流程而规划多个 change。输出一个 change 详情块、单节点 Mermaid 依赖图和单条 /opsx:new 命令,不得输出 /opsx:propose,也不得新增未确认的后端、数据库或 UI 需求。",
68+
"expected_output": "判断这是单个小 change,不为了流程而规划多个 change。输出一个 change 详情块、单节点 Mermaid 依赖图和单条 /opsx:new 命令,不得输出 /opsx:propose,也不得新增未确认的后端、数据库或 UI 需求。摘要中的 change 数和命令数必须为 1,phase 数也必须与 Mermaid 图一致。",
6769
"expected_outputs": [
6870
"判断为单个小 change。",
6971
"输出一个 change 详情块、单节点 Mermaid 依赖图和单条 /opsx:new 命令。",
72+
"保持摘要、Mermaid 图和命令区的计数一致。",
7073
"说明不需要为了流程拆成多个 change。"
7174
],
7275
"must_ask": [

plugins/aisee-plugin/skills/aisee-change-plan/references/output-template.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ flowchart TD
4343
- phase 使用 `subgraph "Phase N"` 标记。
4444
- 并行 change 放在同一个 phase subgraph 中,不额外用表格重复表达。
4545
- 如果只有单个 change,仍保留 Mermaid 语法块,并只画一个节点。
46+
- Phase 编号必须连续,从 `Phase 1` 开始,不得跳号。
4647

4748
## Change 详情模板
4849

@@ -154,6 +155,19 @@ Assumption 格式:
154155
[ASSUMPTION] {假设内容} — 影响 {change 列表} — 开始实现前请确认。
155156
```
156157

158+
## 输出前自检
159+
160+
生成最终文本前,逐项检查:
161+
162+
- 摘要中的 `{N}` 必须等于 change 详情块数量。
163+
- 摘要中的 `{M}` 必须等于 Mermaid 图中的 phase 数量。
164+
- `全部命令` 中的 `/opsx:new` 数量必须等于 change 数量。
165+
- Mermaid 图中的每个 change 都必须有对应详情块和对应命令。
166+
- 每个 change 的 `Metadata gate` 都必须同时包含:
167+
- `/opsx:new must use: /opsx:new "<change>" --schema <selected-schema>`
168+
- `后续 author / implementation 只读取 change metadata 中固化的 schema,不根据 artifacts 猜测或重选`
169+
- 若正文声明存在 `Phase 2` 及以后阶段,Mermaid 图与 `全部命令` 分段都必须一致出现。
170+
157171
## 保存输出
158172

159173
保存到:

tests/test_change_plan_mermaid_contract.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,15 @@ def test_change_plan_uses_mermaid_for_dependency_graph_contract() -> None:
1818
assert "| Change | 依赖 | 可并行 |" not in output_template
1919
assert "使用 Mermaid 语法块输出依赖顺序和并行关系" in skill_text
2020
assert "在 Mermaid 依赖图中用同一 phase 的 `subgraph` 明确标记并行组" in algorithm_text
21+
22+
23+
def test_change_plan_contract_requires_output_consistency_self_check() -> None:
24+
output_template = (ROOT / "plugins/aisee-plugin/skills/aisee-change-plan/references/output-template.md").read_text(encoding="utf-8")
25+
skill_text = (ROOT / "plugins/aisee-plugin/skills/aisee-change-plan/SKILL.md").read_text(encoding="utf-8")
26+
27+
assert "## 输出前自检" in output_template
28+
assert "摘要中的 `{N}` 必须等于 change 详情块数量。" in output_template
29+
assert "摘要中的 `{M}` 必须等于 Mermaid 图中的 phase 数量。" in output_template
30+
assert "`全部命令` 中的 `/opsx:new` 数量必须等于 change 数量。" in output_template
31+
assert "每个 change 的 `Metadata gate` 都必须同时包含" in output_template
32+
assert "输出前执行一致性自检" in skill_text

0 commit comments

Comments
 (0)