Repository navigation
pm-dispatch: register objectstack-ai/mobile as an on-demand repo lane - #29056
Conversation
The mobile app is now a native shell that hosts the Console (objectstack-ai/mobile#144). Register it so its cards can be dispatched: - GOVERNED_REPOS gains `mobile` (its workflows stay outside the scoped workflows row, as hotcrm's do); self-test pins move five -> six - references/lanes/mobile.md: the repo:mobile seat charter — summoned on demand, no patrol routine; business UI stays in the Console, the shell takes native capability only; Console defects filed at the platform - ensure-pm-labels.sh: the pm vocabulary loop includes mobile - seat words and the single-lane repo list name mobile - line ratchet: rows for the new charter at its landed count Claude-Session: https://claude.ai/code/session_01Q4EjjRHkJgnuLkU9vVgHHR Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgments
② Semver levelNothing publishes, so ③ Boundary flags
④ Design judgmentlanes/mobile.md
cross-repo-coordination.md
project-forms.md
Cited code
Implemented-by: VERDICT: FAIL Generated by Claude Code |
- M1: the on-demand seat is now an exception the standing rules name — SKILL.md (project-seat wake rule, resident seats), project-forms.md (taking a seat builds the patrol), seat-lifecycle.md (empty queue is standby) — and the charter exits by SKILL.md's four-part self-exit, opening and closing its mailbox per summons - S1: the seat's window ends at ACCEPT plus hand-off; mobile merges stay the maintainer's - S2: Console-defect cards unblock on a released platform version the configured server can reach, not on an upstream merge - S3: the seat is not summoned before the shell rewrite is on mobile main - S4: the seat post lives in mobile; pm:seat is created there and fleet-roster's DEFAULT_REPOS lists mobile - S5: eas-submit.yml named; the release rule no longer conditions on a secret a seat cannot read, and workflow PRs stay maintainer-merged - S7: mobile joins the dependency direction and the app-repo list - S8: roster comments that state the current count say six; hotcrm's charter says 各仓统一 Claude-Session: https://claude.ai/code/session_01Q4EjjRHkJgnuLkU9vVgHHR Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgmentsDelta 33e1e9c is the only commit on top of a3b6d39. Every judgment in the first record still holds. The delta changes the following:
② Semver levelUnchanged. Nothing publishes, ③ Boundary flags
④ Design judgmentFindings from the first record: M1 RESOLVED; S1, S2, S3, S4, S5 and S7 RESOLVED; S6 escalated to the maintainer and accepted; S8 RESOLVED except one leftover "Five-repo loop" at ensure-pm-labels.sh line 217 (trivial). New findings:
Nothing the delta touches breaks against the code it cites. Implemented-by: VERDICT: PASS Generated by Claude Code |
- S9: the mobile seat stub records `Patrol: none — 按需席`, so the half-state sweep's H70 (which checks the line's presence, not its value) reads an on-demand seat honestly instead of flagging it - S10: project-forms.md defines 按需席 as a seat a charter sets on demand - S8 residue: the last "Five-repo loop" comment says per-repo Claude-Session: https://claude.ai/code/session_01Q4EjjRHkJgnuLkU9vVgHHR Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgmentsDelta 41a35b3 is the only commit on top of the PASS head 33e1e9c: 11 files, +119 / −39 net against main.
② Semver levelUnchanged. Nothing publishes, and ③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: PASS Generated by Claude Code |
… line check-label-desc-cap's self-test requires each parsed `gh label create` line to produce a distinct description; the second, identical pm:seat line for mobile broke "the run invokes at least one description per parsed line" (Lint · repo & tooling gates red on 33e1e9c and 41a35b3). One loop over both repos keeps the same labels with one parsed line. Claude-Session: https://claude.ai/code/session_01Q4EjjRHkJgnuLkU9vVgHHR Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgmentsDelta 93fb90c is the only commit on top of 41a35b3 and touches only
② Semver levelUnchanged. Nothing publishes, and ③ Boundary flags
④ Design judgmentThe seven governed prose files are untouched since 41a35b3, so every judgment of the previous record stands:
The loop holds against the gate it answers, its comment states the gate's reason correctly, and nothing else moves. Implemented-by: VERDICT: PASS Generated by Claude Code |
Maintainer ruling on the review's S6 (2026-11-02, verbatim choice: "A: reads + PATCH (Recommended)"): mobile gets the same per-repo REST rows hotcrm has for reads (issues, comments, labels, pulls, files, commits, check-runs), POST labels, and PATCH on pulls and issues — and deliberately NOT the ccr/ready_for_review and ccr/auto_merge pair, because every mobile merge is the maintainer's (lanes/mobile.md). The deny list is unchanged; check-settings-deny-roster stays green. Claude-Session: https://claude.ai/code/session_01Q4EjjRHkJgnuLkU9vVgHHR Co-authored-by: Claude <noreply@anthropic.com>
Maintainer rulings on the two escalations from the contract reviewsThe maintainer ruled both escalations in-session on 2026-11-02, after reading a four-axis analysis from the decision framework. Their choices, verbatim:
Generated by Claude Code |
Contract reviewServed-tier: ① Derived judgmentsDelta 3ace753 is the only commit on top of 93fb90c and touches only
② Semver levelUnchanged. Nothing publishes, and ③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: PASS Generated by Claude Code |
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_REPOSgains{ id: 'mobile', slug: 'objectstack-ai/mobile' };workflowsrow 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): therepo:mobileseat charter.mainrunseas-build/eas-update, merges in that repo are the maintainer's (AGENTS.md release directive).scripts/pm/ensure-pm-labels.sh: the pm vocabulary loop includesobjectstack-ai/mobile. Norepo:mobileseam row is added, because no reader exists yet.references/project-forms.md: the seat words includemobile.references/cross-repo-coordination.md: the single-lane repo list includesmobile.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/mobile2.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:The rationale presented with that recommendation: most follow-up work lands in this repository's existing
ui/serverlanes (#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 needspnpm installfirst.node scripts/pm/check-governed-prose.mjs: exit 0.node scripts/pm/post-stamped.mjs --self-test: 753 cases.OWN_REFERENCE_PREFIXESderives 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 eslinton the two changed.mjsfiles: 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/pmand.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:objectstack-ai/mobile;scripts/pm/ensure-pm-labels.shagainst it;维护者速读
repo:mobile席位宪章(按需召唤、不建巡查 routine),标签词表与席位词同步。.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。ensure-pm-labels.sh。Human Minimum
packages/specholds no runtime logic. (not touched)pnpm lintpasses on the changed files.main, one pull request. (no issue; branch offmainfrom today)packages/spectouched: n/a.Generated by Claude Code