diff --git a/.claude/skills/pm-dispatch/references/cross-repo-coordination.md b/.claude/skills/pm-dispatch/references/cross-repo-coordination.md index 61966782262..370393c4740 100644 --- a/.claude/skills/pm-dispatch/references/cross-repo-coordination.md +++ b/.claude/skills/pm-dispatch/references/cross-repo-coordination.md @@ -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 周期,或某仓在全序下持续断粮 ⇒ 按仓拆回多席。 diff --git a/.claude/skills/pm-dispatch/references/lanes/devx.md b/.claude/skills/pm-dispatch/references/lanes/devx.md index 08dddf988a6..c794867f9f1 100644 --- a/.claude/skills/pm-dispatch/references/lanes/devx.md +++ b/.claude/skills/pm-dispatch/references/lanes/devx.md @@ -5,7 +5,6 @@ ## 范围 - 本席路径面全量在 SKILL.md 域车道表 `domain:devx` 行,⛔ 不另抄。 -- objectui 的本域面同辖:`.github/`、`scripts/`、构建与发布管线、门禁工具。 - 边界:守护 skills 的门禁脚本在 `scripts/` 下时归本席,判据是被改文件的路径。 - SUBJECT 例外与 spec 三面切分在 SKILL.md 域车道表;`.claude/workflows/` 不是 `.claude/skills/`。 - 范围内的文件不等于范围内的卡:归属按卡的 `domain:*` 判,反向亦然。 diff --git a/.claude/skills/pm-dispatch/references/lanes/spec.md b/.claude/skills/pm-dispatch/references/lanes/spec.md index 14a4668a1cf..e5bf47e076f 100644 --- a/.claude/skills/pm-dispatch/references/lanes/spec.md +++ b/.claude/skills/pm-dispatch/references/lanes/spec.md @@ -10,7 +10,6 @@ - 含 `packages/spec/scripts/**`、`packages/spec/docs/**`。 - 同含围着 spec 契约转的工具链:门禁、生成器、lint 规则、报错散文、references 管线。 - 一般开发工具面留 devx;`packages/spec` 恒归本席,不论谁需要它。 -- objectui 的契约面同辖:`packages/types`、schema 与 `$schema` 语料、spec pin 耦合与契约决策卡。 ## 席内分派参考 diff --git a/.claude/skills/pm-dispatch/references/lanes/ui.md b/.claude/skills/pm-dispatch/references/lanes/ui.md index d7247b47905..c05305e090c 100644 --- a/.claude/skills/pm-dispatch/references/lanes/ui.md +++ b/.claude/skills/pm-dispatch/references/lanes/ui.md @@ -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 受管面段。 diff --git a/scripts/pm/check-half-states.mjs b/scripts/pm/check-half-states.mjs index 4cb17365491..23a11e25341 100644 --- a/scripts/pm/check-half-states.mjs +++ b/scripts/pm/check-half-states.mjs @@ -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: @@ -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); diff --git a/scripts/pm/ensure-pm-labels.sh b/scripts/pm/ensure-pm-labels.sh index 1daf70be465..06ecbabefd4 100644 --- a/scripts/pm/ensure-pm-labels.sh +++ b/scripts/pm/ensure-pm-labels.sh @@ -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 @@ -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