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
20 changes: 10 additions & 10 deletions .claude/skills/pm-dispatch/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,8 @@ session 的 `Claim:` 评论(拼写见「认领」,车道盘点已取)—— 标
产品横跨三仓,依赖方向固定:`objectstack`(后端;`packages/spec` 是唯一契约)→ `objectui`(前端,构
建产物经 `pnpm objectui:refresh` 回流)与 `cloud`。链外两仓不入依赖链:分诊照扫(分诊座位保持五仓唯
一),各归同名 `repo:*` 执行座位,纪律即规则 4 姊妹仓执行座位一套(⛔ 此处不另抄)。第四仓 `objectos`
(纯文档与站点,执行已自 `domain:devx` 迁出):座位由维护者 2026-08-18 亲自提前行使规则 4 预登记的升
格开设(「objectos 是新开的项目经理,是不是少了座位帖。」);无 changeset 流、无 `packages/`;合并队
列 + required `build` + `merge_group` 自 2026-08-18 起已上线 —— 派发预期照实设,⛔ 不要求不存在的机制。
(纯文档与站点,执行已自 `domain:devx` 迁出):座位由维护者 2026-08-18 开设(「objectos 是新开的项目
经理,是不是少了座位帖。」);无 changeset 流、无 `packages/`;合并队列 + required `build` + `merge_group` 已上线 —— 派发预期照实设,⛔ 不要求不存在的机制。
第五仓 `hotcrm`(样板工程:元数据开发的 CRM 示例应用;岗位说明与裁决原文在 `references/lanes/hotcrm.md`):平台相关的功能在平台中实现 —— 建设 hotcrm 时发现的平台缺口按规则 1 落平台仓**普通卡**(非缝卡,⛔ 不在样板内绕行);`repo:hotcrm` 缝标签只给真协调卡。
**objectui 卡按修复落点分流三流**(维护者 2026-08-21 裁定,`domain:ui` 唯一新增标签,命名定稿原话:「按 domain:ui 定稿」):`domain:devx`(工程面)/`domain:spec`(契约面)跨仓归各自车道,其余 —— 发布库与 apps —— `domain:ui` 归 objectui 执行席;症状位置不改流向,docs 随所记录的面走,落点不明留分诊首触 ⛔ 不猜。
**车道可按仓分席(域×仓)**:忙时一个 domain 车道开多个按仓席位(如 devx@objectstack / devx@objectui;触发即规则 4 预登记的拆分条件),各席独立座位贴与 claim 互斥,闲时收归一席 —— 名册状态,不改协议文本;seam 卡单一归属:归修复落地仓的席,双仓皆动 objectstack 侧主导;`scripts/pm/**` 等住 objectstack 的全板工具链单写手恒为 objectstack 侧席,他侧上游立卡回链(hotcrm 宪章同款纪律)。
Expand Down Expand Up @@ -248,6 +247,8 @@ skills,类似分诊」)—— 贴内指针指向其车道文件,升级走技能
**代裁权限唯一归本座位**,任何执行座位(含姊妹仓 `repo:*`)⛔ 不代裁。
**工具加载纪律(fire 开局)**:互斥检查/自退判断只按名加载所需工具 —— `ToolSearch` 用 `select:mcp__github__list_issues,mcp__github__issue_read` 形式,判定「本轮有活」之后才加载其余;⛔ 开局不做泛关键词 ToolSearch(一次注入全家桶 schema —— 分诊席 2026-08-20 自测:空转轮 ~12 万 token,~8 万是这张门票);可验判据:空转轮 ~4 万以内,分诊下轮自测读数回报。只约束分诊 fresh session 的开局;执行座位(常驻会话)与 dev(需全工具面)不受此约束。

