From 09251f3ff61083f56d639a164b28195387ff9796 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 20 Aug 2026 18:09:57 +0000 Subject: [PATCH] =?UTF-8?q?docs(pm-dispatch):=20register=20the=20repo:hotc?= =?UTF-8?q?rm=20exemplar-app=20lane=20=E2=80=94=20=E5=A4=9A=E4=BB=93?= =?UTF-8?q?=E5=8D=8F=E8=B0=83=20entry=20+=20lanes/hotcrm.md=20charter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_019T1sSZbQTnLhrK9HhNdNiB --- .claude/skills/pm-dispatch/SKILL.md | 21 ++++----- .../pm-dispatch/references/lanes/hotcrm.md | 45 +++++++++++++++++++ scripts/pm/check-skill-line-ratchet.mjs | 6 ++- 3 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 .claude/skills/pm-dispatch/references/lanes/hotcrm.md diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index 2525bca58f..6e71e509bd 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -78,7 +78,7 @@ session 的 `Claim:` 评论(拼写见「认领」,车道盘点已取)—— 标 | `pm:on-hold` | 决定**已做**且答案是「不是现在」—— 不派发也不催;**仅当正文带机器可读行 `Restart-when: closed #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:` | 发版阻塞 —— 每个 backlog 恰好一个生产者,见「发版板」 | | `pm:epic`(父单) | 子树已委托 epic PM(会话与领地在父单正文;`label:pm:epic` 即全量索引)—— 其它 PM 不把其 sub-issue 当候选 | @@ -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 @@ -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 @@ -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(需全工具面)不受此约束。 @@ -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 检查):跟跨仓引用 + 关键词搜 diff --git a/.claude/skills/pm-dispatch/references/lanes/hotcrm.md b/.claude/skills/pm-dispatch/references/lanes/hotcrm.md new file mode 100644 index 0000000000..b4c93ad88a --- /dev/null +++ b/.claude/skills/pm-dispatch/references/lanes/hotcrm.md @@ -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: #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 留给分诊;催办不代裁。 +- 展品价值判据:一张卡若既不展现平台能力、也不修真实缺陷,默认不做(轴④);拿不 + 准升决策箱,⛔ 不自裁。 diff --git a/scripts/pm/check-skill-line-ratchet.mjs b/scripts/pm/check-skill-line-ratchet.mjs index 8ca362d423..909cf4cf82 100644 --- a/scripts/pm/check-skill-line-ratchet.mjs +++ b/scripts/pm/check-skill-line-ratchet.mjs @@ -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 @@ -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