From cff6d66e929680eaf1539b802bc638be290f0a31 Mon Sep 17 00:00:00 2001 From: ymq Date: Mon, 24 Aug 2026 08:03:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20PM=20=E5=AE=A1=E6=A0=B8=E6=8E=A5?= =?UTF-8?q?=E5=85=A5=20Bug=20=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F=E6=B5=81?= =?UTF-8?q?=E8=BD=AC=EF=BC=88=E7=8B=AC=E7=AB=8B=E5=BE=AA=E7=8E=AF=20+=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B5=81=E8=BD=AC=E8=83=BD=E5=8A=9B=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根治「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/派发) --- pipeline_service/agent_loop.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/pipeline_service/agent_loop.py b/pipeline_service/agent_loop.py index 04f5bb1..87cf5cd 100644 --- a/pipeline_service/agent_loop.py +++ b/pipeline_service/agent_loop.py @@ -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 等),