**两级盘点(two-tier inventory;维护者 2026-08-20:「每次都需要 四仓全量 open issue 盘点 … 吗?建议分诊多久执行一次」→「立卡」)**:小时轮以 `since` 窗口读增量 —— 锚 = 座位贴上一份收班简报的时间戳(互斥守卫同一读数,零新状态;标签写入刷新 `updated_at`,窗口锚在简报而非上次 fire,漏 fire 积压自动入窗);每日一 fire 跑四仓全量对账并归集日频职责;选层按 fire 时刻 ⛔ 不用计数器(fresh session 无计数器);简报写明本轮跑的层(下轮读者靠它知道窗口盖了什么)。从不更新的卡不入窗是设计:它上次变更时已被扫过,老化欠账归半状态巡查不归小时轮;守住小时 fire 的硬理由是契约复审时延(`since` 读法与成本对价见 runbook)。

**Backlog sweep(常设职责,不等请求)。** 每轮扫任一析取命中的卡:① 全裸(无`pm:*`、
无 `needs-user-decision`、无 `domain:*`);② 有 `pm:queue` 无 `domain:*`(**凡有车道标签的仓皆扫**,
今日为主仓与 objectui —— 三流拆分见多仓协调;豁免仅余真无车道标签的仓 cloud、objectos,该形状在那里才是队列卡常态);③ 有 `domain:*` 无 pm-state。②③ 只取 `updated_at`
Expand Down Expand Up @@ -326,13 +327,11 @@ hold 评论纪律见状态模型,hold 重验只在 `Restart-when:` 命中时发
**整车道一次读全,本地求交**(维护者 2026-08-11 接受):`list_issues` 带 `labels: [domain:X]` +
最小字段一次拿回全车道 open 集,各状态本地求交 —— 按单一 pm 状态切片的查询看不见其它状态,是结
构性盲区。候选 = open、未 assign、无`needs-user-decision`、无 `pm:retriage`;已排队父单的 open sub-issue 自动是
候选(`pm:epic` 父单的子树除外)。**每张候选读全文 + 全部评论**(裁决落在评论区,跳过评论就是跳
过裁决;评论还可能记着一半工作已交付);**派发前做前提过时检查(stale-premise check)—— 裁决同
候选(`pm:epic` 父单的子树除外)。**每张候选读全文 + 全部评论,写派发词前补一次决策复读(decision re-read),与认领的竞态复读对称**:评论读到最后一页,凡维护者裁决**逐字引入派发词裁决分区**作约束,无则写明「无裁决」—— 竞态复读只答「被谁认领」答不了「已被裁过」(裁决评论不带 session ID,裁后回队的标签状态与从未裁过的卡同形,队列列表分不出),漏读的派发词把已闭分叉当开放问题重开、并丢掉裁决自带的实施约束;评论还可能记着一半工作已交付。**派发前做前提过时检查(stale-premise check)—— 裁决同
罪**(裁决描述的也是当时的仓,写得权威、日期又近,恰恰更容易被当成现成事实),两半都查:**动作
面** —— `git log --oneline -20 -- <paths>` 之外,裁决实施卡再核被点名的动作在 `origin/main` 上
还没被做掉;**卡引用面** —— 裁决/卡片点名为阻塞、认领面、协调对象或「落地即启用」依赖的每张
issue,逐个读当前 open/closed/assignee,引用读到的现状 ⛔ 不引用裁决写作时的描述(树答不了「那
张卡还开着吗」;过时动作断言 dev 动手即自纠,过时卡引用不变红)。花几分钟,不查则赔一次 agent 运行。
issue,逐个读当前 open/closed/assignee,引用读到的现状 ⛔ 不引用裁决写作时的描述(过时动作断言 dev 动手即自纠,过时卡引用不变红)。花几分钟,不查则赔一次 agent 运行。

