From 8d3dd7c980912c0bb3889e54a121529f485a0715 Mon Sep 17 00:00:00 2001 From: ymq Date: Sun, 23 Aug 2026 14:48:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9B=9E=E9=80=80=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E9=93=BE=20pm=5Fassigned=20=E6=B1=A1=E6=9F=93=20+=20=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E7=BA=A7=E5=88=A4=E6=96=AD=E6=94=B9=20previous=5Frole?= =?UTF-8?q?=20+=20start=5Ffix=20=E6=94=BE=E5=AE=BD=20open?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 三处根因修复(hrs6 回退重做任务 approve 后链断的完整根因链): 1. _rollback_task_chain 创建回退任务时 new_params.pop('pm_assigned'): 回退重做任务继承 target_task 的 pm_assigned=True,approve 后命中 「模块级 develop 跳过 deploy_test」分支,任务链断在 approved。 与 _create_next_task 的 pop 对齐(两处同源,回退路径漏了)。 2. 模块级 develop 判断从 pm_assigned 改为 previous_role 为空: pm_assigned 会被 design 任务污染(design 也是 PM create_tasks 派发、 带 pm_assigned=True,派生的应用级 develop 继承后被误判模块级)。 previous_role 才是可靠信号:模块级(PM 直接派发)= 空, 应用级(design 派生/回退重做)= agent.design。 3. start_fix 放宽 from 状态 [confirmed] → [confirmed, open]: PM review_rollback 回退 develop 时不走 confirm_bug,bug 停在 open, start_fix 只认 confirmed 导致 develop 修完代码无法 fix_bug, bug 永远 open、闭环断在 fixed 环节。 --- pipeline_service/agent_loop.py | 10 +++++++++- pipeline_service/bug_capability.py | 9 +++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/pipeline_service/agent_loop.py b/pipeline_service/agent_loop.py index a36c3fd..bf0b0a7 100644 --- a/pipeline_service/agent_loop.py +++ b/pipeline_service/agent_loop.py @@ -859,6 +859,10 @@ async def _rollback_task_chain(sor, project_id, task_id, rollback_role, comment) except (json.JSONDecodeError, TypeError): tp = {} new_params = {**tp, 'rollback_from': task_id, 'rollback_comment': comment} + # 清 pm_assigned:回退重做任务是系统重建的任务(非 PM 按模块清单派发),继承 target_task 的 + # pm_assigned 会污染——若 target 是应用级 develop(历史脏数据带 pm_assigned=True),approve 后被 + # 「模块级 develop → 跳过 deploy_test」误判,任务链断在 approved。与 _create_next_task 的 pop 对齐。 + new_params.pop('pm_assigned', None) if prev_task: new_params['previous_task_id'] = getattr(prev_task, 'id', '') new_params['previous_role'] = _normalize_role(getattr(prev_task, 'role', '')) @@ -1795,7 +1799,11 @@ async def pm_review_run(project_id, agent_id=None, model_name=None): _tp = json.loads(getattr(task, 'params', '{}') or '{}') except Exception: _tp = {} - if task_role == 'agent.develop' and _tp.get('pm_assigned'): + # 模块级 develop = PM 用 create_tasks 直接派发(previous_role 为空);应用级 develop = + # 系统派生/回退重做(previous_role=agent.design)。用 previous_role 区分而非 pm_assigned—— + # pm_assigned 会被 design 任务污染(design 也是 PM create_tasks 派发、带 pm_assigned=True, + # 派生的应用级 develop 曾因此误判为「模块级」跳过 deploy_test)。 + if task_role == 'agent.develop' and not _tp.get('previous_role'): logger.info(f"模块级 develop approved,跳过 deploy_test(部署以应用为单位): {task_id}") return {"status": "approved", "task_id": task_id, "comment": comment, "next_role": "", "skip_next": "module_not_deployed_independently"} diff --git a/pipeline_service/bug_capability.py b/pipeline_service/bug_capability.py index e9c67ff..aab5e25 100644 --- a/pipeline_service/bug_capability.py +++ b/pipeline_service/bug_capability.py @@ -127,8 +127,13 @@ async def confirm_bug(bug_id, iteration_id, who=None, agent_id=None): async def start_fix(bug_id, iteration_id, assignee_id="", who=None, agent_id=None): - """开始修复:confirmed → fixing(记录处理人)。""" - return await _transition(bug_id, iteration_id, [S_CONFIRMED], S_FIXING, 'start_fix', + """开始修复:confirmed/open → fixing(记录处理人)。 + + from 允许 open:PM review_rollback 回退 develop 处理部署/功能 Bug 时,走的是「回退重做」任务链 + (隐含确认缺陷有效),不经过 confirm_bug,bug 停在 open。若 start_fix 只认 confirmed, + develop 在回退重做任务里修完缺陷后无法 start_fix→fix_bug,bug 永远 open、闭环断在 fixed 环节。 + """ + return await _transition(bug_id, iteration_id, [S_CONFIRMED, S_OPEN], S_FIXING, 'start_fix', extra_updates={"assignee_id": assignee_id or ''}, who=who, agent_id=agent_id)