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:
parent
df0bec8f7d
commit
cff6d66e92
@ -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 有效(open→confirmed),准备派发修复
|
||||
- reject_bug(bug_id, comment) — 驳回 Bug(误报/重复/非缺陷)
|
||||
- reopen_bug(bug_id) — 重新打开已关闭/驳回的 Bug
|
||||
|
||||
## Bug 生命周期流转(独立循环,与任务流转解耦)
|
||||
Bug 是**独立于任务链的第二条循环**:open → confirmed → fixing → fixed → verified → closed。你(PM)拥有「添加流转」的能力——审核任何任务时都要检查当前迭代的 Bug 状态,并主动推动它流转:
|
||||
1. 审核 test 任务通过时:`list_bugs(status=open)` 查当前迭代 open Bug,逐个读 title/description 判断根因——功能 Bug → `confirm_bug`(open→confirmed)+ `create_tasks` 派发「修复 Bug」任务给 develop(description 带 bug 清单);误报 → `reject_bug`;系统性缺陷 → review_rollback。
|
||||
2. 审核 develop「修复 Bug」任务通过时:`list_bugs(status=fixed)` 查已修复 Bug → `create_tasks` 派发「复测」任务给 test。
|
||||
3. 部署 Bug(环境问题)→ 不 confirm,走 review_rollback 回退 deploy_test 或冒泡运维。
|
||||
Bug 修复前不派部署任务;修复后才派「重新部署」/「复测」。只处理当前迭代的 Bug(list_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 等),
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user