Skip to content

[PR Flow] 区分当前 required status 和历史 check runs,消除旧失败误判 #117

Description

@liuli195

Parent

#89

详细背景

PR #116 合并后,gh pr view --json statusCheckRollup 里同时出现了历史 check run 和当前 required status context:

  • 历史 PR Flow / evidence check run 27047433657CANCELLED
  • 历史 PR Flow Review Status / monitor check run 27047433659CANCELLED
  • 当前 required status context PR Flow / evidencePR Flow / review-statusResearch Governance / verify-full 均为 SUCCESS

用户侧仍看到“还有一个失败检查”,需要人工再用 gh pr viewgh 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=SUCCESSPR Flow / review-status=SUCCESSResearch Governance / verify-full=SUCCESS
  • 历史诊断:存在旧的 cancelled / failed check runs,但已被当前 status context supersede,不阻断

该能力不改变 required checks 规则,只让现有规则可见、可验证、可交接。

详细技术实现方案

  1. 在 PR Flow 状态归因逻辑中增加 final status summary,输入为 GitHub statusCheckRollup、required check 名单和当前 head。
  2. 对同名 check/status 做分组:优先使用当前 required StatusContext 或当前 head 对应 check;旧 CheckRun 只保留为 diagnostic。
  3. 输出结构化字段:current_required_checksblocking_signalsdiagnostic_check_runssuperseded_runsfinal_verdict
  4. pr-submit 在等待 required checks、merge 后 audit、cleanup 前后复用同一归因函数,避免不同阶段判断不一致。
  5. .local/pr-flow/status.json 只把当前失败 required check 写入 blocking_signals;旧失败/取消 run 写入 diagnostic_signals,并带 run URL。
  6. 增加回归测试:
    • 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

  • PR Flow 可以输出当前 required checks 的最终归因摘要。
  • 历史 failed/cancelled/superseded check runs 不会被当成当前阻断。
  • 当前失败 required check 仍会阻断。
  • status.json 按 blocking / diagnostic 区分旧 run 和当前状态。
  • PR 跳过未变化的 PR Evidence 同步 #116 这类 rollup 形态有回归测试。

Blocked by

None - can start immediately

Metadata

Metadata

Assignees

No one assigned

    Labels

    priority:P2Medium priority: efficiency or operator-experience improvementready-for-agent

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions