Skip to content

Commit 0d15f89

Browse files
hotlongclaude
andauthored
pm-dispatch: register objectstack-ai/mobile as an on-demand repo lane (#29056)
No issue: this registers a sibling repository for the PM loop, at the maintainer's direction (quoted below). ## What changes - `scripts/pm/check-governed-merges.mjs`: - `GOVERNED_REPOS` gains `{ id: 'mobile', slug: 'objectstack-ai/mobile' }`; - the docblock records why; - the two self-test pins that spell the roster move five → six. - The scoped `workflows` row is unchanged, so mobile's EAS workflows are not a governed surface (same as hotcrm). The default-scoped rows (ADRs, `.claude/**`, skills, `AGENTS.md`, `CLAUDE.md`, North Star) now govern mobile too. - `.claude/skills/pm-dispatch/references/lanes/mobile.md` (new): the `repo:mobile` seat charter. - The seat is summoned on demand and creates no patrol routine. - Business UI stays in the Console; the shell takes native capability only. - Console defects found on mobile are filed at objectstack, never worked around in the shell. - While a push to `main` runs `eas-build` / `eas-update`, merges in that repo are the maintainer's (AGENTS.md release directive). - Device-only acceptance goes to the maintainer and is never reported as verified. - `scripts/pm/ensure-pm-labels.sh`: the pm vocabulary loop includes `objectstack-ai/mobile`. No `repo:mobile` seam row is added, because no reader exists yet. - `references/project-forms.md`: the seat words include `mobile`. - `references/cross-repo-coordination.md`: the single-lane repo list includes `mobile`. - `scripts/pm/check-skill-line-ratchet.mjs`: rows for the new charter (49 lines, 0 table-row bytes), at the landed count. ## Why `objectstack-ai/mobile` 2.0 is a native shell around the Console (objectstack-ai/mobile#144). Its follow-up cards (objectstack-ai/mobile#145–#148) need a seat to be dispatched. Admission was put to the maintainer as three options; the answer was: > Register, seat on demand (Recommended) The rationale presented with that recommendation: most follow-up work lands in this repository's existing `ui` / `server` lanes (#29039–#29042), so the mobile lane's volume is low and a standing routine would spend budget on an empty queue. ## Verification Run in this branch's worktree, each with its exit code captured before any pipe: - `node scripts/pm/check-skill-line-ratchet.mjs --self-test`: 164 cases pass. The gate itself exits 0; it first flagged 7 charter lines over the 120-byte budget, which were wrapped before the pin was set. - `node scripts/pm/check-skill-id-lint.mjs` (and `--self-test`): clean. - `node scripts/pm/check-governed-merges.mjs --self-test`: 537 assertions, exit 0. It needs `pnpm install` first. - `node scripts/pm/check-governed-prose.mjs`: exit 0. - `node scripts/pm/post-stamped.mjs --self-test`: 753 cases. `OWN_REFERENCE_PREFIXES` derives from the roster. - `node scripts/pm/check-half-states.mjs --self-test`: 5185 cases. - `node scripts/pm/check-label-desc-cap.mjs`: exit 0. - `npx eslint` on the two changed `.mjs` files: clean. `bash -n scripts/pm/ensure-pm-labels.sh`: ok. - `node scripts/pm/dispatch-gates.mjs --self-test`: still running when this PR was opened; CI carries it. Clause-②: no Metadata-protocol: none Nothing here publishes: `scripts/pm` and `.claude/**` are repo tooling, so there is no changeset. ## Landing Governed surface: `.claude/**` is Tier S and no Tier H path is touched. This PR is left in draft for its contract-tier review of record. The steps after merge belong to the maintainer: - install the fleet App on `objectstack-ai/mobile`; - run `scripts/pm/ensure-pm-labels.sh` against it; - the seat's first summons writes its seat post. ## 维护者速读 - 改了什么:把 mobile 仓登记进 PM 循环:受管仓名册加一行,新增 `repo:mobile` 席位宪章(按需召唤、不建巡查 routine),标签词表与席位词同步。 - 为什么改:mobile 已改为宿主 Console 的原生壳,后续卡要靠 pm-dispatch 派发;你选了「登记、按需召唤」。 - 风险与回滚:只动 PM 工具与 `.claude/**`,不碰产品包;回滚即还原本 PR。mobile 的 EAS workflow 不纳入受管面。 - 先看:`references/lanes/mobile.md` 的「常设承诺」,尤其是「main 上 push 触发 EAS 期间合并归你」这一条。 - 两分钟验证:`node scripts/pm/check-governed-merges.mjs --self-test` 与 `node scripts/pm/check-skill-line-ratchet.mjs`,两者都应退出 0。 - 需要你做的:按 Tier S 走达档复核后落地;合并后在 mobile 仓安装车队 App,再对它跑一次 `ensure-pm-labels.sh`。 ## Human Minimum - [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic. (not touched) - [x] 2. Every name I added uses the casing for its kind. - [x] 3. No formatter ran; `pnpm lint` passes on the changed files. - [ ] 4. One issue, one branch off an up-to-date `main`, one pull request. (no issue; branch off `main` from today) - [x] 5. A change that publishes carries a changeset. (nothing publishes) - [x] 6. `packages/spec` touched: n/a. - [x] 7. No hand edits to generated or release-owned docs. - [x] 8. Title, body and comments are in English. (the 维护者速读 block is the maintainer's channel) --- _Generated by [Claude Code](https://claude.ai/code/session_01Q4EjjRHkJgnuLkU9vVgHHR)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent ea150b7 commit 0d15f89

12 files changed

Lines changed: 135 additions & 41 deletions

‎.claude/settings.json‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,33 +30,43 @@
3030
"Bash(agent-browser skills *)",
3131
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/objectstack/issues/*/labels *)",
3232
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/hotcrm/issues/*/labels *)",
33+
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/mobile/issues/*/labels *)",
3334
"Bash(curl -sS -X GET https://api.github.com/rate_limit *)",
3435
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectstack/issues?* *)",
3536
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectui/issues?* *)",
3637
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/hotcrm/issues?* *)",
38+
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/mobile/issues?* *)",
3739
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectstack/issues/* *)",
3840
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectui/issues/* *)",
3941
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/hotcrm/issues/* *)",
42+
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/mobile/issues/* *)",
4043
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectstack/issues/*/comments* *)",
4144
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectui/issues/*/comments* *)",
4245
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/hotcrm/issues/*/comments* *)",
46+
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/mobile/issues/*/comments* *)",
4347
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectstack/issues/*/labels* *)",
4448
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectui/issues/*/labels* *)",
4549
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/hotcrm/issues/*/labels* *)",
50+
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/mobile/issues/*/labels* *)",
4651
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectstack/pulls/* *)",
4752
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectui/pulls/* *)",
4853
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/hotcrm/pulls/* *)",
54+
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/mobile/pulls/* *)",
4955
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectstack/pulls/*/files* *)",
5056
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectui/pulls/*/files* *)",
5157
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/hotcrm/pulls/*/files* *)",
58+
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/mobile/pulls/*/files* *)",
5259
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectstack/pulls/*/commits* *)",
5360
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectui/pulls/*/commits* *)",
5461
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/hotcrm/pulls/*/commits* *)",
62+
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/mobile/pulls/*/commits* *)",
5563
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectstack/commits/*/check-runs* *)",
5664
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectui/commits/*/check-runs* *)",
5765
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/hotcrm/commits/*/check-runs* *)",
66+
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/mobile/commits/*/check-runs* *)",
5867
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/objectstack/pulls/* *)",
5968
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/hotcrm/pulls/* *)",
69+
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/mobile/pulls/* *)",
6070
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/objectstack/pulls/*/ccr/ready_for_review *)",
6171
"Bash(curl -sS -X PUT https://api.github.com/repos/objectstack-ai/objectstack/pulls/*/ccr/auto_merge *)",
6272
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/hotcrm/pulls/*/ccr/ready_for_review *)",
@@ -74,7 +84,8 @@
7484
"Bash(node scripts/pm/issue-transfer.mjs *)",
7585
"Bash(node --use-env-proxy scripts/pm/issue-transfer.mjs *)",
7686
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/objectstack/issues/* *)",
77-
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/hotcrm/issues/* *)"
87+
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/hotcrm/issues/* *)",
88+
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/mobile/issues/* *)"
7889
],
7990
"deny": [
8091
"mcp__github__issue_write",

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,10 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
6969
- 批 = 一个上下文里读完的 ≤5 张同族卡,是质量单位,⛔ 不是预算。
7070
- 班 = 一个会话的任期,只以交接或惰性回收结束。
7171
- 席位两形:Routine 席与项目席(会话是车队项目的线程);细则见 `references/seat-lifecycle.md`。
72-
- 项目席唤醒 = PR 订阅 + 每席一个自建自绑巡查 routine(总监席除外);⛔ 无 `send_later` 链。
72+
- 项目席唤醒 = PR 订阅 + 自建自绑巡查 routine(总监席与按需席除外);⛔ 无 `send_later` 链。
7373
- 探针先行:fire 的第一动作是一次最便宜的车道盘点查询,⛔ 在它之前不读任何长文本。
7474
- 队列空(逐卡表见 `references/seat-lifecycle.md`)+ 无在飞 + 无待复核 + 决策箱无新答复 ⇒ 自退。
75-
- 分诊席与车道席常驻,断粮即换账号重开该席与信箱;分诊席默认判断档;裁决归总监席。
75+
- 分诊席与车道席常驻(按需席除外),断粮换号重开席与信箱;分诊默认判断档;裁决归总监。
7676
- 子代理裁决逐份过转录核验采信。
7777

7878
## 阶段细则索引

‎.claude/skills/pm-dispatch/references/cross-repo-coordination.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# 多仓协调
22

3-
- 产品依赖方向固定:`objectstack`(后端与 `ui/` 前端,`packages/spec` 唯一契约)→ `cloud`、`hotcrm`。
3+
- 依赖方向固定:`objectstack`(后端与 `ui/`,`packages/spec` 唯一契约)→ `cloud`、`hotcrm`、`mobile`。
44
- 多车道仓 `objectstack`:中央分诊唯一生产 `domain:*`/type/定级,定级例外见 triage-duties 自分诊。
5-
- 单车道仓 `cloud`、`objectos`、`hotcrm`、`www.objectos.ai`;未来新仓默认此类。
5+
- 单车道仓 `cloud`、`objectos`、`hotcrm`、`mobile`、`www.objectos.ai`;未来新仓默认此类。
66
- 单车道仓 `repo:*` 席自理机械三务,⛔ 不产 `domain:*`;决策卡入本仓收件箱,不落 objectstack。
77
- 机械三务 = 自扫 sweep、自打 `type`、自做首触(含 `finding`;业务理由归召唤的总监席)。
88
- 新仓登记是一张清单:座位贴、标签、类别归属、门禁盘点、写身份锁移植(deny + hooks)。

‎.claude/skills/pm-dispatch/references/decision-analysis.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444
## 应用仓推荐序特例
4545

46-
- 能力先建在平台(spec、objectstack 运行时与其 `ui/` 渲染器);应用仓(cloud、hotcrm)不自建替代。
46+
- 能力先建在平台(spec、运行时与 `ui/` 渲染器);应用仓(cloud、hotcrm、mobile)不自建替代。
4747
- 阻塞源是平台缺陷 ⇒ 恒荐等待;⛔ 不荐绕行(形状容错、复刻平台规则)、不荐劈半落地。
4848
- 过渡唯维护者明裁;应用仓临时扩展平台契约,仅当平台卡与移除卡同一裁决立出。
4949
- 应用仓裁决立出的平台卡取被裁卡优先级,⛔ 不降档。推论出处:cloud 2932 A、cloud 2924 A。

‎.claude/skills/pm-dispatch/references/lanes/hotcrm.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
- 依赖是已发布的 `@objectstack/*` 包,逐包定版号,非 git pin。
4444
- ⇒ 平台侧修复必须先发版、再在此升版号才到得了展品。
4545
- 上游卡对本道的解锁判据是已发布,不是已合并。
46-
- pm 状态机词表五仓统一,幂等创建在 `scripts/pm/ensure-pm-labels.sh`,对 hotcrm 实跑是落地步骤。
46+
- pm 状态机词表各仓统一,幂等创建在 `scripts/pm/ensure-pm-labels.sh`,对 hotcrm 实跑是落地步骤。
4747

4848
## 席内判断
4949

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# 车道岗位说明:repo:mobile
2+
3+
见 cross-repo-coordination.md;本文是本席的岗位说明,现值状态恒在座位贴,⛔ 不迁入本文件。
4+
5+
## 形态
6+
7+
- 本席为姊妹仓执行座位:在 mobile 仓认领、派发、复核;落地窗口止于 ACCEPT 加交棒。
8+
- 按需席:维护者以指令行 `pm-dispatch mobile` 召唤;本席不建巡查 routine。
9+
- 退席按 SKILL.md 自退四件(队列空、无在飞、无待复核、决策箱无新答复)。
10+
- 信箱随召唤开、随退席关。
11+
- 前提:mobile 仓的原生壳改造已进其 `main`;之前 ⛔ 不召唤本席。
12+
- 座位贴住 mobile 仓,带 `pm:seat`;车队总表经 `fleet-roster.mjs` 默认仓列读到它。
13+
- 存根的巡查行写 `Patrol: none — 按需席`:表明无 routine,半状态巡查只核此行在不在。
14+
- ⛔ 不产 `domain:*`;机械三务(含首触定级)按 cross-repo-coordination.md 单车道仓条自理。
15+
16+
## 范围
17+
18+
- `objectstack-ai/mobile` 全仓:Expo 原生壳,在 WebView 中宿主平台 Console。
19+
- 边界:业务界面与元数据渲染恒在平台 `ui/` 实现。
20+
- ⛔ 永不在壳内原生重写 Console 已有的界面。
21+
- 壳只收原生能力:服务器选择、推送、桥接方法、系统集成、原生加载与兜底页。
22+
- 原生业务页只经仓内 `docs/HYBRID-SHELL.md` 的路由归属规则进入,该节四条前提缺一不收。
23+
- 移动端发现的 Console 缺陷,立普通平台卡到 objectstack(渲染器在其 `ui/`),待分诊。
24+
- 那是 file-at-destination、非缝卡;mobile 侧同笔挂 `pm:blocked` 加 `Blocked-by:` 回链。
25+
- 解锁判据是修复已进平台发行版、配置的服务器可升到它;⛔ 不是上游已合并。
26+
- ⛔ 永不在壳内绕行 Console 缺陷:绕行把平台缺口藏进壳,其余宿主从此拿不到修复。
27+
- 桥接契约单源在仓内 `docs/HYBRID-SHELL.md`。
28+
- 新桥接方法验收后,即在 objectstack 立 Console 消费卡。
29+
- mobile 自己的卡(含决策卡)都住 mobile 仓:issue 住在修复落地的仓,决策入本仓收件箱。
30+
- 无 `repo:mobile` 缝标签:今无具名读者。
31+
- 首张跨仓次序即实质的协调卡出现时,随该卡走词表 PR 增设。
32+
33+
## 常设承诺
34+
35+
- 半状态巡查在本仓无载体:无 `half-state-patrol.yml`,无 workflow 即无锚 issue。
36+
- ⇒ 手工半边:开新派发前整车道全交集读 open 卡。
37+
- 逐张核交付 PR 是否已合并或关闭,先处置半状态;⛔ 无锚不等于免检。
38+
- 壳不持 API 凭据、不调平台 API;⛔ 不重新引入 `@objectstack/*` 客户端依赖。
39+
- `main` 上的 push 跑 `eas-build.yml` 与 `eas-update.yml`;`eas-submit.yml` 手动触发即商店提交。
40+
- 三者皆按发布动作对待(AGENTS.md 发布条),⛔ 不由席位触发。
41+
- `EXPO_TOKEN` 是否配置席位读不到,恒按已配置。
42+
- ⇒ 本仓 PR 的合并恒归维护者;改 `.github/workflows/**` 的 PR 同此,不因触发方式改变而解除。
43+
- 设备验证无 CI 载体:需真机的验收项写进 PR `## 维护者速读` 的「需要你做的」。
44+
- ⛔ 未上真机的项不报已验。
45+
- 本仓有 `.changeset/` 而无 changeset 门禁:用户可见变更随 PR 带 changeset,席位复核时核对。
46+
- 不扩散需求:创业阶段聚焦原则全额适用;原生能力卡第一问恒为 Web 是否真做不到。
47+
- 框架单源在 SKILL.md 〈升级与决策〉,⛔ 不另抄。
48+
- pm 状态机词表各仓统一,幂等创建在 `scripts/pm/ensure-pm-labels.sh`,对 mobile 实跑是落地步骤。
49+
50+
## 席内判断
51+
52+
- 收卡第一问:原生能力还是业务界面。
53+
- 业务界面 ⇒ 转 objectstack 平台卡,本卡关 not planned 并回链。
54+
- 原生页面化提案进决策箱,附该路由的移动端用量与 Web 端性能读数;无读数不收。
55+
- 会话转移、桥接新增写能力、导航策略放行新来源,皆属安全边界,恒在人工地板。
56+
- 拿不准升决策箱,⛔ 不自裁。

‎.claude/skills/pm-dispatch/references/project-forms.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
- 项目指令只有一行:`pm-dispatch <席位> [<席位>…]`,如 `pm-dispatch 总监`、`pm-dispatch ui skills`。
1414
- 首词恒为技能目录名 `pm-dispatch`;⛔ 不用 `fleet`,它已是 bot 与中继的名字。
1515
- 席位词 = 中文名或车道文件名:总监 = `lanes/director.md`,分诊 = `lanes/triage.md`。
16-
- 其余席位词同 `lanes/<lane>.md` 文件名:ui、skills、devx、server、spec、hotcrm。
16+
- 其余席位词同 `lanes/<lane>.md` 文件名:ui、skills、devx、server、spec、hotcrm、mobile。
1717
- 一车道多席:协调者取 🟢 行写本账号的那一席;无则取空席;再无则问维护者一次。
1818
- 其余一切住本文:⛔ 不往项目里贴模板;⛔ 不在账号层复制技能。
1919

@@ -23,7 +23,7 @@
2323
- 指令行就是指派:维护者在项目里写下或改写这一行,是唯一的指派动作。
2424
- 项目聊天里的长句(「本账户坐 X;Y 的 PR 由本账户复审」)是等价写法。
2525
- 坐席即把本账号写进 🟢 行、每席开一条席位线程;⛔ 无花名册文件。
26-
- 坐席即建巡查 routine(见 `seat-lifecycle.md`);分诊席加每小时裸卡轮;总监席不建。
26+
- 坐席即建巡查 routine(见 `seat-lifecycle.md`);分诊加每时裸卡轮;总监与宪章定的按需席不建。
2727

2828
## 接管不等撞墙账号
2929

‎.claude/skills/pm-dispatch/references/seat-lifecycle.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
## 停止条件与待命
8484

8585
- 停:队列空或 `rounds` 用尽(仅一次性调用适用);一轮 ≥ 半数派发失败或升级;维护者打断。
86-
- 队列空是待命非退场:巡查跑到收班,只维护者明令停;⛔ 不按「N 次无变化即停」的习惯。
86+
- 队列空是待命非退场(按需席除外):巡查跑到收班,只维护者令停;⛔ 不按 N 次无变化即停。
8787
- 队列空是逐卡表非结论:报无卡可派(维护者/协调者/轮报)即列队列过滤当刻返回的各卡。
8888
- 逐卡:卡号、同轮现读标签与 assignee(⛔ 不用缓存)、具名卡点;无卡点即候选,⛔ 不得报空。
8989
- 卡点一份词表:候选定义反面(`execution-duties.md`),open `Blocked-by:`、无分诊审计、他席 `Claim:`。

0 commit comments

Comments
 (0)