Repository navigation
test(cli): install-local suites run their independent boot chains at once and declare their spawn budgets - #26214
Merged
Conversation
…once The control boots of the jobs, handlers and boot-steps suites and the four uninstall orders each own their cwd and home, so they no longer wait for each other. Inside a chain every step still waits for the one before it. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DcLzU9qErDBr5VydWEmHVM
Each file boots `os start` from the tsx source entry two or three times per order of events (one boot to READY is about 20 s), so none can fit the 10 s line. Each declares its budget with the ruled class, from the CI reading where the shape is unchanged and from the local after-reading scaled by the file's own CI-over-local ratio where it changed. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DcLzU9qErDBr5VydWEmHVM
Four live os start trees at once, beside the package's other workers, ran a 15 GB box out of memory. Two pairs of four boots and three installs each keep most of the saving. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DcLzU9qErDBr5VydWEmHVM
…ding Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DcLzU9qErDBr5VydWEmHVM
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
…ings Seat review: running chains side by side packs work on CI's shared box and adds about 3.3 GB of peak RSS per file, so every chain runs in sequence again, as on main. Each file's budget is now its slowest CI reading of that sequential shape x 1.25, rounded up. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DcLzU9qErDBr5VydWEmHVM
Contributor
Author
席位核对 · ACCEPT ·
|
| item | reading |
|---|---|
| Shape | Draft, base main, Part of #23181 (slice 10), skip-changeset, mergeable clean. The PR body was replaced through the relay with the dev's v2, which describes the revision. |
| Files | 7 files, +7/−0. One // test-budget: header line in each packages/cli/test/package-install-local-*.integration.test.ts, which is slice 10's surface. Below the header, every file is byte-identical to main. |
| Review round | At the first head, chains that share no state ran concurrently. The seat sent that back: it is packing, which adds about 3.3 GB of peak RSS per file, and four chains at once were memcg-OOM-killed. The same trade is already rejected in packages/cli/vitest.config.ts. It is now taken out, and every chain runs sequentially, as on main. |
| Budgets | Ruling 6181973363 B, class spawns the real producer once per single-cause fixture. Each budget is the slowest CI reading of the sequential shape × 1.25, rounded up. Readings come from the card's refresh window and from hourly run 40290659753, and each file's header cites its runs: uninstall-cleanups 350, jobs 210, hooks 150, jobs-shared-name 140, jobs-pull 140, handlers 130, boot-steps 120. readTestBudget parses all seven. |
| Evidence | On this head, 39 check runs succeeded and 15 were expected skips, with 0 failed. Of the 55 derived gates, 54 exit 0; dual-build-cjs-loads was not measured locally, and CI's Build Core runs it green on this head. --ran exits 0. cli typecheck and eslint are green. |
| Seat ruling on the open question | A, then C, as in #26207's ACCEPT. A, the source-entry oclif manifest, is slice 14 (a test-only globalSetup, in development). After it lands, the next refresh re-reads these rows and the budgets tighten. Not the published-package manifest. |
| Landing | 「按照 pm-dispatch 规则复核过的都授权」 (Leehom, 2026-10-25T11:35Z): ready and auto-merge through the relay. |
Generated by Claude Code
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.
Requested by Leehom · project thread
Part of #23181 (slice 10: the
@objectstack/clipackage-install-local-*family). The card stays open for later slices.Summary
The seven
test/package-install-local-*.integration.test.tsfiles ran 68 to 275 s each on CI. The order's hypothesis was a per-case boot, but that is not this family's shape. Every file already boots in onebeforeAll, and theits only read what the phases recorded. The cost is the boots and installs themselves, spawned from the tsx source entry. Oneos startto READY takes about 20 s, and oneos package installabout 15 s. Slice 9's reading on this box: tsx--versiontakes 10.0 to 10.3 s, dist--version2.7 to 3.0 s. The family spawns 23 boots and 26 installs, so no file here can reach the 10 s line on the tsx entry.So this PR gives each file its measured budget. One header line declares the ruled class
spawns the real producer once per single-cause fixture(ruling record 6181973363, letter B), in the grammarscripts/measure-test-shard-timings.mjsreads.readTestBudgetparses all seven.The diff is those seven lines and nothing else. Every chain stays sequential, as on
main. No assertion, case, timeout, project or tier changed.Revised after the seat's review. The first head also ran chains that share no state side by side: uninstall's orders two at a time, and the
--artifactCONTROL beside boots 1 and 2. That made each file faster locally, but it is packing on CI's shared box. It also added about 3.3 GB of peak RSS per file (uninstall-cleanups went from 4.2 to 7.6 GB, and four orders at once was memcg-OOM-killed, exit 137). It is taken out. The source-entry oclif manifest (slice 14, a test-onlyglobalSetup) is the lever the seat ruled for this cost. Once it lands, the next refresh re-reads these rows and the budgets can tighten.The budgets, from CI readings of the sequential shape
Each budget is the slowest CI reading of the file as it runs on
main, x 1.25, rounded up to the next 10 s. Two windows feed the reading. One is the card's table: refresh run38340176409, each row the file's slowest run in its window. The other is the hourly full battery run40290659753(schedule, 2026-10-26T08:12Z, head05f7758f05), read from its Test Core aggregator table and shard job logs.uninstall-cleanupsjobshooksjobs-shared-namejobs-pullhandlersboot-stepsRows this closes
When the next refresh reads each file under its declared budget, these seven #23181 rows close, all
(integration):package-install-local-uninstall-cleanups,-jobs,-hooks,-jobs-shared-name,-jobs-pull,-handlers,-boot-steps.Acceptance notes
main's. For the record, a shuffled run of the family (--sequence.shuffle --sequence.seed=23181) on the base files passed 77/77 under the default workers (387.5 s, peak tree RSS 11.2 GB).hooks' andjobs-pull's boot 2 (the rehydrate of an entry an earlier build wrote) onto its own home. The headers frame it as a restart of the same home.Clause-②: no
Metadata-protocol: none
skip-changeset: the diff is seven comment lines underpackages/cli/test/.@objectstack/cli'sfilesisdist,README.mdandCHANGELOG.md, so nothing published moves.Local gates (head
ff0ca4cc8)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 55 commands on this diff, and each was run with its exit code captured by redirect before any pipe. 54 exited 0.check:dual-build-cjs-loadsexited 3 (PREREQUISITE NOT MET: dist of packages outside this diff is not built here). It is NOT MEASURED locally, and CI runs it.--ran: "55 derived, 54 run, 1 NOT-MEASURED, 0 UNRUN", exit 0.pnpm --filter @objectstack/cli typecheck: VERDICT command-exit 0.eslint --no-inline-config packages/cli: exit 0.🤖 Generated with Claude Code
https://claude.ai/code/session_01DcLzU9qErDBr5VydWEmHVM