Skip to content

release(ui-merge): one release lane for both scopes — @object-ui joins the fixed group, @objectstack/console builds from ui/apps/console, the objectui pin is deleted (#25711) - #25745

Merged
os-zhuang merged 16 commits into
mainfrom
claude/project-thread-a0vh3h
Oct 25, 2026
Merged

os-zhuang merged 16 commits into
mainfrom
claude/project-thread-a0vh3h

Conversation

@objectstack-fleet

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

Copy link
Copy Markdown
Contributor

Requested by Tesla · project thread

Part of objectstack#25677
Fixes #25711
Blocked-by: sub-issue 5 of #25677 (the subtree PR that adds ui/; not filed yet)

Clause-②: no
Metadata-protocol: none

Maintainer rulings (Tesla, 2026-10-25 09:06Z, director thread): 17a — the release npm token has publish rights on @object-ui. 17b, ruling B — the private VS Code extension object-ui stays in the one fixed group. 17c, ruling B — the QUICK_REFERENCE release-sync rows retire; decision B (17c) carried here.

⛔ Tier H, cutover sitting. The cutover #25825 is on main (fd40831416, with #25833). This PR merged main and applies its ui/ half as tree edits on that tree. Local verdict on fb110c2323: comment 6404553650, every step and gate exit 0. It merges per ruling 30 = B once that sweep is clean and the four fast lanes are green.

Body refreshed 2026-10-25T22:55Z on head fb110c2323 (the merge of main fd40831416 is e2db258a24). Comments read through 6404553650.

What changes

1. One fixed group (.changeset/config.json). The 38 public @object-ui/* packages and the private VS Code extension object-ui (17b) join the @objectstack/* fixed group; @object-ui/example-*, @object-ui/site, @object-ui/runner and @object-ui/test-support are ignored, as in objectui. (objectui#13506 made @object-ui/runner private before the freeze at 9e1fe03286.) ui/.changeset/config.json is deleted by the ui-side patch (changesets reads one config per repository), and objectui's 65 pending ui/.changeset/*.md stay under ui/ for aftercare #25831. Measured on cutover head c04b36dcb9, moving them as they stand reds check-empty-changeset (3 empty frontmatters) and check-adr-0087-registration (41 breaking changesets with no disposition). Root check-changeset-fixed accepts a private name in the group only when PRIVATE_FIXED_MEMBERS declares it (object-ui alone, with its reason), the package is private, and privatePackages.version is true; it reds if that member leaves the group. check:lockstep-package-count subtracts the declared private members, so the published count is 111. check-changeset-no-major now reads packages/console/build-dist.sh as the Console's packed-copy build script, and check-empty-changeset's frontmatter-parser family loses the deleted objectui digest.

2. @objectstack/console builds in this workspace. packages/console/build-dist.sh copies ui/apps/console/dist (built by turbo through @object-ui/console#build) into packages/console/dist, ships the tracked sdui.manifest.json (ADR-0080), and runs the single-zod canary over the bytes it ships. Root task @objectstack/console#build:dist (turbo.json) depends on @object-ui/console#build; pnpm console:build runs it, and pnpm release / cut-rc.yml run it after pnpm run build. files and prepublishOnly are unchanged. scripts/build-console.sh is deleted. The CLI's remedy for a missing Console dist names pnpm console:build.

3. The objectstack-side pin is deleted. .objectui-sha, scripts/bump-objectui.sh (+ selftest), scripts/objectui-changeset-digest.mjs, scripts/objectui-range.mjs, scripts/check-prerelease-pin-watch.mjs, scripts/check-console-sha.mjs, scripts/check-console-injection.mjs, scripts/assert-console-spec-injection.mjs, scripts/console-spec-probes.mjs, packages/spec/scripts/build-console-objectstack-root.test.ts; the pin reads in cut-rc.yml ("THE objectui PIN IS AN INPUT HERE" and Read the committed objectui pin), release.yml, lint.yml, showcase-smoke.yml and the root package.json scripts (objectui:*, check:console-sha, check:console-injection, check:objectui-*, check:prerelease-pins; pnpm dev* no longer runs check:console-sha). scripts/check-console-intercept-disarm.mjs stays. Release notes (collect-release-notes.sh) say "no objectui pin" when the new ref has none. Gate self-tests and rosters that named the deleted scripts follow (dispatch-gates, pnpm-filter-targets, check-pnpm-filter-targets (tree-aware: foreign @object-ui/ targets must be 0 without ui/, >0 with it), bare-root-worklist, check-type-check-coverage). The lockstep count in content/docs/protocol/backward-compatibility.mdx and scripts/publish-smoke-pack.mjs reads 112, both scopes (check:lockstep-package-count --fix), and packages/spec/vitest.repo-tests.json drops the deleted test.

4. The objectui-side pin is deleted, in ui/. Until ui/ was on main, this half was carried as scripts/ui-import/4a-ui-side.patch. After the cutover landed, fb110c2323 applied it under ui/ with README step 2's deletions, then deleted the patch file. scripts/ui-import/README.md now records what was applied. It deletes .objectstack-sha, .objectstack-pin/, bump-objectstack.sh, objectstack-pin.mjs, objectstack-floor.mjs, check-spec-range-floors.mjs, check-installed-spec-pin-claims.mjs, the dist-pin Vite probes vite-objectstack-spec-dist.ts / vite-objectstack-client-dist.ts, changeset-release.yml, spec-range-floors.yml, release-github-releases.mjs and their tests, plus (17c) sync-quick-reference-release.mjs, its test and the quick-reference-current-release-4143 pin, with QUICK_REFERENCE.md's version rows. The single-zod guard moves to ui/scripts/vite-single-zod.ts (it runs in every console build); apps/console/vite.config.ts drops both injections. Every reader of the Changesets config goes through a new changesetConfigPath() (own root standalone, monorepo root when nested); objectui's check-changeset-fixed and check-unused-dependencies otherwise keep their extension rules (17b). The patch was written against verify head 9e37acd126 and checked with git apply --check on cutover heads 1c0d02eda4 and c04b36dcb9 and on main at fd40831416. It also deletes the nested ui/.github/pull_request_template.md, which never renders and whose only markdown-test-inputs reader was the claims test.

6. SDUI manifest. Carries the sdui manifest regeneration for the merged tree (107 → 106 components; objectui#13449 retired html): sdui.manifest.json and scripts/sdui-manifest.record.json, regenerated from ui/ now that .objectui-sha is gone and the dual-mode gates (#25833) read the in-tree oracle.

5. One release lane. objectui's changeset-release.yml is gone; root release.yml publishes both scopes in one pnpm -r publish, and the root scripts/release-github-releases.mjs cuts one GitHub Release per package tag across both scopes.

The four deleted Console checks, and what proves the same thing now

Deleted What it proved Now
assert-console-spec-injection.mjs the built Console bundles THIS tree's @objectstack/spec, not the copy objectui's lockfile installed Can no longer be false. Every @objectstack/* dependency under ui/ is workspace:^ (33 spec, 2 client, 2 lint, 2 formula rows measured), which pnpm links and never resolves from the registry; the merged lockfile has 0 registry entries for @objectstack/spec or @objectstack/client and 37 link: rows to packages/spec. The single-zod guard (Vite, ui/scripts/vite-single-zod.ts) and canary (build-dist.sh, on the shipped bytes) still run in every build.
check-console-injection.mjs a Console dist restored from the pin-keyed cache was built against the current spec Can no longer be false. The cache keyed on .objectui-sha is gone; turbo's hash for @object-ui/console#build includes @objectstack/spec#build, @objectstack/client#build and @objectstack/lint#build (measured with turbo run build:dist --filter=@objectstack/console --dry=json), so a spec change misses the cache.
check-console-sha.mjs the local packages/console/dist was built from the pinned objectui commit The pin it compared against is gone, so that drift cannot occur. A local dist can still be older than ui/ after a pull; pnpm console:build rebuilds it (a turbo cache hit when nothing changed). Nothing checks this on pnpm dev any more: reported to the dispatcher.
console-spec-probes.mjs the shared probe derivation for the two injection checks above Left with them; nothing else imported it.

Verification (merged tree at objectui@cd70b7818; the 17b/17c items re-measured on verify head 9e37acd126)

  • pnpm changeset version on the cutover head 1c0d02eda4 (objectstack#25825, objectui frozen at 9e1fe03286) + this PR + the ui patch: exit 0, and all 112 members move 18.1.0 → 18.2.0 together (111 public: 73 @objectstack/* and 38 @object-ui/*, plus object-ui). The private, ignored @object-ui/runner stays at 18.1.0. On that tree root and objectui check-changeset-fixed and check:lockstep-package-count exit 0.
  • Earlier, on verify head 9e37acd126 (when @object-ui/runner was still public): all 113 members move 18.1.0 → 18.2.0 in one bump: 112 public (73 @objectstack/*, 39 @object-ui/*) and the private extension object-ui. The other private @objectstack/* packages move as they do on main. pnpm -r publish and release-verify-npm skip object-ui (private), so nothing it owes the registry changes.
  • pnpm -r publish --dry-run after the version (at 9e37acd126): 112 packages, 39 @object-ui/* + 72 @objectstack/* + create-objectstack, all 18.2.0. pnpm pack of @object-ui/core: @objectstack/spec workspace:^ → ^18.2.0, @object-ui/types workspace:* → 18.2.0.
  • pnpm console:build (CI=true): exit 0, single-zod canary green. The packed @objectstack/console has the same top-level dist/ entries as the published 18.1.0 tarball, minus dist/.objectstack-injection.json and dist/.objectui-sha; assets 2,268 → 2,381 (newer objectui), tarball 9,260K → 9,140K.
  • Console eager-closure budget (ui/scripts/check-eager-closure-budget.mjs, ceiling 3,496.0 KB): this build 3,054.2 KB gzipped, vendor-objectstack 1,605.2 KB; the published 18.1.0 dist measured by the same ceilings: 3,522.3 KB, vendor-objectstack 1,851.5 KB. The membership half is red identically on both (packages/core: 1 of 89 modules in vendor-objectstack), so it predates this PR.
  • The ui-side patch on verify head 9e37acd126: git apply --check passes after README steps 1–2 and reproduces the edited ui/ tree byte for byte (60 files). With this PR's root half, install and pnpm run build: type-check:scripts, type-check:vitest-config, lint:root exit 0; root and objectui check-changeset-fixed pass; vitest run scripts/__tests__ 17 failed / 5,573 passed, where 2 are 15 s load timeouts that pass alone, 2 fail the same way without the patch (check-lockfile-integrity; quick-reference-commands-4149 on the root scripts the adaptation drops, cutover bill), and 14 read objectui's nested ui/.github/, which 4b PR 2 deletes.
  • actionlint 1.7.7 over release.yml, cut-rc.yml, lint.yml, showcase-smoke.yml: exit 0. No step reads a pin file.

Gates (this branch, no ui/)

dispatch-gates --commands derives 166 families for this diff; all 166 ran, and dispatch-gates --ran reconciles: 164 run, 2 NOT-MEASURED. All were run on head 4ac569dc00 (after merging main at f0cf338330, which had moved .objectui-sha and the root build script), after a full pnpm run build. 156 exit 0, including check:required-contexts, check:workflow-status-functions, check:workflow-step-name-quoting, check-changeset-no-major, check-empty-changeset, check-adr-0087-registration, check:lockstep-package-count (112) and check:nul-bytes. One is red on main itself and not this PR's: check:liveness (translation/flows.screens cites service-automation/src/engine.ts, which #25734 refactored; this PR touches neither). The other 9 are red or not measured because ui/, PR B or 4b has not landed yet, as designed:

Gate Exit Why red here Clears when
check-changeset-fixed 1 the 38 @object-ui/* names and object-ui in fixed have no package without ui/ (on cutover head 1c0d02eda4 + this PR + the ui patch: exit 0, 111 public + 1 declared private) sub-issue 5
check-prerelease-pin-watch --self-test, --verbose 1, 1 named only by prerelease-pin-watch.yml; this PR deletes the script PR B of #25697
check-self-test-wired --self-test 1 ci.yml console-pin and prerelease-pin-watch.yml still invoke deleted scripts PR B of #25697
check:pm-dispatch-gates 1 3 of 1,913 fast-tier cases, all on the same live invocations of deleted scripts PR B of #25697
check:console-sha, check:console-injection NOT-MEASURED (254) root scripts deleted here; only the console-pin job names them PR B of #25697
check-sdui-manifest, check:sdui-lockstep 1, 1 they read .objectui-sha 4b PR 2 (#25712)

Depends on, outside this PR

🤖 Generated with Claude Code

https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe

… objectui pin (objectstack#25711, WIP)

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
…the in-workspace Console build (objectstack#25711, WIP)

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
…ts as live specimens (objectstack#25711, WIP)

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
…ted pin pieces (objectstack#25711, WIP)

- check-pnpm-filter-targets: the foreign-scope live assertion is tree-aware;
  without ui/ no committed filter names @object-ui/ (build-console.sh left).
- pnpm-filter-targets: the @object-ui/ foreign entry states its new cause and
  when it retires (the PR that lands ui/).
- collect-release-notes: section 3 reads a pinless ref instead of failing on
  the missing .objectui-sha.
- bare-root-worklist: the two check-console-injection UNJUDGED rows are gone
  with the gate.
- check-type-check-coverage: the @objectstack/console EXEMPT note names
  build-dist.sh.
- dispatch-gates self-test: the prerelease-pin-watch literal specimen leaves.
- cut-rc builds the Console before the version commit; release.yml and
  cut-rc comments name console:build; packages/console README describes the
  in-workspace build.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
…window, and the changeset (objectstack#25711, WIP)

scripts/ui-import/4a-ui-side.patch removes objectui's pin on objectstack, the
dist-injection Vite probes, objectui's own release lane and its own Changesets
config inside ui/. ui/ does not exist on main until the subtree PR of sub-issue
5, so it ships as a patch with its apply and verify commands in the README.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
…list drops the deleted Console test (objectstack#25711, WIP)

check:lockstep-package-count derives the count from the fixed group, which now
holds both scopes (73 @objectstack + 39 @object-ui). vitest.repo-tests.json still
named build-console-objectstack-root.test.ts, deleted with build-console.sh.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
… relative link (objectstack#25711, WIP)

A relative href is a 404 on npm, and on GitHub until ui/ lands.

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

Copy link
Copy Markdown
Contributor Author

Dispatch seat note — HELD, do not merge before the cutover window. Content ACCEPTed on card #25711 (comment there carries the checks and rulings). check-governed-merges --pr objectstack-ai/objectstack#25745: GOVERNED, tier H(人合) — .github/workflows/** ×4, 12,835 changed lines > 3,000. By the order this PR is red on main by design until the ui/ subtree lands (child 5): check-changeset-fixed needs ui/; ci.yml's console-pin and pin-watch jobs still invoke scripts this PR deletes until PR B of #25697 lands beside it. So: stays draft, no review requested, not enqueued. In the cutover window the seat posts the final 维护者速读 and 席位核对 here, labels the PR, and requests review from GOVERNED_APPROVERS; it lands only after an authorized APPROVED, together with child 5, PR B and 4b PR 2. Before that, git apply --check scripts/ui-import/4a-ui-side.patch is re-run against the final objectui main.


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review October 25, 2026 05:06
@os-zhuang
os-zhuang enabled auto-merge October 25, 2026 05:06
@objectstack-fleet
objectstack-fleet Bot disabled auto-merge October 25, 2026 05:07
@objectstack-fleet
objectstack-fleet Bot marked this pull request as draft October 25, 2026 05:07
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Dispatch seat — HOLD reaffirmed. @os-zhuang please leave this PR in draft until the seat opens the cutover window.

At 05:06Z this PR was approved, marked ready and had auto-merge enabled. At 05:07Z the card thread put it back to draft and disabled auto-merge; the approval (review 5641652106) stands untouched. Nothing was lost, but had the queue taken it, main would have gone red: by the order this PR is red on main by design until the ui/ subtree lands — check-changeset-fixed needs ui/, and the console-pin / pin-watch jobs in ci.yml still invoke scripts this PR deletes until PR B of #25697 lands beside it (seat note above, 05:0x; card #25711 carries the ACCEPT and the rulings).

Landing order for the cutover window (epic #25677, child 5 procedure): subtree import + adaptation → this PR (4a) → PR B of #25697 → 4b PR 2 (#25712). In that window the seat posts the final 维护者速读 and ## 席位核对 here, flips ready, and requests review from GOVERNED_APPROVERS; the PR lands only after an authorized APPROVED given at that point. Until then: draft, no review requested, not enqueued. A ready/auto-merge flip before that is reverted by the seat.

If the hold itself should be overruled, that is Tesla's call, in the epic's decision thread, not on this PR.


Generated by Claude Code

… and the QUICK_REFERENCE release sync retires (objectstack#25711, WIP)

Tesla's rulings of 2026-10-25: decision 17b, ruling B, keeps the private VS Code
extension `object-ui` in the fixed group. The root check-changeset-fixed now
accepts a declared private member (PRIVATE_FIXED_MEMBERS) while
privatePackages.version is true, and check:lockstep-package-count counts
published members only. The ui-side patch drops its private-arm change to
objectui's check-changeset-fixed and keeps the extension rows of
check-unused-dependencies. Decision 17c, ruling B, is carried in the same patch:
QUICK_REFERENCE.md's synced "Current Release" rows, the sync script and its two
tests retire. The patch is regenerated against verify head 9e37acd.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
…1, WIP)

main moved .objectui-sha (#25735) and the root build script (#25738); the pin stays
deleted and the build keeps main's site exclusion.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
This was referenced Oct 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

3 participants