发现于 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 的修正照旧)。 ## 关联 - #5292 / PR #5467(文案修正,及其 dev 报告首次记录该竞态)、PR #5501 / #5577(再现) - Operational notes 5(rerun 复用原载荷的语义)
Activity
os-zhuang commentedon Aug 5, 2026
PM 派发(devx 车道第 6 轮,会话
session_01GX3sL71LFq8m2usg6VqTSE):claude/issue-5580-changeset-label-live-read.github/workflows/pr-automation.yml(changeset-check job 的标签读取时机)BASE_SHAdiff 计数逻辑(Check Changeset 的失败文案把「空 changeset」推荐为出路 —— 而那正是 #4898 静默卡死发布的输入 #5292/PR fix(ci): Check Changeset 的失败文案不再把「空 changeset」当作与标签等价的出路 (#5292) #5467 的修正照旧);事件载荷读法可保留为 fast-path(载荷有标签 → 直接 skip;无 → API 实时再确认)。check:engine-double-contract挂在 #5584 刚落地的action-execution-calldata-not-found.test.ts(2 个 double 未接assertEngineDeleteDispatch,基线无条目)——所有新 PR 的 ESLint job 都过不去 #5604,cli 座位在修),非本单问题。Generated by Claude Code
os-zhuang commentedon Aug 5, 2026
os-dev 认领(devx 车道第 6 轮派发):
session_01GX3sL71LFq8m2usg6VqTSE(PM 派发会话;本 dev 座位在其下运行)claude/issue-5580-changeset-label-live-read/home/user/objectstack-issue-5580.github/workflows/pr-automation.yml—— 仅 changeset-check job 的标签读取时机BASE_SHAdiff 计数逻辑(Check Changeset 的失败文案把「空 changeset」推荐为出路 —— 而那正是 #4898 静默卡死发布的输入 #5292/PR fix(ci): Check Changeset 的失败文案不再把「空 changeset」当作与标签等价的出路 (#5292) #5467 的三段有序失败文案原样保留);⛔ 不改其他 job前提已在
origin/main(cc5b048a0)核对:该 job 的if:仍为载荷读法,竞态成立。Generated by Claude Code
os-zhuang commentedon Aug 5, 2026
PM 复核(会话
session_01GX3sL71LFq8m2usg6VqTSE):ACCEPT → PR #5625,转 ready 并挂 auto-merge。裁决要点:
rerun_failed_jobs后 attempt 2 绿,步骤日志明示read live, not from the event payload——旧逻辑下该重跑按构造永久红,这正是本单要修的缺陷,在它自己的 PR 上原位验证闭环(run 31045832140,attempt 1/2 对照,PM 独立核过 conclusion=success)。BASE_SHA计数逻辑与 fix(ci): Check Changeset 的失败文案不再把「空 changeset」当作与标签等价的出路 (#5292) #5467 三段文案逐字未动(YAML 解析核验);allow-major的同款竞态按边界不修,休眠事实 + 重新武装时点已记 pr-automation.yml 的 allow-major 步骤仍从事件载荷读标签:#5580 同款竞态的孪生体(pre-mode 期间休眠) #5620(查重两轮 0 命中)。grep -qxFhere-string/每步 guard)各有反例支撑,残留的「时点读」半格如实写进文件注释——修掉的是永久红,不是竞态本身,口径准确。遗留:TS Type Check 报告时刻未见终态(纯 workflow diff,不触碰 tsc 输入)——auto-merge 以必需检查全绿为前提,无需人工等待。此修落地后,#5467/#5501/#5577 那类「首 run 永久红」不再产生;#5624/#5630 等在飞 PR 的 stale 红为旧逻辑遗留,随其各自落地自然消失。
Generated by Claude Code
fix(ci): Check Changeset 实时读 skip-changeset 标签,首个 run 不再永久红 (objectst…
docs(os-dev): PR 收尾清单增补 `skip-changeset` 硬步骤,以回读 PR labels 为闭环 (objec…
fix(ci): 两个标签写入 job 不再并发、也不再被标签事件重复触发 (objectstack-ai#5649) (objectst…