Skip to content

test(cli): install-local suites run their independent boot chains at once and declare their spawn budgets - #26214

Merged
objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/project-thread-f9rl92
Oct 26, 2026
Merged

objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/project-thread-f9rl92

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Leehom · project thread

Part of #23181 (slice 10: the @objectstack/cli package-install-local-* family). The card stays open for later slices.

Summary

The seven test/package-install-local-*.integration.test.ts files 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 one beforeAll, and the its only read what the phases recorded. The cost is the boots and installs themselves, spawned from the tsx source entry. One os start to READY takes about 20 s, and one os package install about 15 s. Slice 9's reading on this box: tsx --version takes 10.0 to 10.3 s, dist --version 2.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 grammar scripts/measure-test-shard-timings.mjs reads. readTestBudget parses 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 --artifact CONTROL 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-only globalSetup) 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 run 38340176409, each row the file's slowest run in its window. The other is the hourly full battery run 40290659753 (schedule, 2026-10-26T08:12Z, head 05f7758f05), read from its Test Core aggregator table and shard job logs.

file card window (run) run 40290659753 budget
uninstall-cleanups 275.2 s (38332198724) 270.1 s 350
jobs 160.9 s (38332198724) 161.8 s 210
hooks 117.1 s (38332198724) 114.4 s 150
jobs-shared-name 110.4 s (38332198724) 107.1 s 140
jobs-pull 107.9 s (38335967790) no line in the job logs read 140
handlers 99.4 s (38332198724) 97.8 s 130
boot-steps 94.3 s (38222448090) 68.2 s 120

Rows 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

  • Isolation needs no new proof, because the order of execution is 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).
  • Not taken: moving hooks' and jobs-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 under packages/cli/test/. @objectstack/cli's files is dist, README.md and CHANGELOG.md, so nothing published moves.

Local gates (head ff0ca4cc8)

  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 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-loads exited 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.
  • No ablation and no test run: the diff is header comments only. The integration tier is declared to CI.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DcLzU9qErDBr5VydWEmHVM

…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
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 26, 2026
@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing 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): node scripts/docs-audit/affected-docs.mjs --json f143cd8809aa2f26e2a2d9bccd4a9b17ad51c07a → packageMentionDocs.

…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
@github-actions github-actions Bot added size/xs and removed size/m labels Oct 26, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · ACCEPT · domain:server seat 1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC · 2026-10-26T16:49Z

Head ff0ca4cc8, report 6421761566 (on #23181, slice 10; supersedes 6420506844), claim 6417640032 and its amendments (newest 6420575177). No contract review is owed: the change is test-only and touches no packages/spec/**.

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

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 26, 2026 16:50
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 26, 2026
Merged via the queue into main with commit 1eebbc0 Oct 26, 2026
55 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-f9rl92 branch October 26, 2026 17:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants