Repository navigation
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
Conversation
… 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
…1, WIP) Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
|
Dispatch seat note — HELD, do not merge before the cutover window. Content ACCEPTed on card #25711 (comment there carries the checks and rulings). Generated by Claude Code |
|
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, 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 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
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 extensionobject-uistays in the one fixed group. 17c, ruling B — the QUICK_REFERENCE release-sync rows retire; decision B (17c) carried here.What changes
1. One fixed group (
.changeset/config.json). The 38 public@object-ui/*packages and the private VS Code extensionobject-ui(17b) join the@objectstack/*fixed group;@object-ui/example-*,@object-ui/site,@object-ui/runnerand@object-ui/test-supportare ignored, as in objectui. (objectui#13506 made@object-ui/runnerprivate before the freeze at9e1fe03286.)ui/.changeset/config.jsonis deleted by the ui-side patch (changesets reads one config per repository), and objectui's 65 pendingui/.changeset/*.mdstay underui/for aftercare #25831. Measured on cutover headc04b36dcb9, moving them as they stand redscheck-empty-changeset(3 empty frontmatters) andcheck-adr-0087-registration(41 breaking changesets with no disposition). Rootcheck-changeset-fixedaccepts a private name in the group only whenPRIVATE_FIXED_MEMBERSdeclares it (object-uialone, with its reason), the package is private, andprivatePackages.versionis true; it reds if that member leaves the group.check:lockstep-package-countsubtracts the declared private members, so the published count is 111.check-changeset-no-majornow readspackages/console/build-dist.shas the Console's packed-copy build script, andcheck-empty-changeset's frontmatter-parser family loses the deleted objectui digest.2.
@objectstack/consolebuilds in this workspace.packages/console/build-dist.shcopiesui/apps/console/dist(built by turbo through@object-ui/console#build) intopackages/console/dist, ships the trackedsdui.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:buildruns it, andpnpm release/cut-rc.ymlrun it afterpnpm run build.filesandprepublishOnlyare unchanged.scripts/build-console.shis deleted. The CLI's remedy for a missing Console dist namespnpm 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 incut-rc.yml("THE objectui PIN IS AN INPUT HERE" andRead the committed objectui pin),release.yml,lint.yml,showcase-smoke.ymland the rootpackage.jsonscripts (objectui:*,check:console-sha,check:console-injection,check:objectui-*,check:prerelease-pins;pnpm dev*no longer runscheck:console-sha).scripts/check-console-intercept-disarm.mjsstays. 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 withoutui/, >0 with it),bare-root-worklist,check-type-check-coverage). The lockstep count incontent/docs/protocol/backward-compatibility.mdxandscripts/publish-smoke-pack.mjsreads 112, both scopes (check:lockstep-package-count --fix), andpackages/spec/vitest.repo-tests.jsondrops the deleted test.4. The objectui-side pin is deleted, in
ui/. Untilui/was onmain, this half was carried asscripts/ui-import/4a-ui-side.patch. After the cutover landed,fb110c2323applied it underui/with README step 2's deletions, then deleted the patch file.scripts/ui-import/README.mdnow 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 probesvite-objectstack-spec-dist.ts/vite-objectstack-client-dist.ts,changeset-release.yml,spec-range-floors.yml,release-github-releases.mjsand their tests, plus (17c)sync-quick-reference-release.mjs, its test and thequick-reference-current-release-4143pin, withQUICK_REFERENCE.md's version rows. The single-zod guard moves toui/scripts/vite-single-zod.ts(it runs in every console build);apps/console/vite.config.tsdrops both injections. Every reader of the Changesets config goes through a newchangesetConfigPath()(own root standalone, monorepo root when nested); objectui'scheck-changeset-fixedandcheck-unused-dependenciesotherwise keep their extension rules (17b). The patch was written against verify head9e37acd126and checked withgit apply --checkon cutover heads1c0d02eda4andc04b36dcb9and onmainatfd40831416. It also deletes the nestedui/.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.jsonandscripts/sdui-manifest.record.json, regenerated fromui/now that.objectui-shais gone and the dual-mode gates (#25833) read the in-tree oracle.5. One release lane. objectui's
changeset-release.ymlis gone; rootrelease.ymlpublishes both scopes in onepnpm -r publish, and the rootscripts/release-github-releases.mjscuts one GitHub Release per package tag across both scopes.The four deleted Console checks, and what proves the same thing now
assert-console-spec-injection.mjs@objectstack/spec, not the copy objectui's lockfile installed@objectstack/*dependency underui/isworkspace:^(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/specor@objectstack/clientand 37link:rows topackages/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.objectui-shais gone; turbo's hash for@object-ui/console#buildincludes@objectstack/spec#build,@objectstack/client#buildand@objectstack/lint#build(measured withturbo run build:dist --filter=@objectstack/console --dry=json), so a spec change misses the cache.check-console-sha.mjspackages/console/distwas built from the pinned objectui commitui/after a pull;pnpm console:buildrebuilds it (a turbo cache hit when nothing changed). Nothing checks this onpnpm devany more: reported to the dispatcher.console-spec-probes.mjsVerification (merged tree at objectui@cd70b7818; the 17b/17c items re-measured on verify head
9e37acd126)pnpm changeset versionon the cutover head1c0d02eda4(objectstack#25825, objectui frozen at9e1fe03286) + 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/*, plusobject-ui). The private, ignored@object-ui/runnerstays at 18.1.0. On that tree root and objectuicheck-changeset-fixedandcheck:lockstep-package-countexit 0.9e37acd126(when@object-ui/runnerwas 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 extensionobject-ui. The other private@objectstack/*packages move as they do onmain.pnpm -r publishandrelease-verify-npmskipobject-ui(private), so nothing it owes the registry changes.pnpm -r publish --dry-runafter the version (at9e37acd126): 112 packages, 39@object-ui/*+ 72@objectstack/*+create-objectstack, all 18.2.0.pnpm packof@object-ui/core:@objectstack/specworkspace:^→^18.2.0,@object-ui/typesworkspace:*→18.2.0.pnpm console:build(CI=true): exit 0, single-zod canary green. The packed@objectstack/consolehas the same top-leveldist/entries as the published 18.1.0 tarball, minusdist/.objectstack-injection.jsonanddist/.objectui-sha; assets 2,268 → 2,381 (newer objectui), tarball 9,260K → 9,140K.ui/scripts/check-eager-closure-budget.mjs, ceiling 3,496.0 KB): this build 3,054.2 KB gzipped,vendor-objectstack1,605.2 KB; the published 18.1.0 dist measured by the same ceilings: 3,522.3 KB,vendor-objectstack1,851.5 KB. The membership half is red identically on both (packages/core: 1 of 89 modules invendor-objectstack), so it predates this PR.9e37acd126:git apply --checkpasses after README steps 1–2 and reproduces the editedui/tree byte for byte (60 files). With this PR's root half, install andpnpm run build:type-check:scripts,type-check:vitest-config,lint:rootexit 0; root and objectuicheck-changeset-fixedpass;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-4149on the root scripts the adaptation drops, cutover bill), and 14 read objectui's nestedui/.github/, which 4b PR 2 deletes.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 --commandsderives 166 families for this diff; all 166 ran, anddispatch-gates --ranreconciles: 164 run, 2 NOT-MEASURED. All were run on head4ac569dc00(after mergingmainatf0cf338330, which had moved.objectui-shaand the rootbuildscript), after a fullpnpm run build. 156 exit 0, includingcheck: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) andcheck:nul-bytes. One is red onmainitself and not this PR's:check:liveness(translation/flows.screenscitesservice-automation/src/engine.ts, which #25734 refactored; this PR touches neither). The other 9 are red or not measured becauseui/, PR B or 4b has not landed yet, as designed:check-changeset-fixed@object-ui/*names andobject-uiinfixedhave no package withoutui/(on cutover head1c0d02eda4+ this PR + the ui patch: exit 0, 111 public + 1 declared private)check-prerelease-pin-watch --self-test,--verboseprerelease-pin-watch.yml; this PR deletes the scriptcheck-self-test-wired --self-testci.ymlconsole-pinandprerelease-pin-watch.ymlstill invoke deleted scriptscheck:pm-dispatch-gatescheck:console-sha,check:console-injectionconsole-pinjob names themcheck-sdui-manifest,check:sdui-lockstep.objectui-shaDepends on, outside this PR
ui/; this PR merges right after it.ui/workspace — workspace globs, root turbo tasks, path-filtered ui test/typecheck/lint/E2E jobs, spec change compiles the Console; pin gates retire at cutover (parent #25677, 3/6) #25697 (retire the pin gates in the cutover window): removes theconsole-pinjob andconsolefilter inci.yml,prerelease-pin-watch.yml, and the live specimens in thedispatch-gatesself-test that still namecheck-prerelease-pin-watch.mjs. Until it lands,prerelease-pin-watch.ymlruns a script this PR deletes.objectui#,ui/AGENTS.mdnests, 18 governance workflows merged or retired (parent #25677, 4b/6) #25712):check-sdui-lockstep,check-sdui-manifestandgen-sdui-manifest-noderead.objectui-shaand go red without it; regeneratingsdui.manifest.jsonfromui/is theirs (the root copy lags the old pin, andbuild-dist.shships the tracked one). Also the nestedui/.github/and the tests that read it, and both AGENTS.md files.@object-uipublish rights (card risk 1) — confirmed by Tesla, ruling 17a.🤖 Generated with Claude Code
https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe