Skip to content

pm-dispatch 协议升级:domain 车道 —— 按「修复落点的包」划域认领,支持同仓多 PM 并发(维护者已拍板) #4819

Closed

Description

@os-zhuang

维护者 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」之后

内容包含:

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。

验收

  1. 上述三处改动齐全,锚定规则与 hook 的 condition 求不出值时:全局 fail loud —— 抛错并中断该次操作(方案 B 已拍板;Blocked-by #4770) #4775 反例原文在;
  2. 现有章节的编号/引用未被破坏(该文件被多个在跑会话引用);
  3. pnpm lint(若覆盖 markdown)/ 基本 CI 绿。

关联

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    domain:devxDomain lane — seat card indexed by label:pm:seat
    on Aug 3, 2026
  2. self-assigned this
    on Aug 3, 2026
  3. os-zhuang commented on Aug 3, 2026

    @os-zhuang
    ContributorAuthor

    认领:PM 循环第 5 轮
    会话:session_015Br2xsJsczFsTR9bvbh2Ny
    分支:claude/issue-4819-pm-dispatch-domain-lanes
    Worktree:objectstack-issue-4819
    域:domain:devx(跨域认领 —— 本单由维护者直接指示本会话执行;按新协议的跨域规则声明文件面)
    文件面:.claude/skills/pm-dispatch/SKILL.md(仅此一个文件,越界即停)

    这条认领本身就是新协议的第一次演示:跨域单、声明文件面、其他 PM 选批时可见。已在 #4604 同步。


    Generated by Claude Code

  4. os-zhuang commented on Aug 3, 2026

    @os-zhuang
    ContributorAuthor

    PM 复核:ACCEPT(待 CI 全绿) —— PR #4824。

    三处改动齐全,验收逐条核过:

    • 章节结构未破坏用的是可验证的方法:改动前后 grep '^#\{1,4\} ' 的标题列表逐行 diff,唯一差异是新增的那一行 —— 这个文件被多个在跑会话引用,这条硬要求有证据而不是口头保证;
    • 分类表与 issue 逐字 diff 一致,未增删域;
    • 锚定规则与 hook 的 condition 求不出值时:全局 fail loud —— 抛错并中断该次操作(方案 B 已拍板;Blocked-by #4770) #4775 反例原样落地,且 dev 补了一句我没写、但比我写的更可操作的判据:「说不出落在哪个文件,就是还没分诊,也就不可打标」 —— 它把锚定规则变成了一个自检问题,采纳;
    • 借单被明确为一次性例外、不改登记表 —— 这个澄清很必要,否则借着借着集合就漂了;
    • 规则 4 的修订保留了原禁令作为协议不生效时的缺省 —— 对,新协议是解禁的条件而不是删掉安全网;
    • 空 frontmatter changeset 按 fix(i18n): 删掉九份 i18n-extract 配置里未声明的 name: 键 #4803 先例,正确。

    CI 绿后送合并队列。合并后此协议即为三账号五会话的现行规则,#4604 登记表上的 domain 集合登记同步生效。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpm:queueReady for the PM dispatch looptoolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions