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):
tp = {}
new_params = {**tp, 'rollback_from': task_id, 'rollback_comment': comment}
# 清 pm_assigned回退重做任务是系统重建的任务非 PM 按模块清单派发),继承 target_task 的
# pm_assigned 会污染——若 target 是应用级 develop历史脏数据带 pm_assigned=Trueapprove 后被
# 「模块级 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"}

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):
"""开始修复confirmed → fixing记录处理人"""
return await _transition(bug_id, iteration_id, [S_CONFIRMED], S_FIXING, 'start_fix',
"""开始修复confirmed/open → fixing记录处理人
from 允许 openPM review_rollback 回退 develop 处理部署/功能 Bug 走的是回退重做任务链
隐含确认缺陷有效不经过 confirm_bugbug 停在 open start_fix 只认 confirmed
develop 在回退重做任务里修完缺陷后无法 start_fixfix_bugbug 永远 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)