Skip to content

chore(ui)!: stop publishing @object-ui/app-shell; delete the two host-console examples and the extraction guide (#25922) - #26483

Merged
objectstack-fleet[bot] merged 9 commits into
mainfrom
claude/project-thread-camgrp
Oct 27, 2026
Merged

objectstack-fleet[bot] merged 9 commits into
mainfrom
claude/project-thread-camgrp

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Steve · project thread

Part of #25922 (the unpublish-and-delete item of ruling 6431234244 only; the designer strings (M) item and the 76 Console-only names stay on the card).
Clause-②: yes (narrowing): a published package leaves the registry; ADR-0087 marker per the lane's rules
Metadata-protocol: none

维护者速读

  • 改了什么:@object-ui/app-shell 标为 private: true,移出 changesets 的 fixed 组;删除 ui/examples/byo-backend-console、ui/examples/console-starter 和 ui/docs/app-shell-extraction-guide.md,并清掉指向它们的链接与索引。Console 和 23 个工作区引用方不动。
  • 为什么改:执行 app-shell: a published library that is 66% Console product surface — retire the 67 zero-reference exports now, decide the split, and fold the second i18n table into @object-ui/i18n #25922 的重裁 Q1 = B(6431234244):「本项目的组件就是为 objectos console服务的,可定制console暂时没有业务需求,可以废弃」「相关例子也可以删除」。
  • 风险与回滚:18.2.0 是 npm 上最后一个发布的 @object-ui/app-shell(18.2 版本 PR 已把它记到 18.2.0,18.2 发布从版本提交 27f38ad 发出);之后由你执行 npm deprecate。私有包仍按 privatePackages.version: true 单独记版本,点名它的待发 changeset 不用改。回滚 = revert 本 PR。改动 2979 行(上限 3000),其中 2824 行是删除。
  • 先看:.changeset/25922-unpublish-app-shell.md(BREAKING 说明与 ADR-0087 unpublished 标记)、ui/scripts/check-changeset-fixed.mjs(私有包不在 fixed、不在 ignore 时的分类规则)、ui/packages/app-shell/package.json。
  • 两分钟验证:node scripts/check-changeset-fixed.mjs && node scripts/check-adr-0087-registration.mjs --base origin/main,预期两行 ✓,后者点名 not-required (unpublished)。
  • 需要你做的:无,席位落地。(另有一行受管文件 ui/.claude/** 的修改不在本 PR,见 Acceptance notes。)

Why

Ruling 6431234244 on #25922 re-rules Q1 to B: @object-ui/app-shell stops being published, and the two examples that consume it as a third-party host would, plus the extraction guide that describes that posture, are deleted. The split in 6431032267 is withdrawn.

What changes

The package leaves npm.

  • ui/packages/app-shell/package.json: private: true, beside the 18.2.0 version the 18.2 Version PR set. Nothing else in the manifest moves; every workspace importer keeps workspace:*.
  • .changeset/config.json: @object-ui/app-shell leaves the fixed group. The root scripts/check-changeset-fixed.mjs refuses an undeclared private member there, so it cannot stay. No hand-typed package count moves with it: docs(gates): take the re-typed counts out of the docs and retire the two gates that only held them #26511 took those counts out of the docs and retired check-lockstep-package-count.
  • ui/scripts/check-changeset-fixed.mjs (the ui roster gate, read by its test in Test UI): rule 1 required every package to be in fixed or matched by ignore. A private package outside both is now classified too, but only while privatePackages.version is true. In that case Changesets versions it on its own and publishes it nowhere. Under version: false it would be treated as ignored, and the mixed-changeset failure rule 3 describes would follow, so it stays unclassified there. ignore was not an option: before the 18.2 Version PR, 48 pending changesets named @object-ui/app-shell beside published packages, and ignore makes any such changeset a mixed one. New unit case in check-changeset-fixed.test.ts, covering both directions.

The host-console posture leaves the tree.

  • Deleted: ui/examples/byo-backend-console (11 files), ui/examples/console-starter (16 files, its two tests included), ui/docs/app-shell-extraction-guide.md. pnpm-lock.yaml loses their two importers (deletions only).
  • Links and indexes: ui/README.md (the Quick Start rows, the "Bring your own backend" section that taught npm install @object-ui/app-shell, the run-the-examples block, the package-table row), ui/examples/README.md, ui/examples/hello-world/README.md, ui/examples/schema-catalog/README.md, ui/CONTRIBUTING.md, ui/QUICK_REFERENCE.md (Examples section, published count 36 → 35 with app-shell named among the private packages), ui/content/docs/guide/objectos-integration.mdx (the dead objectui-repo link), ui/packages/app-shell/README.md (a not-published notice, the install section, two example pointers), and three app-shell source comments that sent the reader to examples/console-starter/src/App.tsx.
  • ui/scripts/markdown-test-inputs.mjs: the retired guide leaves four reads entries (--audit: 73 declared entries, all present).
  • tsconfig.tier-base.json: no package's build or type-check program reaches it any more (the deleted byo-backend-console was the one real compile that did). turbo-build-inputs / turbo-type-check-inputs prescribe deleting the dead input, so $TURBO_ROOT$/tsconfig.tier-base.json leaves both tasks in ui/turbo.objectui.json and $TURBO_ROOT$/ui/tsconfig.tier-base.json leaves the live root turbo.json. The two header comments that counted its extenders say 2.

Changeset. .changeset/25922-unpublish-app-shell.md, @object-ui/app-shell: patch (Metadata-protocol none), BREAKING banner, the FROM npm → TO none migration line, and the marker adr-0087: not-required (unpublished). The gate verifies that category mechanically: every package the changeset bumps is private: true at HEAD. It states that 18.2.0 is the last published @object-ui/app-shell (the 18.2 Version PR versioned it before this change and the 18.2 publish ships it) and that the maintainer runs npm deprecate after that publish. The migration line names @object-ui/app-shell@18.2.0.

Untouched, as ruled: ui/apps/console and the 23 ui/packages/* importers; the other @object-ui/* packages' publishing; the 76 Console-only names.

Forced test edits (each follows the deletion or the private flag; none relaxes a check)

  • ui/scripts/__tests__/check-doc-snippet-types.test.ts: the root docs/*.md leg's only real page was the retired guide. "listDocuments reaches them" and "the widening judges something" now prove the leg on a fixture docs/PAGE.md: it is listed, covered and contributes a compiled block. Every real page the leg reaches must still be covered.
  • ui/scripts/__tests__/check-doc-fence-languages.test.ts: same leg, same cause; the per-leg non-empty check reads the root leg on a fixture page.
  • ui/scripts/__tests__/check-doc-links.test.ts: examples scan floor 4 → 3 (the index, hello-world, schema-catalog READMEs).
  • ui/scripts/__tests__/zero-test-member-exclusion-9106.test.ts: the examples/byo-backend-console row leaves the recorded exclusion, as its own failure text prescribes for a member that left.
  • ui/scripts/__tests__/side-effects-declaration-consistency.test.ts: the @object-ui/layout alias tables are apps/console/vite.config.ts alone.
  • ui/scripts/__tests__/check-type-check-coverage.test.ts: packages with tests outside src/ are @object-ui/example-schema-catalog alone.
  • ui/scripts/__tests__/package-files-exist.test.ts: the license-text anti-vacuity floor 37 → 36 (36 measured, app-shell no longer publishes).
  • ui/scripts/__tests__/quick-reference-commands-4149.test.ts: no examples/* package declares dev any more. The test asked for the section to be rewritten, not re-pinned. With no runnable example, it now pins the section's "No directory under examples/ is a dev server" sentence and refuses any example dev command. When an example grows a dev script, the sentence reds and the original per-example check takes over.
  • ui/scripts/__tests__/check-changeset-fixed.test.ts: the new rule's unit case (above).

Tests

After merging main past the 18.2 Version PR (#25640) and #26511, head 443aad7b: node scripts/check-changeset-fixed.mjs, node ui/scripts/check-changeset-fixed.mjs, pnpm run check:publish-smoke-pin, check:docs-spec-enumerations, check:overlay-whitelist-table, check:route-ledger-census, node scripts/check-adr-0087-registration.mjs --base origin/main (not-required (unpublished)), check-empty-changeset and check-changeset-no-major (--base origin/main), node ui/scripts/check-skills-paths.mjs and pnpm exec changeset status --since=origin/main all exit 0. The full release plan assembled with @changesets/cli 3.0.3's own read/config/assemble packages reads all 13 pending changesets with exit 0: @object-ui/app-shell 18.2.0 → 18.2.1 on its own (private, publishes nothing), the fixed group 18.2.0 → 18.3.0. vitest run on quick-reference-commands-4149, check-changeset-fixed, check-doc-links, package-files-exist, check-skills-paths: 5 files, 198 tests passed.

The readings below were measured at head 160fe489 in the card thread's container.

  • pnpm --dir ui exec vitest run scripts/__tests__/ --maxWorkers=2 under the verify lock, after the Console build: Test Files 1 failed | 177 passed | 2 skipped (180), Tests 4 failed | 5053 passed. The 4 are all check-skills-paths.test.ts, one cause: the governed guide line in Acceptance notes. With that line's patch applied locally, check-skills-paths.test.ts is 35/35 and node ui/scripts/check-skills-paths.mjs exits 0. The patch was then restored; it is not in this diff.
  • Console build: pnpm exec turbo run build --filter=@object-ui/console --concurrency=2 under the lock: Tasks: 70 successful, 70 total, VERDICT command-exit 0, and the tree was clean afterwards (sdui.manifest.json unchanged).
  • node ui/scripts/markdown-test-inputs.mjs --audit: 109 candidate test files, all adjudicated; 73 declared entries, all present.

Dogfood battery (the (narrowing) arm owes it), final head 160fe489: pnpm --workspace-concurrency=2 --filter '@objectstack/dogfood^...' build && pnpm --filter @objectstack/dogfood test under the lock, VERDICT command-exit 1, Test Files 2 failed | 298 passed | 3 skipped (303), Tests 10 failed | 2522 passed | 18 skipped (2550). All 10 are outside this diff, which touches no file under packages/rest, packages/qa or packages/spec: authz-probe-blind-spot.test.ts (4: packages/rest/src/rest-route-ledger.ts controls 81 vs pinned 80, rest-server.ts 63/70 vs 62/69) and authz-conformance.test.ts (6: the #17111 docblock-figure pins). Both census files last moved in 6a2866a on main, which added a route; the dogfood battery runs only on main's full schedule, so this reads as a main-side red, reported to the seat.

Verification

Local subset, derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 160fe489 (107 families) and run after the last commit; every exit code captured before any pipe.

dispatch-gates --ran: exit 0, 107 accounted, 106 run, 1 NOT MEASURED
  • 105 commands exit 0, including check-adr-0087-registration --base origin/main (not-required (unpublished) judged), check-changeset-fixed (109 public packages, 1 declared private member), check-changeset-no-major, check-empty-changeset, check:lockstep-package-count, check:publish-smoke-pin, check:published-files, check:turbo-task-graph, check:type-check-coverage, check:cross-package-test-inputs and check:pm-dispatch-gates (fast tier, 380 s).
  • pnpm --filter @objectstack/spec run check:skill-examples: first exit 3 (prerequisite: @objectstack/client-react unbuilt), then exit 0 after pnpm --filter @objectstack/client-react build (264 prose examples type-check).
  • NOT MEASURED: pnpm check:dual-build-cjs-loads, exit 3 PREREQUISITE NOT MET (reads every package dist/, which needs a whole-repo build). The diff touches no package build; CI Lint & Repo Gates runs it.
  • node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran RECORD: 107 derived famil(ies) accounted for — 106 run, 1 NOT-MEASURED.

Every family CI runs is read from this PR's check runs; none was re-run locally to stand in for them.

Acceptance notes

  • Governed follow-up, landed separately (Tier H). The ui/.claude/skills/objectui-contributor/guides/console-development.md bullet that told contributors to fork examples/console-starter was rewritten in docs(ui-skills): the console guide names apps/console as the one host (#25922) #26484 (merged), so check-skills-paths is green here without this PR touching ui/.claude/**.
  • Pending changesets naming @object-ui/app-shell: 48 at first; the 18.2 Version PR consumed them, and 2 others are pending now. None edited. A private package versions under privatePackages.version: true, and changeset status --since=origin/main computes a plan with @object-ui/app-shell versioned on its own (no refusal). check-empty-changeset: no changeset from the merge base modified or deleted.
  • Found on main earlier, since fixed there: .changeset/26095-publishing-metadata.md had its closing frontmatter delimiter glued to its last line, so changeset status exited 1 on main. fix(changeset): close the 26095 publishing-metadata changeset's frontmatter so changeset version parses again #26458 fixed it; the readings at 443aad7b above ran on the unmodified tree.
  • After this PR, DefaultLoginPage / DefaultRegisterPage have no in-repo mount (only console-starter mounted them; the Console has its own pages). That falls under the card's internal tech-debt line, not this PR.
  • Comments and test docblocks in other packages that mention the deleted examples historically (plugin-view/ObjectView.tsx, plugin-list/ListView.tsx, plugin-detail/headerColor.ts, cli/doctor.ts, several ui/scripts docblocks) and the CHANGELOGs are left as written. Editing them is outside the claimed file surface, and ObjectView.tsx is held by another card.
  • Diff size: 155 additions + 2824 deletions = 2979 changed lines, under the 3,000-line Tier H threshold.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (not touched)
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; pnpm lint passes. (lint is CI's run)
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset.
  • 6. packages/spec touched: n/a.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English.

🤖 Generated with Claude Code

https://claude.ai/code/session_01ADHkmQmtHYkx1Ve9ob2ikN


Generated by Claude Code

…examples and the extraction guide

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ADHkmQmtHYkx1Ve9ob2ikN
… retired guide from the markdown input ledger

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ADHkmQmtHYkx1Ve9ob2ikN
…rivate app-shell

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ADHkmQmtHYkx1Ve9ob2ikN
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · ACCEPT · seat domain:ui#1 · 2026-10-27T05:46Z · #25922 app-shell unpublish

Head b5275277 (read from the PR object). It merges main 00a4593a, which contains #26484 (the ui/.claude guide line) and #26458 (the .changeset/26095 frontmatter fix).

Landing: ready + auto-merge through the relay.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 27, 2026 05:47
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 27, 2026 05:47
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 27, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 27, 2026
…-camgrp

# Conflicts:
#	ui/packages/app-shell/package.json
The 18.2 Version PR versioned app-shell to 18.2.0 and the 18.2 publish
ships it, so the changeset and the README notices now name 18.2.0, not
18.1.x, as the last version on npm.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ADHkmQmtHYkx1Ve9ob2ikN
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · re-ACCEPT · seat domain:ui#1 · 2026-10-27T06:41Z · #25922 app-shell unpublish, after the 18.2 Version PR

Head a9fb512c (read from the PR object). It merges main b7f2b0c2, which is past the 18.2 Version PR #25640 (merged 05:56Z).

  • Why again. chore: version packages #25640 moved ui/packages/app-shell/package.json to 18.2.0. chore(ui)!: stop publishing @object-ui/app-shell; delete the two host-console examples and the extraction guide (#25922) #26483 conflicted on that file, and the queue dropped it at 06:10Z.
  • Resolution. package.json keeps main's "version": "18.2.0" and adds "private": true. Nothing else in that file differs from main.
  • Wording. The changeset, the app-shell README notice, the ui/README row and the QUICK_REFERENCE row now name 18.2.0 as the last published @object-ui/app-shell.
  • Release check. The release thread confirmed that the 18.2 publish checks out the version commit 27f38ada, not main's HEAD. Landing this PR now doesn't change that publish.
  • Evidence (dev, merged tree). These all exit 0: changeset status --since=origin/main, root and ui check-changeset-fixed, lockstep 109, ADR-0087 (not-required (unpublished)), empty-changeset, no-major and check-skills-paths. In the release plan, app-shell goes 18.2.0 → 18.2.1 privately.
  • Governed surface. It is still the same 59 files (2985 lines), with no governed path.
  • Checks pinned to the head. All check runs completed: 0 failing, 0 pending. The seat's landing script checked this before posting.

Landing: auto-merge through the relay (the PR is already ready for review).

@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 27, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 27, 2026
…-camgrp

# Conflicts:
#	content/docs/protocol/backward-compatibility.mdx
#	scripts/publish-smoke-pack.mjs
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · re-ACCEPT · seat domain:ui#1 · 2026-10-27T07:36Z · #25922 app-shell unpublish, after #26511

Head 443aad7b (read from the PR object). It merges main 185512cc.

  • Why again. docs(gates): take the re-typed counts out of the docs and retire the two gates that only held them #26511 (d2ca7079) took the hand-typed counts out of content/docs/protocol/backward-compatibility.mdx and scripts/publish-smoke-pack.mjs. Both conflicted, and the queue dropped the PR at 07:01Z.

  • Resolution. docs(gates): take the re-typed counts out of the docs and retire the two gates that only held them #26511's side is taken for both files as a whole. Both now match main byte for byte, so the diff no longer touches them and no number comes back. The diff is now 57 files, +155 / −2824.

  • Evidence (dev, merged tree). These all exit 0:

    • check:publish-smoke-pin (--self-test), check:docs-spec-enumerations, check:overlay-whitelist-table and check:route-ledger-census;
    • root and ui check-changeset-fixed;
    • ADR-0087 (not-required (unpublished)), empty-changeset, no-major and check-skills-paths;
    • changeset status --since=origin/main.

    The release plan reads 13 changesets: app-shell goes 18.2.0 → 18.2.1 privately. The body was patched by the dev.

  • Governed surface. No governed path (the file set shrank).

  • Checks pinned to the head. All check runs completed: 0 failing, 0 pending. The seat's landing script checked this before posting.

Landing: auto-merge through the relay (the PR is already ready for review).

@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 27, 2026
Merged via the queue into main with commit 6a7c0fe Oct 27, 2026
69 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-camgrp branch October 27, 2026 07:59
@github-actions

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 40468287272 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

分类:failure —— 按下面的日志分诊。

失败的 job(日志抽取,best effort):

  • Test UI (8/16) — 失败步骤: Run the ui tests (shard 8/16)

    × unmount unsubscribes: a later pulse reads nothing 32ms
    FAIL   dom  packages/plugin-chatbot/src/__tests__/ChatbotEnhanced.pendingCountPulse-26471.test.tsx > objectstack#26471 — the draft card re-reads its pending count on the metadata pulse > unmount unsub
      ↳ 失败原因: Error: expect(element).toHaveTextContent()
    

↳ 失败原因 是判读的关键:超时(Test timed out in … / Hook timed out in …)多半是负载/时序,不是本 PR 的回归;
断言(AssertionError: …)才指向真实的行为改变。两者的 FAIL 行长得一模一样,只有这一行能区分。

⚠️ 断言这一侧有一类例外,判据是断言在测什么,不是它是不是 AssertionError。 断言的对象是产品行为(一个值、一个形状、一次拒收)⇒ 照上面读:真实的行为改变,去查,⛔ 不要重排掉;
断言的对象是这次实验自身的有效性前提(跑完的耗时、负载下的先后、任何只在时间预算内才成立的条件)⇒ 它跟超时是同一类,同样对负载敏感,重排一次是合法的判别手段。
识别是机械的:断言的消息或它比较的值本身点名了一段时长、一个时间戳、一个耗时计数。实测过的一对 —— AssertionError: SecurityPlugin.init() ran: expected false to be true 测的是产品行为(真回归);
AssertionError: this run took over a second, so second-precision stamps could have differed too: expected 1006 to be less than 1000 测的是实验前提:它守护的那条不变式当时是绿的,同一个 head 原样重排一次即成功。
穿着 AssertionError 外衣的时间测量,仍然是时间测量。(⛔ 这只改「怎么读一次红」,不改「哪些测试可以重排」——后者由别处管。)

跨 PR 相同签名(24h,按失败测试文件聚合):

  • packages/plugin-chatbot/src/__tests__/ChatbotEnhanced.pendingCountPulse-26471.test.tsx — 24h 窗口内只有本 PR 撞到过,暂不汇总(再有一个不同 PR 撞到就会自动开汇总 issue)。
  • ⚠️ 24h 评论账本没读完(超过 5 页仍未读到窗口尽头),所以上面的「不同 PR 数」是下界,不是全量。

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 4 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 看上面的「跨 PR 相同签名」;已有汇总 issue ⇒ flaky/环境问题实锤,去那张 issue 上谈,修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation size/xl tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants