Skip to content

Commit cdc7eff

Browse files
Jack Qclaude
andauthored
docs(pm-dispatch): register the repo:hotcrm exemplar-app lane — 多仓协调 entry + lanes/hotcrm.md charter (#10400)
Claude-Session: https://claude.ai/code/session_019T1sSZbQTnLhrK9HhNdNiB Co-authored-by: Claude <noreply@anthropic.com>
1 parent 8fe2b37 commit cdc7eff

3 files changed

Lines changed: 61 additions & 11 deletions

File tree

.claude/skills/pm-dispatch/SKILL.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ session 的 `Claim:` 评论(拼写见「认领」,车道盘点已取)—— 标
7878
| `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** ⇒ 拒绝放行 —— 那是条件写下后卡已前进的信号(引用的事实可以为真而不再是现行条件) |
7979
| `pm:blocked` + 正文行 `Blocked-by: #N` | 等上游 —— 选择期跳过,#N 关闭时由解锁扫描放回。**工已完、PR 被外部门禁缺陷卡住的卡同用本态,⛔ 不设新标签**:`Blocked-by:` 指向门禁缺陷卡,正文另加机器可读行 `Unlock-action: re-check PR #M` —— 解锁扫描读到它就把解锁动作从「回队重派」换成「重查该 PR 的落地」(回队前提检查见到已完工的 open PR 即按落地工作处理,⛔ 永不给完工卡重派 dev);停放的 PR 正文必须点名门禁卡,让链路从任一端可读、不依赖会被整篇改写的座位贴 |
8080
| `pm:blocking` | 有 open 下游依赖者(分诊 sweep 自 `Blocked-by:` 索引推导的缓存,⛔ 不手工挂);进选择优先级全序 |
81-
| `pm:retriage` | 等分诊改判(维护者 2026-08-19/20 裁定:「同意 并存」)—— 与现行 `pm:*` 标签**并存,⛔ 不摘原标**:原定级在改判前仍是权威,并存让「排队但有异议」在列表上可见;挂标者 = 提出异议的席位,挂标与**异议评论同笔**(证据 + 建议定级),无证据评论的裸挂标不合法;摘标者 = 分诊 Routine,每 fire 高优先重判、重判后摘标 —— 挂/摘分属两方、各自的转换不相交,这是本行的安全性;带本标签的 `pm:queue`**跳过派发**(异议未决不派,即可派发行的除外项);标签须四仓存在(分诊四仓统一职责,首次应用时创建);老化兜底归半状态巡查(年龄谓词随巡查另行落地) |
81+
| `pm:retriage` | 等分诊改判(维护者 2026-08-19/20 裁定:「同意 并存」)—— 与现行 `pm:*` 标签**并存,⛔ 不摘原标**:原定级在改判前仍是权威,并存让「排队但有异议」在列表上可见;挂标者 = 提出异议的席位,挂标与**异议评论同笔**(证据 + 建议定级),无证据评论的裸挂标不合法;摘标者 = 分诊 Routine,每 fire 高优先重判、重判后摘标 —— 挂/摘分属两方、各自的转换不相交,这是本行的安全性;带本标签的 `pm:queue`**跳过派发**(异议未决不派,即可派发行的除外项);标签须五仓存在(分诊五仓统一职责,首次应用时创建);老化兜底归半状态巡查(年龄谓词随巡查另行落地) |
8282
| `finding` | 观察类记录,恒 = **待首次定级**(定级即离标:晋级换 `pm:queue` / 关闭 / hold 换 `pm:on-hold`;裸标签数即健康读数)—— 不占队列不进收件箱 |
8383
| `target:<major>` | 发版阻塞 —— 每个 backlog 恰好一个生产者,见「发版板」 |
8484
| `pm:epic`(父单) | 子树已委托 epic PM(会话与领地在父单正文;`label:pm:epic` 即全量索引)—— 其它 PM 不把其 sub-issue 当候选 |
@@ -139,11 +139,12 @@ session 的 `Claim:` 评论(拼写见「认领」,车道盘点已取)—— 标
139139
## 多仓协调(五条规则)
140140

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

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

244245
## 分诊座位职责
245246

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

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

278-
**路由即分诊的技术判断,永不升级「哪个仓?」。** 读四仓代码定落点;跨仓的按contract-first 拆分;
279+
**路由即分诊的技术判断,永不升级「哪个仓?」。** 读五仓代码定落点;跨仓的按contract-first 拆分;
279280
父单已有子结构的,父单队列标签即可(sub-issue 自动成为候选),分诊逐个展开路由、补 `Blocked-by:`
280281
排序,父单是协调节点**永不派发**。每张留一条英文审计评论(「Triage: lands in …; rationale: …」)
281282
,可选带 `Size/model suggestion:` 行供执行席参考。跨仓查重(shadow 检查):跟跨仓引用 + 关键词搜
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# 车道岗位说明:repo:hotcrm(references/lanes —— 座位贴指针指向本文件)
2+
3+
岗位说明版本化于此,升级走技能 PR;现值状态恒在座位贴,⛔ 不迁入本文件。本席为姊
4+
妹仓执行座位:在 hotcrm 仓认领/派发/复核/落地,⛔ 不产 `domain:*`/type/定级(纪律
5+
全文在 SKILL.md 多仓协调规则 4)。
6+
7+
## 宪章出处(维护者裁决 2026-08-20,逐字未译 —— 本席一切判断锚定于此)
8+
9+
> 「新增了 hotcrm 仓库的席位,这个仓库作为 objectstack 的样板工程,使用元数据开发crm应用,平台相关的功能应该在平台中实现,hotcrm 主要是展现平台能力,并且不扩散需求。」
10+
11+
> 「hotcrm 部署到objectos企业版时,就会有企业版的能力,但是在 objectstack 社区版中也可以运行。」
12+
13+
## 范围
14+
15+
- `objectstack-ai/hotcrm` 全仓:元数据优先的 CRM 样板工程(exemplar app),不入
16+
spec 依赖链(同 objectos)。应用即展品,不是功能实验场 —— 收卡第一问恒为「这张
17+
卡展现哪项平台能力?」。
18+
- 边界(宪章的牙齿):**平台相关的功能在平台中实现** —— 建设 hotcrm 时发现的平台
19+
能力缺口,立**普通平台卡**到 objectstack/objectui(file-at-destination,非缝卡,
20+
待分诊;hotcrm 侧同笔 `pm:blocked` + `Blocked-by: <owner/repo>#N` 回链),⛔ 永
21+
不在 hotcrm 内绕行 —— 绕行把平台缺口藏进样板,展品从此示范错误写法。
22+
- `repo:hotcrm` 缝标签只给真协调卡(跨仓次序即卡的实质);纯 hotcrm 修复住 hotcrm
23+
仓(issue 住在修复落地的仓,多仓协调规则 1)。
24+
25+
## 常设承诺
26+
27+
- **每轮巡检第一判据**:先读半状态巡查锚(`half-state-patrol.yml` 置顶 issue)点名本道卡/PR/座位贴的 H 行,逐行认领或处置,再做其余判据;锚行未处置 ⛔ 不开新派发。
28+
- **展现平台能力**:样板演示的能力必须真实兑现(declared = enforced 在展品里双倍
29+
重要 —— 展品撒谎等于教每个照抄的 AI 撒谎);发现 declared≠enforced 先问「生产者
30+
在哪」,生产者在平台 ⇒ 上游卡。
31+
- **不扩散需求**:创业阶段聚焦原则全额适用,四维框架轴④是本车道首要过滤器(框架
32+
单源在 SKILL.md「升级与决策」,⛔ 不另抄);投机功能形状不入队 —— 走决策箱或关
33+
not planned(定级归分诊/维护者,本席只供证据)。
34+
- **双版本兼容**:hotcrm 必须在 objectstack 社区版可运行;部署到 objectos 企业版
35+
时获得企业能力。操作判据:hotcrm 元数据只可依赖社区能力面,企业特性恒为增强
36+
(enhancement-only)⛔ 永不硬依赖;会 break 社区版运行的卡定义上是错范围,回分诊。
37+
- 该仓无 changeset 流、无发版板(除非另裁);pm 状态机词表五仓统一(幂等创建在
38+
`scripts/pm/ensure-pm-labels.sh`,对 hotcrm 实跑是落地步骤)。
39+
40+
## 席内判断
41+
42+
- 平台缺口卡是本席最常见的联动产出 —— 立卡在平台仓、无 assignee、普通卡待分诊,
43+
`domain:*`/type 留给分诊;催办不代裁。
44+
- 展品价值判据:一张卡若既不展现平台能力、也不修真实缺陷,默认不做(轴④);拿不
45+
准升决策箱,⛔ 不自裁。

scripts/pm/check-skill-line-ratchet.mjs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ export const CEILINGS = new Map([
107107
['.claude/skills/pm-dispatch/references/lanes/devx.md', 38],
108108
['.claude/skills/pm-dispatch/references/lanes/skills.md', 36],
109109
['.claude/skills/pm-dispatch/references/lanes/spec.md', 44],
110+
// repo:hotcrm lane charter (maintainer rulings 2026-08-20: exemplar-app repo —
111+
// platform capabilities implemented upstream, 展现平台能力, 不扩散需求, runs on
112+
// community edition). Set at landed line count (headroom 0, same convention).
113+
['.claude/skills/pm-dispatch/references/lanes/hotcrm.md', 45],
110114
['.claude/agents/os-dev.md', 399],
111115
// #9473: the other four `.claude/skills/` are read in full by the sessions
112116
// that use them too — the erosion mechanism the ratchet exists to stop
@@ -234,7 +238,7 @@ function selfTest() {
234238
['SKILL.md is covered', CEILINGS.has('.claude/skills/pm-dispatch/SKILL.md'), true],
235239
['the dev-agent definition is covered', CEILINGS.has('.claude/agents/os-dev.md'), true],
236240
['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],
237-
['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],
241+
['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],
238242
['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],
239243
['root AGENTS.md is covered (#9792)', CEILINGS.has('AGENTS.md'), true],
240244
// The dispatch-gates declaration (#9964). Enforcement cannot hold any of

0 commit comments

Comments
 (0)