由 PM 座位记录(pm-dispatch devx),度量来自今天一整天的实跑,不是推断。
现象
走「路线 2:skip-changeset 标签」的 PR,首跑 Check Changeset 几乎必红,随后确认标签在位、rerun_failed_jobs 一次即转绿。今天在本车道实测复现 21 次(#6248 / #6252 / #6255 / #6282 / #6284 / #6289 / #6304 / #6310 / #6324 / #6335 / #6340 / #6353 / #6357 / #6358 / #6372 等,多为一 PR 一次)。
根因(结构性时序,非偶发)
pr-automation.yml 的 Check Changeset job 在 pull_request: opened 事件上起跑,起跑那一刻就读标签;而 skip-changeset 标签只能在 PR 创建之后才打得上(GitHub 没有「创建 PR 时原子地带标签」的路径给这条流程)。两者之间恒定存在一个几十秒级的窗口:
为什么现在值得修(以前不值得)
代价一直存在,但今天有两个新事实把它推过了门槛:
- 它消耗的是已经稀缺的资源。 今天 GitHub REST 配额两次整体耗尽(PM + 并发 dev 共用同一身份)。每一次竞态红都要花掉:一次标签读回 + 一次
rerun_failed_jobs + 一轮 job 重跑。21 次就是 21 组。在配额已成为吞吐瓶颈的前提下,这不再是「几分钟的小麻烦」。
- 它训练出一个坏习惯。 每份派单都写着「首跑红 = 已知竞态,确认标签后重跑一次」,于是每个 dev 都学会了看到
Check Changeset 红先重跑而不是先读日志。今天有 dev 在报告里明确写下这条处方的执行过程。一道门如果它的标准处置是「无视并重跑」,它对这条路线就已经不提供判别力了——而它对真正忘记写 changeset 的 PR 仍然必须提供判别力,两者混在同一个红色里。
候选方向(未预设结论,交实现者测量决定)
- 让首跑等一个短窗口再判:job 起跑后轮询标签若干秒(例如 ≤30s)再做判定。最小改动,但把等待成本转嫁给每一次运行。
- 改由
labeled 事件承担唯一判定:opened 那跑不下红色结论(或直接跳过),判定统一由 labeled / synchronize 事件的运行给出。⚠️ 需要确认:一个从头到尾没有任何标签动作的 PR(既没打 skip-changeset、也没有 bot 加标签)是否仍会被判到——若不会,这个方向会开一个真实的漏洞,必须配一条兜底。
- 判定推迟到 ready-for-review 或首次
synchronize:与本仓「PR 先 DRAFT、验收后才翻 ready」的既有流程对齐——draft 阶段本就不该拦人。
- 其他(例如让 job 在标签缺失时输出 neutral 而非 failure)。
⚠️ 硬约束:无论选哪条,「真的忘了写 changeset」这一类必须仍然响亮变红。本单的目的是消除结构性假红,不是放宽门禁。任何让该门变得更容易被绕过的修法,即使消灭了竞态,也是不可接受的。
落点与查重
未认领,交分诊定级。
Generated by Claude Code
由 PM 座位记录(pm-dispatch devx),度量来自今天一整天的实跑,不是推断。
现象
走「路线 2:
skip-changeset标签」的 PR,首跑Check Changeset几乎必红,随后确认标签在位、rerun_failed_jobs一次即转绿。今天在本车道实测复现 21 次(#6248 / #6252 / #6255 / #6282 / #6284 / #6289 / #6304 / #6310 / #6324 / #6335 / #6340 / #6353 / #6357 / #6358 / #6372 等,多为一 PR 一次)。根因(结构性时序,非偶发)
pr-automation.yml的Check Changesetjob 在pull_request: opened事件上起跑,起跑那一刻就读标签;而skip-changeset标签只能在 PR 创建之后才打得上(GitHub 没有「创建 PR 时原子地带标签」的路径给这条流程)。两者之间恒定存在一个几十秒级的窗口:为什么现在值得修(以前不值得)
代价一直存在,但今天有两个新事实把它推过了门槛:
rerun_failed_jobs+ 一轮 job 重跑。21 次就是 21 组。在配额已成为吞吐瓶颈的前提下,这不再是「几分钟的小麻烦」。Check Changeset红先重跑而不是先读日志。今天有 dev 在报告里明确写下这条处方的执行过程。一道门如果它的标准处置是「无视并重跑」,它对这条路线就已经不提供判别力了——而它对真正忘记写 changeset 的 PR 仍然必须提供判别力,两者混在同一个红色里。候选方向(未预设结论,交实现者测量决定)
labeled事件承担唯一判定:opened那跑不下红色结论(或直接跳过),判定统一由labeled/synchronize事件的运行给出。synchronize:与本仓「PR 先 DRAFT、验收后才翻 ready」的既有流程对齐——draft 阶段本就不该拦人。落点与查重
.github/workflows/pr-automation.yml(可能连带scripts/check-empty-changeset.mjs的自测面 —— 该脚本今天已有 36 条自测,含直接读 workflow 的 CONSUMER 断言)。未认领,交分诊定级。
Generated by Claude Code