BMAD-METHOD/bmad-core/tasks/apply-qa-fixes.md

151 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- 由 BMAD™ Core 驱动 -->
# 应用QA修复
根据特定故事的QA结果门禁和评估实施修复。此任务供开发代理系统地使用QA输出并应用代码/测试更改,同时仅更新故事文件中允许的部分。
## 目的
- 读取故事的QA输出门禁YAML + 评估markdown
- 创建优先的、确定性的修复计划
- 应用代码和测试更改以弥补差距和解决问题
- 仅更新开发代理允许的故事部分
## 输入
```yaml
required:
- story_id: '{epic}.{story}' # 例如, "2.2"
- qa_root: 来自 `bmad-core/core-config.yaml` 键 `qa.qaLocation` (例如, `docs/project/qa`)
- story_root: 来自 `bmad-core/core-config.yaml` 键 `devStoryLocation` (例如, `docs/project/stories`)
optional:
- story_title: '{title}' # 如果缺少则从故事的H1派生
- story_slug: '{slug}' # 如果缺少,则从标题派生 (小写,连字符连接)
```
## 要读取的QA源
- 门禁 (YAML): `{qa_root}/gates/{epic}.{story}-*.yml`
- 如果有多个,则使用修改时间最新的一个
- 评估 (Markdown):
- 测试设计: `{qa_root}/assessments/{epic}.{story}-test-design-*.md`
- 可追溯性: `{qa_root}/assessments/{epic}.{story}-trace-*.md`
- 风险概况: `{qa_root}/assessments/{epic}.{story}-risk-*.md`
- 非功能性需求评估: `{qa_root}/assessments/{epic}.{story}-nfr-*.md`
## 先决条件
- 仓库在本地构建和测试运行 (Deno 2)
- 可用的Lint和测试命令:
- `deno lint`
- `deno test -A`
## 流程 (不要跳过步骤)
### 0) 加载核心配置并定位故事
- 读取 `bmad-core/core-config.yaml` 并解析 `qa_root``story_root`
-`{story_root}/{epic}.{story}.*.md` 中定位故事文件
- 如果缺少则停止并要求正确的故事ID/路径
### 1) 收集QA发现
- 解析最新的门禁YAML:
- `gate` (PASS|CONCERNS|FAIL|WAIVED)
- `top_issues[]` 包含 `id`, `severity`, `finding`, `suggested_action`
- `nfr_validation.*.status` 和注释
- `trace` 覆盖范围摘要/差距
- `test_design.coverage_gaps[]`
- `risk_summary.recommendations.must_fix[]` (如果存在)
- 读取任何存在的评估markdown并提取明确的差距/建议
### 2) 构建确定性修复计划 (按优先级顺序)
按顺序应用,优先级最高的优先:
1. `top_issues` 中的高严重性项目 (安全/性能/可靠性/可维护性)
2. NFR状态所有FAIL必须修复 → 然后是CONCERNS
3. 测试设计 `coverage_gaps` (如果指定则优先处理P0场景)
4. Trace未覆盖的需求 (AC级别)
5. 风险 `must_fix` 建议
6. 中等严重性问题,然后是低严重性问题
指导:
- 在代码更改之前/同时,优先选择弥补覆盖差距的测试
- 保持更改最小化和有针对性遵循项目架构和TS/Deno规则
### 3) 应用更改
- 根据计划实施代码修复
- 添加缺失的测试以弥补覆盖差距 (单元测试优先根据AC要求进行集成测试)
- 通过 `deps.ts` 保持导入集中化 (参见 `docs/project/typescript-rules.md`)
- 遵循 `src/core/di.ts` 中的DI边界和现有模式
### 4) 验证
- 运行 `deno lint` 并修复问题
- 运行 `deno test -A` 直到所有测试通过
- 迭代直到干净
### 5) 更新故事 (仅限允许的部分)
关键:开发代理仅被授权更新故事文件的这些部分。不要修改任何其他部分 (例如, QA结果, 故事, 验收标准, 开发说明, 测试):
- 任务/子任务复选框 (将您添加的任何修复子任务标记为完成)
- 开发代理记录 →
- 使用的代理模型 (如果更改)
- 调试日志参考 (命令/结果, 例如, lint/tests)
- 完成说明列表 (更改了什么, 为什么, 如何)
- 文件列表 (所有添加/修改/删除的文件)
- 更改日志 (描述应用的修复的新的带日期的条目)
- 状态 (见下文规则)
状态规则:
- 如果门禁为PASS且所有已识别的差距都已弥补 → 设置 `Status: Ready for Done`
- 否则 → 设置 `Status: Ready for Review` 并通知QA重新运行审查
### 6) 不要编辑门禁文件
- 开发人员不修改门禁YAML。如果修复解决了问题请请求QA重新运行 `review-story` 以更新门禁
## 阻塞条件
- 缺少 `bmad-core/core-config.yaml`
- 找不到 `story_id` 的故事文件
- 未找到QA工件 (门禁和评估都没有)
- 停止并请求QA生成至少一个门禁文件 (或仅在有明确的开发人员提供的修复列表的情况下继续)
## 完成清单
- deno lint: 0个问题
- deno test -A: 所有测试通过
- 所有高严重性的 `top_issues` 已解决
- NFR FAIL → 已解决; CONCERNS 已最小化或记录
- 覆盖差距已弥补或用理由明确记录
- 故事已更新 (仅限允许的部分),包括文件列表和更改日志
- 状态已根据状态规则设置
## 示例故事2.2
给定门禁 `docs/project/qa/gates/2.2-*.yml` 显示
- `coverage_gaps`: 未测试返回操作行为 (AC2)
- `coverage_gaps`: 未测试集中化依赖项强制执行 (AC4)
修复计划:
- 添加一个测试,确保工具包菜单的“返回”操作返回到主菜单
- 添加一个静态测试,验证服务/视图的导入通过 `deps.ts`
- 重新运行lint/tests并相应地更新开发代理记录 + 文件列表
## 关键原则
- 确定性的、风险优先的优先级排序
- 最小的、可维护的更改
- 测试验证行为并弥补差距
- 严格遵守允许的故事更新区域
- 门禁所有权仍归QA所有开发通过状态信号表示准备就绪