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)