Repository navigation
ci(spec-shape-gate): install objectui through its pinned-build directories, packed from this commit - #24469
Conversation
…ories, packed from this commit objectui now overrides every @objectstack/* package it installs to file:node_modules/.cache/objectstack/<name>, a directory only its scripts/objectstack-pin.mjs build fills, so the gate's bare frozen install died on ENOENT there (exit 254) and every run reported exit 2. The gate now builds the packages those overrides name (read from objectui's package.json, --filter-prod closure) from this commit, packs them into those directories with OBJECTSTACK_ROOT set to this checkout, and then runs the frozen install. objectui compiles against all seven packages built here, not only the spec. The inject step stays: it still judges the spec's dependency ranges and proves every consumer resolves the injected copy, which the pin script does not (it compares dependency names only). Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
`node scripts/objectstack-pin.mjs build` in a step whose working directory is the objectui checkout names a path that exists only there, and check-self-test-wired's live corpus keys every workflow `node <path>` to a file in this repository (its self-test went red on it). objectui's own `objectstack:build` script is the same command under the name objectui declares for it, and names no path here. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
…he compile read objectui now installs all seven @objectstack/* packages it uses from this commit's build, so "compiled against @objectstack/spec built and packed from" understated the subject of every reading. Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp Co-authored-by: Claude <noreply@anthropic.com>
|
Generated by Claude Code |
维护者速读改了什么:Spec Shape Gate(每小时检查 objectui 能否在本仓当前提交上编译通过)安装 objectui 的方式。先在本仓构建 objectui 用到的 7 个 为什么改:objectui 改为按提交消费 风险与代价(含回滚):每次运行多约一分钟。本 PR 自己的运行已经证明修复有效:安装、打包、编译都跑通(81 个类型检查任务中 80 个通过),唯一的红是一处真实的形状破坏——PR #24442 退役了操作行的 席位意见:建议批准。改动只在门禁的安装步骤,方向与 objectui 自己的 pin 设计一致;剩下的那一处红是门禁正确地发现了 main 上的真实问题。批准后,席位会等登记落到 main、合并 main 让门禁重跑转绿,再入队。 你要做的:给本 PR 一次批准(APPROVED review)。 席位核对ACCEPT ·
Generated by Claude Code |
Fixes #24424
Clause-②: no
What was red
Every
Spec Shape Gaterun since objectui749ed760(objectstack-ai/objectui#12957): step "Install objectui dependencies" ran a barepnpm install --frozen-lockfilein objectui, whose rootpackage.jsonnow overrides every@objectstack/*package tofile:node_modules/.cache/objectstack/NAME, a directory only objectui'sscripts/objectstack-pin.mjs buildfills. Reproduced locally against objectui4016370af3(itsmainwhen this was measured): exit 254,ENOENT: no such file or directory, scandir '.../objectui/node_modules/.cache/objectstack/client'. Run39188135125step 14 concludedfailurewith the annotationProcess completed with exit code 254(its raw log host answers 403 from this container, so the annotation is the reading).The change
.github/workflows/spec-shape-gate.yml:objectui/package.json'spnpm.overrides, the list the pin script packs, and the selector is--filter-prod=NAME...: runtime edges only, as the pin script's own build uses (a plain...filter pulls in the client's dev closure of runtime, drivers and services). If no override is found, that step exits 2.pnpm run objectstack:buildwithOBJECTSTACK_ROOTset to this checkout. That is objectui's stand-in input: it packs every overridden package from this tree into those directories, with no lockfile change. The step calls objectui's script by name rather than by path.check-self-test-wired's live corpus maps every workflownode PATHto a file in THIS repository, and its self-test went red on the path spelling atbfa828074(exit 0 on BASE).injectstep stays (measured below). Its comment now says what it still adds.scripts/ci/spec-shape-gate.mjs: two summary lines now name the subject the compile reads,@objectstack/specand every other@objectstack/*package objectui installs. The self-test's pinned substring (type-checks against) is unchanged.No gate was added, no step skipped, and no
continue-on-errorset.report's exit-2 meaning is unchanged.The dispatch's hypotheses, measured
Readings at BASE
725a5b131, objectui4016370af3, pnpm 10.31.0, node 22.22.0.OBJECTSTACK_ROOT=TREEpacks every package and leaves the lockfile unchanged. Confirmed. Seven packages were packed from725a5b1311ecin 15 s and the pin script's lockfile check passed.pnpm install --frozen-lockfilethen exited 0 in 7 s, and objectui'sgit statusstayed clean.pnpm run setupwould pass the variable through too. Butsetupis also THIS repository's script name, so the self-test-wired corpus would expand it against ourpackage.json. The build and the install are therefore two named steps.injectbecomes redundant. On BASE it changes nothing: every declaration file is identical, it made 0 substitutions, and it verified 32 consumers. The only differences between npm pack and pnpm pack output arepackage.json(npm keeps thepreparescript) and one nestedsrc/migrations/entries/README.md. It is not redundant, though: it is the only range check of the spec's declared dependencies. A tarball declaringzod: ^4.7.0against the store'szod@4.6.7madeinjectexit 2 with nothing written, while the pin script's check passed the same drift. It stays.dependencies,optionalDependencies,peerDependencies,peerDependenciesMetaorenginesover the 157 commits from objectui's pin2c9bf9430ato BASE. The mechanism itself is falsified. I mutated the packed spec manifest four ways: a new dependency name, peerai: ^8.0.0,engines.nodeat 24 or above (under objectui'sengine-strict=true), andzod: ^4.7.0. objectui's frozen install exited 0 every time and linked the drifted manifest. Only the pin script refuses, and only for the name class.How the gate reads the name class. The pin step exits 1 with the pin script's own
objectstack-pinerror annotation, which names the package and the dependency. Install and compile are skipped, andreportexits 2: no reading, never a pass. That is a red with no compile verdict, and the remedy is objectui's: move its.objectstack-shawithscripts/bump-objectstack.shand commit the lockfile. It is neither a shape break nor a registered retirement, because the registry matches diagnostics and there are none. I propose no new registry kind: a "known" reading of a compile that never ran is a skip, which this card's ruling forbids. Nothing refuses peer, engines or range drift in the other six packages. In that case the compile reads objectui's lockfile-resolved dependencies, which is what objectui's own frozen install does with the same build.Local end-to-end
I extracted the edited workflow's own
run:texts from the YAML and replayed them underbash -eo pipefail.4016370af3with a freshnode_modules: step 13 (pnpm run objectstack:build) exit 0 in 14.5 s; step 14 (frozen install) exit 0 in 7.9 s;injectexit 0.TURBO_FORCE=true pnpm type-check --continue --concurrency=2exited 0, with 81 of 81 tasks successful and 0 cached, in 16m16s on a shared box.report --status 0on that log exited 0 ("type-checks against"). Two registered retirements matched nothing and are listed as such.Gates
Run at
eb080715a, the head of this PR. The 51 commandsnode scripts/pm/dispatch-gates.mjs --commandsderives for this diff all exited 0, each exit code captured before any pipe.--ranreconciliation: "51 derived, 51 run, 0 NOT-MEASURED, 0 UNRUN". Selected verdict lines:pnpm check:spec-shape-gate:spec-shape-gate --self-test: 60/60 passed across 7 batteriesnode scripts/check-self-test-wired.mjs --self-test: exit 0 (red atbfa828074on the path spelling, see above)pnpm check:pnpm-filter-targets,pnpm check:workflow-step-name-quoting,pnpm check:nul-bytes,pnpm check:entry-guard,pnpm check:bash32-floor: exit 0pnpm check:pnpm-flag-spellingsexit 0.The gate's own
pull_requestrun on this PR (path-filtered to this workflow and the script) is the CI end-to-end reading.Acceptance notes
inject's tarball comes fromnpm pack; objectui's pinned build comes frompnpm pack. They differ inpackage.json(npm keepsprepare) and one nested README, and tsc reads neither. Observation only.check-self-test-wired's live corpus does not read a step'sworking-directory, so anode PATHrun inside the objectui checkout reads as a path in this repository. This PR spells objectui's entry point by script name instead. Observation only, no carrier.725a5b1311(this PR's BASE), and its Release run refused at the full-battery check because the newest schedule run at or before that version commit is red.维护者速读(草稿)
改了什么
Spec Shape Gate 是每小时检查 objectui 能否在本仓当前提交上编译通过的门禁,这次改的是它安装 objectui 的方式:先在本仓构建 objectui 用到的全部 7 个
@objectstack/*包,再调用 objectui 自己的objectstack:build脚本把它们打包进 objectui 期望的目录,最后照常冻结安装。以前只注入 spec 一个包,现在 objectui 编译时读到的 7 个包全部来自本次提交。为什么改
objectui 改为按提交消费
@objectstack/*之后,门禁原来的裸安装每次都失败(找不到缓存目录),门禁一直是红的,而发版门禁读这条结果。triage 读数 6259975511:next.4 已无法挽救,可发版的路径是本卡落地、新 main 上出现一次绿色的定时 Spec Shape Gate 运行,然后发 next.5。风险与代价(含回滚)
每次运行大约多一分钟(多构建 6 个小包,外加一次打包)。如果本仓某次提交给这 7 个包新增或删除了运行时依赖,objectui 的打包脚本会拒绝,门禁变红(读作"无读数",不算通过),要等 objectui 升级它的 pin 并提交 lockfile 才能转绿。回滚:revert 本 PR,门禁回到现在的红色状态。
席位意见
你要做的
看一下本 PR 自己的
Spec Shape Gatepull_request 运行结论;同意的话批准合并(工作流文件属于 Tier H,需要你亲手批准)。Generated by Claude Code