**批次独立性。** 一批内任两单不得可能碰同一个包/registry/barrel/spec schema;拿不准就串行。**同
文件单跨轮硬串行;延后不是搁置**(被延后那一刻就把已知的坑记到该 issue 上)。**家族派发(family dispatch)是本条的范围澄清,不是豁免**:独立性防的是两个 agent 相撞同一区域,
Expand Down Expand Up @@ -423,8 +422,7 @@ dev 侧推分支要早 —— 远程分支是在飞工作最硬的证据。**死
draft-only、tier 推导引用、棘轮实况、释义纪律)。无条件条款只住角色文件(冲突时它胜、错了修那里,
⛔ 不靠派发词临时覆盖)。**终报要求随派发词带一句**:只收机器可核字段(gates/line_budget/
deviations/files_changed),⛔ 复述 PR body 叙事。**清单、路径、行号在派发那一刻从树上取**,⛔ 不
从卡片/上次派发/记忆抄(`node scripts/pm/dispatch-gates.mjs`,取数的是 PM 不是 dev —— dev 只跑
被点名的族,全 farm 归 CI;点名单是线索不是规格,dev 同脚本对实际改动重取、补跑漏点名的族并报告,条款在 os-dev 定义);行级断言转述前必须自己重验。
从卡片/上次派发/记忆抄(`node scripts/pm/dispatch-gates.mjs`,取数的是 PM;点名单是线索不是规格,dev 对实际改动重取补跑 —— 条款在 os-dev 定义,补遗见 runbook);行级断言转述前必须自己重验。
- **触 `skills/**`(对外发布的技能包)的卡,派发词必带 PM 定的净增行数预算**(按 feature 大小定,小功能给小数);dev 装不下 ⇒ 停手回报,⛔ 不自行扩写、不自行抬预算(抬预算是维护者裁决)。
**原则:对外发布的技能包是平台最大的对外价值,评估恒整包整体**(维护者 2026-08-21:「对外发布的 skills 是整个平台的最大价值,尤其要整体考虑和评估。」)。
- **文件面写两句**(预期落点 + 生产者在别包时报备后按生产者侧修,⛔ 不在消费者侧打补丁
Expand Down Expand Up @@ -521,7 +519,8 @@ os-zhuang 审核。我的手机github 应该会收到推送消息吧」;当日
肢**由声明行承载。档位以 dispatch-gates 常量 `CONTRACT_REVIEW_TIER` 为准(档位单源,⛔ 本文与标签不写模型名,模型升级只改一行一个文件)。派发席职责止于:卡上记一行认定、挂 `needs:contract-review`(标签命名审的对象,恒英文)——**PR 与卡双载体同笔挂**(维护者 2026-08-22:「简化一点是否可以直接挂 PR 侧」「两边都挂好」;PR 一存在即挂,报告先于 PR 到达则先挂卡侧、ACCEPT 时补齐 PR 侧),同笔在该 PR 上向复审席账号 request review(同裁决:「也可以直接要求复审」—— 仅通知,载体仍是标签)、停手;⛔ 禁止自查放行。
- **`needs:contract-review` 复审链**:复审资格 —— ① 跑在契约复审档位,硬条件,认定只认降档保险丝的机读;② 非该卡派发席,已从资格条件放宽为路径偏好(维护者 2026-08-21,原话:「你自己就是 Fable,自己就可以审核」):经同一机读证实达档的派发席,可对自派的卡执行契约复审并清标(审的是低档实现者的契约增量,非自身产物 —— 派发席不写代码);放宽豁免的是独立席位,不是复审本身 —— 一行结论照样先落卡、后清标,上条「⛔ 禁止自查放行」禁的是免复审直放,不禁本路径;低于契约复审档位的席照旧留标等待。归属:常设 = 分诊席(Routine 模型由维护者在 Routines UI
钉在契约复审档位),分诊轮子轮清该标签仍是默认清标路径(达档席自清仅是后备)—— 只审契约增量 diff、结论一行写在卡上、PASS 双载体同笔清标(PR 与卡各按标签纪律硬步骤)并清 review request 或留一条 review 评论,标清后卡方可入队;每小时一轮即天然攒批;过渡期(分诊 Routine 未建成前)由 skills 席代行。**降档保险丝**:
子轮开场**必调一次 `get_session`**(claude-code-remote MCP,无参)读 `external_metadata.last_served_model`,⛔ 自述档位不是读数(静默降档腐蚀的恰是自述;实测与配置档陷阱见 platform-readings);读数 ≠ `CONTRACT_REVIEW_TIER` ⇒ 该子轮整体跳过、标签原样留置 —— 卡在队列外等待是安全态;契约复审 ⛔ 不适用额度耗尽豁免降档(豁免的对象是派发;复审的存在意义就是补偿一次低于地板的派发)。**载体不迁移**(维护者 2026-08-18,原话:「中期把闸门迁到 PR review 的 Request Changes 上 我觉得没必要」):闸门载体保持本标签,⛔ 不迁 PR review / Request Changes、不为迁移留门;挂与清皆按标签纪律的 read-modify-write 硬步骤写。
子轮开场**必调一次 `get_session`**(claude-code-remote MCP,无参)读 `external_metadata.last_served_model`,⛔ 自述档位不是读数(静默降档腐蚀的恰是自述;实测与配置档陷阱见 platform-readings);读数 ≠ `CONTRACT_REVIEW_TIER` ⇒ 该子轮整体跳过、标签原样留置 —— 卡在队列外等待是安全态。
**保险丝只对座位自会话有效**:`mode:subagent` 里的 `get_session` 量的是**派发会话**(实测:钉在地板档的子代理读回父会话的档位,`session_context.model` 与 `last_served_model` 一致只是同一来源引用两次,⛔ 不作互证)—— subagent 的实际服役档位现无法自证,条款②的 `mode:subagent` 派发因此恒保留 `needs:contract-review` 走复审链,「派发已在地板」的免审跳过仅座位自会话成立。契约复审 ⛔ 不适用额度耗尽豁免降档(豁免的对象是派发;复审的存在意义就是补偿一次低于地板的派发)。**载体不迁移**(维护者 2026-08-18,原话:「中期把闸门迁到 PR review 的 Request Changes 上 我觉得没必要」):闸门载体保持本标签,⛔ 不迁 PR review / Request Changes、不为迁移留门;挂与清皆按标签纪律的 read-modify-write 硬步骤写。
- **碰生成物的 PR,入队前先同步 + 整体重生成**(os-regen 驱动零冲突标记地**静默丢掉一侧改动**):
四步序已机械化 `bash scripts/pm/os-regen-merge.sh`;陷阱、断言措辞与锚点禁令见 landing-operations A。
- **跟到 MERGED 为止;入队后的看护同归车道 PM 的落地窗口**:验收、首次入队 flip 定点、MERGED 两读
Expand Down Expand Up @@ -676,6 +675,7 @@ grep <branch>`),复升级时逐条**跑**一遍,零命中/变形的就地改写
| `scripts/pm/check-half-states.mjs` | label/assignee/PR 半状态的 report-only 巡查(含已复核就绪却无人落地的孤儿 PR 检测) |
| `scripts/pm/check-governed-merges.mjs` | governed 面合并清单的 report-only 审计(事后防线;轮报载体,本地枚举零 API,仅归因走查询) |
| `scripts/pm/dispatch-gates.mjs` | 文件面 → 该跑的门禁族(派发令取数) |
| `scripts/pm/git-history.mjs` | 窗口化 commit 计数:回答或 REFUSE —— 浅 clone 对窗口化 `git log`/`rev-list` 以 exit 0 无警告答错;`historyHorizon()` 是自答工具的只读谓词 |
| `scripts/pm/os-regen-merge.sh` | 碰生成物 PR 的 merge 四步序(防静默吞并与锚点倒退) |
| `scripts/pm/ensure-pm-labels.sh` | pm 标签词表的幂等一次性创建;退役车道刻意不在 ⛔ 不加回,理由与对象清理以脚本头为权威 |
| `check:skill-frame-sync` / `-freshness` | 四维决策框架四份拷贝的同构与新鲜度 |
Expand Down
Loading
Loading