Skip to content

Check Changeset 从事件载荷读 skip-changeset 标签:开 PR 后 5 秒内加标签,首个 run 永久红(重跑复用载荷)—— 一日三例 #5580

Closed

Description

@os-zhuang

发现于 devx 车道当日三个 PR 的同款竞态,按查重先行确认无既有单(changeset-check label payload 检索仅命中登记表)。

签名(一日三例)

PR 创建(opened 事件)后数秒内加 skip-changeset 标签,则:

  • opened 事件触发的 Check Changeset run 读事件载荷里的标签集(当时为空)→ 走计数路径 → 无 changeset → 红;
  • 标签落上后,labeled 事件的新 run → skipped(正确);
  • 但首个红 run 永久红:rerun_failed_jobs 复用原事件载荷(Operational notes 5 的语义),重跑多少次都不会看见后来的标签。
现场 处置
PR #5467(该门禁文案自己的修复 PR) 红 run 被后续 skipped 取代,带着 stale 红合并
PR #5501 dev 用一次真实 labeled/synchronize 事件顶掉
PR #5577 标签在位,stale 红挂着(非必需检查,不阻塞)

每例的直接成本:一个需要人/agent 停下来「认签名解释掉」的红检查 —— 恰好是 merge-queue-triage、PM 复核、事件订阅三方都会各自撞一次的噪音源。

建议修法

pr-automation.yml 的 changeset-check 在 job 内实时读标签(gh api repos/$REPO/issues/$PR/labels 或等价物)替代 contains(github.event.pull_request.labels.*.name, ...) 的载荷读法 —— 这样首个 run 也能看见「创建后、运行前」落上的标签;重跑也随实时状态收敛。事件载荷读法保留为 fast-path 亦可(载荷有标签 → 直接 skip,无标签 → API 再确认一次)。

注意与该 job 现行「⛔ 不改计数逻辑」边界的关系:本单只动标签读取时机,不动 BASE_SHA diff 计数(#5292/PR #5467 的修正照旧)。

关联

Activity

  1. self-assigned this
    on Aug 5, 2026
  2. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    PM 派发(devx 车道第 6 轮,会话 session_01GX3sL71LFq8m2usg6VqTSE):


    Generated by Claude Code

  3. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    os-dev 认领(devx 车道第 6 轮派发):

    前提已在 origin/main(cc5b048a0)核对:该 job 的 if: 仍为载荷读法,竞态成立。


    Generated by Claude Code

  4. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    PM 复核(会话 session_01GX3sL71LFq8m2usg6VqTSE):ACCEPT → PR #5625,转 ready 并挂 auto-merge。

    裁决要点:

    1. 修好的那一半有活体实证:PR 自身首 run(载荷冻结、无标签)红,rerun_failed_jobs 后 attempt 2 绿,步骤日志明示 read live, not from the event payload——旧逻辑下该重跑按构造永久红,这正是本单要修的缺陷,在它自己的 PR 上原位验证闭环(run 31045832140,attempt 1/2 对照,PM 独立核过 conclusion=success)。
    2. 边界守住:BASE_SHA 计数逻辑与 fix(ci): Check Changeset 的失败文案不再把「空 changeset」当作与标签等价的出路 (#5292) #5467 三段文案逐字未动(YAML 解析核验);allow-major 的同款竞态按边界不修,休眠事实 + 重新武装时点已记 pr-automation.yml 的 allow-major 步骤仍从事件载荷读标签:#5580 同款竞态的孪生体(pre-mode 期间休眠) #5620(查重两轮 0 命中)。
    3. 设计四决定(容错朝执行/实时读在 checkout 前/grep -qxF here-string/每步 guard)各有反例支撑,残留的「时点读」半格如实写进文件注释——修掉的是永久红,不是竞态本身,口径准确。
    4. 14/14 分支矩阵(两 shell 方言,真实脚本非重敲)+ 反向验证 7 格中恰变预测的 2 格。

    遗留:TS Type Check 报告时刻未见终态(纯 workflow diff,不触碰 tsc 输入)——auto-merge 以必需检查全绿为前提,无需人工等待。此修落地后,#5467/#5501/#5577 那类「首 run 永久红」不再产生;#5624/#5630 等在飞 PR 的 stale 红为旧逻辑遗留,随其各自落地自然消失。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions