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
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
- 新仓登记是一张清单:座位贴、标签、类别归属、门禁盘点、写身份锁移植(deny + hooks)。
- 新仓准入判据一句:这个仓真的需要常设席位吗。
- hotcrm 收卡判据与宪章见 `references/lanes/hotcrm.md`。
- objectui 卡按修复落点分流三流,`domain:ui` 是唯一新增标签。
- `domain:devx`(工程面)与 `domain:spec`(契约面)跨仓归各自车道。
- 其余(发布库与 apps)归 `domain:ui` 执行席;症状位置不改流向,docs 随所记录的面走。
- objectui 卡按修复落点分两条车道:`domain:ui`(全部代码)与 `domain:skills`(仓根发布 `skills/**`)。
- objectui 的 `domain:spec`、`domain:devx`、`domain:tooling` 已退役:⛔ 不贴、不认领、不再创建。
- 协议恒归 objectstack `domain:spec`;跨层功能照规则 2,objectui 子单归 `domain:ui`。
- 车道可分席(席号 `· seat N`,或域×仓):忙时一车道开多席,闲时收归一席;每席独立座位贴。
- 认领评论带 `Seat: domain:X#N` 行申报席号(缺省席 1);同席认领互斥,他席认领不触发自退。
- 拆分触发预登记:单轮逼近 fire 周期,或某仓在全序下持续断粮 ⇒ 按仓拆回多席。
Expand Down
1 change: 0 additions & 1 deletion .claude/skills/pm-dispatch/references/lanes/devx.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
## 范围

- 本席路径面全量在 SKILL.md 域车道表 `domain:devx` 行,⛔ 不另抄。
- objectui 的本域面同辖:`.github/`、`scripts/`、构建与发布管线、门禁工具。
- 边界:守护 skills 的门禁脚本在 `scripts/` 下时归本席,判据是被改文件的路径。
- SUBJECT 例外与 spec 三面切分在 SKILL.md 域车道表;`.claude/workflows/` 不是 `.claude/skills/`。
- 范围内的文件不等于范围内的卡:归属按卡的 `domain:*` 判,反向亦然。
Expand Down
1 change: 0 additions & 1 deletion .claude/skills/pm-dispatch/references/lanes/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
- 含 `packages/spec/scripts/**`、`packages/spec/docs/**`。
- 同含围着 spec 契约转的工具链:门禁、生成器、lint 规则、报错散文、references 管线。
- 一般开发工具面留 devx;`packages/spec` 恒归本席,不论谁需要它。
- objectui 的契约面同辖:`packages/types`、schema 与 `$schema` 语料、spec pin 耦合与契约决策卡。

## 席内分派参考

Expand Down
6 changes: 3 additions & 3 deletions .claude/skills/pm-dispatch/references/lanes/ui.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@

## 范围

- 三流分流的残余流归本席:发布库 `@object-ui/*` 与 `apps/*`,判据见 cross-repo-coordination.md。
- objectui 的 `domain:devx` 与 `domain:spec` 卡归各自跨仓车道,⛔ 不归本席。
- objectui 全部代码归本席:发布库 `@object-ui/*` 与 `apps/*`;`packages/types`、schema 语料与 spec pin;
- `.github/`、`scripts/`、构建与发布管线、门禁工具;docs 随所记录的面走。
- 协议恒归 objectstack `domain:spec`,新 `packages/spec` 工作同此;跨层功能的 objectui 子单归本席。
- 落点不明留分诊首触,⛔ 不猜、不代判。

## 常设承诺

