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
21 changes: 11 additions & 10 deletions .claude/skills/pm-dispatch/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ session 的 `Claim:` 评论(拼写见「认领」,车道盘点已取)—— 标
| `pm:on-hold` | 决定**已做**且答案是「不是现在」—— 不派发也不催;**仅当正文带机器可读行 `Restart-when: closed <owner/repo>#N`(由 `Blocked-by:` 的同一遍解锁扫描点火、同一正文单通道)或 `Restart-when: <一行可执行判据>` 时才合法**;hold 评论带日期、理由、出处(维护者裁或座位定级,⛔ 不设第二个标签区分);机会主义重启的触发文件走同族正典行 **`Restart-touch: <仓内相对路径>`**(一行一路径,大小写敏感、行锚定,与 `Blocked-by:`/`Restart-when:` 同一正文单通道;反引号/bullet 可容忍、值须为 tracked 文件)—— 喂半状态巡查 H17 的 on-hold 触发文件索引,抽取器已随巡查落地、采用即零代码;存量 hold ⛔ 不迁移、不产 finding,散文锚词抽取兜底旧卡;**放行双查(两查皆机械、零判断)**:① 只对**最近一次** `pm:on-hold`/`pm:blocked` 转换评论所载条件放行,⛔ 永不对线程里更早的 blocker —— 已放行过的条件是花掉的,再点火就把过期前提立成现行;② 该转换评论之后卡上有**更新的 merged PR** ⇒ 拒绝放行 —— 那是条件写下后卡已前进的信号(引用的事实可以为真而不再是现行条件) |
| `pm:blocked` + 正文行 `Blocked-by: #N` | 等上游 —— 选择期跳过,#N 关闭时由解锁扫描放回。**工已完、PR 被外部门禁缺陷卡住的卡同用本态,⛔ 不设新标签**:`Blocked-by:` 指向门禁缺陷卡,正文另加机器可读行 `Unlock-action: re-check PR #M` —— 解锁扫描读到它就把解锁动作从「回队重派」换成「重查该 PR 的落地」(回队前提检查见到已完工的 open PR 即按落地工作处理,⛔ 永不给完工卡重派 dev);停放的 PR 正文必须点名门禁卡,让链路从任一端可读、不依赖会被整篇改写的座位贴 |
| `pm:blocking` | 有 open 下游依赖者(分诊 sweep 自 `Blocked-by:` 索引推导的缓存,⛔ 不手工挂);进选择优先级全序 |
| `pm:retriage` | 等分诊改判(维护者 2026-08-19/20 裁定:「同意 并存」)—— 与现行 `pm:*` 标签**并存,⛔ 不摘原标**:原定级在改判前仍是权威,并存让「排队但有异议」在列表上可见;挂标者 = 提出异议的席位,挂标与**异议评论同笔**(证据 + 建议定级),无证据评论的裸挂标不合法;摘标者 = 分诊 Routine,每 fire 高优先重判、重判后摘标 —— 挂/摘分属两方、各自的转换不相交,这是本行的安全性;带本标签的 `pm:queue` 卡**跳过派发**(异议未决不派,即可派发行的除外项);标签须四仓存在(分诊四仓统一职责,首次应用时创建);老化兜底归半状态巡查(年龄谓词随巡查另行落地) |
| `pm:retriage` | 等分诊改判(维护者 2026-08-19/20 裁定:「同意 并存」)—— 与现行 `pm:*` 标签**并存,⛔ 不摘原标**:原定级在改判前仍是权威,并存让「排队但有异议」在列表上可见;挂标者 = 提出异议的席位,挂标与**异议评论同笔**(证据 + 建议定级),无证据评论的裸挂标不合法;摘标者 = 分诊 Routine,每 fire 高优先重判、重判后摘标 —— 挂/摘分属两方、各自的转换不相交,这是本行的安全性;带本标签的 `pm:queue` 卡**跳过派发**(异议未决不派,即可派发行的除外项);标签须五仓存在(分诊五仓统一职责,首次应用时创建);老化兜底归半状态巡查(年龄谓词随巡查另行落地) |
| `finding` | 观察类记录,恒 = **待首次定级**(定级即离标:晋级换 `pm:queue` / 关闭 / hold 换 `pm:on-hold`;裸标签数即健康读数)—— 不占队列不进收件箱 |
| `target:<major>` | 发版阻塞 —— 每个 backlog 恰好一个生产者,见「发版板」 |
| `pm:epic`(父单) | 子树已委托 epic PM(会话与领地在父单正文;`label:pm:epic` 即全量索引)—— 其它 PM 不把其 sub-issue 当候选 |
Expand Down Expand Up @@ -139,11 +139,12 @@ session 的 `Claim:` 评论(拼写见「认领」,车道盘点已取)—— 标
## 多仓协调(五条规则)

产品横跨三仓,依赖方向固定:`objectstack`(后端;`packages/spec` 是唯一契约)→ `objectui`(前端,构
建产物经 `pnpm objectui:refresh` 回流)与 `cloud`。第四仓 `objectos`(纯文档与站点,不入上述依赖链):
分诊照扫(分诊座位保持四仓唯一),执行已自 `domain:devx` 折入迁出、归 `repo:objectos` 执行座位 ——
座位已存在,维护者 2026-08-18 亲自提前行使规则 4 预登记的升格(「objectos 是新开的项目经理,是不是
少了座位帖。」),同其它 `repo:*` 座位一套执行座位纪律(⛔ 不产 `domain:*`/type/定级)。该仓无
changeset 流、无 `packages/`;合并队列 + required `build` + `merge_group` 自 2026-08-18 起已上线 —— 派发预期照实设,⛔ 不要求不存在的机制。
建产物经 `pnpm objectui:refresh` 回流)与 `cloud`。链外两仓不入依赖链:分诊照扫(分诊座位保持五仓唯
一),各归同名 `repo:*` 执行座位,纪律即规则 4 姊妹仓执行座位一套(⛔ 此处不另抄)。第四仓 `objectos`
(纯文档与站点,执行已自 `domain:devx` 迁出):座位由维护者 2026-08-18 亲自提前行使规则 4 预登记的升
格开设(「objectos 是新开的项目经理,是不是少了座位帖。」);无 changeset 流、无 `packages/`;合并队
列 + required `build` + `merge_group` 自 2026-08-18 起已上线 —— 派发预期照实设,⛔ 不要求不存在的机制。
第五仓 `hotcrm`(样板工程:元数据开发的 CRM 示例应用;岗位说明与裁决原文在 `references/lanes/hotcrm.md`):平台相关的功能在平台中实现 —— 建设 hotcrm 时发现的平台缺口按规则 1 落平台仓**普通卡**(非缝卡,⛔ 不在样板内绕行);`repo:hotcrm` 缝标签只给真协调卡。

1. **Issue 住在修复落地的仓,分诊时按判据严格执行**(维护者 2026-08-10 裁决;2026-08-16 重申收紧)。判
据:正文抽掉 objectstack 还成立 ⇒ file-at-destination,分诊当场转仓 —— console/UI 缺陷即转 objectui
Expand All @@ -158,7 +159,7 @@ changeset 流、无 `packages/`;合并队列 + required `build` + `merge_group`
3. **联动杂事立单,不靠记忆。** 已验收 PR 的产物流向另一仓时,由**接受那个 PR 的执行座位**立即
在消费仓立后续单(带 `Blocked-by:`);`domain:*` 仍由分诊补。
4. **纵向拆分:一个分诊 PM + N 个执行 PM,一人一车道双射**(维护者 2026-08-05 拍板;2026-08-16 裁
定分诊统一收归一座)。分诊座位**四仓唯一**:objectstack、objectui、cloud、objectos 全部 backlog 的分诊/
定分诊统一收归一座)。分诊座位**五仓唯一**(仓单即多仓协调首段的五仓):全部 backlog 的分诊/
定级/路由/type 由它一座生产,只扫/分类/打标签/拆分/查重/转仓,⛔ 永不认领、永不派发、永不写代
码。执行座位信任标签、只在本车道认领,误标**不自行改**、留言上报;姊妹仓 `repo:*` 座位收窄为**
执行座位**(在本仓认领/派发/复核/落地,同一套执行座位纪律,⛔ 不产 `domain:*`/type/定级;skills
Expand Down Expand Up @@ -243,8 +244,8 @@ skills,类似分诊」)—— 贴内指针指向其车道文件,升级走技能

## 分诊座位职责

(执行座位 ⛔ 跳过本节动作 —— 读到标签当既成事实。)本节全部职责**对四仓统一执行**(三仓归一维护者
2026-08-16 裁定,objectos 并入 2026-08-18 裁定):sweep、首触定级、发版板(objectos 无发版板,跳过)、查重/shadow 检查与代裁通道逐仓各跑一遍;**代裁权限唯
(执行座位 ⛔ 跳过本节动作 —— 读到标签当既成事实。)本节全部职责**对五仓统一执行**(三仓归一维护者
2026-08-16 裁定,objectos 并入 2026-08-18、hotcrm 并入 2026-08-20 裁定):sweep、首触定级、发版板(objectos、hotcrm 无发版板,跳过)、查重/shadow 检查与代裁通道逐仓各跑一遍;**代裁权限唯
一归本座位**,任何执行座位(含姊妹仓 `repo:*`)⛔ 不代裁。
**工具加载纪律(fire 开局)**:互斥检查/自退判断只按名加载所需工具 —— `ToolSearch` 用 `select:mcp__github__list_issues,mcp__github__issue_read` 形式,判定「本轮有活」之后才加载其余;⛔ 开局不做泛关键词 ToolSearch(一次注入全家桶 schema —— 分诊席 2026-08-20 自测:空转轮 ~12 万 token,~8 万是这张门票);可验判据:空转轮 ~4 万以内,分诊下轮自测读数回报。只约束分诊 fresh session 的开局;执行座位(常驻会话)与 dev(需全工具面)不受此约束。

Expand Down Expand Up @@ -275,7 +276,7 @@ objectui pin 落后且其队列已空 ⇒ 在本仓立/刷新 console bump 单;
扫必烂),新卡即时打、存量卡下次碰到补。读者三个:代裁路由(`Feature` 机械落人工地板,`Bug`/
`Task` 才是代裁候选)、发版板缺陷扫描(`type:Bug is:open`)、普通队列 Bug 优先平手判据。

**路由即分诊的技术判断,永不升级「哪个仓?」。** 读四仓代码定落点;跨仓的按contract-first 拆分;
**路由即分诊的技术判断,永不升级「哪个仓?」。** 读五仓代码定落点;跨仓的按contract-first 拆分;
父单已有子结构的,父单队列标签即可(sub-issue 自动成为候选),分诊逐个展开路由、补 `Blocked-by:`
排序,父单是协调节点**永不派发**。每张留一条英文审计评论(「Triage: lands in …; rationale: …」)
,可选带 `Size/model suggestion:` 行供执行席参考。跨仓查重(shadow 检查):跟跨仓引用 + 关键词搜
Expand Down
45 changes: 45 additions & 0 deletions .claude/skills/pm-dispatch/references/lanes/hotcrm.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# 车道岗位说明:repo:hotcrm(references/lanes —— 座位贴指针指向本文件)

岗位说明版本化于此,升级走技能 PR;现值状态恒在座位贴,⛔ 不迁入本文件。本席为姊
妹仓执行座位:在 hotcrm 仓认领/派发/复核/落地,⛔ 不产 `domain:*`/type/定级(纪律
全文在 SKILL.md 多仓协调规则 4)。

## 宪章出处(维护者裁决 2026-08-20,逐字未译 —— 本席一切判断锚定于此)

> 「新增了 hotcrm 仓库的席位,这个仓库作为 objectstack 的样板工程,使用元数据开发crm应用,平台相关的功能应该在平台中实现,hotcrm 主要是展现平台能力,并且不扩散需求。」

> 「hotcrm 部署到objectos企业版时,就会有企业版的能力,但是在 objectstack 社区版中也可以运行。」

## 范围

- `objectstack-ai/hotcrm` 全仓:元数据优先的 CRM 样板工程(exemplar app),不入
spec 依赖链(同 objectos)。应用即展品,不是功能实验场 —— 收卡第一问恒为「这张
卡展现哪项平台能力?」。
- 边界(宪章的牙齿):**平台相关的功能在平台中实现** —— 建设 hotcrm 时发现的平台
能力缺口,立**普通平台卡**到 objectstack/objectui(file-at-destination,非缝卡,
待分诊;hotcrm 侧同笔 `pm:blocked` + `Blocked-by: <owner/repo>#N` 回链),⛔ 永
不在 hotcrm 内绕行 —— 绕行把平台缺口藏进样板,展品从此示范错误写法。
- `repo:hotcrm` 缝标签只给真协调卡(跨仓次序即卡的实质);纯 hotcrm 修复住 hotcrm
仓(issue 住在修复落地的仓,多仓协调规则 1)。

