由 #6378 / PR #6429 的实现过程中记录,未在该 PR 内修复 (超出本单范围),按 Prime Directive #10 单独立观察单。
现象
pr-automation.yml 的 changeset-check job 里,能让 PR 变红的步骤共五个。PR #6429 之后,其中四个同时认两次 活标签读取(快路径读取 + 结算读):
Require a changeset (or the skip-changeset label)
Reject an empty-frontmatter changeset added by this PR
Require an ADR-0087 disposition on a declared-breaking changeset
Guard against accidental major bumps (launch window)
第五个 —— Resolve the diff base (merge base with the base branch) —— 只带 steps.labels.outputs.skip != 'true' 这一条快路径守卫,而它自己有两处 exit 1:
事件不带 base 分支;
git merge-base 算不出来(例如 origin/BASE_REF 取不到)。
后果(复合条件,今天没人撞得到)
要踩到需要同时成立两件事:
skip-changeset 标签晚于快路径读取 才落地(即 Check Changeset 的首跑对 skip-changeset 路线结构性必红:job 在 PR 打开瞬间读标签,而标签只能在创建之后打上(今日实测复现 21 次) #6378 的那个窗口内 —— 这恰恰是常态),并且
该跑的 git 基准解析真的失败。
此时 Resolve the diff base 会在结算读有机会纠正之前就把 job 判红,而这个 PR 本该是豁免的。条件 2 极少发生(需要 fetch 失败一类的基础设施抖动),所以今天没有已知实例 ,归观察类。
这是有意留下的,不是遗漏
PR #6429 在正文的「不在本 PR 里」一节写明了该格,理由是:它的 exit 1 表达的是「git 基准不可用」,不是 changeset 判决,本就不受标签豁免;#6378 的范围是消除结构性假红,顺手扩大一个豁免面不在其内。该 PR 新增的 CONSUMER 断言按「跑 check-*.mjs 或发出 no-changeset 错误」来圈定判定步骤,有意 把这一步排除在外,以免断言把一个没论证过的豁免钉成契约。
候选处置(未预设结论)
维持现状,只补注释说明该格是有意的(最省,今天也确实没人撞到)。
把结算读前移 到 Resolve the diff base 之前。代价:结算读能白拿的已流逝时间从「约 +45s」降到「约 +20s」(checkout 之前),窗口内需要真等的概率上升 —— 而 fix(ci): Check Changeset 的 skip-changeset 判定加一次「结算读」,首跑不再结构性必红 (#6378) #6429 的成本论证正建立在「等待只向将红的 PR 收取」上,前移会让计数尚未发生、无法判断该 PR 是否将红,等待面因此扩大到所有无标签的 PR。这一条与 Check Changeset 的首跑对 skip-changeset 路线结构性必红:job 在 PR 打开瞬间读标签,而标签只能在创建之后打上(今日实测复现 21 次) #6378 的成本结论直接冲突,需要重新测量再决定。
让 Resolve the diff base 的失败先落成一个 output,由后面已认两次读取的判定步骤统一裁决。
倾向 1 或 3;⛔ 选 2 之前必须重测,否则会把 #6378 刚消掉的成本以另一种形式加回来。
未认领,交分诊定级。
由 #6378 / PR #6429 的实现过程中记录,未在该 PR 内修复(超出本单范围),按 Prime Directive #10 单独立观察单。
现象
pr-automation.yml的changeset-checkjob 里,能让 PR 变红的步骤共五个。PR #6429 之后,其中四个同时认两次活标签读取(快路径读取 + 结算读):Require a changeset (or the skip-changeset label)Reject an empty-frontmatter changeset added by this PRRequire an ADR-0087 disposition on a declared-breaking changesetGuard against accidental major bumps (launch window)第五个 ——
Resolve the diff base (merge base with the base branch)—— 只带steps.labels.outputs.skip != 'true'这一条快路径守卫,而它自己有两处exit 1:git merge-base算不出来(例如origin/BASE_REF取不到)。后果(复合条件,今天没人撞得到)
要踩到需要同时成立两件事:
skip-changeset标签晚于快路径读取才落地(即 Check Changeset 的首跑对 skip-changeset 路线结构性必红:job 在 PR 打开瞬间读标签,而标签只能在创建之后打上(今日实测复现 21 次) #6378 的那个窗口内 —— 这恰恰是常态),并且此时
Resolve the diff base会在结算读有机会纠正之前就把 job 判红,而这个 PR 本该是豁免的。条件 2 极少发生(需要 fetch 失败一类的基础设施抖动),所以今天没有已知实例,归观察类。这是有意留下的,不是遗漏
PR #6429 在正文的「不在本 PR 里」一节写明了该格,理由是:它的
exit 1表达的是「git 基准不可用」,不是 changeset 判决,本就不受标签豁免;#6378 的范围是消除结构性假红,顺手扩大一个豁免面不在其内。该 PR 新增的 CONSUMER 断言按「跑check-*.mjs或发出 no-changeset 错误」来圈定判定步骤,有意把这一步排除在外,以免断言把一个没论证过的豁免钉成契约。候选处置(未预设结论)
Resolve the diff base之前。代价:结算读能白拿的已流逝时间从「约 +45s」降到「约 +20s」(checkout 之前),窗口内需要真等的概率上升 —— 而 fix(ci): Check Changeset 的 skip-changeset 判定加一次「结算读」,首跑不再结构性必红 (#6378) #6429 的成本论证正建立在「等待只向将红的 PR 收取」上,前移会让计数尚未发生、无法判断该 PR 是否将红,等待面因此扩大到所有无标签的 PR。这一条与 Check Changeset 的首跑对 skip-changeset 路线结构性必红:job 在 PR 打开瞬间读标签,而标签只能在创建之后打上(今日实测复现 21 次) #6378 的成本结论直接冲突,需要重新测量再决定。Resolve the diff base的失败先落成一个 output,由后面已认两次读取的判定步骤统一裁决。倾向 1 或 3;⛔ 选 2 之前必须重测,否则会把 #6378 刚消掉的成本以另一种形式加回来。
未认领,交分诊定级。