docs(os-dev): PR 收尾清单增补 skip-changeset 硬步骤,以回读 PR labels 为闭环 - #5650
Merged
Conversation
测试-only / 工作流-only / `.claude/`-only 的 PR 不写 changeset,靠 `skip-changeset` 标签豁免 Check Changeset。此前收尾清单对这一步只字未提,dev 在 PR 正文「声明」了 标签却没有真正挂上,#5533/#5538 两例各烧一轮门禁红并由 PM 手工兜底 —— 「声明了 ≠ 执行了」正是 declared ≠ enforced 的 agent 版。 新增条目把它写成与「PR 正文以 Fixes 开头」同级的硬步骤,并按实测校正了三处认知: - 没有任何自动化会替你挂:`.github/labeler.yml` 九条规则里没有 `skip-changeset`, 2026-08-05 六例(#5533/#5538/#5542/#5624/#5642/#5645)的该标签全部来自 agent, `github-actions[bot]` 一次都没挂过 —— 它只负责 `size/*`、`documentation`、 `tests`、`ci/cd`。 - 只「加一个标签」,不要整集写入:整集写入会把 bot 刚挂的 `size/*` / `documentation` / `tests` 抹掉(#5533/#5538/#5642/#5645 的 agent `unlabeled` 事件即此),反向也成立 —— #5533 的标签 15:46:44 落、15:46:45 就被 `github-actions[bot]` 的写入抹掉,只活了一秒。 - 闭环是回读而不是 POST:Check Changeset 在 PR 打开后数秒就实时读一次标签 (#5580),`opened` run 通常早于标签落地 —— #5542 的 dev 做对了全套,仍留下 一条红 `opened` run,之后每一次 run 才被标签豁免。所以要在 bot 平息后回读 标签、并把读到的列表写进报告。
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
本 PR(#5650)自己按新硬步骤执行时,实测结果与原措辞相反:标签 22:03:54 落地, `opened` run(workflow run 31051251795,创建于 22:03:38)的 Check Changeset job 直到 22:04:35 才启动并做实时标签回读 —— 早于回读 41 秒落地的标签被读到,该 run 直接 **success**,并非预设的红。 于是这一句改为如实描述竞态:首 run 的颜色取决于 runner 启动耗时与 POST 落地 的先后,两个方向都有实例(#5542 红、#5650 绿)。指导语随之从「预期会红」改为 「尽快落标签,把首 run 的颜色当信息而不是自己的判决」。 预设方向被自己的实测证伪时如实记录,而不是让措辞压着实测走。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #5559
背景
测试-only / 工作流-only /
.claude/-only 的 PR 不写 changeset,靠skip-changeset标签豁免 Check Changeset —— 门禁自己的失败文案就把标签列为 PREFERRED 路径。但 os-dev 的「Definition of done」收尾清单对这一步一字未提:当前 main 的.claude/agents/os-dev.md全文搜 label 零命中。于是 dev 在 PR 正文里「声明」标签而没有真正挂上,#5533、#5538 各烧一轮门禁红并由 PM 手工兜底 —— 「声明了 ≠ 执行了」正是 declared ≠ enforced 的 agent 版。改动
.claude/agents/os-dev.md收尾清单新增一条硬步骤,与「PR 正文以 Fixes 开头」同级。19 行新增、0 行删除,单文件;其余段落一字未动(含 #5630 新加的 toolchain trap 5、#5642 今日重写的 Byte discipline)。实测校正了派发词的三处认知
派发词给的新数据点是「CI Auto Label 已会自动挂 skip-changeset,文案 PR has no user-facing published change,所以硬步骤应写成回读验证为准而非无条件 POST」。逐 PR 核对 timeline 后,前半句证伪,因此条款按实测事实落笔(「回读为准」这个结论保留 —— 但理由完全不同):
os-zhuang五次、claude[bot]一次);github-actions[bot]一次都没挂过,它只挂size/*、documentation、tests、ci/cd.github/labeler.yml九条规则里没有skip-changeset;仓内唯一匹配「PR has no user-facing published change」的字符串,是本 PR 初稿里我自己写下的那一行15:46:44已落地,15:46:45被github-actions[bot]的整集写入抹掉 —— 只活了一秒,dev 侧与「没挂」无法区分整集写入会互相抹:agent 每次挂标签都伴随一条自己发出的
unlabeled,把 bot 刚挂的size/*/documentation/tests抹掉(#5533/#5538/#5642/#5645 均可见);反向就是上表第三行。本 PR 自证时更抓到纯 CI 侧的一次:22:03:48bot 挂size/s,22:03:49bot 自己把它unlabeled又挂上documentation—— 与任何 agent 动作无关。条款因此写明只加一个标签。落点在 pr-automation.yml 与写入客户端,超出本单文件面,已另开 #5649,本 PR 不修。实践自证:本 PR 自己是新条款的第一次实测
22:03:52,PR 创建后 20 秒)["documentation"]—— CI 没有代挂skip-changeset,证实上表第一、二行POST /issues/5650/labels)["documentation","skip-changeset"],documentation未被抹;timeline 里我这次写入没有产生任何unlabeled事件 —— 与六例 agent 整集写入形成对照22:04:52)["documentation","size/s","skip-changeset"]—— 三个标签齐全,size/s由 bot 自行补回预设方向被证伪的一处,如实改掉了条款措辞。 初稿按 #5542 的历史预设「首 run 必然红」,并在本 PR 正文里写过「立刻落标签让首 run 直接豁免不可达」。实测相反:标签
22:03:54落地,而openedrun(workflow run31051251795,创建于22:03:38)的 Check Changeset job 直到22:04:35才启动并做实时回读 —— 读到了早它 41 秒的标签,该 run 直接 success。所以首 run 的颜色是一场由 runner 启动耗时决定的竞态,两个方向都有实例(#5542 红、#5650 绿),第二次 commit 把措辞改成如实描述竞态,并把指导语从「预期会红」改为「尽快落标签,把首 run 的颜色当信息而不是自己的判决」。验证
- Tear down …之后一行未动。node scripts/check-nul-bytes.mjs --self-test48 assertions 绿 + 全仓扫描OK (5573 tracked text file(s));改动文件自扫grep -naP控制字节零命中。check-doc-authoring(362 files clean)、check-role-word(43 baselined, no new)绿。**四个成对、反引号 20 个成对、最大 80 列与既有条目一致。.claude/diff),Check Changeset 经标签豁免。边界
⛔ 未动
.github/workflows/pr-automation.yml(#5580/#5625 已改,#5620 在排队);⛔ 未动 pm-dispatch SKILL.md 的 PM 兜底逻辑;⛔ 未写 changeset(.claude/文档-only,走标签路线)。