feat: PM 审核接入 Bug 生命周期流转(独立循环 + 添加流转能力)

根治「Bug 闭环断链」:43 个 open bug 从未被 confirm/修复,根因是
pm_review_run 完全没有 bug 能力工具(只有 load_skill/create_tasks/list_tasks/
cancel_task 四个硬编码工具),且 test 是任务链终点 approve 后直接 completed。

修复(两个独立循环,不耦合):
1. PM_SYSTEM_PROMPT 工具清单加 list_bugs/confirm_bug/reject_bug/reopen_bug,
   并新增「Bug 生命周期流转(独立循环)」段——明确 bug 是独立于任务链的
   第二条循环,PM 拥有「添加流转」能力,每次审核任何任务都检查 bug 状态
2. pm_review_run 的 tool_call 分支把 bug 工具路由到 exec_capability_tool
   (带 capability_ctx:iteration_id/who/agent_id/org_id 自动注入)
3. 保持 bug 流转由 PM 读技能自主决策(不硬编码 approve 后自动 confirm/派发)
This commit is contained in:
ymq 2026-08-24 08:03:44 +08:00
parent df0bec8f7d
commit cff6d66e92

View File

@ -527,6 +527,17 @@ __ROLE_SKILLS__
- create_tasks(tasks) 批量创建并派发后续任务tasks JSON 数组每项 {title, role, description, key?, depends_on?, parent_id?}key 供同批任务间 depends_on 引用depends_on 是前序 key 或任务ID 数组=并行/非空=串行
- list_tasks(role, state) 列出项目现有任务派发前先查避免重复
- cancel_task(task_id) 取消任务重做/作废前必须先取消旧任务避免两个相同任务并存
- list_bugs(status) 查当前迭代的 Bug 清单可按 status 过滤
- confirm_bug(bug_id) 确认 Bug 有效openconfirmed准备派发修复
- reject_bug(bug_id, comment) 驳回 Bug误报/重复/非缺陷
- reopen_bug(bug_id) 重新打开已关闭/驳回的 Bug
## Bug 生命周期流转(独立循环,与任务流转解耦)
Bug **独立于任务链的第二条循环**open confirmed fixing fixed verified closedPM拥有添加流转的能力审核任何任务时都要检查当前迭代的 Bug 状态并主动推动它流转
1. 审核 test 任务通过时`list_bugs(status=open)` 查当前迭代 open Bug逐个读 title/description 判断根因功能 Bug `confirm_bug`openconfirmed+ `create_tasks` 派发修复 Bug任务给 developdescription bug 清单误报 `reject_bug`系统性缺陷 review_rollback
2. 审核 develop修复 Bug任务通过时`list_bugs(status=fixed)` 查已修复 Bug `create_tasks` 派发复测任务给 test
3. 部署 Bug环境问题 confirm review_rollback 回退 deploy_test 或冒泡运维
Bug 修复前不派部署任务修复后才派重新部署/复测只处理当前迭代的 Buglist_bugs 已按迭代过滤
## 审核流程
1. 先用工具检查代码/交付件是否实际产出git_status / list_files / read_file
@ -1855,6 +1866,23 @@ async def pm_review_run(project_id, agent_id=None, model_name=None):
result = await _pm_cancel_task(sor, project_id, params)
elif tool == 'load_skill':
result = await _load_skill_by_name(sor, project_id, 'pm', org_id, params.get('name', ''), params.get('file_path') or None)
elif tool in ('list_bugs', 'confirm_bug', 'reject_bug', 'reopen_bug'):
# Bug 生命周期流转独立循环PM 拥有「添加流转」能力,通过能力工具推动 bug 状态机。
from .capability_tools import exec_capability_tool
_iter = None
try:
from .iteration_capability import get_current_iteration
_iter = await get_current_iteration(sor, project_id)
except Exception:
_iter = None
bug_ctx = {
"project_id": project_id,
"iteration_id": (_iter.get('id', '') if _iter else ''),
"who": "agent.pm",
"agent_id": agent_id or "",
"org_id": org_id or '0',
}
result = await exec_capability_tool(tool, params, bug_ctx)
else:
if turn >= 3:
# 硬约束最后两轮拒绝执行探索类工具read_file/git_status/list_files/run_shell 等),