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

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