fix: 迭代边界——老迭代任务 approve 后不再自动触发下一角色任务(新迭代创建后老迭代链终止)

This commit is contained in:
ymq 2026-08-18 14:48:03 +08:00
parent dfa441b09b
commit e26826f924

View File

@ -624,6 +624,16 @@ async def _create_next_task(sor, project_id, task, next_role, pm_comment=''):
return new_task_id, new_title
def _task_iteration_name(task):
"""提取任务的迭代名params.iteration_id存的是迭代名称非 id"""
params_str = getattr(task, 'params', '{}') or '{}'
try:
params = json.loads(params_str) if isinstance(params_str, str) else params_str
return (params.get('iteration_id') or '').strip()
except (json.JSONDecodeError, TypeError):
return ''
# ── Agent 工具执行 ──
def _parse_agent_action(raw):
@ -1166,6 +1176,17 @@ async def pm_review_run(project_id, agent_id=None, model_name=None):
await approve_task(task_id, project_id, who="agent.pm", agent_id=agent_id, comment=comment)
next_role = await _get_next_role(task_role, project_id)
if next_role:
# 迭代边界:任务若归属老迭代(非当前迭代=该项目最新创建的迭代),
# 链到此终止,不再自动触发下一角色任务——「新迭代创建后老迭代不再产生新任务」。
task_iter = _task_iteration_name(task)
if task_iter:
cur = await sor.sqlExe(
"SELECT iteration_name FROM sd_iterations WHERE project_id=${pid}$ ORDER BY created_at DESC LIMIT 1",
{"pid": project_id})
cur_name = getattr(cur[0], 'iteration_name', '') if cur else ''
if cur_name and task_iter != cur_name:
logger.info(f"迭代边界:任务 {task_id} 归属老迭代「{task_iter}」(当前「{cur_name}」),链终止")
return {"status": "completed", "task_id": task_id, "comment": comment or "迭代已结束,链终止"}
next_tid, next_title = await _create_next_task(sor, project_id, task, next_role, comment)
return {"status": "approved", "task_id": task_id, "next_task_id": next_tid, "next_role": next_role, "comment": comment}
else: