Repository navigation
Commit 2a61f08
<!-- claude-projects-attribution: {"github_login":"os-tesla"} -->
_Requested by **Tesla** · [project
thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6JaoKAHLK79xmvJyPStopRpPQ2)_
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
- **Sub-issue 5** (subtree PR): adds `ui/`; this PR merges right after
it.
- **PR B of #25697** (retire the pin gates in the cutover window):
removes the `console-pin` job and `console` filter in `ci.yml`,
`prerelease-pin-watch.yml`, and the live specimens in the
`dispatch-gates` self-test that still name
`check-prerelease-pin-watch.mjs`. Until it lands,
`prerelease-pin-watch.yml` runs a script this PR deletes.
- **4b PR 2 (#25712)**: `check-sdui-lockstep`, `check-sdui-manifest` and
`gen-sdui-manifest-node` read `.objectui-sha` and go red without it;
regenerating `sdui.manifest.json` from `ui/` is theirs (the root copy
lags the old pin, and `build-dist.sh` ships the tracked one). Also the
nested `ui/.github/` and the tests that read it, and both AGENTS.md
files.
- **Maintainer**: the npm token's `@object-ui` publish rights (card risk
1) — confirmed by Tesla, ruling 17a.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_0149BHSXfCdQywGaLdpRAtWe
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent fd40831 commit 2a61f08
93 files changed
Lines changed: 1424 additions & 25864 deletions
File tree
- .changeset
- .github/workflows
- packages
- cli
- src/utils
- test
- console
- spec
- scripts
- scripts
- pm
- ui-import
- ui
- .changeset
- .github
- workflows
- apps/console
- scripts
- __tests__
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
118 | 118 | | |
119 | 119 | | |
120 | 120 | | |
121 | | - | |
| 121 | + | |
| 122 | + | |
122 | 123 | | |
123 | 124 | | |
124 | 125 | | |
| |||
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3064 | 3064 | | |
3065 | 3065 | | |
3066 | 3066 | | |
3067 | | - | |
3068 | | - | |
3069 | | - | |
3070 | | - | |
3071 | | - | |
3072 | | - | |
3073 | | - | |
3074 | | - | |
3075 | | - | |
3076 | | - | |
3077 | | - | |
3078 | | - | |
3079 | | - | |
3080 | | - | |
3081 | | - | |
3082 | | - | |
3083 | | - | |
3084 | | - | |
3085 | | - | |
3086 | | - | |
3087 | | - | |
3088 | | - | |
3089 | | - | |
3090 | | - | |
3091 | | - | |
3092 | 3067 | | |
3093 | 3068 | | |
3094 | 3069 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1835 | 1835 | | |
1836 | 1836 | | |
1837 | 1837 | | |
1838 | | - | |
1839 | | - | |
| 1838 | + | |
| 1839 | + | |
1840 | 1840 | | |
1841 | | - | |
1842 | | - | |
1843 | | - | |
1844 | | - | |
1845 | | - | |
1846 | | - | |
1847 | | - | |
1848 | | - | |
1849 | | - | |
1850 | | - | |
1851 | | - | |
1852 | | - | |
1853 | | - | |
| 1841 | + | |
| 1842 | + | |
| 1843 | + | |
| 1844 | + | |
| 1845 | + | |
| 1846 | + | |
| 1847 | + | |
| 1848 | + | |
| 1849 | + | |
| 1850 | + | |
| 1851 | + | |
| 1852 | + | |
1854 | 1853 | | |
1855 | 1854 | | |
1856 | 1855 | | |
1857 | 1856 | | |
1858 | 1857 | | |
1859 | | - | |
1860 | | - | |
1861 | | - | |
1862 | | - | |
1863 | | - | |
1864 | | - | |
1865 | | - | |
1866 | | - | |
1867 | | - | |
1868 | | - | |
1869 | | - | |
1870 | | - | |
1871 | | - | |
1872 | | - | |
1873 | | - | |
1874 | | - | |
1875 | | - | |
1876 | | - | |
1877 | | - | |
1878 | | - | |
1879 | | - | |
1880 | | - | |
1881 | | - | |
1882 | | - | |
1883 | | - | |
1884 | | - | |
1885 | | - | |
1886 | | - | |
1887 | | - | |
1888 | | - | |
1889 | | - | |
1890 | | - | |
1891 | | - | |
1892 | | - | |
1893 | | - | |
1894 | | - | |
1895 | | - | |
1896 | | - | |
1897 | | - | |
1898 | | - | |
1899 | | - | |
1900 | | - | |
1901 | | - | |
1902 | | - | |
1903 | | - | |
1904 | | - | |
1905 | | - | |
1906 | | - | |
1907 | | - | |
1908 | | - | |
1909 | | - | |
1910 | | - | |
1911 | | - | |
1912 | | - | |
1913 | | - | |
1914 | | - | |
1915 | | - | |
1916 | | - | |
1917 | | - | |
1918 | | - | |
1919 | | - | |
1920 | | - | |
1921 | | - | |
1922 | | - | |
1923 | | - | |
1924 | | - | |
1925 | | - | |
1926 | | - | |
1927 | | - | |
1928 | | - | |
1929 | | - | |
1930 | | - | |
1931 | | - | |
1932 | | - | |
1933 | | - | |
1934 | | - | |
1935 | | - | |
1936 | | - | |
1937 | | - | |
1938 | | - | |
1939 | | - | |
1940 | | - | |
1941 | 1858 | | |
1942 | 1859 | | |
1943 | 1860 | | |
| |||
2031 | 1948 | | |
2032 | 1949 | | |
2033 | 1950 | | |
2034 | | - | |
2035 | | - | |
2036 | | - | |
| 1951 | + | |
| 1952 | + | |
| 1953 | + | |
| 1954 | + | |
2037 | 1955 | | |
2038 | 1956 | | |
2039 | 1957 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
55 | 55 | | |
56 | 56 | | |
57 | 57 | | |
58 | | - | |
59 | | - | |
60 | | - | |
61 | | - | |
62 | | - | |
63 | | - | |
64 | | - | |
65 | | - | |
66 | | - | |
67 | | - | |
68 | | - | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
69 | 65 | | |
70 | 66 | | |
71 | 67 | | |
| |||
This file was deleted.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
9 | | - | |
10 | | - | |
11 | | - | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
| 21 | + | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
26 | | - | |
| 26 | + | |
27 | 27 | | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | 28 | | |
32 | 29 | | |
33 | 30 | | |
| |||
147 | 144 | | |
148 | 145 | | |
149 | 146 | | |
150 | | - | |
151 | | - | |
152 | 147 | | |
153 | | - | |
154 | | - | |
155 | | - | |
156 | 148 | | |
157 | 149 | | |
158 | 150 | | |
| |||
0 commit comments