Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions .claude/agents/os-dev.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/<n>/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/<n>/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(实测:空转轮询烧掉的恰是一个红门禁需要的预
Expand Down
4 changes: 2 additions & 2 deletions scripts/pm/dispatch-gates.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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('; ');
Expand Down Expand Up @@ -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')));
Expand Down
Loading