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
…ts fixed group until 4a lands (bill item 39, objectstack#25803) On the merged tree main's check-changeset-fixed counts public packages only, and the ui root manifest `object-ui` (ui/packages/vscode-extension is the other private member) is private, so 4a's text with `"object-ui"` in fixed[0] exits 1 here and the lockstep count reads 112 against the 111 the docs state. 4a (#25745) adds `object-ui` back together with the PRIVATE_FIXED_MEMBERS edits to both scripts when it re-merges main after this import; this commit keeps the cutover tree at 111/111 so both gates exit 0 on their own. Measured by the J thread (probe, 17:15Z). Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU
…objectstack#25711, WIP) Measured on cutover head c04b36d: one objectui changeset name collides with a root one (react-pages-default-off.md), so a colliding name moves under a `ui-` prefix; ui/.objectstack-pin is already gone, so the deletions take --ignore-unmatch. Removing the claims test's markdown-test-inputs row leaves ui/.github/pull_request_template.md with no reader and reds the totality test; the nested template never renders (GitHub reads the root one), so step 2 deletes it. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
…tstack#25711, WIP) Measured on cutover head c04b36d, moving the 65 ui/.changeset/*.md to the root as they stand reds check-empty-changeset (3 empty frontmatters) and check-adr-0087-registration (41 breaking changesets with no adr-0087 disposition). Per the epic PM's ruling, the move stays with the aftercare card objectstack#25831; step 1 is dropped and step 2 still deletes ui/.changeset/config.json, since changesets reads the root config only. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
…btree import at the frozen tip 9e1fe03 plus the adaptation series (objectstack#25752) (#25825) <!-- claude-projects-attribution: {"github_login":"os-tesla"} --> _Requested by **Tesla** · [project thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6Jao?thread=cmsg_01AXsQkLFKRdQCqQ3RTr6JaoYYsrey6RNUKhoT2wtFatch)_ Part of objectstack#25752 (child 5, the cutover procedure; steps 3–4). Part of objectstack#25677. Clause-②: no Metadata-protocol: none ## ⛔ Merged by the maintainer at the Tier H sitting, 2026-10-26 09:00Z (北京 17:00) — not before This PR is **Tier H by size** (the whole objectui tree, ~2.6 M lines) and is the first of four merged in order at the sitting: this PR → 4a #25745 → PR B (objectstack#25697 item 6) → 4b PR 2 #25712, then the required-checks change (step 6). It stays draft until the seat says it is green; the seat never enqueues it. Reviewers: the GOVERNED_APPROVERS, requested when it leaves draft. ## What this PR is objectui (objectstack-ai/objectui) becomes the `ui/` workspace of this repository, per the maintainer's D1 ruling (objectstack#25677: one repository, one fixed version group, the objectui repository archived as a migration notice). 1. **`git subtree add --prefix=ui`** of objectui `main` at its **frozen tip `9e1fe032866965c7cb0460cff2b6af09350236b7`** (objectui#13545, the final `.objectstack-sha` pin, pointing at objectstack `5e7cf63e71`). objectui `main` is frozen since 2026-10-25 15:40Z (freeze notice: objectstack#25752); nothing lands there after that commit. History is kept (no squash). 2. **Root workspace file.** pnpm v10 reads `overrides` and `patchedDependencies` from `pnpm-workspace.yaml` only, so objectui's `pnpm` field moves there: the qs / shell-quote / tmp / uuid floors, the single react line (19.3.0), the `@radix-ui/react-focus-scope@1.1.16` patch; the react-router override narrows to the 8.x line it fixes (objectui's react-router-dom 7.18 pins a 7.x react-router with no fixed version to force). 3. **Adaptation series (objectstack#25803, card J)** — one commit per gate or concern, each named in its message. Drop 1: every `@objectstack/*` range in the 32 ui manifests becomes `workspace:^`; `ui/` stops being a workspace root of its own (nested `pnpm-workspace.yaml` deleted, `pnpm` field and `preinstall` pin check removed, `turbo.json` parked as `turbo.objectui.json`); the ui root manifest drops its turbo-recursive scripts; `scripts/ui-import/splice-lockfile.mjs` carries objectui's lockfile resolutions into the merged lock. Drop 2 (root gates, ledgers, eslint ignore, skills move, the K1 scoping of `check:published-files`) follows in this PR before it leaves draft; the list is in `/mnt/project-files/d1-merge/out/cutover-adaptation/SERIES.md` and will be mirrored here. 4. **One lockfile.** `ui/pnpm-lock.yaml` is removed; the root lock is objectui's resolutions spliced in (`moved 0` against objectui's own lock at the splice), reconciled twice with `pnpm install --lockfile-only`, then `pnpm dedupe`; `pnpm install --frozen-lockfile` and `pnpm dedupe --check` exit 0. `ai` 7.0.118 and `@ai-sdk/react` 4.0.121 hold one copy each. ## What this PR does not do - It does not touch `.github/workflows/**`, `AGENTS.md`, `docs/adr/**` or CODEOWNERS: the pin-gate retirement is PR B, the release lane is 4a #25745, the workflow port is 4b PR 2 #25712, the governance for `ui/` landed in #25732. - It does not remove the `packages/console` pin field or its build switch (sub-issue 4). - It does not conform the 39 `@object-ui` manifests to `check:published-files` (maintainer ruling K1: the gate is scoped off `ui/` here; aftercare objectstack#25753). ## Accepted red classes (procedure #25752, "Accepted red classes") and the bill Anything red on this PR is read against `/mnt/project-files/d1-merge/out/5-cutover-bill-notes.md` (items 1–36). A red that is not on the bill stops the sitting until it is ruled. ## Verification _(filled by the seat before the PR leaves draft: the CI run, the local gate sweep, the lock verdicts and sha, the `git am` acceptance of the series.)_ 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01RSDL3SFtJaKzcymvCD8RsU --------- Co-authored-by: objectstack-fleet[bot] <332303061+objectstack-fleet[bot]@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: os-zhuang <jack@objectstack.ai> Co-authored-by: 包周涛 <baozhoutao@hotoa.com> Co-authored-by: marchtian <tianqi@hotoa.com>
main now carries ui/ (cutover #25825) and the dual-mode sdui gates (#25833). .changeset/config.json keeps this branch's side ("object-ui" in the fixed group, which the root PRIVATE_FIXED_MEMBERS rule accepts); scripts/ui-import/README.md (added on both sides) keeps the cutover's splice procedure first and 4a's record after it. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
…711) With ui/ on main (#25825), the objectui side of the release lane lands as tree edits instead of a patch file: - README step 2: the pin, the dist-injection probes, objectui's release lane, its Changesets config, the QUICK_REFERENCE release sync (17c) and the nested pull_request_template.md are deleted; objectui's 65 pending changesets stay under ui/ for #25831; - 4a-ui-side.patch applied under ui/ (git apply --check exit 0 on this tree), then deleted; scripts/ui-import/README.md now records what was applied; - the SDUI manifest is regenerated from ui/ for the merged tree (107 -> 106 components; objectui#13449 retired html), from the patch the 4b PR 2a thread measured. check-changeset-fixed, check:lockstep-package-count, check:sdui-lockstep and check-sdui-manifest (--self-test and the run) exit 0. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
|
Card thread — sitting run on head The head is
There were no other conflicts.
Known reds after this PR, all owned elsewhere:
Generated by Claude Code |
|
Card thread — 2026-10-25T23:01Z: Lint & Repo Gates red on
All of these clear with PR B #25827, which removes the invocations. Generated by Claude Code |
|
Card thread — 2026-10-25T23:15Z: Test UI 3/16 red on
Under ruling 30 = B, the fix is a follow-up PR on Generated by Claude Code |
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
…e Pin Gate, prerelease-pin-watch (#25827) Part of #25697 (item 6, PR B). PR A (#25710) carried items 1 to 5 and is merged; the card stays open for the epic PM, who hands this PR to the cutover. Blocked-by: #25752 (cutover PR first) Part of objectstack#25677 Clause-②: no Metadata-protocol: none ## What this retires Once `ui/` lives in this repository, the gates that proved the objectui pin from the outside have nothing left to prove. This PR deletes them: - `.github/workflows/spec-shape-gate.yml` (**Spec Shape Gate**), with `scripts/ci/spec-shape-gate.mjs` and `scripts/ci/spec-shape-retirements.json`. - The `console-pin` job (**Console Pin Gate**) in `ci.yml`, and the `console` list and output of its `filter` job. - `.github/workflows/prerelease-pin-watch.yml` (**Stable release watch**). - The `Spec Shape Gate` row of `RELEASE_GATE_WORKFLOWS` in `scripts/ci/scheduled-full-run.mjs`. The release gate now reads `CI` and `Lint & Type Check`. `release.yml` and `cut-rc.yml` have no read of their own (measured); both reach the roster only through `scheduled-full-run.mjs --release-gate`. What replaces them is already on `main` from PR A: `Type Check UI` and `Build & E2E UI` compile and build the Console from `ui/` in the PR that changes one of the seven packages objectui installs (`ui_consumers` filter). The console scripts (`build-console.sh`, `check-console-sha.mjs`, `check-console-injection.mjs`, `console-spec-probes.mjs`, `assert-console-spec-injection.mjs`) stay, as the order says. 4a #25745 deletes them with the pin. ## Hit-class table Census: `git grep -n -E 'spec-shape-gate|Spec Shape Gate|spec-shape-retirements|prerelease-pin-watch|Console Pin Gate|console-pin'` at the base `52f3f518e1` gives 169 hits in 33 files. Also posted on the card: #25697 (comment) | Class | Files (hits) | Treatment | |---|---|---| | The retired gates themselves | `spec-shape-gate.yml` (15), `scripts/ci/spec-shape-gate.mjs` (21), `scripts/ci/spec-shape-retirements.json` (1), `prerelease-pin-watch.yml` (6) | deleted | | `ci.yml` job and filter | `ci.yml` (7) | `console-pin` job, `console` filter list and output deleted; the comments that pointed at them re-worded | | Release-gate roster | `scripts/ci/scheduled-full-run.mjs` (19) | roster row dropped; the self-tests that encoded a three-row roster are rewritten to the two-row roster with the same assertion shape (none deleted or skipped); two dated diagnosis fixtures kept verbatim | | Gates that encode the deleted job or script | `check-ci-filter-parity.mjs` (5), `check-expected-skips.mjs` (5), `dispatch-gates.self-test.mjs` (20), `dispatch-gates.mjs` (7) | filter-parity `console` subject retired with its battery (floor 10 to 9); the `Console Pin Gate` expected-skip row removed and its recorded runs re-spelled to the live roster; the live-tree job-filter cases re-pointed at `Build Core`; synthetic specimens kept; tense fixes | | Orphan the deletion forces | `scripts/check-prerelease-pin-watch.mjs` (15), `package.json` (2) | deleted, with the `check:spec-shape-gate` and `check:prerelease-pins` aliases (deviation 1) | | Instruction prose naming a deleted gate as live | `AGENTS.md` (2), `docs/releases-maintenance.md` (2) | prose fixes, listed below | | Comments naming a retired gate as live | `cut-rc.yml:358`, `docs-deploy.yml`, `lint.yml` (2), `release-coverage-patrol.yml`, `release.yml:1510`, `check-release-section-coverage.mjs` (2), `check-self-test-workflow-commands.mjs`, `check-vendor-version-stamps.mjs` (2), `check-required-contexts.mjs` | past tense, or a one-paragraph addendum to the existing tombstone | | Left for 4a #25745, which deletes or rewrites them | `release.yml:1874` and `:1917`, `cut-rc.yml:383`, `packages/console/README.md:54`, `check-console-injection.mjs` (6) | untouched here, so the two PRs do not conflict on them | | Dated history and fixtures | `docs/audits/*` (5), `scripts/docs-audit/README.md`, `scripts/fixtures/merge-queue-triage/*.json` (2), the `fleet-write/validate.mjs` fixture, `packages/spec/liveness/dashboard.json:146`, `pnpm-workspace.yaml:184`, the #9533 tombstone in `check-required-contexts.mjs` | kept as written | ## Tier H prose touched - `AGENTS.md` line 533: drops `Console Pin Gate` from the list of full-battery jobs. - `AGENTS.md` lines 1103 to 1104: the sibling-removal rule named the full battery's `Console Pin Gate` as what reds a breaking removal on `main`. It now names `Type Check UI`, which compiles the Console under `ui/` in the PR that makes the removal. Line count unchanged (1117, the ratchet ceiling). - `docs/releases-maintenance.md`: the "What still checks the pin" paragraph is now "What used to check the pin", and the release-gate roster reads `CI`, `Lint & Type Check`. No ADR is touched. ## Required contexts that vanish **None.** Read at the time of this PR: the `main` ruleset requires `TypeScript Type Check`, `Test Core`, `Build Core`, `Lint & Repo Gates`, `Governed Surface Queue Guard`, and classic branch protection requires `TypeScript Type Check`, `Build Core`, `Test Core`, `Dogfood Regression Gate`. Neither `Spec Shape Gate` nor `Console Pin Gate` is in either list, so the sitting needs no ruleset change for this PR. `node scripts/check-required-contexts.mjs --verify-required-set` exits 0: the registry and the live set agree in both directions. ## Landing with 4a #25745 This PR and 4a are two halves of one change and land as a batch, 4a first: - **On `main` alone this PR is red in one place.** The order keeps `check-console-injection.mjs` and `console-spec-probes.mjs` until 4a and deletes `Console Pin Gate`, their only PR-time runner. Two live-tree cases of the dispatch-gates fast tier then red: the silent load-break pair `check:console-injection` from `console-spec-probes.mjs`, and the `pull_request`-only narrowing of the scheduled-only zero. That step belongs to `Lint & Repo Gates`. With 4a merged first, the same tier passes 1917 of 1917 (verification record below). Neither case was weakened. - **Two files overlap.** `package.json` (both PRs delete the `check:prerelease-pins` alias) and one comment in `scripts/pm/dispatch-gates.self-test.mjs` near line 1006. Take the `main` side (4a) in both; checked on the local merge below. ## Deviations from the order 1. `scripts/check-prerelease-pin-watch.mjs` and its `check:prerelease-pins` alias are deleted here as well. Once the workflow is gone the script has no CI caller and `check-self-test-wired` reds the orphan. 4a deletes the same file, so the two deletions agree. 2. `prerelease-pin-watch.yml` does not watch the objectui pin. It watched better-auth prerelease overrides in `pnpm-workspace.yaml`, and its watch list was already empty. It is deleted as ordered. 3. Beyond the order's file list, these gates had to follow the deletion so they stay true: `check-ci-filter-parity.mjs`, `check-expected-skips.mjs`, `dispatch-gates.self-test.mjs`. Each keeps its assertion shape; nothing is skipped or loosened. ## Verification record Head `1776dbd798a4ebde5abc974e5b8d01c6db3fd3ef`, base `52f3f518e1`. - **Derived gate sweep** (`node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`): 86 derived, 82 run. 81 exit 0. `pnpm check:pm-dispatch-gates` exits 1 (the two cases above, 2 of 1917). 4 exit 3, prerequisite not met, because they need every workspace dist built: `check:dts-closure`, `check:dual-build-cjs-loads`, `check:lean-entry-closure`, `check:sourcemap-no-sources-content`. `Build Core` runs them on this PR. `dispatch-gates.mjs --ran`: 86 accounted, 0 unrun. - **Named by the order:** `node scripts/ci/scheduled-full-run.mjs --self-test` 0, `pnpm check:shard-attestation` 0, `pnpm --filter @objectstack/spec check:liveness` 0, `check-required-contexts.mjs --verify-required-set` 0. - **Merged tree** (`main` `abebc4e14d` + 4a `4ac569dc00` + this PR, local, conflicts resolved to the `main` side): `pnpm check:pm-dispatch-gates` exit 0 (fast tier 1917 of 1917). The same 86-command sweep on the merged tree: 80 exit 0, 6 exit 3 (prerequisite not met: the throwaway worktree has no package dists or package-level installs, so `check:doc-formula-expressions` and `check:type-check-debt` join the four above; both exit 0 on this branch), no finding. ```text exit command (this branch, head 1776dbd) 0 node scripts/check-aggregator-roster.mjs 0 node scripts/check-aggregator-roster.mjs --self-test 0 node scripts/check-ci-filter-parity.mjs 0 node scripts/check-ci-filter-parity.mjs --self-test 0 node scripts/check-closing-keyword-parity.mjs 0 node scripts/check-closing-keyword-parity.mjs --self-test 0 node scripts/check-comment-mask-corpus.mjs 0 node scripts/check-declaration-mirrors.mjs 0 node scripts/check-declaration-mirrors.mjs --self-test 0 node scripts/check-dts-emitted.mjs --self-test 0 node scripts/check-merged-branch-reaper-outcome.mjs 0 node scripts/check-merged-branch-reaper-outcome.mjs --self-test 0 node scripts/check-position-name-fold-loaders.mjs 0 node scripts/check-position-name-fold-loaders.mjs --self-test 0 node scripts/check-release-section-coverage.mjs 0 node scripts/check-release-section-coverage.mjs --self-test 0 node scripts/check-release-section-coverage.mjs --strict 0 node scripts/check-scripts-symbol-anchors.mjs 0 node scripts/check-scripts-symbol-anchors.mjs --self-test 0 node scripts/check-self-test-wired.mjs 0 node scripts/check-self-test-wired.mjs --self-test 0 node scripts/check-self-test-workflow-commands.mjs 0 node scripts/check-self-test-workflow-commands.mjs --self-test 0 node scripts/check-step-collectors.mjs 0 node scripts/check-step-collectors.mjs --self-test 0 node scripts/check-whole-set-label-write.mjs 0 node scripts/check-whole-set-label-write.mjs --self-test 0 node scripts/ci/assert-turbo-remote-cache.mjs --self-test 0 node scripts/ci/prune-turbo-cache.mjs --self-test 0 node scripts/ci/scheduled-full-run.mjs --self-test 0 node scripts/docs-audit/check-drift-comment.mjs 0 node scripts/pm/bare-root-worklist.mjs --self-test 0 node scripts/pm/ci-failure.mjs --self-test 0 node scripts/release-dist-tags.mjs --self-test 0 node scripts/release-verify-npm.mjs --self-test 0 node scripts/render-release-coverage-anchor.mjs --self-test 0 pnpm --filter @objectstack/lint run check:doc-formula-expressions 0 pnpm check:agent-test-spelling 0 pnpm check:bash32-floor 0 pnpm check:cli-command-ids 0 pnpm check:cross-package-test-inputs 0 pnpm check:declared-population-live 0 pnpm check:doc-authoring 0 pnpm check:docs-audit-scope 0 pnpm check:driver-memory-census 0 pnpm check:entry-guard 0 pnpm check:gitlink-declared 0 pnpm check:manifest-repository-directory 0 pnpm check:merge-driver 0 pnpm check:node-version 0 pnpm check:nul-bytes 0 pnpm check:parse-guard 0 pnpm check:pm-close-cards 0 pnpm check:pm-expected-skips 0 pnpm check:pm-fleet-write-dispatch 0 pnpm check:pm-fleet-write-execute 0 pnpm check:pm-fleet-write-validate 0 pnpm check:pm-governed-merges 0 pnpm check:pm-governed-prose 0 pnpm check:pm-issue-transfer 0 pnpm check:pm-post-stamped 0 pnpm check:pm-record-recognisers 0 pnpm check:pm-skill-id-lint 0 pnpm check:pm-skill-ratchet 0 pnpm check:pnpm-acquisition 0 pnpm check:pnpm-filter-targets 0 pnpm check:pnpm-flag-spellings 0 pnpm check:ratchet-remedy-authority 0 pnpm check:refd-timer-probe 0 pnpm check:required-contexts 0 pnpm check:select-gate-families 0 pnpm check:shard-attestation 0 pnpm check:stall-guard-budget 0 pnpm check:stall-guard-headroom 0 pnpm check:turbo-task-graph 0 pnpm check:type-check-coverage 0 pnpm check:type-check-debt 0 pnpm check:vendor-version-stamps 0 pnpm check:watch-hint-literal 0 pnpm check:workflow-status-functions 0 pnpm check:workflow-step-name-quoting 1 pnpm check:pm-dispatch-gates 3 pnpm check:dts-closure 3 pnpm check:dual-build-cjs-loads 3 pnpm check:lean-entry-closure 3 pnpm check:sourcemap-no-sources-content ``` ## 维护者速读(草稿) **改了什么**:删掉三个只为「跨仓库钉版本」存在的门禁:Spec Shape Gate(每小时拉 objectui main 编译一遍)、Console Pin Gate(按 `.objectui-sha` 克隆 objectui 构建控制台)、prerelease-pin-watch(盯 better-auth 预发布版本,清单早已为空)。发布前的全量电池名单从三个工作流减为 `CI` 与 `Lint & Type Check`。AGENTS.md 两处、发布维护文档一处把它们改为过去时。 **为什么改**:objectui 合入 `ui/` 之后,控制台在同一个 PR 里由 `Type Check UI`、`Build & E2E UI` 编译构建,规格一改就当场验证,不再需要隔一小时去克隆另一个仓库。留着旧门禁只会对着已不存在的钉版本报错。 **风险与代价(含回滚)**:不影响必需检查(这三个都不在必需集合里)。必须在 4a #25745 之后合入:单独合入时 `Lint & Repo Gates` 会因控制台脚本失去 PR 期运行者而红两条,4a 删除这些脚本后即消失。回滚就是还原此 PR,三个工作流与脚本原样恢复。 **席位意见**: **你要做的**:切换当天在 4a 之后合入本 PR(Tier H,需你批准)。规则集无需改动。 --- _Generated by [Claude Code](https://claude.ai/code/session_01H835wAyqCCeF7jiYq7XSxi)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
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