diff --git a/.claude/agents/os-dev.md b/.claude/agents/os-dev.md index 28b7cdb746..537cc802a9 100644 --- a/.claude/agents/os-dev.md +++ b/.claude/agents/os-dev.md @@ -325,19 +325,19 @@ dispatch prompt 只携带每单增量(裁决引文、裁决 / PM-机制假设分 内容的 PR 顺带」、2026-08-29 裁「筹行(为内容购买行数)⛔ vs 独立密度修复(无内容购买)允 许」。分界只问折行有没有为新增内容买行 —— 门禁分不出两种 net-0;⛔ 不买内容的密度 修复是修复,不要当筹行拒掉。删不出等量内容 ⇒ 报 `blocked`,⛔ 不抬 ceiling(人工地板)。 -- **`skip-changeset` 标签按仓库分流——先认清目标仓库有没有这个机制。** 判据:**不从任何包 - 发布东西**;闭合清单:仅含 `docs/adr/**` · `.claude/**` · `scripts/pm/**` · tests/workflow · 注释 的 - diff。**本仓库**:标签是真实机制,打标签是你的步骤、不是 CI 的,**PR 一开出就打**,⛔ 永不 - 等 Check Changeset 转红再补。写入首选**加法端点**(REST `POST .../issues//labels`——不碰已有标 - 签),⚠️ 可达性是**会话**属性、不是端点或席位的(门先于端点应答、读写同拒,门开会话 - 实测 200;读数住 platform-readings)⇒ 先探后用;被拒 ⇒ 走回退:MCP 读现值→并集→整组 - 写→**必做对比式读回**(diff 现集对 union(读集, 目标),union 有而回读缺 = 被剥的并发标签,重 - 挂并写进报告;读回只**检测**剥除防不了,门语义标签被剥恰成绿灯),并申报换道。加法写 - 同样必要不充分:size-labeler 整组 PUT 曾 ~1 秒内抹掉正确加法写——收尾一律读回、清单引 - 进报告;标签消失读作被抹,**重新加上**,不是你的错。关此步骤的是读回不是写入;读回 - 验「写落了」验不出「有门在读」——幻影门标签读回照样成功。**objectui:同名标签对象 - 在(历史误挂铸出),零 workflow/脚本读它、豁免不了任何东西,pin 测试钉着**——那边用空 - frontmatter 的 changeset 声明,门禁判定行是权威;⛔ 永不在那边施加该标签。 +- **`skip-changeset` 标签按仓库分流——先认清目标仓库有没有这个机制。** 判据是规则:**不从 + 任何包发布东西**;清单仅为示例(`docs/adr/**` · `.claude/**` · `scripts/pm/**` · 仓根工具配置 · + `examples/**` 等私有 workspace · tests/workflow · 注释)。**本仓库**:标签是真实机制,打标签是你 + 的步骤、不是 CI 的,**PR 一开出就打**,⛔ 永不等 Check Changeset 转红再补。写入首选**加法端 + 点**(REST `POST .../issues//labels`——不碰已有标签),⚠️ 可达性是**会话**属性(读写同拒;读 + 数住 platform-readings)⇒ 先探后用;被拒 ⇒ 走回退:MCP 读现值→并集→整组写→**必做对比式 + 读回**(diff 现集对 union(读集, 目标),union 有而回读缺 = 被剥的并发标签,重挂并写进报告;读 + 回只**检测**剥除防不了,门语义标签被剥恰成绿灯),并申报换道。加法写同样必要不充 + 分:size-labeler 整组 PUT 曾 ~1 秒内抹掉正确加法写——收尾一律读回、清单引进报告;标签消 + 失读作被抹,**重新加上**,不是你的错。关此步骤的是读回不是写入;读回验「写落了」验不 + 出「有门在读」——幻影门标签读回照样成功。**objectui:同名标签对象在(历史误挂铸出), + 零 workflow/脚本读它、豁免不了任何东西,pin 测试钉着**——那边用空 frontmatter 的 changeset + 声明,门禁判定行是权威;⛔ 永不在那边施加该标签。 - **报告在 draft PR 时点交付 —— CI 收敛等待归 PM,不归你**(维护者 2026-08-10 拍板)。分支一推 上、draft PR 一开出,立刻交报告;门禁状态如实记录 —— `in_progress` 是诚实值。⛔ draft PR 开 出后永不 sleep、定时等待或空转轮询 CI(实测:空转轮询烧掉的恰是一个红门禁需要的预 diff --git a/scripts/pm/dispatch-gates.mjs b/scripts/pm/dispatch-gates.mjs index 7d11d5dc5a..dfc0bdf211 100644 --- a/scripts/pm/dispatch-gates.mjs +++ b/scripts/pm/dispatch-gates.mjs @@ -7548,7 +7548,7 @@ export function pendingChangesetFamilies(entries, matchedChecks, probe = CHANGES export function pendingChangesetLines(pending, probe = CHANGESET_PROBE_PATH) { if (pending.length === 0) return []; const lines = [ - `Once a changeset exists, ${pending.length} more famil(ies) apply — write one unless this card is docs-only:`, + `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):`, ]; for (const { entry, hits } of [...pending].sort((a, b) => a.check.localeCompare(b.check))) { const via = hits.map((h) => `${h.via} '${h.hint}'`).join('; '); @@ -15277,7 +15277,7 @@ function selfTest() { t('and its provenance says so, rather than claiming a source literal', csTriggered[0]?.hits?.[0]?.via?.startsWith('CI trigger in') === true); // Rendering. const pendingOut = pendingChangesetLines(pending); - 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])); + 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])); 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 '))); 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))); t('the section says out loud that it is not a fourth bucket', pendingOut.some((l) => l.includes('NOT a fourth bucket')));