Skip to content

Commit 0ea90c7

Browse files
chore(ui-merge): clear the objectui leftovers after the ui/ merge (#25753) (#26598)
<!-- claude-projects-attribution: {"github_login":"os-tesla"} --> _Requested by **Tesla** · [project thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6Jao?thread=cmsg_01AXsQkLFKRdQCqQ3RTr6Jao2fSEGAKhWxTZd1rVNTsfqL)_ Part of #25753 (the cleanup leftovers that #25712's closing record 6432294556 moved there: F18, F19, F20, F23, F27 and the 2h list, plus its own item 3, the import tooling). Part of #25677. One PR, because the 2h list edits `.claude/**` and so the whole diff is Tier S either way. Clause-②: no Metadata-protocol: none ## 维护者速读 - **改了什么:** objectui 并入 `ui/` 之后剩下的小件清理,一个 PR: - 删掉两个已无人调用的 objectui 遗留脚本(F19 `workflow-checks.ts` 解析器、F20 跨仓 closer 的结果测试),`--changed` 模式随它唯一的调用方退役,账本本身保留作审计(F18)。 - `field.externalId` 在 liveness 账本里由 `live` 改判 `dead`(F23):`packages/**` 与 `ui/**` 里没有任何读取方,upsert 都按别的键匹配。作者写 `externalId: true` 时 `os lint` 会提示,附一个 patch changeset。 - spec 源码注释里 `objectui: packages/…` 的渲染器引用改写为 `ui/packages/…`(F27)。 - 车队的 playbook(pm-dispatch references、os-dev、checklist-test、dogfood-verification)不再把 objectui 当兄弟仓,settings 去掉 5 条 objectui 写权限(2h 清单)。 - 删掉只在切换时跑过一次的 `scripts/ui-import/` 锁文件拼接工具,`pnpm-workspace.yaml` 里引用它的注释改为指向保留该说明的提交。 - **为什么改:** objectui 已归档,这些文字和脚本描述的是不存在的仓和流程,会误导执行席。 - **风险与回滚:** 无运行时改动;唯一面向作者的变化是 `externalId: true` 的 lint 警告。回滚 = revert 本 PR。 - **你要做的:** 无。`.claude/**` 是 Tier S,由席位在达档复核 PASS 且全绿后经队列落地。F12(`ui/.github/labeler.yml`)等你在项目线程里选;F14(CI 文档页重写)单独开 PR。 ## What changes **F20.** `ui/scripts/check-cross-repo-closer-outcome.mjs` is deleted. Its subject was objectui's `cross-repo-issue-closer.yml`, which left with `ui/.github/workflows/`, and only objectui's `lint.yml` ran it. `scripts/check-closing-keyword-parity.mjs` drops its `NON_PARSERS` row (the comment above the list now records all three imported rows as gone). **F19.** `ui/scripts/__tests__/workflow-checks.ts` is deleted. Its parser (`readWorkflows`, `triggerBlock`, `producedCheckNames`) had no caller since 2d-3. Its last export, `repoRoot`, had two importers (`check-lockfile-dedupe.test.ts`, `check-lockfile-integrity.test.ts`); each now computes the same `path.resolve(dirname(fileURLToPath(import.meta.url)), '../..')` itself. Two retirement notes that named the file now say it was deleted, and `check-test-shard-results.mjs`'s header no longer points at it. **F18.** The `markdown-test-inputs` ledger stays, as an audit: `markdown-test-inputs.test.ts` holds the adjudicated class equal to what the scanner derives, and `check-pending-changeset-literals.mjs` resolves markdown literals through its `deriveCandidates()`. Its `--changed` mode retires. Its only caller was objectui's `ci.yml` decision step, and the root `Test UI` job starts on any `ui/**` change, so no CI step asks that question any more. The header says so; the history sections below it stay. **F23.** `liveness/field.json` re-grades `field.externalId` from `live` to `dead`. The `live` grade rested on objectui console `metadataConverters.ts`, which objectui dc14bcb deleted for having zero importers. Re-measured at 1c63231 across `packages/**` and `ui/**`, nothing outside `packages/spec` reads a field's `externalId`: - The Studio field inspector (`ObjectFieldInspector`) edits it, and `MetadataService.ts` copies it into a field summary. Neither shows it to a person as a preview, so the designer-preview ruling does not apply. - Upserts match on other keys: a seed dataset's `externalId` (`seed-loader.ts`, default `name`) and an import mapping's `upsertKey` (`import-prepare.ts`). The row carries `verifiedAt`, `evidenceScope: in-repo` and an `authorHint` that names those two keys. The flag's `.describe()` ("Is external ID for upsert operations") now says it is not read and names the same two keys; the generated reference pages (`references/data/field.mdx`, `object.mdx`, `system/migration.mdx`) are regenerated from it, and the three hand-written field tables (`fields.mdx`, `field-types.mdx`, `validation-rules.mdx`) say the same. `@objectstack/lint`'s pin on the set of warned field keys gains `externalId`. It is a boolean `default(false)`, so the lint warns only on an authored `true`. The changeset is a `patch` on `@objectstack/spec`, because the ledger ships in the package and the advisory warning is what an author sees. **F27.** In `ui/page.zod.ts` and `ui/component.zod.ts`, the six renderer citations spelled `objectui: packages/…` become `ui/packages/…`. Each cited file exists under `ui/`, and each named symbol is still in it: `useElementApiDataSource` and `PredicateScopeProvider` in `SchemaRenderer.tsx`, `parentDataSource` and `ParentRecordBinding` in `record-related-list.tsx`, `BoundRecordProvider` in `recordBinding.tsx`. The one pin on that spelling (`expression-scope-data-root.pin.test.ts:194`) moves with it. The other 24 lines of the F27 count are `objectui @<sha>` measurement records, mostly in `migrations/entries/retired-keys/18.*`. They say where and when something was measured, so they stay as written, the same rule 2e applied to the liveness ledger. **2h list** (#26216's follow-up section): - `.claude/skills/pm-dispatch/references/`: - `triage.md`, `hotcrm.md` and `decision-analysis.md` name `ui/` instead of the objectui repo. - `director.md` drops the objectui pin-chain rule. `dispatch-runbook.md` drops objectui's release-PR title. - `filing-gate.md` drops the "objectui cards waiting for `next.N`" line, because `ui/` consumes the spec through the workspace now, and renames the consumer follow-up line. - `platform-readings.md` drops objectui's labeler and `os-verify-lock.sh` readings. `rest-channel.md` drops objectui's nine required contexts. `review-checklist.md` drops objectui's `skip-changeset` exception. - `seat-post-protocol.md`: two board producers, two queries, two boards. The console-pin release precondition goes, because there is no pin any more (`console.ts`, "Unstamped dist"). - `lanes/director.md` drops the pin chain from its duty heading, daily summary and pointer; `lanes/triage.md` no longer alternates two repos; `dispatch-runbook.md` and `platform-readings.md` drop "两仓" (both words meant objectstack and objectui). - `true-green.md`: the objectui section becomes `ui/`, with `pnpm --dir ui test`. - `.claude/agents/os-dev.md`: the force-push, `type-check` spelling and dispatch-gates lines no longer name objectui. Its objectui labeler and `skip-changeset` rows go. - `.claude/skills/checklist-test/SKILL.md`: the console build is `pnpm console:build` from `ui/apps/console`, and the environment fingerprint has no `.objectui-sha`. - `.claude/skills/dogfood-verification/SKILL.md`: the `/_console` section describes the in-workspace Console build. The pin-drift bullet is replaced, because `pnpm console:build` stamps no SHA and `os dev` has no drift to judge (`packages/cli/src/utils/console.ts`, "Unstamped dist"). - `.claude/settings.json`: the five objectui write rows (labels POST, pulls and issues PATCH, ready-for-review, auto-merge) go. The repo is archived and refuses writes. Its read rows stay, because the history is still read there. - `scripts/pm/check-skill-line-ratchet.mjs`: eight ceilings fall to the landed counts (each with a one-line note). No line was added anywhere, and no YAML was re-wrapped. **Import tooling** (#25753 item 3). `scripts/ui-import/` (the README recipe and `splice-lockfile.mjs`) ran once, at the cutover, and nothing calls it. It is deleted. The one comment that cited its step 6, in `pnpm-workspace.yaml`'s happy-dom override note, now says the recipe retired here and names the commit to read it at (1c63231). Provenance-only mentions stay as they are: the `objectui#N` citations, `cross-repo-coordination.md`'s merge note, and the hook comments that cite objectui incidents. ## Not in this PR - **F12** (`ui/.github/labeler.yml`) is waiting on the maintainer's choice, which was asked in the project thread. - The Studio field form's help text for `externalId` (`field.form.ts`, "Mark as external ID for upsert operations") and its generated translations still describe the old meaning, and the designer still offers the toggle. Filed as #26674 (a `ui/` lane change plus the metadata-forms translation pipeline). - **F14** (`ui/content/docs/guide/ci-cd-pipeline.md`, 3,243 lines that describe objectui's deleted workflows, read by about a dozen tests) gets its own PR. ## Verification `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derives 142 commands for this diff. All of them ran locally on this branch, and all exit 0 on the head: - `check-plugin-teardown-shape --self-test` first exited 3: its fixture commit was outside the shallow clone. After fetching it, exit 0. - `check:liveness` first exited 1: the generated `liveness/state-counts/field.md` shard still counted `externalId` as live. `gen:liveness-counts` rewrote that one shard (live 100 → 99, dead 1 → 2), and it is committed. No README Notes cell names the field set. - `check:entry-nameability`, `check:exported-any`, `check:dts-closure`, `check:dual-build-cjs-loads`, `check:generated` and `check:skill-examples` refused at first (no declarations on disk). After `env -u OS_SKIP_DTS pnpm build` and a spec rebuild, all exit 0. - `pnpm --dir ui exec vitest run scripts/`: 5,055 of 5,059 pass. `unit-registry-absence-collision` needed `@objectstack/client`'s dist (15/15 once built), and two `check-i18n-call-site-keys` cases timed out at 15 s while other gates loaded the machine (137/137 alone). Main moved twice while this was open. #26536 and #26569 edited three of the same skill files (main's root-run `console:build` wording and its ninth required context kept). #26599 retired `conditionalRequired`, so the lint pin is now `['externalId']` alone, and the regenerated field shard reads 99 / 0 / 0 / 1 / 6 / 106. After each merge, the touched-surface gates, `check:generated` (after a spec rebuild) and the lint suite (7,389 tests) pass. Main moved a third time while the PR sat in the queue, and the queue dropped it for a conflict at 14:25Z. #26693 rewrote the director lane's governed-draft lines, the same lines this PR had edited to drop "本仓". Main's version is taken whole, because it no longer names a second repo. `lanes/director.md` now reads 86 lines, so its ceiling falls 88 → 86 (`6f64f2a7`). On the merged tree (`03c8cf2b`), `gen:schema`, `gen:docs` and `gen:liveness-counts` produce no diff. `check:generated` (after a spec rebuild), `check:liveness`, the skill line ratchet with its self-test (164 cases), `check-settings-deny-roster`, `check-closing-keyword-parity` and the lint liveness test (109) all pass. The delta review on `6f64f2a7` (FAIL 6447375373) named one must-fix. #26765 had landed on main and pinned `lanes/director.md` at 87, on the same ratchet line this PR moves to 86. `d8d03efd` merges `origin/main` `83c4bd29` and resolves that row to 86. Its comment now reads 88 → 87 (#26765) → 86 (#25753). `fab4534b` takes should-fix 1: the triage charter's ratchet note no longer says pickup alternates between two repos. No ceiling moves. On the merged tree, the regen produces no diff, and the ratchet with its self-test, `check:generated`, `check:liveness` and the lint liveness test pass. The first contract review (FAIL on 434b014) named those conflicts and three playbook files the objectui edits had left self-contradictory; both are fixed above. Its should-fixes are in too: the `externalId` ledger row names every `ui/` carrier and the preview search, `os-dev.md` says plainly that hotcrm has no `dispatch-gates.mjs`, and the Studio follow-up is #26674. CI's first run caught one thing the derivation does not list: `@objectstack/lint`'s `lint-liveness-properties.test.ts` pins the set of field keys the shipped ledger warns on. It now expects the shipped warned set; the package suite passes (7,389 tests). Also run by hand: the skill line ratchet and its self-test (164 cases), `check-settings-deny-roster`, `check-harness-current`, `check-closing-keyword-parity` with their self-tests, `markdown-test-inputs --audit`, and the ui vitest files the diff touches (118 tests). --- _Generated by [Claude Code](https://claude.ai/code/session_01L9qibvE77Ed7MKdzPxJTQQ)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 59441b6 commit 0ea90c7

42 files changed

Lines changed: 131 additions & 1965 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
---
2+
'@objectstack/spec': patch
3+
---
4+
5+
fix(spec): `os lint` tells an author that a field's `externalId: true` does nothing
6+
7+
Clause-②: no (a liveness-ledger re-grade: no schema, accept set, served body or error code moves; only the advisory `liveness-dead-property` warning on an authored `externalId: true` starts, and the flag's description is reworded)
8+
Metadata-protocol: none
9+
10+
The shipped liveness ledger (`liveness/field.json`) graded a field's `externalId` flag `live` on the strength of one renderer module that was deleted for having no importers. Re-measured across `packages/**` and `ui/**`, nothing reads the flag: the Studio field inspector edits it and a metadata summary copies it, and no upsert matches on it. The row is now `dead`, so `os lint` warns on a field that sets `externalId: true` (the default `false` is not warned). The flag's schema description, and the reference pages generated from it, no longer say it drives upserts.
11+
12+
- **What to do.** Remove the flag. To match seed records on a field, name the field in the seed dataset's `externalId` (`name` when it is left out). For an import, name it in the mapping's `upsertKey`.
13+
- **Unchanged.** Parsing (the key is still accepted, default `false`), seed loading, imports and every upsert.

‎.claude/agents/os-dev.md‎

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ model: opus
7070
- 优先扩展一个守卫关掉整个类;任一条不成立 ⇒ 回默认:报告列出交席位立单、不碰。
7171
- 本轮改动令其变假或触碰的已发布缺陷必修;其余立卡并记明已发布面,PR 照常落地。
7272
4. ⛔ 永不推 `main`、合并任何 PR、在代码 PR 里改 `content/docs/releases/`;改错另开 docs-only PR。
73-
- force-push 按落地仓 AGENTS.md:objectui/cloud 绝对禁;objectstack §3 五条全立才 `--force-with-lease`。
73+
- force-push 按落地仓 AGENTS.md:cloud 绝对禁;objectstack §3 五条全立才 `--force-with-lease`。
7474
5. **Contract-first。** 修复若诱使你在消费端加宽容回退(`??` 别名、宽松解析),缺陷在上游。
7575
- 去生产者或 spec 修,或返回 `needs_decision`。
7676
6. **issue 正文是线索,不是规格。** 动手前对 `origin/main` 核验其前提。
@@ -122,7 +122,7 @@ model: opus
122122
- 从门禁绿跑清单里挑一个已 pin 的 fake 照抄。
123123
- 缺一种该文件没有的 double 时,覆写文件里已有的 double 优于 pin 新的:不动台账。
124124
- 匹配到零个脚本的 `pnpm --filter` 运行以 0 退出:什么都没跑,读上去却是通过。
125-
- objectui 把 typecheck 拼作 `type-check`(连字符);核对输出里确实回显了脚本名。
125+
- `ui/` 的包把 typecheck 拼作 `type-check`(连字符);核对输出里确实回显了脚本名。
126126
- 浏览器验证:Chromium 已预装,`PLAYWRIGHT_BROWSERS_PATH` 指向 `/opt/pw-browsers`。
127127
- launch 传 `executablePath: '/opt/pw-browsers/chromium'`;⛔ 永不跑 `playwright install`。
128128

@@ -154,7 +154,7 @@ model: opus
154154
- 派生答哪些门禁读你改的文件,不答哪些测试测这个脚本。
155155
- 跑同目录点名它的 `*.test.ts`,加同包 tests 下 `git grep` 该脚本文件名的全部命中。
156156
- 该脚本只住在 objectstack,答案只关于它所在的树:每次推导第一行(stderr)点名仓与 commit。
157-
- 读之前先核对;姊妹仓未必有 `scripts/pm/dispatch-gates.mjs`:objectui 只有 `check-half-states.mjs`。
157+
- 读之前先核对;姊妹仓未必有 `scripts/pm/dispatch-gates.mjs`:hotcrm 就没有。
158158
- 把它们的路径喂进 objectstack 检出,得到的是 objectstack 的门禁族:形态完整、退出 0、全错。
159159
- 那边的清单从该仓自己的 `package.json` 与 `.github/workflows/` 手工推导。
160160
- 加 `--repo <owner>/<name>` 申报本次答案该属于哪个仓,不匹配即拒绝并同时点名两个仓。
@@ -306,8 +306,6 @@ model: opus
306306
- 关此步骤的是读回不是写入;读回只验写落了,验不出有门在读:幻影门标签读回照样成功。
307307
- 被拒 ⇒ 报端点与状态码、席位代挂,⛔ 不报 `blocked`、不走 MCP;收尾再读一次。
308308
- 分类器拒外部写 ⇒ 停手,`deviations` 记命令与拒因,席位只转维护者定夺;⛔ 不换路重发。
309-
- objectui:路径标签归 `labeler.yml`,逐 push 同步;无门禁读你打的标签 ⇒ 派发词未点名即零写。
310-
- objectui 的 `skip-changeset` 零读者;空 frontmatter changeset 即声明,门禁判定行为准,⛔ 永不施加。
311309
- 报告在本地验证走完时交付,CI 收敛等待归 PM 不归你:⛔ 不为等 CI 结论推迟报告。
312310
- 门禁状态如实记录,`in_progress` 是诚实值;PR 开出后 ⛔ 永不 sleep、定时等待或空转轮询 CI。
313311
- 你报告之后才转红的门禁,会作为同一认领上的补丁轮回来。

‎.claude/settings.json‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
"Bash(agent-browser snapshot *)",
3030
"Bash(agent-browser skills *)",
3131
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/objectstack/issues/*/labels *)",
32-
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/objectui/issues/*/labels *)",
3332
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/hotcrm/issues/*/labels *)",
3433
"Bash(curl -sS -X GET https://api.github.com/rate_limit *)",
3534
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectstack/issues?* *)",
@@ -57,13 +56,10 @@
5756
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectui/commits/*/check-runs* *)",
5857
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/hotcrm/commits/*/check-runs* *)",
5958
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/objectstack/pulls/* *)",
60-
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/objectui/pulls/* *)",
6159
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/hotcrm/pulls/* *)",
6260
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/objectstack/pulls/*/ccr/ready_for_review *)",
6361
"Bash(curl -sS -X PUT https://api.github.com/repos/objectstack-ai/objectstack/pulls/*/ccr/auto_merge *)",
64-
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/objectui/pulls/*/ccr/ready_for_review *)",
6562
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/hotcrm/pulls/*/ccr/ready_for_review *)",
66-
"Bash(curl -sS -X PUT https://api.github.com/repos/objectstack-ai/objectui/pulls/*/ccr/auto_merge *)",
6763
"Bash(curl -sS -X PUT https://api.github.com/repos/objectstack-ai/hotcrm/pulls/*/ccr/auto_merge *)",
6864
"Bash(node --use-env-proxy scripts/pm/post-stamped.mjs *)",
6965
"Bash(node --use-env-proxy scripts/pm/label-write.mjs *)",
@@ -78,7 +74,6 @@
7874
"Bash(node scripts/pm/issue-transfer.mjs *)",
7975
"Bash(node --use-env-proxy scripts/pm/issue-transfer.mjs *)",
8076
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/objectstack/issues/* *)",
81-
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/objectui/issues/* *)",
8277
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/hotcrm/issues/* *)"
8378
],
8479
"deny": [

‎.claude/skills/checklist-test/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ GitHub 写入只走 pm-dispatch 写入门:仓根直调 `scripts/pm/issue-create.
137137
是协议载体、不入分诊 sweep,⛔ 不是可派发单元;工作标签随抽取出的缺陷卡走(RUNNER 抽取
138138
义务条款)。**这条在记录的整个生命周期成立** —— 收口与关闭时同样不补挂。
139139
- **正文**,按此顺序:
140-
- **环境指纹** —— framework sha、`.objectui-sha`、端口、db、seed、时间戳。
140+
- **环境指纹** —— framework sha(`ui/` 在内)、端口、db、seed、时间戳。
141141
- **范围** —— 选择器 + 每项所对的 `revision`。
142142
- **逐条款判定表** —— 项 · 条款 · 判定 · 一行**文本** oracle 证据
143143
(API/网络/构建/测试结果 —— 服务端真相,永不是像素)。

‎.claude/skills/dogfood-verification/SKILL.md‎

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -73,24 +73,17 @@ dev 工作树、dev-server 端口、preview 浏览器全是**共享的**:并行
7373
- [ ] ⚠️ **消融的 mutate 腿与 restore 腿都要重建 —— 但那条规则不是 dogfood 专属**:
7474
判据、preflight 与两次实测住在 `.claude/agents/os-dev.md`;⛔ 这里不留第二份拷贝。
7575
- [ ] `dist/` 已 gitignore —— 安全;永不提交构建产物。
76-
- [ ] **`/_console` UI 是 *vendored objectui 构建*,与框架 `dist` 是两回事。** 它由
77-
`.objectui-sha` 钉住、按预构建 bundle 提供。已合并的 objectui 修复 —— *甚至
78-
bump 过的 `.objectui-sha`* —— 在 vendored console 重建之前**不会活在 :3000
79-
上**:运行中的服务器继续提供旧构建产物(BUILD 陈旧 ≠ PIN 陈旧)。所以**在宣布
80-
:3000/_console 上发现 console/Studio UI 缺陷之前,先对当前 objectui 源码或全新
81-
构建核一遍** —— vendored bundle 可能是旧的,缺陷可能上游已修。最快的权威核验 =
82-
objectui 的 HMR console 指向你的服务器:
76+
- [ ] **`/_console` UI 是 *Console 构建*,与框架包的 `dist` 是两回事。** 它由
77+
仓库根目录的 `pnpm console:build` 从 `ui/apps/console` 构建,拷进 `packages/console/dist`。
78+
`ui/` 下已合并的修复在 Console 重建之前**不会活在 :3000 上**:运行中的服务器继续
79+
提供旧构建产物。所以**在宣布 :3000/_console 上发现 console/Studio UI 缺陷之前,先
80+
对当前 `ui/` 源码或全新构建核一遍** —— 构建可能是旧的,缺陷可能已修。最快的权威
81+
核验 = `ui/` 的 HMR console 指向你的服务器:
8382
`VITE_SERVER_URL=http://localhost:<port> DEV_PROXY_TARGET=http://localhost:<port> pnpm --filter @object-ui/console dev`
8483
(独立 origin → 需要它自己的 `admin@objectos.ai/admin123` 登录)。跳过这步曾在
85-
一个 objectui main 已修掉的 action-create 死路上白付一整圈 spawn-a-fix。
86-
- [ ] **漂移的构建不再静默启动(#7752)。** `build-console.sh` 把它构建所用的 SHA 盖
87-
进 `packages/console/dist/.objectui-sha`;当这个章与仓库的 `.objectui-sha` pin
88-
不一致时,`os dev` **拒绝挂载 `/_console`** 并打印补救 —— `/_console/` 404,横
89-
幅不再宣传 console URL。那是要修的前置条件,不是产品缺陷:跑
90-
**`pnpm console:build`**(在仓库根目录跑,从本仓 `ui/` 下的 Console 源码重建;
91-
改 Console 就改 `ui/` 下的源码)再重启。`pnpm check:console-sha`
92-
不启动也能报同一比较。`OS_ALLOW_CONSOLE_DRIFT=1` 是故意启动陈旧 bundle —— 那之
93-
后你做的每个 console 观察,描述的都是一个仓库没有钉住的 commit。
84+
一个上游已修掉的 action-create 死路上白付一整圈 spawn-a-fix。
85+
- [ ] **构建新鲜度由你自核。** `pnpm console:build` 产出的 dist 不盖 SHA 章,`os dev`
86+
无从判定它是否陈旧,照常挂载 `/_console`;改过 `ui/` 就先在仓库根目录重建再观察。
9487

9588
## 3. 核验 —— 视觉 / API 先行,DOM 殿后(防误报规则)
9689

@@ -104,8 +97,7 @@ dev 工作树、dev-server 端口、preview 浏览器全是**共享的**:并行
10497
- [ ] **门的两侧都要测**:`requiresService`/`requiresObject`/权限门要在依赖存在*与*
10598
缺席两种状态下各验一次。
10699
- [ ] 服务端是权威可见性门(ADR-0124 D1)—— 客户端过滤只是「礼貌」。元数据开关不改
107-
UI 时,先查强制在服务端(框架,可在本仓修)还是客户端(objectui console,另一
108-
个仓)。
100+
UI 时,先查强制在服务端(框架)还是客户端(`ui/` 的 console);两边都在本仓修。
109101
- [ ] 用 `preview_screenshot`(API 改动用 `preview_network`)向用户证明;loading
110102
spinner / 异步数据状态要显式写明,而不是声称你没等到的最终值。
111103

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

‎.claude/skills/pm-dispatch/references/dispatch-runbook.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
- 之二,解锁扫描反演 = 逐仓 `state=CLOSED` + `since` 与 `Blocked-by:` 反向索引求交,命中走双查。
6767
- 之三,健康指标 = 逐标签 `perPage: 1` 只读 `totalCount`。
6868
- 裸卡数例外:标签缺席无计数可读,取本轮析取①的枚举,⛔ 不另发查询。
69-
- 每日层(当日首 fire)= 两仓全量对账 + 归集本就日频的职责。
69+
- 每日层(当日首 fire)= 全量对账 + 归集本就日频的职责。
7070
- 日频职责 = finding 集中轮;`Restart-when:` 批扫归车道巡查,决策箱回填归总监席。
7171
- 成本靶:干活轮 ≤50k token,空转轮守既有探针预算。
7272
- 每条枚举比对返回数与 `totalCount`;分页只治当次,一个谓词,⛔ 不加第二条代码路径。
@@ -86,7 +86,7 @@
8686
- 交付了一半的阻塞是判断不是 grep,归四件之③,⛔ 不进机械旗。
8787
- 发布窗口判据:已上膛 = 开着的 head `changeset-release/main` PR,`is:pr is:open head:changeset-release`。
8888
- 点亮对照 `git ls-remote origin changeset-release/main` 必中;⛔ title 永不是判据。
89-
- 两仓 title 不同、由 action 配置:objectui `chore: release packages`、objectstack `chore: version packages`。
89+
- title 由 action 配置,本仓为 `chore: version packages`。
9090
- 上膛与否不足:真判据是本卡 changeset 已否折进该 head `CHANGELOG.md`,即「离永久还有多远」。
9191
- 卡上 re-check 命令两条硬线:① 每条 grep 自带阳性对照。
9292
- 对照取同文件里确定存在、且 ⛔ 绝不是被测词子串的一个词。

‎.claude/skills/pm-dispatch/references/filing-gate.md‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@
3939
- 协议类:修复改 spec 接受/声明面(含 ADR-0087 转换窗)或 `/meta` 读存删门的收答,宽窄皆算。
4040
- REST/数据门收窄亦算;措辞、文档、账本、CLI 旗、lint/verify 导出、门不变的服务行为不算。
4141
- 此类任何车道皆 p1 + 在研大版 `target:`,可退役键的条件卡同档;维护者裁决,本节余条不压。
42-
- 分诊轮的维护者清单点名等下个 `next.N` 的 objectui 卡数,堆积即请切版。
43-
- 此类的消费方跟进卡(objectui 类型镜像、渲染器、Studio)缺它即坏用户才 p1,余者守本档。
42+
- 此类的消费方跟进卡(`ui/` 类型镜像、渲染器、Studio)缺它即坏用户才 p1,余者守本档。
4443
- 坏用户 = 设计器系统性写出协议拒收的元数据,或协议声明的块/键渲染为空;纯镜像不算。
4544
- 此类的跟进卡全部列入消费方新大版的首发卡,赶在该版发布前落地。
4645
- 清单项三态 ①:项会 fail ⇒ 断,继承其 `priority`;⛔「有人在等」不是定级判据。

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,15 @@
6868
- 待您清单与待字索引随所属批只呈一次,⛔ 不逐轮重印;座位贴散文降为指针,标签即状态。
6969
- 出口执行:核验动作确已发生,再摘标加证据评论同笔;出口条款见 `../state-machine.md`。
7070

71-
## 职责四:每日摘要、发版板、pin 链与总表
71+
## 职责四:每日摘要、发版板与总表
7272

73-
- 每日摘要:在飞/待裁/待落地/撞墙、等复审逾 24h 的 PR、发版板、pin 滞后、无卡 fork PR。
73+
- 每日摘要:在飞/待裁/待落地/撞墙、等复审逾 24h 的 PR、发版板、无卡 fork PR。
7474
- 座位贴与在飞活性复查归本摘要,见 `../dispatch-runbook.md` 巡查常设项与 `../triage-duties.md`。
7575
- 发版板 `target:<major>` 主仓归本席;判据二元,⛔ 不做优先级渐变:不修它,RC 能不能发。
7676
- 判阻塞四类:① 用户今天就撞的已发布面缺陷;② 公开契约 declared≠enforced。
7777
- ③ 存量数据/迁移形状(发布后修不回);④ 发布说明里要为它道歉的。
7878
- 拆分/分票时 `target:*` 随工作走,对每一半重跑二元判据,默认继承,不继承按四类写明理由。
79-
- 每张板恰好一个生产者;鲜度节奏、清板三选一、pin 前置见 `../seat-post-protocol.md`。
80-
- 跨仓 pin 链:objectui pin 落后且其队列已空 ⇒ 在本仓立/刷新 console bump 单;⛔ 只立单不 bump。
79+
- 每张板恰好一个生产者;鲜度节奏、清板三选一见 `../seat-post-protocol.md`。
8180
- 见新 tag 族发布 ⇒ 在 cloud 与每个应用仓立平台版本 bump 单;单张封顶,已有则追评刷新。
8281
- bump 单等待卡清单 = hold 索引(`Restart-when:`/`Blocked-by:` 点名该发布的 open 卡),查询落正文。
8382
- 车队总表随本摘要重生成,坐席/接管/收班同笔;一席一行,⛔ 不手改;见 `../project-forms.md`。

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
- `objectstack-ai/hotcrm` 全仓:元数据优先的 CRM 样板工程,不入 spec 依赖链。
1313
- 应用即展品,不是功能实验场 —— 收卡第一问恒为这张卡展现哪项平台能力。
1414
- 边界:平台相关的功能在平台中实现。
15-
- 建设 hotcrm 时发现的平台能力缺口,立普通平台卡到 objectstack 或 objectui。
15+
- 建设 hotcrm 时发现的平台能力缺口,立普通平台卡到 objectstack(渲染器在其 `ui/`)。
1616
- 那是 file-at-destination、非缝卡、待分诊;hotcrm 侧同笔挂 `pm:blocked` 加 `Blocked-by:` 回链。
1717
- ⛔ 永不在 hotcrm 内绕行:绕行把平台缺口藏进样板,展品从此示范错误写法。
1818
- `repo:hotcrm` 缝标签只给真协调卡,跨仓次序即卡的实质。

0 commit comments

Comments
 (0)