Repository navigation
build-console: objectui's @objectstack/* install from this framework tree when the pin carries .objectstack-sha (ruling B on objectstack-ai/objectui#12955) - #24440
Conversation
…tree A pinned objectui that carries .objectstack-sha (objectui 749ed760 on, ruling B on objectui#12955) resolves every @objectstack/* package from file:node_modules/.cache/objectstack/NAME, which its scripts/objectstack-pin.mjs fills. Nothing filled it here, so the frozen install of such a pin died with ERR_PNPM_LINKED_PKG_DIR_NOT_FOUND. When the file is present, build the packages objectui overrides in this tree through turbo and run the pin script with OBJECTSTACK_ROOT set to this tree before the install, so objectui's install resolves to this framework with no lockfile change. A pin without the file builds as before; a pin with it but without the OBJECTSTACK_ROOT hook refuses, naming the hook. A pin-script refusal prints the operator's remedy for dependency drift (move objectui's pin first, then .objectui-sha). Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks Co-authored-by: Claude <noreply@anthropic.com>
… the pinned-build directory) Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks Co-authored-by: Claude <noreply@anthropic.com>
…remedy; say why the spec assert reports no skew on an OBJECTSTACK_ROOT pin Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks Co-authored-by: Claude <noreply@anthropic.com>
…ay their logs Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks Co-authored-by: Claude <noreply@anthropic.com>
…ild-console-objectstack-root
…S_SKIP_DTS the caller exported objectui's pin script packs whole packages and refuses one whose types entry is missing; with OS_SKIP_DTS=1 and a typeless tree this branch exited 1 at @objectstack/client's dist/index.d.ts. The closure build now runs with OS_SKIP_DTS unset (turbo hashes it, so a typeless cache entry cannot replay), says so when the caller had it set, and the refusal names it for hand rebuilds. Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks Co-authored-by: Claude <noreply@anthropic.com>
…fake objectui The real script, copied into a temp framework root beside a temp objectui repo, with pnpm and the pin script as recording shims: no .objectstack-sha builds as before; one without the OBJECTSTACK_ROOT hook refuses before any install; one with it builds the overridden packages, passes this tree as OBJECTSTACK_ROOT, then installs, in that order; an inherited OS_SKIP_DTS does not reach the closure build; a pin-script refusal stops the install. Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift Check
What this run could not see
Coarse fallback — 143 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
席位核对 — ACCEPT ·
|
Fixes #24306
Clause-②: no
Ruling B on objectstack-ai/objectui#12955 (comment
6248859734), step 3. objectui consumes@objectstack/*by commit since objectstack-ai/objectui#12957 landed as749ed760: its rootpackage.jsonoverrides seven packages (spec, core, types, client, formula, sdui-parser, lint) tofile:node_modules/.cache/objectstack/NAME, and itsscripts/objectstack-pin.mjs buildfills those directories. WithOBJECTSTACK_ROOT=TREEset, that script packs an installed and built objectstack tree instead of building its own pin, with no lockfile change.scripts/build-console.shnow uses that input. Until this lands,.objectui-shacannot move past749ed760: the console build's frozen install of objectui dies there.What changed
One file of behaviour,
scripts/build-console.sh, plus one test..objectstack-sha, a new block runs before objectui's frozen install. A pin without the file never enters it (Done-when item 2)..objectstack-shawhosescripts/objectstack-pin.mjsis missing or has noOBJECTSTACK_ROOTinput exits 1, naming the hook, like the existingOBJECTSTACK_SPEC_DIST/OBJECTSTACK_CLIENT_DISTguards (item 3).package.jsonat the pin, through turbo (^buildbrings their dependencies). In every workflow that runs this script this is a cache hit (measured below), and--output-logs=new-onlykeeps a hit from replaying about 3,600 cached log lines.OS_SKIP_DTSsays. That build runs withOS_SKIP_DTSunset and says so when the caller had it set. See the consumer pointer section below.OBJECTSTACK_ROOT=FRAMEWORK_ROOT node scripts/objectstack-pin.mjs buildin the objectui checkout, then the unchanged frozen install. Every@objectstack/*package objectui installs is then this tree's (item 1)..objectstack-sha, commit the lockfile (and any override) that needs, land it, then move.objectui-shahere. ⛔ Not by editing the scratch lockfile or making the install non-frozen.OBJECTSTACK_SPEC_DIST/OBJECTSTACK_CLIENT_DISTstay: older pins still install from npm and need them.Not changed:
.objectui-sha(item 5: the bump that follows is this card's verification), any workflow, anything in objectui.The consumer pointer on this card (
6257693480,repo:cloud#2)It measured, on objectstack-ai/cloud#3023, that objectui's pin script refuses an
OS_SKIP_DTS=1(typeless) tree, and that the rebuild its refusal prints inherits the sameOS_SKIP_DTS.package.jsonscript, shell script or Dockerfile in this repository (git grep OS_SKIP_DTS: readers only). It is a developer's or agent's local speed flag (AGENTS.md mentions it), and cloud's lane.f106564740,OS_SKIP_DTS=1, all seven built typeless: exit 1,@objectstack/client is not built in TREE: its manifest points at dist/index.d.ts, which is not there.OS_SKIP_DTScan no longer reach a refusal whose printed remedy loops; the override is announced, not silent.turbo.jsonlistsOS_SKIP_DTSinglobalEnv, so the unset build hashes apart from a typeless one and cannot replay it. The proof is on disk, not turbo's word: see the measurements.Measurements (each command with its exit code, captured before any pipe)
Shared 4-core box; wall-clock figures are shared-box readings. The objectui trees were scratch clones under the session scratchpad (
OBJECTUI_ROOT). ⛔ The shared../objectuicheckout was not touched..objectui-shawas set locally only, and restored by a trap that compared blob hashes withHEAD. Every run ended withgit diff HEADempty and a cleangit status.Item 4, new branch, objectui
749ed760, the CI way, atf106564740:pnpm exec turbo run build --filter=@objectstack/client... --concurrency=2OBJECTUI_ROOT=SCRATCH bash scripts/bump-objectui.sh --no-commit --no-changeset 749ed760…(refresh, first half)OBJECTUI_ROOT=SCRATCH bash scripts/build-console.sh(refresh, second half; the CI step)node scripts/gen-sdui-manifest-node.mjspnpm check:console-shapnpm check:console-injection --require-stamp(the dist stamp check)pack 7 package(s): 16 s. The pin script's lockfile dependency-name check passed.a532a18745was also all exit 0.Item 4, with
OS_SKIP_DTS=1exported and the seven typeless, at10e5579ba9(the final script; the later commit adds only the test):dist/index.d.tswas ABSENT for all seven, with 0 declaration files under eachdist.build-console.shexited 0 and printed theOS_SKIP_DTSnotice.gen-sdui-manifest-node.mjs,check:console-shaandcheck:console-injection --require-stampeach exited 0.Item 1, read off the objectui tree after the install:
node_modules/.cache/objectstack/.stamp.json:source: external,root= this worktree,sha= its HEAD.node_modules/.pnpm: 7@objectstackentries, each@objectstack+NAME@file+node_modules+.cache+objectstack+NAME….pnpm-lock.yaml: 0 registry-resolved@objectstack/*keys (14file:keys).dist/againstpackages/NAME/dist/here:diff -rqexit 0 for all seven (control, spec against core: exit 1).@objectstack/spec@18.0.0-next.3tarball (the spec objectui's own pin2c9bf9430awas released as),assert-console-spec-injection.mjsexited 0: 10 of 10 injected-only descriptions present, the 1 next.3-only description absent.Item 2, the committed pin
0707b4ae37(git cat-file -e 0707b4ae37:.objectstack-shaexit 128; control749ed760exit 0), ata532a18745:origin/main97cb5c5a82's script run over the same tree.assets/sha256 manifests are identical (3,450 files), and so are the injection stamps.check:console-shaandcheck:console-injection --require-stampexited 0 after both..objectstack-shablock, and the test's first case pins that a pin without the file reaches the install with no closure build and no pin script.Item 3, two scratch commits on
749ed760, both carrying.objectstack-sha:fac93cc890:OBJECTSTACK_ROOTrenamed out of the pin script, 6 occurrences to 0.11ad951921: the pin script deleted.has no OBJECTSTACK_ROOT hook. The install never ran, the pin script never ran, and the build tree has nonode_modules.Before state (the dispatch's ablation; not committed). The branch was disabled through⚠️ That is not the
scripts/ablation-replace.mjs(anchor 1 to 0, blobec24facfto33c9e4d0, restore proved), and objectui749ed760built from a fresh tree. The frozen install died withENOENT: no such file or directory, scandir '…/node_modules/.cache/objectstack/client', exit 254.ERR_PNPM_LINKED_PKG_DIR_NOT_FOUNDthe card's unlock note names; that code was measured on objectui's side, not in this script.The test:
packages/spec/scripts/build-console-objectstack-root.test.ts, in spec'srepoproject;scripts/**is already spec's declared cross-package input.pnpmand the pin script are recording shims, andpnpm installexits 42, so reaching the install is the exit code..objectstack-sha; no hook; hook (exact order: closure build, then the pin script withOBJECTSTACK_ROOT= the framework root and cwd = the build tree, then the install); inheritedOS_SKIP_DTS=1(the closure build sees it unset, the install still sees1); a pin-script refusal.vitest run --project repoon it: 5 passed, 839 ms.ablation-replace.mjswith the restore proved:OS_SKIP_DTS: 1 failed, 4 passed;git diff HEADempty.tsc --noEmit -p tsconfig.scripts.json --listFiles: exit 0, and the file is in the program.The dispatch's mechanism assumptions, measured
Build closure. Turbo dry runs at this branch show that every workflow filter builds all seven: ci.yml
--filter=@objectstack/client...(37 tasks), cut-rc.ymlclient...+spec...(37), showcase-smoke.yml@objectstack/example-showcase^...(65), release.ymlpnpm run build(83). Control:--filter=@objectstack/typesbuilds spec and types only. So the script builds what it needs itself and no workflow changes. The PR is not on the governed register:check-governed-merges.mjs --test: NOT governed.Dependency names. Confirmed: the pin script's lockfile check passed for objectui
749ed760(pin2c9bf9430a) against this tree. Operator remedy: the refusal text above. Design alternative: in the report.The injections on the new branch. They are redundant for "which spec and client ship". A rebuild of the console in the same objectui tree without them passes:
They are not neutral: with them the JS is 907 KB larger (34,623,558 against 33,716,662 bytes;
vendor-objectstack6,128,118 against 5,222,138), and the bundle carries more spec text. Kept, as ordered; a follow-up decision is in the report.The console-dist cache key (
ci.yml) under-covers the new branch. Core, types, formula, sdui-parser and lint now come from this tree, while the key carries onlypackages/spec/package.jsonandtsup.config.tsof them. For CONTENT that is the same accepted class as the client and the spec's content (the ruled cost model).cut-rc.yml'spnpm objectui:build, orpnpm run releasein the publish step.consolefilter costs no extra miss on Version Packages merges, because all seven are in one changesetsfixedgroup with spec.Gates
e497bf7535: the 80 familiesnode scripts/pm/dispatch-gates.mjs --commandsderives. 79 exited 0.pnpm check:dual-build-cjs-loadsexited 3 (PREREQUISITE NOT MET: it needs a whole-treepnpm build), so it is NOT MEASURED locally and CI's reading stands.pnpm check:console-shafirst read exit 1, against the dist my item 4 run left stamped749ed760after the pin was restored: the gate working. It re-read exit 0 with no dist, the CI lint state. Its substantive readings are the item 2 and item 4 rows above.--ranreconciliation: 80 derived, 79 run, 1 NOT MEASURED (derived from the recorded exit 3), 0 unrun.vitest run src/utils/console.not-built.test.ts test/console-resolve.test.tsin@objectstack/cli(2 files, 30 tests passed); spec'srepoproject in full (pnpm --filter @objectstack/spec run test:repo: 69 files, 1,130 tests passed); the scripts tsc above.main's push battery after the merge, at today's pin, which is item 2's path.Changeset
None. Nothing in any package's
files[]changes. At today's pin the console dist is byte-identical (item 2), and the bump that moves the pin writes its own@objectstack/consolechangeset.skip-changesetapplies. ⛔ No label was written here: the dispatch forbade label writes, so the seat applies it.Acceptance notes (observations, not filed)
check-console-injection.mjssays "between the injected and published spec" for a no-skew stamp. On this branch the vendored side is this tree's packed spec, not a published one.packages/console/README.mdstep 2 says opening the PR runs the Console Pin Gate. That has been false since the gate became full-battery only, and predates this change.Generated by Claude Code