Repository navigation
fix(live-e2e): the backend cold install writes overrides.vitest so npm 10 can install the published graph (objectui#12649) - #12674
Merged
objectstack-fleet[bot] merged 1 commit intoOct 16, 2026
Conversation
…npm 10 can install the published graph The live lane's backend install (`e2e/live/ci/start-backend.sh`) died on npm 10 (the runner's npm, 10.9.9 on Node 22.23.3) with `Cannot read properties of null (reading 'edgesOut')`: the published @objectstack/cli graph reaches vitest only as an optional peer, and the newest vitest 4 has no coherent @vitest/browser-webdriverio peer set for npm 10's peer-set walk. A cache hit on the old pins hid it until backend.env moved. The rewritten showcase manifest now carries a root `overrides.vitest: ~4.0.0`, objectstack's documented remedy for this crash. The value is the stamp's third component, so a fixture prepared under another recipe is rebuilt rather than reused. The comment states why it exists and when it goes. The CI/CD guide's paragraph that said no transitive dependency is overridden now says which one is, and what the fixture cache still cannot see. Claude-Session: https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4t Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
席位核对 · ACCEPT · objectui#12674 (draft, head
|
| route | install | health / ready | allowlist |
|---|---|---|---|
baseline (main script) |
exit 1, edgesOut |
— | — |
| (a) override (chosen) | exit 0, 528 packages | 200 / 200 | 5 passed |
| (b) npm 11.21.0, no override | exit 0, 528 packages | 200 / 200 | 5 passed |
(c) --legacy-peer-deps |
exit 0, 506 packages | 200 / 200 | 5 passed, but better-sqlite3 and 21 build deps are missing |
- The (a) and (b) lockfile trees are identical path for path, so the override changes nothing the backend runs.
- On the PR itself:
Live E2E (informational)(job 116990202266) succeeded, and it was a cold install. The restore missed, the start step took 71 s, "Save live backend fixture" ran, and the allowlist read "5 passed". - Out of scope, routed by this seat:
stop-backend.shrecords the subshell's PID, not the server's, so a local stop leaves the server running. CI is unaffected (ephemeral runner). The seat files it as its own card.- The cache key hashes
backend.envalone, so registry drift under unchanged pins stays hidden until the next bump. That is stated in the PR body and on the docs page. Closing it would need a governedlive-e2e.ymledit, and the seat does not widen this PR for it.
- Landing: objectui's required contexts are
Lint,Type Check,Build & E2E,Build Docs,Changeset Declaration,TestandGoverned Surface Queue Guard. Once every check on this head reads green, the seat readies the PR, arms auto-merge and confirms the merge on objectuiorigin/main.
Generated by Claude Code
objectstack-fleet
Bot
deleted the
claude/issue-12649-live-backend-cold-install
branch
October 16, 2026 13:36
This was referenced Oct 16, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #12649
Clause-②: no
The
Live E2E (informational)lane's backend now installs cold on the runner's npm.e2e/live/ci/start-backend.shwrites one rootoverridesentry,vitest: ~4.0.0, into the rewritten showcase manifest. The same value is the third component of the fixture stamp, so a fixture prepared under another install recipe is rebuilt, not reused. The CI/CD guide's paragraph that said "no transitive dependency is overridden" now names this one and says what the fixture cache still cannot see.Reproduction
actions/setup-nodestep (job 116927385035): Node 22.23.3, npm 10.9.9.LIVE_BACKEND_DIR.origin/mainscript atf78efdd1eunder npm 10.9.9: exit 1 withnpm error Cannot read properties of null (reading 'edgesOut'). The stack is in#loadPeerSetunderidealTree:node_modules/@objectstack/cli. That is the CI failure, reproduced on the runner's npm.vitestonly as an optional peer, frombetter-auth@1.7.3(nested under@objectstack/plugin-auth) and from@objectstack/metadata-core@18.0.0-next.2. That was read by scanning the installed tree. Upstream today,npm view vitest dist-tagsgivesV4: 4.1.12, and the 4.x line of@vitest/browser-webdriverioends at4.1.11.Remedy chosen, and the alternatives' readings
/api/v1/health·/api/v1/readyoverrides.vitest: ~4.0.0(chosen)--legacy-peer-deps7a6ba03109. objectstack's scaffolds emit the same override (fix(cli): os init / os create emit overrides.vitest so new projects install on npm 10 objectstack#23850).packagesmaps were compared path for path and version for version: 554 entries each, and no difference beyond npm 10 and npm 11 writing differentoptional/peerflags. So the lane still tests the published pair.@objectstack/plugin-auth'sbetter-sqlite3@12.11.1peer with its 21-package build subtree, and hoistsbetter-authto the root. The claim allowed it only as the last resort.Boot and allowlist proof: what was measured, and what was not
GET /api/v1/healthgave 200 (status: ok,version: 18.0.0-next.2), andGET /api/v1/readygave 200 (status: ready).VITE_BASE_PATH=/, as in the workflow'sBuild consolestep, and served byvite previewwithDEV_PROXY_TARGETat the backend. The four specstest:e2e:live:cinames ran:5 passed.executablePath, and video recording was off, because this container has no ffmpeg for this Playwright revision. Both came from a scratch config that spreadplaywright.live.config.tsand changed nothing else. It was deleted afterwards and is not in this diff.prepare: pins unchanged (… 18.0.0-next.2 vitest@~4.0.0), reusing, in 13 s with no install.origin/mainscript had prepared printedprepare: showcase@…and installed cold again: exit 0, 528 packages. That fixture's stamp has no third component, which is what a restored cache would carry.Is this PR's own Live E2E run cold?
live-backend-plus the runner OS plushashFiles('e2e/live/ci/backend.env'). This PR does not touchbackend.env, so the key stays3e640c78135ae9fa….main's, andmain's are written only by the nightly schedule and manual dispatch. The workflow's run list since 11:00Z on 2026-10-16 shows onlypull_requestruns, so nothing onmainhas saved a fixture sincef62b6ffmovedbackend.env.Start ObjectStack backend (published packages)step, goes in the os-dev report on Live E2E: a cold live-backend install crashes in npm (Cannot read properties of null (reading 'edgesOut')) on next.1 and next.2 alike; the lane is green only from its cache #12649.What the cache still hides
backend.envalone. So a cold install that breaks because the registry moved under unchanged pins stays hidden untilOBJECTSTACK_VERSIONmoves. That is how this one broke: the card's18.0.0-next.1control fails the same way.Removal condition
VITEST_OVERRIDE, theoverridesline inprepare(), and the stamp's third component once the published@objectstack/cliatOBJECTSTACK_VERSIONinstalls on npm 10 with no override.next, andbetter-auth's optional vitest peer reaches the crash on its own.npm installagain, and npm answersup to datewith exit 0, because it installs from the lockfile. That rerun proves nothing; only a fresh dir does.Gates (local, at
eed841f45)node scripts/check-governed-queue-guard.mjs --test e2e/live/ci/start-backend.sh content/docs/guide/ci-cd-pipeline.md: exit 0,NOT GOVERNED.node scripts/check-changeset-presence.mjs: exit 0, no changeset owed. The two files are neither published source nor a release-covered manifest.check-bash32-floor,check-doc-links,check-control-bytes,check-new-cross-file-line-citations(0 new),check-doc-fence-languagesandcheck-shell-escape-residue.bash -non the script is clean.check-doc-json-fencesfirst refused with exit 2, a prerequisite:@object-ui/typeswas not built. After the build it exits 0.pnpm exec vitest runover the 17 test files that nameci-cd-pipeline.mdorstart-backend.sh(found withgit grep -l): 17 files and 737 tests passed.Acceptance notes
stop-backend.shdoes not stop the backend. This is pre-existing and not touched here.start()records$!of a backgroundedcd … && nohup … objectstack devlist. That is the forked subshell, not the server.origin/mainscripts: the pid file held 30766, and the server was 30767, its child.stop-backend.shprintedstopped pid 30766and exited 0, while/api/v1/healthon the port still answered 200. The server was reparented to pid 1.Session:
https://claude.ai/code/session_016PVjjuVPte5XEJvaQx1E4tGenerated by Claude Code