Skip to content

Commit 3d9aa3e

Browse files
os-litantclaude
andauthored
docs(os-dev): the skip-changeset clause states its criterion as the rule and its list as examples; dispatch-gates prints the same criterion (#13680) (#14621)
The clause used to state a criterion ("publishes nothing from any package") beside a CLOSED list that omitted shapes the criterion covers — repo-root tooling config and the private example workspaces — so the two readings disagreed and every such PR cost an escalation. The list is now illustrative under the criterion; the two escalation shapes appear as examples only. Line-neutral under the os-dev.md ratchet (469/469): the +59 bytes of the new sentence are paid by deleting 74 bytes inside the same clause — the reachability aside "not an endpoint's or a seat's", "the gate answers before the endpoint", and "an open-gate session measured 200" — whose readings live in platform-readings, which the clause still points at. dispatch-gates.mjs's pending-changeset heading restates the same criterion in place of "unless this card is docs-only", and its self-test regex pins the new sentence exactly. Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1 Co-authored-by: Claude <noreply@anthropic.com>
1 parent a3d5724 commit 3d9aa3e

2 files changed

Lines changed: 15 additions & 15 deletions

File tree

.claude/agents/os-dev.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -325,19 +325,19 @@ dispatch prompt 只携带每单增量(裁决引文、裁决 / PM-机制假设分
325325
内容的 PR 顺带」、2026-08-29 裁「筹行(为内容购买行数)⛔ vs 独立密度修复(无内容购买)允
326326
许」。分界只问折行有没有为新增内容买行 —— 门禁分不出两种 net-0;⛔ 不买内容的密度
327327
修复是修复,不要当筹行拒掉。删不出等量内容 ⇒ 报 `blocked`,⛔ 不抬 ceiling(人工地板)。
328-
- **`skip-changeset` 标签按仓库分流——先认清目标仓库有没有这个机制。** 判据:**不从任何包
329-
发布东西**;闭合清单:仅含 `docs/adr/**` · `.claude/**` · `scripts/pm/**` · tests/workflow · 注释 的
330-
diff**本仓库**:标签是真实机制,打标签是你的步骤、不是 CI 的,**PR 一开出就打**,⛔ 永不
331-
Check Changeset 转红再补。写入首选**加法端点**(REST `POST .../issues/<n>/labels`——不碰已有标
332-
),⚠️ 可达性是**会话**属性、不是端点或席位的(门先于端点应答、读写同拒,门开会话
333-
实测 200;读数住 platform-readings)⇒ 先探后用;被拒 ⇒ 走回退:MCP 读现值→并集→整组
334-
写→**必做对比式读回**(diff 现集对 union(读集, 目标),union 有而回读缺 = 被剥的并发标签,
335-
挂并写进报告;读回只**检测**剥除防不了,门语义标签被剥恰成绿灯),并申报换道。加法写
336-
同样必要不充分:size-labeler 整组 PUT 曾 ~1 秒内抹掉正确加法写——收尾一律读回、清单引
337-
进报告;标签消失读作被抹,**重新加上**,不是你的错。关此步骤的是读回不是写入;读回
338-
验「写落了」验不出「有门在读」——幻影门标签读回照样成功。**objectui:同名标签对象
339-
在(历史误挂铸出),零 workflow/脚本读它、豁免不了任何东西,pin 测试钉着**——那边用空
340-
frontmatter 的 changeset 声明,门禁判定行是权威;⛔ 永不在那边施加该标签。
328+
- **`skip-changeset` 标签按仓库分流——先认清目标仓库有没有这个机制。** 判据是规则:**不从
329+
任何包发布东西**;清单仅为示例(`docs/adr/**` · `.claude/**` · `scripts/pm/**` · 仓根工具配置 ·
330+
`examples/**` 等私有 workspace · tests/workflow · 注释)**本仓库**:标签是真实机制,打标签是你
331+
的步骤、不是 CI 的,**PR 一开出就打**,⛔ 永不等 Check Changeset 转红再补。写入首选**加法端
332+
**(REST `POST .../issues/<n>/labels`——不碰已有标签),⚠️ 可达性是**会话**属性(读写同拒;读
333+
数住 platform-readings)⇒ 先探后用;被拒 ⇒ 走回退:MCP 读现值→并集→整组写→**必做对比式
334+
读回**(diff 现集对 union(读集, 目标),union 有而回读缺 = 被剥的并发标签,重挂并写进报告;读
335+
回只**检测**剥除防不了,门语义标签被剥恰成绿灯),并申报换道。加法写同样必要不充
336+
:size-labeler 整组 PUT 曾 ~1 秒内抹掉正确加法写——收尾一律读回、清单引进报告;标签消
337+
失读作被抹,**重新加上**,不是你的错。关此步骤的是读回不是写入;读回验「写落了」验不
338+
出「有门在读」——幻影门标签读回照样成功。**objectui:同名标签对象在(历史误挂铸出),
339+
零 workflow/脚本读它、豁免不了任何东西,pin 测试钉着**——那边用空 frontmatter 的 changeset
340+
声明,门禁判定行是权威;⛔ 永不在那边施加该标签。
341341
- **报告在 draft PR 时点交付 —— CI 收敛等待归 PM,不归你**(维护者 2026-08-10 拍板)。分支一推
342342
上、draft PR 一开出,立刻交报告;门禁状态如实记录 —— `in_progress` 是诚实值。⛔ draft PR 开
343343
出后永不 sleep、定时等待或空转轮询 CI(实测:空转轮询烧掉的恰是一个红门禁需要的预

scripts/pm/dispatch-gates.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7548,7 +7548,7 @@ export function pendingChangesetFamilies(entries, matchedChecks, probe = CHANGES
75487548
export function pendingChangesetLines(pending, probe = CHANGESET_PROBE_PATH) {
75497549
if (pending.length === 0) return [];
75507550
const lines = [
7551-
`Once a changeset exists, ${pending.length} more famil(ies) apply — write one unless this card is docs-only:`,
7551+
`Once a changeset exists, ${pending.length} more famil(ies) apply — write one unless this card publishes nothing from any released package (then the skip-changeset label instead, per the os-dev clause):`,
75527552
];
75537553
for (const { entry, hits } of [...pending].sort((a, b) => a.check.localeCompare(b.check))) {
75547554
const via = hits.map((h) => `${h.via} '${h.hint}'`).join('; ');
@@ -15297,7 +15297,7 @@ function selfTest() {
1529715297
t('and its provenance says so, rather than claiming a source literal', csTriggered[0]?.hits?.[0]?.via?.startsWith('CI trigger in') === true);
1529815298
// Rendering.
1529915299
const pendingOut = pendingChangesetLines(pending);
15300-
t('the section heading counts the families and carries the docs-only escape', /^Once a changeset exists, 2 more famil\(ies\) apply — write one unless this card is docs-only:$/.test(pendingOut[0]));
15300+
t('the section heading counts the families and carries the publishes-nothing escape, stated as the os-dev clause states it', /^Once a changeset exists, 2 more famil\(ies\) apply — write one unless this card publishes nothing from any released package \(then the skip-changeset label instead, per the os-dev clause\):$/.test(pendingOut[0]));
1530115301
t('every row is a RUNNABLE invocation, the same as the matched list', pendingOut.filter((l) => l.startsWith(' - ')).every((l) => l.startsWith(' - pnpm ') || l.startsWith(' - node ')));
1530215302
t('every row prints the hypothetical path it would match, so the lead cannot read as a real one', pendingOut.filter((l) => l.startsWith(' - ')).every((l) => l.includes(CHANGESET_PROBE_PATH)));
1530315303
t('the section says out loud that it is not a fourth bucket', pendingOut.some((l) => l.includes('NOT a fourth bucket')));

0 commit comments

Comments
 (0)