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 等),