- 构建产物经 `pnpm objectui:refresh` 回流,见 cross-repo-coordination.md。
- 回流后的 console pin bump 是 objectstack 的单张卡,⛔ 永不做本仓 PR 的 rider。
- 新 `packages/spec` 工作恒归 `domain:spec` 席,已派发卡 ⛔ 不因此转席,见 cross-repo-coordination.md。
- `scripts/pm/**` 单写手恒在 objectstack 侧 ⇒ 本席的工具需求走上游卡带 `Blocked-by:` 回链。
- 本仓标签/assignee 写走 objectstack `label-write.mjs --repo`,⛔ 不 MCP `issue_write`;被拒转有通道席。
- 受管面五项含仓根发布 `skills/**`,清单、判据与禁令见 objectui AGENTS.md §9 受管面段。
Expand Down
7 changes: 4 additions & 3 deletions scripts/pm/check-half-states.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7437,7 +7437,8 @@ export function seatDeclaresWait(markerBody) {
* three measured shapes (2026-08-25 census, all 12 open seat posts):
*
* `domain:engine` — a lane on THIS board
* `domain:devx @ objectui` — a lane on a SIBLING board
* `domain:ui @ objectui` — a lane on a SIBLING board (the census read
* `domain:devx`; objectui retired it 2026-10-22, keeping `domain:ui` and `domain:skills`)
* `repo:cloud` / `skills` / `triage (objectstack-wide)`
*
* plus the free-claim multi-seat shape the protocol added afterwards:
Expand Down Expand Up @@ -30166,8 +30167,8 @@ async function selfTest() {
t('H38 seat: …and is not foreign', seatLane(seat38(seat2Title)).foreign, false);
t('H38 seat: …and carries the seat number', seatLane(seat38(seat2Title)).seat, 2);
t('H38 seat: a bare title is seat 1', seatLane(seat38()).seat, 1);
t('H38 seat: a numbered seat on a SIBLING board is still foreign', seatLane(seat38('[PM seat] domain:devx · seat 3 @ objectui — 🟢 os-b')).foreign, true);
t('H38 seat: …and still carries its number', seatLane(seat38('[PM seat] domain:devx · seat 3 @ objectui — 🟢 os-b')).seat, 3);
t('H38 seat: a numbered seat on a SIBLING board is still foreign', seatLane(seat38('[PM seat] domain:ui · seat 3 @ objectui — 🟢 os-b')).foreign, true);
t('H38 seat: …and still carries its number', seatLane(seat38('[PM seat] domain:ui · seat 3 @ objectui — 🟢 os-b')).seat, 3);
t('H38 seat: a numbered seat still buys the H32 comment fetch', h32NeedsSeatComments(seat38(seat2Title)), true);
t('H38 seat: an unparseable title has no seat', seatLane(seat38('not a seat title')).seat, null);
t('H38 seat: a claim with no `Seat:` line is seat 1', claimSeatNumber('Claim: x\nBranch: `claude/issue-1-a`'), 1);
Expand Down
63 changes: 42 additions & 21 deletions scripts/pm/ensure-pm-labels.sh
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@
# deliberately ABSENT — recreating a retired label puts an ownerless lane back
# into GitHub's autocomplete. Their leftover label OBJECTS may still exist in
# the repos; deleting those objects is a separate, deliberate PM action.
# The objectui-repo STREAM labels domain:spec / domain:devx / domain:tooling,
# retired in objectui only on 2026-10-22 (maintainer ruling 「甲,现在做」), are
# recorded beside the objectui domain:ui row further down, for the reason the
# next paragraph gives for `repo:objectstack`.
#
# ⛔ One RETIRED ROUTING label is held on those same two terms — deliberately
# absent, object deliberately kept — but is recorded beside the `repo:*` rows
Expand Down Expand Up @@ -460,28 +464,45 @@ gh label create domain:cloud -R objectstack-ai/objectui -c bfd4f2 -d "Cloud-s
gh label create status:parked -R objectstack-ai/objectstack -c cfd3d7 -d "Parked — exempt from the PM sweep and half-state patrol until its owner migrates it (e.g. cloud PM)" 2>/dev/null || true
gh label create status:parked -R objectstack-ai/objectui -c cfd3d7 -d "Parked in objectui — exempt from the PM sweep until the cloud PM migrates it (with domain:cloud)" 2>/dev/null || true

# objectui workload streams — maintainer rulings 2026-08-21, quoted verbatim:
# objectui workload lanes — TWO since the maintainer's ruling of 2026-10-22,
# quoted verbatim: 「objectui 只有 skills 是特殊的,他本身没有 spec 的概念。devx
# 我感觉可以和 ui 合并」, and on the options put to them, 「甲,现在做」. The
# three-stream vocabulary it replaces (maintainer rulings 2026-08-21, verbatim:
# 「B:两车道」→「现在本身就有 domain:devx」→「不要搞出那么多车道名称」→「也有
# domain:spec」「其他就是 domain:ui ?」, naming finalized 「按 domain:ui 定稿」.
# objectui cards are streamed by the domain of the surface their FIX lands on
# (never by symptom location; docs cards follow the surface they document):
# domain:devx (engineering face — .github/, scripts/, build/publish/release
# pipeline, gate tooling) and domain:spec (contract face — packages/types, the
# schema corpus, @objectstack/spec pin coupling) reuse the EXISTING cross-repo
# lane names and are worked by those lanes exactly as main-repo cards are;
# domain:ui is the ONE new label, named for the repo's own trade — the published
# library (components, plugin-*, fields, layout, core) and the apps — worked by
# the objectui execution seat. Cards whose landing surface is undetermined stay
# unstreamed for triage first-touch rather than guessed. These rows create
# objectui-repo label OBJECTS: the main-repo lane roster (the loop above) is
# untouched, and the retired main-repo domain:ui lane stays retired there (see
# the header). Named consumers: the objectui execution seat's candidate query
# and the devx / spec lanes' cross-repo pulls (SKILL.md 多仓协调). Streaming
# the existing objectui backlog is a triage duty once the vocabulary lands —
# by file-path evidence, never guessed — not this script's.
gh label create domain:devx -R objectstack-ai/objectui -c bfd4f2 -d "objectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo" 2>/dev/null || true
gh label create domain:spec -R objectstack-ai/objectui -c bfd4f2 -d "objectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane" 2>/dev/null || true
gh label create domain:ui -R objectstack-ai/objectui -c bfd4f2 -d "objectui ui stream: fix lands on the published library or apps — objectui execution seat" 2>/dev/null || true
# domain:spec」「其他就是 domain:ui ?」, naming finalized 「按 domain:ui 定稿」)
# streamed objectui cards by the surface their FIX lands on into domain:devx
# (engineering face), domain:spec (contract face) and domain:ui (the rest).
# Measured on objectui, 2026-10-08 → 2026-10-22: every domain:spec card was
# objectui's own packages/types, docs and widgets catching up with the protocol
# and was worked by objectui hands — the protocol itself lives only in
# objectstack — and every domain:devx card was objectui CI, test shards, pin
# and release tooling, worked by ui seats. So objectui has exactly two lanes:
# domain:ui — ALL objectui code: the published library (components,
# plugin-*, fields, layout, core) and the apps; packages/types,
# the schema corpus and the @objectstack/spec pin coupling;
# .github/, scripts/, the build/publish/release pipeline and
# the gate tooling; docs, which follow the surface they
# document. Worked by the objectui execution seat.
# domain:skills — the published skills/** (a governed surface). No objectui
# row here: this file has never created that object; a row
# arrives by PR with the reader that names it.
# ⛔ RETIRED in objectui only, 2026-10-22: domain:spec, domain:devx and
# domain:tooling. This script stops creating the first two (domain:tooling was
# never a row here); their leftover label OBJECTS on objectui are cleaned up by
# the separate, deliberate PM act the header describes — a "retired, use
# domain:ui" description, or deletion. objectstack's own domain:spec and
# domain:devx lanes are untouched: the retirement is per repo. The protocol
# stays objectstack domain:spec's — a cross-layer feature keeps its parent plus
# per-layer children, spec and backend first, and its objectui child is now
# domain:ui. Cards whose landing surface is undetermined stay unstreamed for
# triage first-touch rather than guessed. The row below creates the objectui-
# repo label OBJECT: the main-repo lane roster (the loop above) is untouched,
# and the retired main-repo domain:ui lane stays retired there (see the
# header). Named consumer: the objectui execution seat's candidate query
# (.claude/skills/pm-dispatch/references/lanes/ui.md). Re-laning the open
# objectui backlog onto domain:ui was triage's act on the ruling's day, by
# file-path evidence — not this script's.
gh label create domain:ui -R objectstack-ai/objectui -c bfd4f2 -d "objectui ui lane: all objectui code — library, apps, packages/types, .github/, scripts/, docs" 2>/dev/null || true

# The FEATURE AXIS — `area:*`, one per card, eleven values. It is the PLANNING
# axis: priority is judged on it, and `domain:*` beside it decides only which
Expand Down
Loading