fix(flow): 等上游QC未过的维度不算编排掉链——合法等待轮不再空转烧orch_done(中电新项目误抛待办根因)

This commit is contained in:
yumoqing 2026-09-04 15:14:30 +08:00
parent 41d55b5d39
commit 7733ff31cf

View File

@ -586,32 +586,49 @@ async def reconcile_project(sor, project_id, project_name=""):
if await _open_orch_tasks(sor, project_id) > 0: if await _open_orch_tasks(sor, project_id) > 0:
acts.append("waiting: PM 解析编排任务在办") acts.append("waiting: PM 解析编排任务在办")
else: else:
_ft2 = _ft or await _latest_tender_file_ts(sor, project_id) # 2026-09-04 修复(中电新项目实测):上游 QC 未过的维度是合法等待,
orch_done = await _orch_done_count(sor, project_id, since=_ft2 or '') # 不是「掉链」——PM 即使接到编排任务也派发不了(dispatch_analysis_dim
if orch_done >= MAX_ORCH_ATTEMPT: # 依赖门禁拒绝)。把这类维度留在 pending 会让编排任务空转(无可派发维度
ht = await find_human_task(sor, project_id, "general", status="pending") # 即完成),空转轮次计入 orch_done → MAX_ORCH_ATTEMPT 轮后误抛
if not ht: # 「PM 解析编排掉链」人工待办。只有真正可派发的维度才驱动编排/掉链计数。
await create_human_task( qc_passed = await _qc_passed_types(sor, project_id)
sor, project_id, "general", dispatchable, waiting_up = [], []
"PM 解析编排掉链,需人工介入", for d, lb in first_run_pending:
("解析阶段已完成 %d 次编排任务,仍有维度未启动/未过 QC:%s。\n" up_ok = all(t in qc_passed
"请人工核对编排任务卡点(任务列表,角色 agent.pm," for u in DIM_UPSTREAM.get(d, ())
"参数 task_kind=analysis_orchestration)," for t in DIM_QC_TYPES[u])
"或人工派发缺失维度。" (dispatchable if up_ok else waiting_up).append((d, lb))
% (orch_done, "、".join(lb for _, lb in first_run_pending))), if waiting_up:
assignee_role="owner.superuser") acts.append("waiting: 维度「%s」等上游 QC 通过(合法等待,不计掉链)"
await sor.sqlExe("COMMIT", {}) % "、".join(lb for _, lb in waiting_up))
acts.append("escalated: PM 解析编排掉链 → 人工介入") first_run_pending = dispatchable
else: if first_run_pending:
dims_brief = "、".join("%s(%s)" % (lb, d) for d, lb in first_run_pending) _ft2 = _ft or await _latest_tender_file_ts(sor, project_id)
tid = await create_role_task( orch_done = await _orch_done_count(sor, project_id, since=_ft2 or '')
sor, project_id, R_PM, if orch_done >= MAX_ORCH_ATTEMPT:
"%s 解析编排:按任务链派发分析维度" % pname, ht = await find_human_task(sor, project_id, "general", status="pending")
{"stage": "analysis_orchestration", if not ht:
"task_kind": "analysis_orchestration", await create_human_task(
"pending_dims": [d for d, _ in first_run_pending]}) sor, project_id, "general",
acts.append("created: PM 解析编排任务 %s(待派发维度:%s)" % (tid, dims_brief)) "PM 解析编排掉链,需人工介入",
("解析阶段已完成 %d 次编排任务,仍有维度未启动/未过 QC:%s。\n"
"请人工核对编排任务卡点(任务列表,角色 agent.pm,"
"参数 task_kind=analysis_orchestration),"
"或人工派发缺失维度。"
% (orch_done, "、".join(lb for _, lb in first_run_pending))),
assignee_role="owner.superuser")
await sor.sqlExe("COMMIT", {}) await sor.sqlExe("COMMIT", {})
acts.append("escalated: PM 解析编排掉链 → 人工介入")
else:
dims_brief = "、".join("%s(%s)" % (lb, d) for d, lb in first_run_pending)
tid = await create_role_task(
sor, project_id, R_PM,
"%s 解析编排:按任务链派发分析维度" % pname,
{"stage": "analysis_orchestration",
"task_kind": "analysis_orchestration",
"pending_dims": [d for d, _ in first_run_pending]})
acts.append("created: PM 解析编排任务 %s(待派发维度:%s)" % (tid, dims_brief))
await sor.sqlExe("COMMIT", {})
# ── A2. 分析产出 QC 门禁(五个类型逐一审核,每类一个审核任务并行;阈值见 bid_qc_pass_score)── # ── A2. 分析产出 QC 门禁(五个类型逐一审核,每类一个审核任务并行;阈值见 bid_qc_pass_score)──
# 2026-09-03 章节级门禁:本段只负责「推进 QC」(重做/审核/冒泡),不再提前 return # 2026-09-03 章节级门禁:本段只负责「推进 QC」(重做/审核/冒泡),不再提前 return