Make a fresh clone set itself up, and close two gaps in the gates - #687
Merged
Merged
Conversation
The competitor install ran with --ignore-workspace, which is what made the root workspace's minimumReleaseAge quarantine not apply to it - and the reason the bench package was kept out of CI. competitors/ is now its own workspace root carrying the same setting, and the install is frozen to its lockfile in every use, so a new version arrives only through a reviewed lockfile change. With that objection gone the bench lane runs the harness typecheck, the one bench check that needs the competitors (the adapters are typed against them, which is what catches an upstream change on a bump), and the pre-push hook's hand-rolled version of the same check goes. The harness's own unit tests need no competitor at all and join the ordinary test project list.
The physics sleeping test asserts a wall-clock ratio: a settled field must step at least twice as fast asleep as awake. Run alongside the rest of the suite, the light sleeping arm loses proportionally more to scheduling gaps than the heavy awake arm; the ratio collapsed from a measured 3.4x to 1.8x and the push gate failed with nothing regressed. The test now lives in its own project, run after the parallel suite, where the measurement has the machine to itself. The behavioural half of the claim stays in the main suite. A guard test now requires every vitest project to be named by a package script that a lane runs. It found the bench project, whose 287 tests no lane had ever executed.
Node was pinned nowhere: CI named 24.x in four places and drifted with it, and a contributor's shell ran whatever it had. .nvmrc is now the single declaration; devEngines refuses another major, the workflows read the file, and a parity test keeps the three equal. pnpm bootstrap stays what CI needs - dependencies and build tooling, install scripts off - which is why a clone set up that way had no git hooks: prepare never ran. bootstrap:dev adds the hooks, every build, the bench competitors and a Chromium, then runs doctor, which reports each prerequisite with the command that fixes it. The API docs generator wiped its output directory before converting the extension packages; when their dist was missing the conversion failed and the site lost every extension page. It now generates into a staging directory, moves it into place only on success, and refuses up front without a core dist. clean:artifacts removes what a test, benchmark or release run leaves behind, through git clean so a tracked placeholder survives; clean:all also drops every build output and cache. The root micro-benchmark script is renamed bench:micro so it no longer reads as the cross-library benchmark.
Exoridus
enabled auto-merge (squash)
September 6, 2026 05:27
Bundle ReportChanges will decrease total bundle size by 18.89MB (-37.28%) ⬇️. This is within the configured threshold ✅ Detailed changes
Affected Assets, Files, and Routes:view changes for bundle: site-server-esmAssets Changed:
App Routes Affected:
|
The staging-and-swap change gave the API docs generator a guard that refused to run without a core dist, on the belief that TypeDoc resolved the extension packages through the published entry points. It does not: it converts from the sources through the workspace aliases, and with every dist removed it still produces all 1085 pages byte for byte. The guard only broke the sync gate, whose CI job has never had a dist. The bench unit tests now run in CI for the first time, and two of them self-skip where no real GPU is present. Their budget is recorded.
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.
Makes a fresh clone able to set itself up, pins the Node version in one place, and closes two gaps that let checks pass without running.
A test project that no lane ran
A new guard requires every vitest project to be named by a package script that a lane runs. It immediately found one:
exojs-bench, whose 287 tests had never executed in CI. They are in the ordinary test project list now.The reason they were excluded no longer held.
bench:setupinstalled the competitor libraries with--ignore-workspace, which is what put them outside the root workspace'sminimumReleaseAgequarantine - and that, in turn, was the stated reason the whole package stayed out of CI.competitors/is now its own workspace root carrying the same setting, and the install is frozen to its lockfile, so a new competitor version arrives only through a reviewed lockfile change. Verified: a 100-year quarantine in that directory rejects all 19 entries, so the gate demonstrably applies.With the objection gone, the path-gated
benchlane runs the harness typecheck - the one bench check that genuinely needs the competitors, since the adapters are typed against them - and the pre-push hook's hand-rolled version of the same check is deleted.A push gate that failed on load, not on regressions
packages/exojs-physics/test/perf.test.tsasserts that a settled field steps at least twice as fast asleep as awake. Run inside the parallel suite, the light sleeping arm loses proportionally more to scheduling gaps than the heavy awake arm: the ratio collapsed from a measured 3.4x to 1.8x and blocked a push with nothing regressed. It is 4/4 green on an idle machine.The test moves to its own project, run after the parallel suite. Its comment claimed the ratio was "machine-independent" - true across machines, false under load - and now says which of the two it is. Allocation was measured as a load-independent substitute and rejected on the numbers: 677 KB/step awake against 622 KB/step asleep is a ratio of 1.09 with all 5000 bodies asleep, so it cannot carry the claim. The behavioural half stays in the main suite, where
sleeping.test.tsalready covers it.One Node version
CI named
24.xin four places withcheck-latest, so it drifted with every 24.x release; a contributor's shell ran whatever it had..nvmrcis now the single declaration,devEnginesrefuses another major (verified: pnpm rejects the install), the workflows read the file, and a parity test keeps the three in agreement..nvmrcneeded allowlisting - the repository blanket-ignores dotfiles, so it would have been committed nowhere and every workflow would have failed on a missing file.A clone that sets itself up
pnpm bootstrapstays what CI needs: dependencies and build tooling, install scripts off.pnpm bootstrap:devadds the git hooks, every build, the bench competitors and a Chromium, then runspnpm doctor- which reports each prerequisite with the command that fixes it, and can be run at any time.Verified against an actual fresh clone:
bootstrapsucceeds, anddoctorcorrectly reports twelve unbuilt units and the missing competitors. That test also corrected a claim in the first draft of these docs: pnpm runs an install of its own before a script whennode_modulesis absent, and that install - notbootstrap- is what installs the hooks. The docs now say what actually happens.The API docs generator no longer destroys its output first
build-api.tswipedsite/src/content/api/before converting the extension packages. With their dist missing, the conversion failed and the site lost every extension page - about 350 files, which happened three times during recent work. It now generates into a staging directory, moves it into place only after every package has produced its pages, and refuses up front without a core dist. Verified: with the core dist removed, the run fails, all 1085 pages survive, and no staging directory is left behind.Artifacts
pnpm clean:artifactsremoves what a test, benchmark or release run leaves behind (347 MB here);--allalso drops every build output and cache. Deletion goes throughgit clean -X, so only ignored files go - verified that a tracked.gitkeepinside an artifact directory survives while the ignored files around it are removed.doctorreports both totals.Also: the root
benchscript is renamedbench:micro. It maps tovitest bench, the engine micro-benchmarks, and there is no rootbench:compare- so the published reproduce instructions, which saidpnpm bench, sent readers to the wrong benchmarks entirely.Verification
Gate groups
typecheck,lint,sync,site; the full pre-push gate (verify:quickplus every selected lane, including the browser lanes and the 24-example smoke) passed on the push that opened this PR. 223 CI tests intest/ci/.git diff --checkclean.