test(cli): pin the five cluster-driver diagnosis branches at boot, silence included - #15381
Merged
os-litant merged 2 commits intoSep 4, 2026
Merged
Conversation
WIP: first full draft of the boot-level suite for #14054. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D47qPfEWVPmhguWgBZCi5N
The two mutations, what each one turns red, and why no rebuild is involved (the harness runs `serve.ts` from source through tsx). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D47qPfEWVPmhguWgBZCi5N
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): |
os-litant
marked this pull request as ready for review
September 4, 2026 14:14
os-litant
enabled auto-merge
September 4, 2026 14:14
os-litant
deleted the
claude/issue-14054-serve-cluster-driver-diagnosis-pins
branch
September 4, 2026 14:53
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 #14054
The four cluster-driver diagnosis branches added by #14042, plus the fifth deliberately-silent case, are now asserted at boot against the real
os serveprocess. This is the follow-up the at-tier contract review on #14042 required to exist: a disclosed coverage gap, not a defect. Nothing about what any branch prints changes here.Route: booted
serve.serve.tsis untouched.The card offered two routes and preferred the boot; the boot was measured before it was chosen rather than assumed tractable. A temp host app carrying a fixture
@objectstack/service-clusterreaches the block in ~7.5s per case, andrunServe()already resolves a boot that DIES — which is what all six boots here do. So no seam was extracted,packages/cli/src/commands/serve.tshas zero changed bytes, and the PR is one new file.What is pinned
['custom'][cluster]output of any kind['redis']undeclaredcreateHostImporter's own remedy immediately after itdeclared-unresolvablelistClusterDriversaccessorBoth resolution kinds are pinned because the site interpolates only the kind TOKEN and defers every word of remedy to the importer. The pair is what keeps a per-kind branch from growing here — the #14270 shape the sibling i18n site is deliberately not in.
Why the two silences are measurements rather than empty buffers
Two things stop a silence pin from being vacuous, and both are asserted rather than assumed:
defineCluster()'s documented error, raised from the framework's real registry one statement past the diagnosis. It can only print if the block ran to its end and setclusterConfig, so it is the child's own proof that the reading happened.@objectstack/service-clusteranswers when asked for its driver list. A separate (boot-free) guard pins that isolation on the generated sources. If the accessor were never read, the middle case would be silent too. It is not: it warns.Ablation
Both mutations were applied to
serve.tsin the working tree, run, and reverted withgit checkout HEAD --, byte-identity re-checked against the HEAD blob (b3ab2e36…) after each. No rebuild was needed or done, and that is a property of this harness rather than a skipped step:runServe()spawnsbin/run-dev.js, which runs the command fromsrc/through tsx — the crash case's own stack frame namespackages/cli/src/commands/serve.ts, so the file the ablation edits is the file the child executes.indexOf(...) >= 0becomes< 0) reds five of the six boots, theregisteredsilence among them.no-accessorstays green, correctly — its silence is not bought by visibility.: undefinedbecomes: []) reds exactly one,no-accessor, and nothing else.Not duplicated
serve-cluster-host-resolution.test.tspins the block's SHAPE by source scan (host-anchored loads, module-scopeimportFromHost);packages/services/service-cluster/src/cluster-driver-registry.test.tspins the accessor invariant in both directions. Neither is restated. What is only here is the boot-level fact that each branch fires on its own condition. The new file lands in the derivedintegrationtier automatically (runServe(is a SPAWN signal).Verification, at
bc0c47f1pnpm --filter @objectstack/cli exec vitest run test/serve-cluster-driver-diagnosis.e2e.test.ts test/vitest-tiers-partition.test.ts— 30 passed.pnpm --filter @objectstack/cli typecheck—tsc --noEmitclean,check:test-typecheck: OK.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsat this HEAD on a clean tree: 35 commands, each exit code captured before any pipe. 34 exit 0.pnpm check:dual-build-cjs-loadsexits 3 withPREREQUISITE NOT MET — this gate reads built outputand its own line⛔ This is NOT a pass: nothing was measured— recorded as NOT MEASURED, neither pass nor red; only the CLI dependency closure was built locally, and CI builds the workspace.packages/(check:authz-resolver,check:error-code-casing,check:filter-alias-parity,check:swallow-census-controls) were run rather than read off their silence: all exit 0.pnpm lint(eslint . --no-inline-config, whole repo) — exit 0. No narrowing was needed, so none is claimed.dispatch-gateswarned the tree is behindorigin/mainand that one file it derives from changed there,scripts/pm/check-skill-line-ratchet.mjs. That file's surface is a closed ENUMERATION of.claude/skills/**andskills/**paths; both copies were diffed and the change is a ceiling raise plus comments. It cannot match this PR's single path either way, so the derived union stands.No changeset: this PR adds one test file and
packages/clipublishesfiles: ["dist", "README.md", "CHANGELOG.md"], so nothing is released from any package.skip-changesetis applied.Generated by Claude Code