## 常设承诺

- **每轮巡检第一判据**:先读半状态巡查锚(`half-state-patrol.yml` 置顶 issue)点名本道卡/PR/座位贴的 H 行,逐行认领或处置,再做其余判据;锚行未处置 ⛔ 不开新派发。
- **展现平台能力**:样板演示的能力必须真实兑现(declared = enforced 在展品里双倍
重要 —— 展品撒谎等于教每个照抄的 AI 撒谎);发现 declared≠enforced 先问「生产者
在哪」,生产者在平台 ⇒ 上游卡。
- **不扩散需求**:创业阶段聚焦原则全额适用,四维框架轴④是本车道首要过滤器(框架
单源在 SKILL.md「升级与决策」,⛔ 不另抄);投机功能形状不入队 —— 走决策箱或关
not planned(定级归分诊/维护者,本席只供证据)。
- **双版本兼容**:hotcrm 必须在 objectstack 社区版可运行;部署到 objectos 企业版
时获得企业能力。操作判据:hotcrm 元数据只可依赖社区能力面,企业特性恒为增强
(enhancement-only)⛔ 永不硬依赖;会 break 社区版运行的卡定义上是错范围,回分诊。
- 该仓无 changeset 流、无发版板(除非另裁);pm 状态机词表五仓统一(幂等创建在
`scripts/pm/ensure-pm-labels.sh`,对 hotcrm 实跑是落地步骤)。

## 席内判断

- 平台缺口卡是本席最常见的联动产出 —— 立卡在平台仓、无 assignee、普通卡待分诊,
`domain:*`/type 留给分诊;催办不代裁。
- 展品价值判据:一张卡若既不展现平台能力、也不修真实缺陷,默认不做(轴④);拿不
准升决策箱,⛔ 不自裁。
6 changes: 5 additions & 1 deletion scripts/pm/check-skill-line-ratchet.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@ export const CEILINGS = new Map([
['.claude/skills/pm-dispatch/references/lanes/devx.md', 38],
['.claude/skills/pm-dispatch/references/lanes/skills.md', 36],
['.claude/skills/pm-dispatch/references/lanes/spec.md', 44],
// repo:hotcrm lane charter (maintainer rulings 2026-08-20: exemplar-app repo —
// platform capabilities implemented upstream, 展现平台能力, 不扩散需求, runs on
// community edition). Set at landed line count (headroom 0, same convention).
['.claude/skills/pm-dispatch/references/lanes/hotcrm.md', 45],
['.claude/agents/os-dev.md', 399],
// #9473: the other four `.claude/skills/` are read in full by the sessions
// that use them too — the erosion mechanism the ratchet exists to stop
Expand Down Expand Up @@ -234,7 +238,7 @@ function selfTest() {
['SKILL.md is covered', CEILINGS.has('.claude/skills/pm-dispatch/SKILL.md'), true],
['the dev-agent definition is covered', CEILINGS.has('.claude/agents/os-dev.md'), true],
['all five compressed references are covered', ['dispatch-runbook', 'platform-readings', 'review-checklist', 'landing-operations', 'seat-post-protocol'].every((n) => CEILINGS.has(`.claude/skills/pm-dispatch/references/${n}.md`)), true],
['all six lane job descriptions are covered', ['engine', 'services', 'cli', 'devx', 'skills', 'spec'].every((n) => CEILINGS.has(`.claude/skills/pm-dispatch/references/lanes/${n}.md`)), true],
['all seven lane job descriptions are covered', ['engine', 'services', 'cli', 'devx', 'skills', 'spec', 'hotcrm'].every((n) => CEILINGS.has(`.claude/skills/pm-dispatch/references/lanes/${n}.md`)), true],
['the other four skills are covered (#9473)', ['checklist-test', 'checklist-author', 'dogfood-verification', 'spec-property-retirement'].every((n) => CEILINGS.has(`.claude/skills/${n}/SKILL.md`)), true],
['root AGENTS.md is covered (#9792)', CEILINGS.has('AGENTS.md'), true],
// The dispatch-gates declaration (#9964). Enforcement cannot hold any of
Expand Down
Loading