Skip to content

Commit 3d50a43

Browse files
docs(agents): instructions treat ui/ as a workspace, not the objectui sibling repo (#26216)
<!-- claude-projects-attribution: {"github_login":"os-tesla"} --> _Requested by **Tesla** · [project thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6Jao?thread=cmsg_01AXsQkLFKRdQCqQ3RTr6JaoKs8hmc2q8bGsPhpaAWD8EY)_ Part of #25712 Part of objectstack#25677 ## What Item 4 of #25712 (slice 2h): the instruction set stops treating objectui as a sibling repository now that it lives in `ui/`. - **Root `AGENTS.md`** drops the `objectui#` references and every sibling-checkout step (`pnpm objectui:refresh`, pin moves, `.cache/objectui-*`, the PD#15 pin item). The Frontend section, the monorepo layout line, Context Routing (`ui/**` → `ui/AGENTS.md`) and Post-Task step 4 now describe `ui/` as a workspace of this repo. 1117 → 1112 lines. - **`ui/AGENTS.md`** is rewritten as a nested file scoped to `ui/` (630 → 261 lines). It keeps the UI-specific rules and no longer restates root rules (governed surfaces, merge queue, changesets, release); a new §9 points at the root file for those. - **Lane charter** (folded in per the PM's ruling on the claim): `SKILL.md` gains a `domain:ui` lane-table row (with `packages/console`, removed from the unowned row) and loses the pin-consumer clause of the hold rule; `references/lanes/ui.md` and `references/cross-repo-coordination.md` describe `ui/` as a workspace here, with the sister-repo, pin-lag and pin-bump lines deleted and no new lane rules; `scripts/pm/ensure-pm-labels.sh` keeps `domain:ui` in the main-repo lane loop. - **Gates that quoted the old text**: `scripts/check-closing-keyword-parity.mjs` drops the stale `ui/AGENTS.md` non-parser row; `ui/scripts/check-required-check-set.mjs` docblock and its test retire the leg that read a phrase the rewrite removed (the gate's own remedy text prescribes this). - **Ratchet** (`scripts/pm/check-skill-line-ratchet.mjs`): ceilings lowered to the landed counts — `AGENTS.md` 1117 → 1112, `cross-repo-coordination.md` 51 → 47, `lanes/ui.md` 38 → 23. `SKILL.md` stays at 319: the new row was paid by deleting the hold rule's pin clause and folding the rest of that line into the `pm:on-hold` rule it qualified. No raise, no cross-file move. Untouched by design: the sdui-manifest paragraph in root `AGENTS.md` ("Moving the pin has a second half…") is byte-identical for 2g/2i, and no sdui files are in this diff. Clause-②: no Metadata-protocol: none ## Verification - Head `22fcfd7f`; 10 files, +123 / −547 (under the 3000-line threshold, so no split). - `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`: 54 derived gates, 54 exit 0. `check:doc-formula-expressions` first exited 3 (prerequisite: unbuilt `@objectstack/formula`/`@objectstack/lint`); after `pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` it exits 0. - `pnpm check:pm-skill-ratchet`: exit 0. - `pnpm --dir ui exec vitest run scripts/__tests__/check-required-check-set.test.ts`: 24/24. - Push battery (`GITHUB_ACTIONS=true GITHUB_EVENT_NAME=push node scripts/pm/check-dispatch-gates.mjs`, both tiers): 2182 cases pass, 0 fail (fast 1917, slow 265). - Model tier: dispatch-gates names clause ① for the `SKILL.md` edit. The edit is one table row plus one deleted clause, recorded as the one-line-class mechanical exit (PM ruling on the claim thread). ## Follow-up (not in this PR) Remaining places that still treat objectui as a separate repo, left for a later card so this PR does not widen: - `.claude/skills/pm-dispatch/references/`: `lanes/triage.md:5`, `lanes/director.md:81` (objectui pin chain), `lanes/hotcrm.md:15`, `dispatch-runbook.md:89`, `filing-gate.md:42-43`, `platform-readings.md:239,389`, `rest-channel.md:78`, `review-checklist.md:23`, `seat-post-protocol.md:80`, `true-green.md:18` (objectui section), `decision-analysis.md:47`. - `.claude/agents/os-dev.md:73,125,157,309,310` (objectui force-push, script spelling, labeler and changeset rows). - `.claude/skills/checklist-test/SKILL.md:69,135` and `.claude/skills/dogfood-verification/SKILL.md:76-107` (`.objectui-sha`, `pnpm objectui:build`, vendored console). - `.claude/settings.json` allow-list rows for `repos/objectstack-ai/objectui/**` (13). - Provenance-only mentions (no change needed): `.claude/hooks/guard-*.sh` comments citing objectui incidents; `skills/objectui/**` is the product skill bundle's name. ## 维护者速读(草稿) 1. **改了什么**:根 `AGENTS.md` 与 pm-dispatch 技能不再把 objectui 当兄弟仓;`ui/AGENTS.md` 改为只管 `ui/` 的嵌套文件,不重述根规则;`domain:ui` 进入本仓车道表。 2. **为什么**:objectui 已并入本仓 `ui/`(#25677),旧的兄弟仓步骤(`pnpm objectui:refresh`、pin 移动等)已无对象,留着会误导执行席。 3. **风险**:纯文档与门禁文案;两个门禁随引用文本调整,行数上限只降不升。 4. **验证**:54 个派生门禁全绿,push battery 2182/0,ratchet 绿。 5. **席位意见**: 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01P33kUswHotSHBLPc6UVn6n --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 9b6df03 commit 3d50a43

10 files changed

Lines changed: 123 additions & 547 deletions

File tree

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
137137
- 一个标签存在当且仅当有具名读者;`pm:blocking` 即其推导缓存,读者以词表脚本注为权威。
138138
- 跨仓解锁判据是消费方可安装,⛔ 不是上游已合并;探针:装上的包是否接受新键/新行为。
139139
- 以发布包消费上游的仓,解锁放回前先验修复已进可安装的发行版。
140-
- 未发版 ⇒ 转 `pm:on-hold` + `Restart-when:` 加消费方安装面判据,⛔ 不回 `pm:queue`。
141-
- 该 hold 评论预写唤醒后的派发形状;pin 消费的仓不适用:pin 移动即可安装,走 pin 滞后读数。
140+
- 未发版 ⇒ 转 `pm:on-hold`;`Restart-when:` 写安装面判据与唤醒后派发形状,⛔ 不回 `pm:queue`。
142141
- 状态变更不过夜:标签无评论、assignee 无认领评论、结论只在 chat,都是半状态。
143142
- 半状态在结束会话(含限流悬挂)前补齐成对或回滚半边;report-only 巡查见守卫索引。
144143
- 等待他座位也是状态,写在卡上才存在(等谁、自何时),⛔ 不留在会话记忆。
@@ -162,8 +161,9 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
162161
| `domain:devx` | `sdui-parser`、`packages/qa`、`content/docs`、`apps/docs`、`docs/qa`、`.githooks`、`docker/README.md`、`examples/**` 仅测试基建面;`packages/lint`、`scripts`(门禁类)、`.github/workflows`(接线)三者按锚定规则归 `domain:spec`,门禁按 SUBJECT:governed 面归 skills,代码/文档质量归本域 |
163162
| `domain:skills` | governed 面全量(含本文件;统一定义见「governed 面统一定义」行);非门禁的 `scripts/pm/**`(PM 循环工具);governed 面的治理执行文件:`.github/CODEOWNERS` + SUBJECT 是 governed 面本身的门禁/审计(现为 `scripts/pm/check-governed-merges.mjs`) |
164163
| `domain:spec` | `packages/spec` 整包:schema 形状、`contracts/**`、退役行为半边、strictness 台账;describe/JSDoc/墓碑散文/错误 guidance 与 alias 表;`packages/spec/scripts/**`、`packages/spec/docs/**` 及按锚定规则的例外归本域的工具链(域边界枚举与席内分派见 `references/lanes/spec.md`) |
164+
| `domain:ui` | `ui/**` 全部代码:`@object-ui/*` 库与 `ui/apps/*`、`ui/packages/types` 与 schema 语料、`ui/scripts` 与门禁工具、文档随所记录的面走;`packages/console`(dist 由 `pnpm console:build` 生成 ⛔ 不手改);协议恒归 `domain:spec`,受管面归 `domain:skills`;详见 `references/lanes/ui.md` |
165165
| `domain:cloud` | 云服务旅程,停放(加 `status:parked`,sweep 免扫)待 cloud PM 迁移,本仓不派 |
166-
| (无固定归属,按落点分诊) | `packages/apps/*`、`packages/console`(dist 由脚本生成 ⛔ 不手改;UI 缺陷走 `repo:objectui`)、`examples/*`(归它演练的子系统)、`docs/audits/**` |
166+
| (无固定归属,按落点分诊) | `packages/apps/*`、`examples/*`(归它演练的子系统)、`docs/audits/**` |
167167

168168
- 表未覆盖的包首次分诊时归类并走 PR 更新本表;新增或退役 `domain:*` 必须同批改本表。
169169
- 退役 `domain:*` 只退流通,对象保留;`domain:engine`/`domain:services`/`domain:cli` 读作 `domain:server`。

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

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,31 @@
22

33
分诊席每次 fire 路由与查重前读本文;执行席跨仓认领、派发或转移时读本文。
44

5-
- 产品依赖方向固定:`objectstack`(后端,`packages/spec` 是唯一契约)→ `objectui`(前端)与 `cloud`。
6-
- 多车道仓 `objectstack`、`objectui`:中央分诊是 `domain:*`/type/定级的唯一生产者。
5+
- 产品依赖方向固定:`objectstack`(后端与 `ui/` 前端,`packages/spec` 唯一契约)→ `cloud`、`hotcrm`。
6+
- 多车道仓 `objectstack`:中央分诊是 `domain:*`/type/定级的唯一生产者。
77
- 单车道仓 `cloud`、`objectos`、`hotcrm`、`www.objectos.ai`;未来新仓默认此类。
88
- 单车道仓 `repo:*` 席自理机械三务,⛔ 不产 `domain:*`;决策卡入本仓收件箱,不落 objectstack。
99
- 机械三务 = 自扫 sweep、自打 `type`、自做首触(含 `finding`;业务理由归召唤的总监席)。
1010
- 新仓登记是一张清单:座位贴、标签、类别归属、门禁盘点、写身份锁移植(deny + hooks)。
1111
- 新仓三件:加入 `GOVERNED_REPOS`、安装车队 App、写 `lanes/<repo>.md` 宪章;应用仓无分诊席。
1212
- 新仓准入只问一句:真需要常设席位吗;hotcrm 宪章见 `references/lanes/hotcrm.md`。
13-
- objectui 卡按修复落点分两条车道:`domain:ui`(全部代码)与 `domain:skills`(仓根发布 `skills/**`)。
14-
- objectui 的 `domain:spec`、`domain:devx`、`domain:tooling` 已退役:⛔ 不贴、不认领、不再创建。
15-
- 协议恒归 objectstack `domain:spec`;跨层功能照规则 2,objectui 子单归 `domain:ui`。
13+
- objectui 仓已并入本仓 `ui/`:UI 卡住本仓,`ui/**` 代码归 `domain:ui`,受管面归 `domain:skills`。
14+
- 协议恒归 `domain:spec`;跨层功能照规则 2,`ui/` 子单归 `domain:ui`。
1615
- 车道可分席(席号 `· seat N`,或域×仓):忙时一车道开多席,闲时收归一席;每席独立座位贴。
1716
- 认领评论带 `Seat: domain:X#N` 行申报席号(缺省席 1);同席认领互斥,他席认领不触发自退。
1817
- 拆分触发预登记:单轮逼近 fire 周期,或某仓在全序下持续断粮 ⇒ 按仓拆回多席。
1918
- seam 卡单一归属:归修复落地仓的席,双仓皆动 objectstack 侧主导。
2019
- `scripts/pm/**` 等住 objectstack 的全板工具链单写手恒为 objectstack 侧席,他侧上游立卡回链。
2120
- 工装只答被告知的仓,缺 `--repo`/`PM_SWEEP_REPO` 即答 objectstack;⛔ 不答手上那张卡的仓。
2221
- 规则 1:issue 住在修复落地的仓,分诊时按判据严格执行。
23-
- 判据:正文抽掉 objectstack 还成立 ⇒ 当场转仓(console/UI 缺陷即转 objectui);不成立才是缝卡。
22+
- 判据:正文抽掉 objectstack 还成立 ⇒ 当场转仓(UI 缺陷不转,归 `domain:ui`);不成立才是缝卡。
2423
- 转仓走 `issue-transfer.mjs`;名册外或平台拒才重建:出处头 + 裸 `#N` 改全名 + 关源单为 moved。
2524
- 缝卡收窄为真协调卡:留 objectstack 带 `repo:*`,正文点名读者(哪个座位、哪一步)。
2625
- 决策卡留在立卡仓,总监席扫全部仓 `needs-user-decision` 呈批;在飞卡 ⛔ 不中途转仓。
27-
- 规则 2:跨层功能点或 objectui 消费的 `Seam:` 卡恒由分诊立父单 + 逐层子单,spec/后端先行。
26+
- 规则 2:跨层功能点或 `ui/` 消费的 `Seam:` 卡恒由分诊立父单 + 逐层子单,spec/后端先行。
2827
- `main` 有 `ui/` 起,新 spec 键不再先行、取代上句次序:与首个读者同 PR,hotcrm 读者同合并批。
2928
- 下游带 `Blocked-by: <owner/repo>#<n>`;`Blocked-by` 未关闭/未合并的不派发,对 GitHub 现验。
3029
- 被链接或同父的两单永不同批;`ui/` 起的新键与首个读者除外,⛔ `planned` 行不单独进 main。
31-
- pin 滞后是盲区:本仓 pin 是否已覆盖该 commit 是第二读数,派发前用 REST `compare` 核祖先。
32-
- 本地 `merge-base` 在浅检出上给假非祖先;未覆盖 ⇒ 派发令要求 PR 正文留档分叉窗口。
33-
- ⛔ pin bump 不做 rider:走专用 bump 脚本连带 override 与 lockfile。
3430
- 规则 3:联动杂事立单,不靠记忆。
3531
- 已验收 PR 的产物流向另一仓,接受该 PR 的执行席立即在消费仓立后续单,带 `Blocked-by:`。
3632
- 规则 4:纵向拆分,一个分诊 PM + N 个执行 PM;一人恰一车道,一车道可坐多席。
Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,23 @@
11
# 车道岗位说明:domain:ui
22

3-
见 cross-repo-coordination.md;本文是本席的岗位说明,现值状态恒在座位贴,⛔ 不迁入本文件。
3+
范围见 SKILL.md 域车道表 `domain:ui` 行;本文是岗位说明,现值状态恒在座位贴,⛔ 不迁入。
44

55
## 形态
66

7-
- 本席为姊妹仓执行座位:在 objectui 仓认领、派发、复核、落地。
7+
- 本席是本仓 `ui/` 树的执行座位:在 objectstack 认领、派发、复核、落地。
88
- ⛔ 不产 `domain:*`、type 与定级,中央分诊唯一生产;误标 ⛔ 不自改,挂 `pm:retriage`+异议同笔。
9-
- 维护者裁决例外于上条与 SKILL.md 无标签禁认领:main/队列 `Spec Main Shape Gate` 红即止血认领。
10-
11-
## 范围
12-
13-
- objectui 全部代码归本席:发布库 `@object-ui/*` 与 `apps/*`;`packages/types`、schema 语料与 spec pin;
14-
- `.github/`、`scripts/`、构建与发布管线、门禁工具;docs 随所记录的面走。
15-
- 协议恒归 objectstack `domain:spec`,新 `packages/spec` 工作同此;跨层功能的 objectui 子单归本席。
9+
- 协议恒归 `domain:spec`,新 `packages/spec` 工作同此;跨层功能的 `ui/` 子单归本席。
1610
- 落点不明留分诊首触,⛔ 不猜、不代判。
1711

1812
## 常设承诺
1913

20-
- 构建产物经 `pnpm objectui:refresh` 回流,见 AGENTS.md。
21-
- 回流后的 console pin bump 是 objectstack 的单张卡,⛔ 永不做本仓 PR 的 rider。
22-
- `scripts/pm/**` 单写手恒在 objectstack 侧 ⇒ 本席的工具需求走上游卡带 `Blocked-by:` 回链。
23-
- 本仓标签/assignee 写走 objectstack `label-write.mjs --repo`,⛔ 不 MCP `issue_write`;被拒转有通道席。
24-
- 受管面五项含仓根发布 `skills/**`,清单、判据与禁令见 objectui AGENTS.md §9 受管面段。
25-
- ⇒ 命中即停 draft;⛔ 未获授权批准不 ready 不入队不自合、永不批准,获批后认领席落地。
26-
- 未命中的 PR 按同节走合并队列落地;changeset 与版本纪律见 objectui AGENTS.md §9。
27-
- 半状态巡查在本仓有载体:定时 workflow 与 sweeper 皆在,自 objectstack 移植。
28-
- 锚 issue 未配置 ⇒ 写锚步骤 skip,发现只落 run summary,绿不等于已交付读锚腿。
29-
- ⇒ 手工半边照 `hotcrm.md` 那条办,并每轮实测锚是否已配,⛔ 不沿用本行读数。
14+
- `ui/` 的规则在 `ui/AGENTS.md`,只补充根 `AGENTS.md`;受管面、合并队列与 changeset 一律按根文件。
15+
- `scripts/pm/**` 不归本席 ⇒ 工具需求立卡给归属车道并带 `Blocked-by:` 回链,⛔ 不顺手改。
3016

3117
## 席内判断
3218

3319
- 卡正文是快照不是状态:⛔ 不凭正文单读裁决或派发,读全线程并对 `origin/main` 重测。
34-
- `pm:queue` 在本仓兼指已分诊与可派发 ⇒ 逐张重验可派性,⛔ 不按标签直派。
35-
- 零读数恒配点亮的正控,且正控须经被测机制本身生效;本仓 search 假零,查重只引命中。
20+
- 零读数恒配点亮的正控,且正控须经被测机制本身生效;查重只引命中。
3621
- 脚本能滚动不证明用户能滚动:可达性断言必须驱动真实输入管道。
3722
- 落地验证按内容,正控须在合并前证明会响,⛔ 不按 sha 判已落地。
3823
- 契约三面复核本席适用:按面欠达档记录落 PR 或卡,散文面归 ACCEPT,见 `../contract-review.md`。

‎AGENTS.md‎

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ layer at least as close to the code (ruling record 6120820653).
135135

136136
| Scenario | Command | Notes |
137137
|:---|:---|:---|
138-
| **Frontend debug** (UI in `../objectui` calls backend) | `PORT=3000 pnpm dev` | `pnpm dev` = the **showcase** kitchen-sink app (default; best for exercising the platform). Port **must** be 3000 (UI hard-wired); persistent state; leave running. For the minimal CRM app instead: `PORT=3000 pnpm dev:crm`. |
138+
| **Frontend debug** (the Console in `ui/` calls backend) | `PORT=3000 pnpm dev` | `pnpm dev` = the **showcase** kitchen-sink app (default; best for exercising the platform). Port **must** be 3000 (UI hard-wired); persistent state; leave running. For the minimal CRM app instead: `PORT=3000 pnpm dev:crm`. |
139139
| **Backend-only debug** | `pnpm dev -- --fresh -p <random>` | Random high port; ephemeral tempdir; **you must kill it** when done |
140140

141141
`--fresh`: ephemeral tempdir (auto-deleted on exit) + `--seed-admin` (POSTs sign-up, prints creds — default
@@ -153,26 +153,23 @@ pnpm dev:crm -- --fresh -p 38421 # start; debug via curl
153153
kill $(lsof -ti tcp:38421) # tear down — tempdir auto-deletes
154154
```
155155

156-
### Frontend (Studio UI) — sibling repo `../objectui`
156+
### Frontend (Studio UI) — `ui/`
157157

158-
This repo ships **backend only**. All Studio/Console UI work happens in `../objectui` (separate repo, checked out next
159-
to `framework/`). Workflow: edit + commit + push in `../objectui`, then in `framework/` run `pnpm objectui:refresh` to
160-
pull its build into `packages/console/`.
161-
162-
Other scripts: `objectui:bump` (pull only), `objectui:build`, `objectui:clean`. ⛔ Never hand-edit
163-
`packages/console/dist/` or `.cache/objectui-*/` — regenerated.
158+
The Studio/Console UI lives in this workspace under `ui/` (`@object-ui/*`; the Console source is `ui/apps/console`),
159+
and `ui/AGENTS.md` adds that tree's own rules to this file's. `pnpm console:build` builds the Console and copies its
160+
dist into `packages/console/` (`packages/console/build-dist.sh`). ⛔ Never hand-edit `packages/console/dist/`.
164161

165162
**Moving the pin has a second half: regenerate the committed manifest** — `pnpm objectui:build`, then
166163
`node scripts/gen-sdui-manifest-node.mjs`, which reads objectui's BUILT tree at the pin (never an npm install, whose
167164
version string names an older commit) and takes no arguments; `scripts/check-sdui-manifest.mjs` reds until you do.
168165
`objectui:bump` and `objectui:refresh` print the step, and the console build ships that same tracked file in
169166
`packages/console/dist/`. Full procedure: `docs/releases-maintenance.md`.
170167

171-
**Fast iteration on `../objectui` src (no commit/refresh loop):** run objectui's own console dev server —
172-
`cd ../objectui && pnpm --filter @object-ui/console dev` (Vite on **:5180**, HMR). Its `/api` proxy targets
168+
**Fast iteration on `ui/` src (no rebuild loop):** run the Console dev server —
169+
`pnpm --filter @object-ui/console dev` (Vite on **:5180**, HMR). Its `/api` proxy targets
173170
`DEV_PROXY_TARGET || http://localhost:3000`, so **run the backend you're testing on :3000** (`PORT=3000 pnpm dev` for
174-
showcase) and browse `:5180`. Note `:3001/_console` (or whatever the backend serves) is the **published** console, not
175-
your `../objectui` src — only `:5180` reflects local UI edits. See `../objectui/AGENTS.md` for the app-id /
171+
showcase) and browse `:5180`. Note `:3001/_console` (or whatever the backend serves) is the **built** console, not
172+
your `ui/` src — only `:5180` reflects local UI edits. See `ui/AGENTS.md` for the app-id /
176173
localStorage / auth gotchas.
177174

178175
---
@@ -231,7 +228,7 @@ localStorage / auth gotchas.
231228
`.claude/hooks/guard-main-checkout.sh` blocks `Edit`/`Write`/`NotebookEdit`, and
232229
`.claude/hooks/guard-main-checkout-bash.sh` blocks the identical write arriving through **Bash** (`>`/`>>`
233230
redirection, `sed -i`, `perl -i`, `tee`, `cp`, `mv`, `rm`, `touch`) — and both check the **target file's own
234-
repo**, so sibling repos (`objectui`/`cloud`) you touch are covered too (deliberate non-task override:
231+
repo**, so sibling repos (`cloud`, `hotcrm`) you touch are covered too (deliberate non-task override:
235232
`OS_ALLOW_MAIN_EDITS=1`, one switch for both). The Bash guard is precision-first: it never blocks reads, and any
236233
shape it cannot resolve with confidence (`bash -c …`, `xargs`, `node -e`, a `$VAR`/glob target) is allowed through
237234
— the rule still outranks the hook. **A worktree isolates neither the stash nor the build cache** — the
@@ -302,7 +299,7 @@ localStorage / auth gotchas.
302299
15. **⛔ A version release is performed by the maintainer, by hand — no AI seat publishes, tags, cuts a Release, or
303300
triggers a release, and none merges the Version Packages PR.** A rule that binds every seat lives here,
304301
not only in a lane-specific skill file. **Release-adjacent work stays open to every seat**: the release board,
305-
`.objectui-sha` pin bumps, version reconciliation, writing changesets, compiling release notes when asked, and
302+
version reconciliation, writing changesets, compiling release notes when asked, and
306303
*verifying* release state (`npm view`, `git ls-remote --tags`) are ordinary tasks. What is reserved is the
307304
**release act itself**: ⛔ running `changeset publish` / `pnpm run release`, ⛔ pushing a version tag, ⛔
308305
cutting a GitHub Release, ⛔ pushing a runtime image, ⛔ `workflow_dispatch`-ing `release.yml` in any lane but
@@ -568,11 +565,10 @@ Even inside your own worktree, operate defensively:
568565
| `packages/spec/dist` | `check:api-surface` reports *other people's* exports as "N breaking (removed/narrowed)"; `check:i18n-coverage` rejects an example config for a value the spec allows | both read the built `.d.ts`, not `src/` |
569566
| `node_modules` | a package fails to resolve a dependency it plainly declares (`Cannot find package 'hono'`) | the merge moved `pnpm-lock.yaml` |
570567
| `packages/runtime/.objectstack/` | `datasource-autoconnect` sees each row 6× | gitignored fixture state accumulating across runs |
571-
| `.cache/objectui-*` | `pnpm lint` reports dozens of errors in files you have never opened | a full objectui checkout left by `build-console.sh`, linted as if it were ours |
572568

573569
So after any `git merge origin/main`:
574-
`pnpm install --frozen-lockfile && pnpm build && rm -rf packages/runtime/.objectstack`
575-
(add `rm -rf .cache` if you have run the console build). Note `OS_SKIP_DTS=1` keeps
570+
`pnpm install --frozen-lockfile && pnpm build && rm -rf packages/runtime/.objectstack`.
571+
Note `OS_SKIP_DTS=1` keeps
576572
a build fast but leaves no `.d.ts`, so `gen:api-surface` cannot run at all under it —
577573
that one needs a real build. None of this is CI-visible (CI checks out fresh). Only
578574
the first row has a gate: `check:dev-prereqs` refuses `pnpm dev` on a stale
@@ -659,6 +655,7 @@ packages/
659655
plugins/ # 🧱 Official plugins & drivers
660656
services/ # 🔧 Kernel-managed services
661657
apps/docs/ # 📖 Fumadocs site
658+
ui/ # 🎨 Studio/Console UI (`@object-ui/*`, `ui/apps/console`) — its own rules in `ui/AGENTS.md`
662659
examples/ # 📚 Reference implementations
663660
skills/ # 🤖 Domain skill definitions
664661
content/docs/ # 📝 Docs content
@@ -796,7 +793,7 @@ test regenerate; the wrapper reports all three each run rather than staying sile
796793
| `apps/docs/**` | Docs Engineer | Fumadocs + Next.js, MDX |
797794
| `examples/**` | Example Author | Minimal, runnable, uses `defineStack`. App or platform, on any tree: could this be written from the metadata alone, with no knowledge of this company? No ⇒ the app; yes ⇒ the platform, and a **gap** until it does — `.claude/skills/pm-dispatch/references/app-platform-boundary.md` |
798795
| `content/docs/**` | Technical Writer | Respect auto-gen boundaries |
799-
| `../objectui/**` (sibling repo) | Studio UI Engineer | React + Shadcn + Tailwind, dark mode default |
796+
| `ui/**` | Studio UI Engineer | React + Shadcn + Tailwind, dark mode default; `ui/AGENTS.md` applies on top |
800797

801798
---
802799

@@ -1099,11 +1096,9 @@ Both non-handshake shapes, and how to classify and probe your own:
10991096
disposition, in writing** — exactly one marker in the changeset body, which also carries both declaration lines
11001097
(`pnpm check:adr-0087-registration` reads the arm and the kind there). ⛔ The categories are NOT copied here —
11011098
the gate prints the full set when it fails.
1102-
4. **A removal that breaks the pinned sibling checkout ships together with the sibling fix and the pin bump — or it
1103-
does not ship.** `Type Check UI` compiles the Console under `ui/` against the spec of the PR that makes such a
1104-
removal, so the removal reds its own PR; its ruling therefore authorizes the
1105-
objectui-side fix and the pin bump (manifest regeneration included — see the Frontend section) in the same
1106-
landing. Before merging, `git grep` what you remove or rename in `../objectui` at the pinned SHA.
1099+
4. **A removal that breaks `ui/` ships together with the `ui/` fix — or it does not ship.** `Type Check UI` compiles
1100+
the Console under `ui/` against the spec of the PR that makes such a removal, so the removal reds its own PR; its
1101+
ruling authorizes the `ui/` fix in the same PR. Before pushing, `git grep` what you remove or rename under `ui/`.
11071102
5. **Touched `packages/spec`? Regenerate and commit its artifacts before pushing** — § *Touched `packages/spec`*
11081103
above is the authority; note `OS_SKIP_DTS=1` greens `check:api-surface` locally and reds it in CI.
11091104
6. Update `ROADMAP.md` if user-facing or architectural.

0 commit comments

Comments
 (0)