Parent
#89
详细背景
PR #116 合并后,gh pr view --json statusCheckRollup 里同时出现了历史 check run 和当前 required status context:
- 历史
PR Flow / evidence check run 27047433657 为 CANCELLED。
- 历史
PR Flow Review Status / monitor check run 27047433659 为 CANCELLED。
- 当前 required status context
PR Flow / evidence、PR Flow / review-status、Research Governance / verify-full 均为 SUCCESS。
用户侧仍看到“还有一个失败检查”,需要人工再用 gh pr view、gh run list 区分旧 run 和当前阻断状态。
PR #115 的 post-merge PR Flow / evidence 失败根因已经由 PR #116 修复;本 issue 不重复 #113 / PR #116 的 root cause。这里记录的是未解决的状态归因问题:历史失败、取消或 superseded check runs 仍会混入 rollup,让 agent 或用户误以为当前 PR 仍被阻断。
这和 PR 工作流规则冲突:规则已经要求“旧 required-check failure 只能进入 diagnostic_signals,当前阻断只进入 blocking_signals”,但现在默认查看路径仍需要人工完成这一步归因。
产品解决方案
为 PR Flow 增加最终状态归因摘要:明确区分“当前 required checks 阻断”和“历史诊断信号”。
用户视角:PR 合并前后只需要看到一个稳定结论,例如:
- 当前阻断:None
- 当前 required checks:
PR Flow / evidence=SUCCESS、PR Flow / review-status=SUCCESS、Research Governance / verify-full=SUCCESS
- 历史诊断:存在旧的 cancelled / failed check runs,但已被当前 status context supersede,不阻断
该能力不改变 required checks 规则,只让现有规则可见、可验证、可交接。
详细技术实现方案
- 在 PR Flow 状态归因逻辑中增加 final status summary,输入为 GitHub
statusCheckRollup、required check 名单和当前 head。
- 对同名 check/status 做分组:优先使用当前 required
StatusContext 或当前 head 对应 check;旧 CheckRun 只保留为 diagnostic。
- 输出结构化字段:
current_required_checks、blocking_signals、diagnostic_check_runs、superseded_runs、final_verdict。
pr-submit 在等待 required checks、merge 后 audit、cleanup 前后复用同一归因函数,避免不同阶段判断不一致。
.local/pr-flow/status.json 只把当前失败 required check 写入 blocking_signals;旧失败/取消 run 写入 diagnostic_signals,并带 run URL。
- 增加回归测试:
- 旧
CANCELLED check run + 当前 SUCCESS status context => 不阻断。
- 旧
FAILURE check run + 当前 SUCCESS status context => 不阻断,进入 diagnostic。
- 当前 required status context 为
FAILURE => 阻断。
- 当前 required status context 缺失但只有旧 success run => 阻断或 pending,不误判为 success。
Acceptance criteria
Blocked by
None - can start immediately
Parent
#89
详细背景
PR #116 合并后,
gh pr view --json statusCheckRollup里同时出现了历史 check run 和当前 required status context:PR Flow / evidencecheck run27047433657为CANCELLED。PR Flow Review Status / monitorcheck run27047433659为CANCELLED。PR Flow / evidence、PR Flow / review-status、Research Governance / verify-full均为SUCCESS。用户侧仍看到“还有一个失败检查”,需要人工再用
gh pr view、gh run list区分旧 run 和当前阻断状态。PR #115 的 post-merge
PR Flow / evidence失败根因已经由 PR #116 修复;本 issue 不重复 #113 / PR #116 的 root cause。这里记录的是未解决的状态归因问题:历史失败、取消或 superseded check runs 仍会混入 rollup,让 agent 或用户误以为当前 PR 仍被阻断。这和 PR 工作流规则冲突:规则已经要求“旧 required-check failure 只能进入 diagnostic_signals,当前阻断只进入 blocking_signals”,但现在默认查看路径仍需要人工完成这一步归因。
产品解决方案
为 PR Flow 增加最终状态归因摘要:明确区分“当前 required checks 阻断”和“历史诊断信号”。
用户视角:PR 合并前后只需要看到一个稳定结论,例如:
PR Flow / evidence=SUCCESS、PR Flow / review-status=SUCCESS、Research Governance / verify-full=SUCCESS该能力不改变 required checks 规则,只让现有规则可见、可验证、可交接。
详细技术实现方案
statusCheckRollup、required check 名单和当前 head。StatusContext或当前 head 对应 check;旧CheckRun只保留为 diagnostic。current_required_checks、blocking_signals、diagnostic_check_runs、superseded_runs、final_verdict。pr-submit在等待 required checks、merge 后 audit、cleanup 前后复用同一归因函数,避免不同阶段判断不一致。.local/pr-flow/status.json只把当前失败 required check 写入blocking_signals;旧失败/取消 run 写入diagnostic_signals,并带 run URL。CANCELLEDcheck run + 当前SUCCESSstatus context => 不阻断。FAILUREcheck run + 当前SUCCESSstatus context => 不阻断,进入 diagnostic。FAILURE=> 阻断。Acceptance criteria
Blocked by
None - can start immediately