Skip to content

chore(console): 刷新 objectui pin 到 f995a452d2ca —— 98 个 commit / 64 条 releasing changeset / 2 项 v17 破坏性变更进入 v17 - #6097

Merged
hotlong merged 1 commit into
mainfrom
claude/issue-6089-objectui-refresh-console-pin
Aug 7, 2026
Merged

chore(console): 刷新 objectui pin 到 f995a452d2ca —— 98 个 commit / 64 条 releasing changeset / 2 项 v17 破坏性变更进入 v17#6097
hotlong merged 1 commit into
mainfrom
claude/issue-6089-objectui-refresh-console-pin

Conversation

@hotlong

@hotlong hotlong commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Fixes #6089

跑了 pnpm objectui:refresh(= scripts/bump-objectui.sh + scripts/build-console.sh)并落 pin。diff 只有两个文件 —— .objectui-sha 与脚本生成的 changeset,与 #4665 那轮(PR #4732同形

两条命令都持容器级锁、带堆上限:

flock -w 7200 /tmp/os-heavy-verify.lock \
  NODE_OPTIONS=--max-old-space-size=4096 OBJECTUI_ROOT=/home/user/objectui \
  bash scripts/bump-objectui.sh --no-commit f995a452d2ca97fcc4b92ec6d004ee5571f3d6b7
flock -w 7200 /tmp/os-heavy-verify.lock \
  NODE_OPTIONS=--max-old-space-size=4096 OBJECTUI_ROOT=/home/user/objectui \
  bash scripts/build-console.sh

--no-commit 只是为了自己写提交信息;文件内容全部是脚本产出的,一个字节没手改。)

读数

旧 pin f5bc4c78be76
新 pin f995a452d2ca —— objectui main tip(ci(scripts): type-check scripts/ via a standalone tsconfig.scripts.json (#3494) (#3498),2026-08-06T13:52:26Z)
关系 merge-base --is-ancestor ✓ · ahead 98 · behind 0(pin 是 main 的干净祖先,无分叉)
区间新增 changeset 65(与本单读数一致)
其中 releasing 64 —— 14 minor / 50 patch / 0 major
release-nothing 1 —— live-e2e-lane.md(空 frontmatter,CI lane,changesets 自己的"不发版"写法)
未带 changeset 的提交 33(19 fix · 4 ci · 4 docs · 4 test · 2 chore
生成的 changeset 级别 @objectstack/console: minor(= 区间内 objectui 声明的最高级)
清单是否截断 否 —— 64 条 ≤ 上限 100,footer 的 accounting 逐项对得上

64 / 65 的差额已核清:唯一没进清单的是 live-e2e-lane.md,它的 frontmatter 是空的(release-nothing),按 #4731 的判据本就不该进 —— 不是漏收。

跑之前踩到的两个坑(都会静默产出错误结果,记下来)

  1. 给 bump 传了显式 SHA,没走默认路径 —— 与 chore(console): 刷新 objectui pin 到 785b8a5d432c —— 2026-08-02 的 7 个 PR 进入 v17 #4732 同一个坑:bump-objectui.sh 不带参数时取 ../objectuiHEAD,而容器里那个共享 checkout 停在功能分支 claude/pm-dispatch-devx-rgxpjf7894432)上,默认路径会把 pin 钉到一个不是 main 的提交。传入的 SHA 由 git ls-remote https://github.com/objectstack-ai/objectui.git refs/heads/main 当场解析。
  2. 容器里的 objectui 是 shallow clone(只有 63 个提交可达),旧 pin f5bc4c78 不可达。直接跑会掉进脚本的 degraded 分支 —— 那条路径只写 tip 的 subject,产出一份"看起来完整、实则只有一行"的清单。先 git fetch --no-tags --deepen=200 把区间打通(269 个提交可达、旧 pin present),才拿到完整的 65 条声明。

两条 v17 破坏性变更 —— 逐条确认

两条都已随 changeset 带进来,条目在 .changeset/console-f995a452d2ca.md 里逐字如下:

1. 042e09d77 —— widget 元数据收敛到 field 单键(field-widget-single-metadata-carrier.md

生成清单里的条目(自带 **BREAKING (v17)** 标注,因为该标注就在 changeset 正文首段,digest 取的正是首段):

- **minor** — **BREAKING (v17)** — field widgets receive their metadata on ONE key, `field`.
  `schema` is removed from the widget contract (objectui#3233). (objectui `042e09d77`)

产物侧对照(旧 pin git grep 0 命中佐证,不是"应该在"):

探针 旧 pin 新 pin
withFieldCarrier(changeset 描述的新注册适配器) 0 文件 10 文件
packages/fields/src 里读第二载体(props.schema / field || schema 34 文件 / 36 处 6 文件 / 13 处

2. 6e794a19e —— flow 节点几何收敛到 spec 的 FlowNode.positionflow-node-geometry-is-spec-position.md

- **minor** — The flow designer writes node geometry as the spec's `FlowNode.position`, not its
  own `ui: { x, y }` (objectui#3172). (objectui `6e794a19e`)
探针 旧 pin 新 pin
packages/app-shell/srcmanualPosition()(读侧兼容旧 ui 的迁移路径) 0 文件 2 文件
FlowNodePosition(由 spec 按引用派生的几何类型) 0 文件 2 文件

⚠️ 一处如实记录:digest 的"破坏性"计数对这两条是 0

objectui-changeset-digest.mjsbreaking 计的是声明级别为 major 的 changeset,而 objectui 在 v17 发布窗内把破坏性变更声明成 minor + 正文标注(与本仓 check-changeset-no-major.mjs 的窗口约定同源)。所以这次 breaking = 0,那句"⚠️ N of these declare a major (breaking) bump"没有触发

后果不是"丢失"——两条都在清单里、级别正确、摘要完整;但只有 widget 那条自己在首段喊了 BREAKING (v17),flow 那条的破坏性陈述("Breaking for anyone reading node.ui")在正文靠后的段落,digest 读不到,条目读起来就是一条普通行为修复。这是本 PR 之外的观察项,已另开单,不在这里改。

另有一条与本仓 pin 链直接相关的条目也进来了:

- **minor** — Track `@objectstack/spec` 17.0.0-rc.2 (objectui#3235, #3208, #3287, #3264). (objectui `d22ae31ce`)

门禁

$ pnpm check:console-sha
✓ Console dist matches the objectui pin (objectui@f995a452d2ca).

$ pnpm check:objectui-changeset
✓ objectui-changeset-digest --self-test: all checks passed
✓ objectui-range --self-test: all checks passed

$ NODE_USE_ENV_PROXY=1 pnpm check:objectui-pin-fresh
✓ check-objectui-pin-fresh --self-test: all checks passed
✓ objectui pin is FRESH — .objectui-sha is objectui `main` (objectui@f995a452d2ca).
  Nothing objectui has merged is outside the @objectstack/console changeset range.

$ pnpm check:nul-bytes
✓ check-nul-bytes --self-test: 56 assertions over a temp git repo (real scan() path)
check-nul-bytes: OK (scanned 5834 tracked text file(s); no raw ASCII control bytes).

$ node scripts/check-changeset-fixed.mjs
✓ .changeset/config.json "fixed" group is in sync with 69 public workspace packages.

$ node scripts/check-changeset-no-major.mjs   # exit 0
$ node scripts/check-release-notes.mjs
check-release-notes: OK — every released major has a curated, navigable release page.

ESLint job 里会碰到本 PR 这份 markdown 的几道门禁也单独跑了,全绿:check:doc-authoring(363 files clean)、check:docs-audit-scopecheck:role-word(43 baselined,no new occurrences)、check:adr-anchorscheck:org-identifier

包级验证(沿用 #4732 的选型 —— console 解析与 SHA drift 守卫都在 CLI 包):

$ pnpm --filter @objectstack/cli test
 Test Files  87 passed (87)
      Tests  872 passed (872)

$ pnpm --filter @objectstack/cli typecheck   # tsc --noEmit,无输出即通过,exit 0

首轮 CLI 测试 29 个文件失败(@objectstack/cloud-connection 等依赖的 dist 未构建,loadOptionalPackage 判成 broken)—— 与 #4732 当轮同一个现象,是新 worktree 首次 install 后的构建状态,跑完 pnpm --filter '@objectstack/cli^...' build 后 87/87 全绿,与本 PR 无关。

未跑 Playwright e2e(要真实浏览器 + 起服务,本轮多个 agent 共用一个容器)。

packages/console/dist 的 delta:全部是生成物,不在 diff 里

packages/console/.gitignore 第 1 行就是 dist/,所以这次重建的 49228 KB / 1400 个 asset 一个都不进 git —— PR 的 changed_files2。⛔ 没有手改过 dist 里的任何一个字节,它整个由 build-console.sh 产出。

链路自证:

  • 构建树 HEAD = f995a452d2ca = .objectui-sha(脚本自己 rev-parse 校验过,不匹配就 exit 1);
  • packages/console/dist/.objectui-sha 戳 = f995a452d2ca97fcc4b92ec6d004ee5571f3d6b7check:console-sha 因此绿;
  • bundle canary import/jobs 命中 —— 产物里的 @objectstack/client本仓这棵树的(OBJECTSTACK_CLIENT_DIST 注入生效),不是 objectui lockfile 里的旧版本;
  • 区间内改动确实进了产物,抽两条正交的:objectui-locale0554e889c,locale 持久化,旧 pin 源码树 0 文件命中 → 新 pin 3 文件 → 产物 1 个 asset 命中)、aria-required680080ada → 产物 7 个 asset 命中)。

v17 升级指南:两条迁移都还没有落点(只核查,未改)

content/docs/releases/ 对代码 PR 是禁区(CLAUDE.md 第三条),所以这里只报不改:

  • content/docs/releases/v17.mdx 的「Breaking changes & migration」章节里,field-widget / FieldWidgetComponentProps / withFieldCarrier / objectui#3233 / FlowNode.position / node.ui / objectui#3172 逐个 0 命中;扩到整个 content/docs/ 也是 0。两条 v17 破坏性迁移目前只存在于 .changeset/(发布说明的法定输入层),RC 期间正在升级的作者在文档站上读不到。
  • 顺带:该页 1969 行的 console 段标题仍写着 bundled objectui advanced 4a4829d0ef39 → 785b8a5d432c —— 本 PR 落地后这个区间又旧了一轮(现为 → f995a452d2ca)。同一个落点问题的另一半,与 chore(console): 刷新 objectui pin 到 785b8a5d432c —— 2026-08-02 的 7 个 PR 进入 v17 #4732 当时记的是同一条。

#4732 的三选项框架,这仍然是 B(changeset + 一个独立的 docs-only PR) 更合适:changeset 是发布说明的单一输入这条不能破(A 已做),但一条作者破坏性迁移在 RC 期间只活在 .changeset/ 里,对正在升级的作者等于不存在。决定权在维护者,本 PR 不代做。

不在本 PR 里

  • objectui#3374(@objectstack/spec rc pin,pm:on-hold)零接触 —— 本单明确把它排除在外。顺带记一个当场读数:npm 上 @objectstack/specrc 仍停在 17.0.0-rc.3,objectui 侧 track 的是 rc.2;两件事各走各的 PR,没有在这里捆。
  • packages/spec/** 零改动(属 spec 座位)。
  • content/docs/releases/** 零改动。
  • objectui 侧零改动(只 fetch --deepen 打通了本地 shallow clone 的历史,没有动它的工作树、HEAD 或任何 ref)。
  • 无任何 rider:git show --stat = 2 files changed, 75 insertions(+), 1 deletion(-)。

Generated by Claude Code

…leasing changeset / 2 项 v17 破坏性变更)

pin 落后 objectui main 98 个 commit(ahead_by=98、behind_by=0,pin 是 main 的干净祖先)。
刷新之前这些改动只存在于 objectui 的 main 上:既不在本仓的构建产物里,也进不了 v17 的
发布记录 —— 正是 #3340 要防的失效模式。

- `.objectui-sha`: f5bc4c78be76 → f995a452d2ca(objectui `main` tip,2026-08-06T13:52:26Z)
- `.changeset/console-f995a452d2ca.md`(`@objectstack/console`: minor):由
  `objectui-changeset-digest.mjs` 按 objectui **自己声明的** changeset 生成 —— 区间新增
  65 个 changeset,64 条 releasing(14 minor / 50 patch),1 条 release-nothing
  (`live-e2e-lane.md`,空 frontmatter),33 个提交未带 changeset。清单未截断(上限 100)。
- `packages/console/dist` 由 `build-console.sh` 在该 pin 上重建(gitignored,不在 diff 里),
  产物内 `.objectui-sha` 戳与 pin 一致,bundle canary `import/jobs` 通过。

两条 v17 破坏性变更都已随 changeset 带入:
- `042e09d77` `field-widget-single-metadata-carrier.md` —— 条目自带 `**BREAKING (v17)**` 标注
- `6e794a19e` `flow-node-geometry-is-spec-position.md`

不含任何 rider:未动 `packages/spec/**`、`content/docs/releases/**`,与 objectui#3374
(`@objectstack/spec` rc pin)无关。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BDmDsu2575gDxeMCxXhDE3
@vercel

vercel Bot commented Aug 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 7, 2026 1:14am

Request Review

hotlong commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

CI 收敛结果:唯一的红是 main 带进来的,不是本 PR

本 PR 的 diff 是 .objectui-sha + 一个 .changeset/*.md零源码。ESLint job 挂在 check:slot-lookup 上,点名的却是 packages/plugins/plugin-sharing/src/sharing-plugin.ts —— 本 PR 从未碰过的文件。

CI 跑的是 merge ref(main 当前 tip 与本分支的合并),所以 main 上的红会照进来。已就地证伪"是我造成的":

# ① 本分支的基(e3ef52b)+ 我的提交 —— 绿
$ pnpm check:slot-lookup
✓ slot-lookup ratchet holds: 143 unswept site(s) in 32 file(s), none new.
  baseline key set verified against e3ef52b: no files added.

# ② 干净的 origin/main(acb10f6),一个字节都没有我的改动 —— 红
$ git worktree add --detach ../objectstack-6089-mainprobe origin/main
$ node scripts/check-slot-lookup-ratchet.mjs
✗ slot-lookup ratchet (1 problem(s)):
  • packages/plugins/plugin-sharing/src/sharing-plugin.ts: erasure count grew 10 → 11.
Unswept: 144 site(s) in 32 file(s).

143 → 144 的那一条,来自我分支点之后合进 main 的 f226605fix(plugin-sharing): hierarchy resolver 按权威字段拿到调用方活动组织 (#5859) (#6067))—— 该区间里只有它动过这个文件,新增的擦除点是:

tenancy: () => {
  try { return ctx.getService< any >('tenancy'); }
  catch { return null; }
},

该止血单已存在#6100bug / pm:queue / pm:dispatched)。按本单纪律(pin bump 独立 PR、⛔ 不带任何 rider),这里不顺手改别人刚合进来的文件。

其余门禁全绿

job 结论
Console Pin Freshness(本单的判据门禁) ✅ success
Console Pin Gate(钉的 SHA 还能不能构建) ✅ success
TypeScript Type Check ✅ success
Check Changeset ✅ success
Check PR Size / Auto Label / Test Core / Dogfood Regression Gate ✅ success
No other open PR may claim the same issue ✅ success
ESLint ❌ failure —— 上述 main 侧继承红(#6100

Console Pin GateConsole Pin Freshness 两个都绿这件事值得单记一笔:按 check-objectui-pin-fresh.mjs 文件头的说法,它们问的是同一个事实的两端("钉的 SHA 还能不能构建" vs "这个 pin 还是不是最新"),任一为绿都不能替另一个背书 —— 这次是两端同时成立。


Generated by Claude Code

@hotlong
hotlong marked this pull request as ready for review August 7, 2026 01:29
@hotlong
hotlong added this pull request to the merge queue Aug 7, 2026
Merged via the queue into main with commit ce1155c Aug 7, 2026
18 of 19 checks passed
@hotlong
hotlong deleted the claude/issue-6089-objectui-refresh-console-pin branch August 7, 2026 01:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tooling

Projects

None yet

2 participants