fix: 回退任务链 pm_assigned 污染 + 模块级判断改 previous_role + start_fix 放宽 open

三处根因修复(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 环节。
This commit is contained in:
ymq 2026-08-23 14:48:14 +08:00
parent e3301f5ed9
commit 8d3dd7c980
2 changed files with 16 additions and 3 deletions

View File

@ -859,6 +859,10 @@ async def _rollback_task_chain(sor, project_id, task_id, rollback_role, comment)
except (json.JSONDecodeError, TypeError): except (json.JSONDecodeError, TypeError):
tp = {} tp = {}
new_params = {**tp, 'rollback_from': task_id, 'rollback_comment': comment} 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: if prev_task:
new_params['previous_task_id'] = getattr(prev_task, 'id', '') new_params['previous_task_id'] = getattr(prev_task, 'id', '')
new_params['previous_role'] = _normalize_role(getattr(prev_task, 'role', '')) 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 '{}') _tp = json.loads(getattr(task, 'params', '{}') or '{}')
except Exception: except Exception:
_tp = {} _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}") logger.info(f"模块级 develop approved,跳过 deploy_test(部署以应用为单位): {task_id}")
return {"status": "approved", "task_id": task_id, "comment": comment, return {"status": "approved", "task_id": task_id, "comment": comment,
"next_role": "", "skip_next": "module_not_deployed_independently"} "next_role": "", "skip_next": "module_not_deployed_independently"}

View File

@ -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): async def start_fix(bug_id, iteration_id, assignee_id="", who=None, agent_id=None):
"""开始修复:confirmed → fixing(记录处理人)。""" """开始修复:confirmed/open → fixing(记录处理人)。
return await _transition(bug_id, iteration_id, [S_CONFIRMED], S_FIXING, 'start_fix',
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 ''}, extra_updates={"assignee_id": assignee_id or ''},
who=who, agent_id=agent_id) who=who, agent_id=agent_id)