Repository navigation
Closed
Labels
domain:devxDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatchpm:queueReady for the PM dispatch loopReady for the PM dispatch looptoolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surfaceFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
Description
维护者 2026-08-03 拍板:采用 domain 车道方案支持多 PM 并发(每个 PM 独立会话、独立容器)。本单落地协议文本到 .claude/skills/pm-dispatch/SKILL.md。
背景:为什么是 domain,锚定规则是什么
今晚多 PM 运行暴露的核心问题:分诊与选批发生在认领之前,两个 PM 各自视野内的「文件独立」在全局不成立(#4763 险撞、declared-fields.ts 共享面、#4604 的车道协商)。domain 标签把一个 PM 的分诊结果缓存成全体 PM 可见的路由,选批过滤在标签层完成。
锚定规则(方案的核心,必须原样写进协议):
每个包恰好属于一个 domain;issue 的
domain:*标签 = 修复落点所在包的 domain,在分诊时读代码后打,不从标题词汇猜。
反例说明(写进协议做示例):#4775 的 hook condition 概念上属 automation,但修复落点是 packages/objectql/src/hook-wrappers.ts —— 按落点归 domain:engine。按题目猜会让两个 PM 撞进同一个包。
分类表(初版,写进 SKILL.md;新包在首次分诊时归类并 PR 更新此表)
| 标签 | 包家族 |
|---|---|
domain:engine |
packages/objectql、packages/metadata*、packages/platform-objects、packages/core、packages/plugins/driver-* |
domain:services |
packages/services/*、packages/plugins/plugin-approvals、plugin-webhooks、packages/connectors/* |
domain:identity |
packages/plugins/plugin-auth、plugin-security、plugin-sharing、plugin-audit |
domain:devx |
packages/lint、skills/**、content/docs/**、scripts/(门禁类) |
domain:spec |
packages/spec 及其生成物(现 spec 车道不变) |
domain:cli |
packages/cli、runtime、verify、qa、types |
examples/** 随其锻炼的子系统归域;归不进的在分诊时按主要落点判。
SKILL.md 要改的三处
1. 新增一节「Domain lanes(同仓多 PM 并发)」,放在「Multi-repo coordination」之后
内容包含:
- 前提:每个 PM = 独立会话 + 独立容器,加 PM 即加算力;冲突由 domain-包映射防止;
- 上面的锚定规则 + hook 的
condition求不出值时:全局 fail loud —— 抛错并中断该次操作(方案 B 已拍板;Blocked-by #4770) #4775 反例 + 分类表; - 标签纪律:
domain:*在 backlog sweep(round loop 第 0 步)分诊时打;打标 ≠ 认领,任何 PM 都可为任何 issue 打标;未打标的 issue 任何 PM 不得直接认领(先分诊打标); - 认领范围:每个 PM 会话在登记表([PM] 分片分工登记表 — 谁在管哪个仓库的队列 #4604)登记自己的 domain 集合;只认领标签在集合内的 issue;
- 跨域单:按既有 contract-first 规则拆成子单各归各域;不拆则单个 PM 认领并在认领注释里声明全部文件面;
- 借单:空闲 PM 可跨域借单,条件:(a) 该域 PM 未认领它,(b) 认领注释声明文件面,(c) 全局在飞检查通过;
- 全局在飞检查:选批时列出全仓
pm:dispatched的 issue,读其最新认领注释的文件面声明,要求与本批候选不相交; - 合并队列仍是全体共享的串行资源:flaky 税(参 flaky:
spec/src/cloud/tenant.test.ts的 #4739 导出面用例贴着 5s 超时 —— 今晚已两次把不相干的 PR 踢出合并队列 #4796)随 PM 数线性放大,队列健康是全体 PM 的共同责任。
2. 认领注释模板(round loop 第 4 步)加两行
> 认领:PM 循环第 N 轮
> 会话:`session_<id>`
> 分支:`claude/issue-<n>-<slug>`
> Worktree:`<repo>-issue-<n>`
> 域:`domain:<x>`
> 文件面:`<预计触碰的目录列表>`(越界即停,报告说明)
「文件面」对跨域单与借单必填,同域普通单建议填。
3. 修订「Multi-repo coordination」规则 4
现文写「Multiple PMs on the SAME queue: prohibited」。改为:同队列多 PM 仅在 domain 车道协议生效时允许(每 PM 独立会话独立容器 + 登记 domain 集合 + 遵守标签纪律与全局在飞检查);无该协议时维持禁止。原有的 repo 分片阶梯保留,domain 车道作为同仓扩展的第三级。
约束
- 只改
.claude/skills/pm-dispatch/SKILL.md。不动.claude/agents/os-dev.md,不动任何packages/**。 - 行文风格贴合该文件现有段落(简洁、规则式、带理由),不要写成变更日志。
- 若 Check Changeset 门禁对
.claude/only 的 diff 要求 changeset,用空 frontmatter changeset(先例:PR fix(i18n): 删掉九份 i18n-extract 配置里未声明的name:键 #4803 对 scripts-only 改动的做法)。 - 分类表照抄本 issue,不要自行增删 domain —— 表的演化走后续 PR。
验收
- 上述三处改动齐全,锚定规则与 hook 的
condition求不出值时:全局 fail loud —— 抛错并中断该次操作(方案 B 已拍板;Blocked-by #4770) #4775 反例原文在; - 现有章节的编号/引用未被破坏(该文件被多个在跑会话引用);
pnpm lint(若覆盖 markdown)/ 基本 CI 绿。
关联
- [PM] 分片分工登记表 — 谁在管哪个仓库的队列 #4604(登记表 —— 本单合并后 PM 们在那里改登记 domain 集合)
has(x)reads as a null guard and is not one — a publish-time lint should reject un-guarded nullable comparisons in CEL predicates #4763 / hook 的condition求不出值时:全局 fail loud —— 抛错并中断该次操作(方案 B 已拍板;Blocked-by #4770) #4775(锚定规则的实证)- flaky:
spec/src/cloud/tenant.test.ts的 #4739 导出面用例贴着 5s 超时 —— 今晚已两次把不相干的 PR 踢出合并队列 #4796(队列 flaky 税)
Metadata
Metadata
Assignees
Labels
domain:devxDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatchpm:queueReady for the PM dispatch loopReady for the PM dispatch looptoolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surfaceFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
Activity
os-zhuang commentedon Aug 3, 2026
认领:PM 循环第 5 轮
会话:
session_015Br2xsJsczFsTR9bvbh2Ny分支:
claude/issue-4819-pm-dispatch-domain-lanesWorktree:
objectstack-issue-4819域:
domain:devx(跨域认领 —— 本单由维护者直接指示本会话执行;按新协议的跨域规则声明文件面)文件面:
.claude/skills/pm-dispatch/SKILL.md(仅此一个文件,越界即停)这条认领本身就是新协议的第一次演示:跨域单、声明文件面、其他 PM 选批时可见。已在 #4604 同步。
Generated by Claude Code
os-zhuang commentedon Aug 3, 2026
PM 复核:ACCEPT(待 CI 全绿) —— PR #4824。
三处改动齐全,验收逐条核过:
grep '^#\{1,4\} '的标题列表逐行 diff,唯一差异是新增的那一行 —— 这个文件被多个在跑会话引用,这条硬要求有证据而不是口头保证;condition求不出值时:全局 fail loud —— 抛错并中断该次操作(方案 B 已拍板;Blocked-by #4770) #4775 反例原样落地,且 dev 补了一句我没写、但比我写的更可操作的判据:「说不出落在哪个文件,就是还没分诊,也就不可打标」 —— 它把锚定规则变成了一个自检问题,采纳;name:键 #4803 先例,正确。CI 绿后送合并队列。合并后此协议即为三账号五会话的现行规则,#4604 登记表上的 domain 集合登记同步生效。
Generated by Claude Code
docs(pm-dispatch): domain 车道 —— 按修复落点划域,支持同仓多 PM 并发 (objectstack-ai#4819