@@ -1835,109 +1835,25 @@ jobs:
18351835 run : node scripts/check-changeset-fixed.mjs
18361836
18371837 # ──────────────────────────────────────────────────────────────────────
1838- # ⛔ TOMBSTONE — the #3340 pin-currency gate that used to sit here is gone
1839- # (2026-08-20 ruling, #10134). Do not re-add one .
1838+ # ⛔ TOMBSTONE — no objectui pin is read, built or checked here, and none
1839+ # is re-added (objectstack#25711, D1 ruling 「同一个版本号组」) .
18401840 #
1841- # It compared `.objectui-sha` against objectui `main` at publish time and
1842- # refused a release whose pin lagged. The ruling removed the question, not
1843- # just the job: WHICH objectui revision this repo pins is a decision taken
1844- # in an objectstack issue, never derived from another repo's HEAD, so
1845- # "the pin is behind main" is not a defect a release lane may diagnose.
1846- #
1847- # R4's lesson (#6170 — "a gate required on a PR the publishing lane can
1848- # skip is not a gate") is untouched and does not resurrect this one:
1849- # #3340's actual invariant is "everything published is covered by the
1850- # changeset record", and that is carried by `scripts/bump-objectui.sh` +
1851- # `scripts/objectui-changeset-digest.mjs` at BUMP time — on the manual pin
1852- # PR, which is now the only way the pin ever moves. Publishing an old
1853- # console is therefore a published decision, not an unnoticed gap.
1841+ # The Console is a workspace package now: `ui/apps/console`
1842+ # (@object-ui/console) builds against this tree's @objectstack/* through
1843+ # `workspace:^`, and `@objectstack/console#build` (root turbo.json) copies
1844+ # that dist with the tracked sdui.manifest.json, so the `pnpm run build`
1845+ # below builds it with everything else. The pin-currency gate, the
1846+ # vendored-dist cache keyed on `.objectui-sha`, its SHA stamp check and
1847+ # its spec-injection check are gone with the pin: each answered "was the
1848+ # Console built from the objectui commit, and against the spec, this
1849+ # release names", and both are true by construction when the Console
1850+ # source and the spec are one tree at one commit. The single-zod canary
1851+ # survives inside packages/console/build-dist.sh, on the bytes it ships.
18541852 # ──────────────────────────────────────────────────────────────────────
18551853
18561854 - name : Build
18571855 run : pnpm run build
18581856
1859- - name : Read the spec's declared zod range (Console dist key input)
1860- id : spec-zod
1861- # Fails rather than keying on an empty or `undefined` range: a key that
1862- # silently stopped carrying the range would restore across a zod move.
1863- run : |
1864- node -e '
1865- const range = require("./packages/spec/package.json").dependencies?.zod;
1866- if (typeof range !== "string" || range.trim() === "") {
1867- console.error("packages/spec/package.json declares no dependencies.zod, so the Console dist key cannot carry it.");
1868- process.exit(1);
1869- }
1870- console.log("range=" + range.trim());
1871- ' >> "$GITHUB_OUTPUT"
1872-
1873- # This key hashes the pin and the build script, and carries the spec's
1874- # DECLARED zod range (the step above). ci.yml's Console Pin Gate (#4290)
1875- # hashes a SUPERSET of the files: those two, the probe scripts and the
1876- # spec's entry layout (#20765). So the two workflows no longer share dist
1877- # entries, and each one builds its own on a miss. Keeping this key narrower
1878- # is deliberate.
1879- # Following ci.yml would rebuild the console on every Version Packages
1880- # merge, and publishing a cached console whose spec content lags is the
1881- # existing cache design.
1882- #
1883- # The zod range is the one spec input the cached dist is NOT allowed to
1884- # lag (#21108). The console bundles a single zod instance, the console's
1885- # own copy, and its build refuses a console zod outside the injected spec's
1886- # declared `zod` range (objectui#11353). A dist restored after that range
1887- # moved would publish a console the build never judged against it. The
1888- # range is read out of packages/spec/package.json, not hashed with it: the
1889- # file's `version` moves on every Version Packages merge, and hashing the
1890- # whole file would turn every publish into a cold console rebuild.
1891- #
1892- # Split restore/save, matching ci.yml, and not the combined actions/cache
1893- # action: the combined form's post-step saves even when the job FAILED,
1894- # and build-console.sh writes the SHA stamp BEFORE it asserts the bundle
1895- # canary — so a canary failure here would seed this shared, repo-scoped
1896- # key with a stamped-but-broken dist that later runs restore and sail
1897- # through. See ci.yml's split-restore note for the full rationale.
1898- - name : Restore vendored Console dist (keyed on the objectui pin)
1899- id : console-dist-cache
1900- uses : actions/cache/restore@v6
1901- with :
1902- path : packages/console/dist
1903- key : ${{ runner.os }}-console-dist-${{ hashFiles('.objectui-sha', 'scripts/build-console.sh') }}-zod-${{ steps.spec-zod.outputs.range }}
1904-
1905- - name : Build vendored @objectstack/console SPA
1906- # Clones objectstack-ai/objectui at the SHA pinned in .objectui-sha,
1907- # builds @object-ui/console, and copies dist/ into
1908- # packages/console/dist/. Must run before publish so the prepublishOnly
1909- # guard in @objectstack/console passes.
1910- if : steps.console-dist-cache.outputs.cache-hit != 'true'
1911- run : bash scripts/build-console.sh
1912-
1913- - name : Verify Console dist stamp matches pin
1914- run : pnpm check:console-sha
1915-
1916- # The spec-injection half of the same question, spelled exactly as
1917- # ci.yml's Console Pin Gate spells it — both consumers of one cache key
1918- # apply one check. check:console-sha answers only "which objectui SHA",
1919- # and scripts/assert-console-spec-injection.mjs runs INSIDE
1920- # build-console.sh, which the `if: cache-hit != 'true'` above skips — so
1921- # on a cache hit nothing had asked whether the dist this job is about to
1922- # PUBLISH bundles this tree's @objectstack/spec rather than the published
1923- # tarball. --require-stamp because the vacuity check:console-sha tolerates
1924- # (no dist, or a dist no build ever stamped) is wrong on a publish lane.
1925- - name : Verify the restored Console dist bundles this tree's spec
1926- env :
1927- CONSOLE_DIST_CACHE_KEY : ${{ runner.os }}-console-dist-${{ hashFiles('.objectui-sha', 'scripts/build-console.sh') }}-zod-${{ steps.spec-zod.outputs.range }}
1928- run : pnpm check:console-injection --require-stamp
1929-
1930- # Reached only with every console assertion above green: Actions steps
1931- # default to `success()`, and nothing between the restore and here carries
1932- # `if: always()` or `continue-on-error`. Saving only on a miss keeps an
1933- # immutable entry from being rewritten on every release run.
1934- - name : Save vendored Console dist
1935- if : steps.console-dist-cache.outputs.cache-hit != 'true'
1936- uses : actions/cache/save@v6
1937- with :
1938- path : packages/console/dist
1939- key : ${{ runner.os }}-console-dist-${{ hashFiles('.objectui-sha', 'scripts/build-console.sh') }}-zod-${{ steps.spec-zod.outputs.range }}
1940-
19411857 - name : Downstream backward-compat smoke (live hotcrm)
19421858 # Pre-publish gate (#2035): the about-to-publish @objectstack/spec must
19431859 # not break a real third-party consumer pinned to a published release.
@@ -2031,8 +1947,8 @@ jobs:
20311947 run : bash scripts/release-spec-changes.sh --verify
20321948
20331949 # ──────────────────────────────────────────────────────────────────────
2034- # The publish itself. `pnpm run release` = build + build-console +
2035- # scripts/release-publish.sh, which is `changeset publish` followed by ONE
1950+ # The publish itself. `pnpm run release` = build (both scopes; the turbo
1951+ # cache makes it the build above) + scripts/release-publish.sh, which is `changeset publish` followed by ONE
20361952 # atomic `git push origin --tags` (#2191: the action's concurrent per-tag
20371953 # pushes raced GitHub's ref backend and lost ~half the tags).
20381954 #
0 commit comments