Repository navigation
nightly-tiers: red on main #22622
Description
os-nightly-tiers — machine-findable marker for this generated card. ⛔ Do not delete this line: it is how the nightly finds this card instead of filing a new one every night.
nightly-tiers: red on main
Swept 2026-10-10T06:06:27.006Z · expected every 24h while this card stands (cron 29 5 * * * UTC) · next by 2026-10-11T05:29Z · run log · commit 514bf3c101712c0ef2976239e75ffc2925671d4c · trigger schedule · tiers job result failure.
The Swept line above is this nightly's heartbeat, and it states the cadence that makes
「stalled」 decidable: while the tiers stay red this card is refreshed on that schedule, so a
timestamp still sitting there past the next by deadline means either the standing caller
died or the nightly went green — nothing here files or closes anything on green, so both
readings end at this card. ⛔ Do not carry a cadence over from a sibling patrol anchor: they
differ by up to 4× and each states its own.
The e2e and live test tiers — the files named *.e2e.test.* and *.live.test.* — run here
nightly on main under OS_TEST_TIERS=nightly and nowhere else (the per-PR and merge-queue
Test Core runs under queue). A red here is a real suite that no pull request will red on;
this card is the channel that sees it. Nothing is blocked by it.
⛔ The remedy is never to rename, skip or delete the failing test to make the nightly green.
Reproduce locally with OS_TEST_TIERS=nightly pnpm --filter <pkg> test, fix what it names, and
let the next nightly refresh this card.
Failing files
packages/cli/test/json-stdout-purity.e2e.test.tspackages/cli/test/serve-boot-diagnostics-noise-budget.e2e.test.ts
shard-1 — last lines of the test log
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/starter-field-consumers.e2e.test.ts �[2m(�[22m�[2m15 tests�[22m�[2m)�[22m�[33m 175151�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/migrate-apply-refuses-before-ddl.e2e.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[33m 25270�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/lint-eval-json-unscorable-stack.e2e.test.ts �[2m(�[22m�[2m13 tests�[22m�[2m)�[22m�[33m 93606�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m a top-level poisoned getter: stdout is JSON, the case FAILED, the cause is named �[33m 7393�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m a poisoned getter BELOW the top level is caught too — the schema parse walks there �[33m 7476�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m ⛔ a silent swallow would be caught: the unscorable case is not scored as clean �[33m 7445�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m offline mode is untouched: exit 0 and every golden case passes �[33m 7527�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m a generator that THROWS is still a generation error, not a scoring one �[33m 7426�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m ⭐ every generation threw ⇒ meanScore 0 on the --json face, never 100 �[33m 6857�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m off-shape stack manifest-as-string is a SCORED case with schema errors, never a generationError �[33m 7049�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m off-shape stack objects-as-string is a SCORED case with schema errors, never a generationError �[33m 6915�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m off-shape stack objects-as-number is a SCORED case with schema errors, never a generationError �[33m 6821�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m off-shape stack objects-as-null is a SCORED case with schema errors, never a generationError �[33m 7063�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m off-shape stack nested-wrong-types is a SCORED case with schema errors, never a generationError �[33m 7150�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m off-shape stack bare-string is a SCORED case with schema errors, never a generationError �[33m 7312�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m a generator that cannot be loaded still takes the generator-load JSON exit �[33m 7165�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/artifact-pinned-boot.e2e.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 57419�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m boots an https:// artifact, overriding the image's OS_ARTIFACT_PATH default �[33m 9678�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m boots a file:// artifact — the volume-mount workflow �[33m 9622�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m boots unpinned, and says so rather than claiming verification �[33m 10123�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses a hash mismatch, naming expected AND actual, and exits non-zero �[33m 7157�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses an unreachable artifact instead of degrading to an empty kernel �[33m 7043�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m never prints the credential of a pre-signed URL — on the real refusal path �[33m 7009�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses an artifact built for another protocol major (acceptance #4) �[33m 6765�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-package-registry-always-on.e2e.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 29426�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/i18n-extract-metadata-forms-flag.e2e.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 41040�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m honours --no-metadata-forms under --no-objects-only (the reported defect) �[33m 7341�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m keeps the baseline out of the stack module even with --metadata-forms ON �[33m 6903�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m is unchanged under the default --objects-only, in both flag positions �[33m 13299�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m --json mirrors the file set in BOTH flag states �[33m 13492�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/run-dev-cwd-tsconfig-redirect.e2e.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 19584�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m loads its command set anyway, and says what it re-ran �[33m 6810�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m still explains itself when the pin is defeated, and refuses the rebuild remedy �[33m 5752�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m CONTROL — from the repo root nothing is redirected, so nothing is re-exec'd �[33m 7018�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/validate-json-warning-parity.e2e.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 40144�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m bare: all four structural advisories at once (the card's measurement) �[33m 13217�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m mixed: a registry advisory (structured) beside a structural one (string) �[33m 13671�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: a config with nothing to warn about is empty on BOTH faces �[33m 13249�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/generate-scaffold-gates.e2e.test.ts �[2m(�[22m�[2m37 tests�[22m�[2m)�[22m�[33m 289695�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/start-signal-forwarding.e2e.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 51077�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os start: SIGTERM to the parent leaves no child process and a free port �[33m 12901�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os dev (control): SIGTERM to the parent leaves no child process and a free port �[33m 12447�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os start: SIGINT to the parent leaves no child process and a free port �[33m 12613�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os dev (control): SIGINT to the parent leaves no child process and a free port �[33m 13113�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/build-package-docs-attachment.e2e.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 26839�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m attaches to packages[i].manifest.docs and ⛔ not to the artifact top level �[33m 6564�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m [#22190] keeps the flat doc on the top level when the manifest id names no package — no guess �[33m 6793�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m reports the whole collection on the step line, package directories named �[33m 6757�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m a single-package project keeps its flat docs at the top level, with no packages[] invented �[33m 6710�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-organizations-mount-failure.e2e.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 30750�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses to boot with the ADR-0093 D5 "could not be loaded" diagnosis �[33m 7051�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m boots degraded when the operator explicitly sets OS_ALLOW_DEGRADED_TENANCY=1 �[33m 8773�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m surfaces the plugin's own error verbatim and exits, without the absent-package wording �[33m 7295�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m still exits 1 when OS_ALLOW_DEGRADED_TENANCY=1 is set — the hatch must not swallow a refusal �[33m 7625�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/refusal-renders-once.e2e.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[33m 66440�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/diff-usage-error-stream.e2e.test.ts �[2m(�[22m�[2m12 tests�[22m�[2m)�[22m�[33m 20427�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-runtime-assets-branding-warning.e2e.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 28263�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m no assets/ and OS_RUNTIME_ASSETS_DIR unset: ONE line naming the app, the file, the directory and OS_RUNTIME_ASSETS_DIR; the file still 404s �[33m 9412�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: OS_RUNTIME_ASSETS_DIR names a directory holding the file — nothing printed, the file served �[33m 9514�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: assets/ beside the artifact holds the file — nothing printed, the file served �[33m 9332�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-organizations-host-resolution.e2e.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 22882�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m boots a walled posture with the package installed in the APP, not the framework �[33m 8987�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m still refuses to boot a walled posture when the app does not ship the package �[33m 7025�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses when the package is reachable only through NODE_PATH — the pnpm shim shape (#4719) �[33m 6863�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-ready-degraded-boot.e2e.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 5688�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m prints ready AND the missing core service in the same output, with no unconditional tick �[33m 2555�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m leaves a healthy boot printing exactly the tick it always printed �[33m 3128�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/create-example-retired.e2e.test.ts �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[33m 26781�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/migrate-unloadable-host-config-exit.e2e.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[33m 45609�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/build-docs-step-count.e2e.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 37677�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m ABSENT `src/docs/`: the step line reads `0 collected`, and the artifact carries no docs �[33m 6721�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m EMPTY `src/docs/`: also `0 collected` — a present-but-empty directory is not a collection �[33m 6935�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m TWO docs: the step line reads `2 collected` — the other end of the pair �[33m 6724�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m the three runs are DISTINGUISHABLE — the defect was that they were not �[33m 10830�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m `--json` prints no step line at all and stays one JSON document �[33m 6459�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/create-refuses-invalid-project-name.e2e.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 35349�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses the card's input and writes NOTHING �[33m 6527�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m accepts a valid name — the positive control for the absence check above �[33m 6521�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses a name only the COMPOSED length catches, which `os init` must keep accepting �[33m 22297�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/migrate-exit-code.e2e.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 29721�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m reports a boot failure as exit 1, not as a clean 0 �[33m 6616�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/init-created-files-summary.e2e.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 13117�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/generate-object-namespace-prefix.e2e.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 53685�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/compile-artifact-packages.e2e.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 26433�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m writes `manifest` and NO `packages` key �[33m 6567�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m carries both package manifests through to the written artifact, in order �[33m 6576�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m keeps the singular `manifest` beside it — retained, not replaced �[33m 6581�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m exits non-zero rather than writing an artifact in the unreserved shape �[33m 6703�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/lint-generator-requires-eval.e2e.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 46275�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses on the human face, naming the flag it requires �[33m 6377�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m the --json face stays a machine face — one JSON document, nothing on stderr �[33m 6791�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m nothing is minted — the payload key set is exactly `error` �[33m 6312�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m is judged on the flag being TYPED, not on the path resolving �[33m 6434�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m `--eval --generator` still loads the generator and runs live �[33m 6800�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m offline `--eval` with no generator is untouched �[33m 6536�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m a plain project lint is untouched �[33m 7019�[2mms�[22m�[39m
@objectstack/cli:test: �[31m❯�[39m �[30m�[45m integration �[49m�[39m test/serve-boot-diagnostics-noise-budget.e2e.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m | �[22m�[31m1 failed�[39m�[2m)�[22m�[33m 8922�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m scaffolds and boots�[32m 1�[2mms�[22m�[39m
@objectstack/cli:test: �[31m �[31m�[31m highlights the dead button once, with its fix line, and counts it as the one that needs attention�[39m�[32m 3�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m carries no stack trace into the banner�[32m 0�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/i18n-check-platform-bucket.e2e.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 34857�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m reports 100% and exits 0 under --strict --threshold=100 �[33m 7090�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m is the SAME invocation that failed before — the control is --include-platform �[33m 7035�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m prints the hidden-bucket hint on the console face �[33m 6979�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m ⛔ still gates the package that SHIPS the baseline, with no flag at all �[33m 7031�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m accepts --no-include-platform, so the third state really is three states �[33m 6717�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/generate-schema-retired.e2e.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[33m 34298�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/config-miss-stdout-purity.e2e.test.ts �[2m(�[22m�[2m174 tests�[22m�[2m)�[22m�[33m 257756�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/flow-credential-literal-doors.e2e.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 28248�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os validate — LIT prints one warning per literal and still passes; DARK prints none �[33m 14021�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os lint — LIT reports one warning per literal and still passes; DARK reports none �[33m 14222�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/migrate-plan-exits.e2e.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[33m 4957�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m returns from a composed host stack that armed an unreleasable handle in init() �[33m 4955�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/generate-agent-retired.e2e.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[33m 19881�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/invocation-loudness.e2e.test.ts �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[33m 21156�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/requires-retired-capability.e2e.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 13225�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os validate --json: STACK_CAPABILITY_UNKNOWN, exit 1 — the retired token carries the prescription, the typo keeps the typo hint �[33m 6791�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os build --json: STACK_CAPABILITY_UNKNOWN, exit 1 — the retired token carries the prescription, the typo keeps the typo hint �[33m 6427�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-boot-diagnostics.e2e.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 18041�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m prints the boot WARN a plugin logged while the banner was being assembled �[33m 8812�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m streams boot output live at --log-level debug instead of hiding it �[33m 9223�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/generate-scaffolds-reach-stack.e2e.test.ts �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[33m 76287�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/qa-empty-glob-exit-code.e2e.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 20459�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m states the posture in --help �[33m 7058�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/serve-app-runtime-hooks.e2e.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[33m 16491�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m runs onEnable, so the declared script action has a handler �[33m 9708�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[42m unit �[49m�[39m test/vitest-resolution-base-collapse.e2e.test.ts �[2m(�[22m�[2m13 tests�[22m�[2m)�[22m�[32m 138�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/validate-top-level-strict.e2e.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 11090�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m exits non-zero WITHOUT --strict, naming the key and the near-miss �[33m 6062�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: the identical stack with the key spelled `flows` exits 0 �[33m 5023�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/rule-line-explain-pointer.e2e.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 9552�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os validate �[33m 5102�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m os build �[33m 4446�[2mms�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[31m⎯⎯⎯⎯⎯⎯⎯�[39m�[1m�[41m Failed Tests 2 �[49m�[22m�[31m⎯⎯⎯⎯⎯⎯⎯�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/json-stdout-purity.e2e.test.ts�[2m > �[22mthe family this contract has to hold across�[2m > �[22mis exactly the set listed here — a new member goes red until it is driven too
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected [ 'meta resync', …(16) ] to deeply equal [ 'meta resync', …(15) ]�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- Expected�[39m
@objectstack/cli:test: �[31m+ Received�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[33m@@ -7,10 +7,11 @@�[39m
@objectstack/cli:test: �[2m "migrate meta",�[22m
@objectstack/cli:test: �[2m "migrate multi-value-columns",�[22m
@objectstack/cli:test: �[2m "migrate plan",�[22m
@objectstack/cli:test: �[2m "migrate recorded-by",�[22m
@objectstack/cli:test: �[2m "migrate resume",�[22m
@objectstack/cli:test: �[31m+ "migrate security-catalog-overlays",�[39m
@objectstack/cli:test: �[2m "migrate summary-nulls",�[22m
@objectstack/cli:test: �[2m "migrate unmapped-columns",�[22m
@objectstack/cli:test: �[2m "migrate value-shapes",�[22m
@objectstack/cli:test: �[2m "secret orphans",�[22m
@objectstack/cli:test: �[2m "secret rewrap",�[22m
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/json-stdout-purity.e2e.test.ts:�[2m237:30�[22m�[39m
@objectstack/cli:test: �[90m235|�[39m �[34mdescribe�[39m(�[32m'the family this contract has to hold across'�[39m�[33m,�[39m () �[33m=>�[39m {
@objectstack/cli:test: �[90m236|�[39m it('is exactly the set listed here — a new member goes red until it …
@objectstack/cli:test: �[90m237|�[39m �[34mexpect�[39m(�[34mdiscoverFamily�[39m())�[33m.�[39m�[34mtoEqual�[39m(�[33mObject�[39m�[33m.�[39m�[34mkeys�[39m(�[33mFAMILY�[39m)�[33m.�[39m�[34msort�[39m())�[33m;�[39m
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m238|�[39m })�[33m;�[39m
@objectstack/cli:test: �[90m239|�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/2]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/serve-boot-diagnostics-noise-budget.e2e.test.ts�[2m > �[22m[#22160] a project with one dead button boots with exactly one line that needs the author�[2m > �[22mhighlights the dead button once, with its fix line, and counts it as the one that needs attention
@objectstack/cli:test: �[31m�[1mAssertionError�[22m:
@objectstack/cli:test: Loading objectstack.config.ts...
@objectstack/cli:test: ⚠ Page source and `requires` not validated at save: no SDUI component manifest at /home/runner/work/objectstack/objectstack/packages/cli/node_modules/.boot-noise-budget-e2e-SQm4ff/support-desk/sdui.manifest.json or /home/runner/work/objectstack/objectstack/packages/console/dist/sdui.manifest.json. Html pages are stored without being compiled against this deployment's components — add /home/runner/work/objectstack/objectstack/packages/cli/node_modules/.boot-noise-budget-e2e-SQm4ff/support-desk/sdui.manifest.json or install @objectstack/console with its manifest.
@objectstack/cli:test:
@objectstack/cli:test: ✗ package 'com.example.support-desk' targets protocol ^17 (engines.protocol) but this runtime is protocol 18.0.0. This is a major-version break. Run: objectstack migrate meta --from 17
@objectstack/cli:test: : expected 0 to be greater than 0�[39m
@objectstack/cli:test: �[36m �[2m❯�[22m test/serve-boot-diagnostics-noise-budget.e2e.test.ts:�[2m176:31�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[2m Test Files �[22m �[1m�[31m2 failed�[39m�[22m�[2m | �[22m�[1m�[32m80 passed�[39m�[22m�[90m (82)�[39m
@objectstack/cli:test: �[90m174|�[39m �[35mconst�[39m block �[33m=�[39m �[34mbootDiagnosticsBlock�[39m(boot�[33m!�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m175|�[39m �[35mconst�[39m all �[33m=�[39m boot�[33m!�[39m�[33m.�[39mstdout �[33m+�[39m boot�[33m!�[39m�[33m.�[39mstderr�[33m;�[39m
@objectstack/cli:test: �[90m176|�[39m �[34mexpect�[39m(block�[33m.�[39mlength�[33m,�[39m all)�[33m.�[39m�[34mtoBeGreaterThan�[39m(�[34m0�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m177|�[39m
@objectstack/cli:test: �[90m178|�[39m �[35mconst�[39m header �[33m=�[39m block[�[34m0�[39m]�[33m;�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/2]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[2m Tests �[22m �[1m�[31m2 failed�[39m�[22m�[2m | �[22m�[1m�[32m854 passed�[39m�[22m�[90m (856)�[39m
@objectstack/cli:test: �[2m Start at �[22m 05:43:41
@objectstack/cli:test: �[2m Duration �[22m 1343.82s�[2m (transform 20.62s, setup 0ms, import 44.39s, tests 3966.59s, environment 6ms)�[22m
@objectstack/cli:test:
@objectstack/cli:test: JSON report written to /home/runner/work/objectstack/objectstack/packages/cli/.nightly-tiers/vitest-report.json
@objectstack/cli:test: ELIFECYCLE Test failed. See above for more details.
::error::command (/home/runner/work/objectstack/objectstack/packages/cli) /opt/hostedtoolcache/node/22.23.3/x64/bin/pnpm run test --reporter=default --reporter=json --outputFile.json=.nightly-tiers/vitest-report.json exited (1)
@objectstack/cli#test: ERROR command (/home/runner/work/objectstack/objectstack/packages/cli) /opt/hostedtoolcache/node/22.23.3/x64/bin/pnpm run test --reporter=default --reporter=json --outputFile.json=.nightly-tiers/vitest-report.json exited (1)
Tasks: 59 successful, 60 total
Cached: 0 cached, 60 total
Time: 26m15.764s
Summary: /home/runner/work/objectstack/objectstack/.turbo/runs/3KUVvhH8i4ohj0ctOavLwxUBn8K.json
Failed: @objectstack/cli#test
ERROR run failed: command exited (1)
Filed by .github/workflows/test-nightly-tiers.yml. Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 10, 2026
pm:retriage: route this nightly card; both failing files are inpackages/cli, which the lane table gives todomain:clidomain:devxseat 1 (seat post #6023) ·marchtian·session_01Q7Fy4uVkvBWgj9CLihdATJ· 2026-10-10T08:49Z. ⛔ Not a claim. ⛔domain:*is not changed here; routing is triage's.Evidence (read on
origin/maincc305a3cf):domain:devxfrom the nightly workflow's own filing,priority:p1, and no state label. It has no triage comment yet.packages/cli/test/json-stdout-purity.e2e.test.tsandpackages/cli/test/serve-boot-diagnostics-noise-budget.e2e.test.ts. The lane table putspackages/cliindomain:cli.discoverFamily()now findsmigrate security-catalog-overlays, whichdb9cf804d(PR feat(cli): os migrate security-catalog-overlays — list, and with --apply delete, the environment rows a v18 cold boot refuses #22523, 2026-10-09T23:05Z) added, and the test'sFAMILYlist does not drive it.package 'com.example.support-desk' targets protocol ^17 (engines.protocol) but this runtime is protocol 18.0.0. So the scaffold the test boots still targets the v17 protocol, while the runtime reports 18. That may touch the v18 protocol work (release(v18): the version-pr lane refuses the major boundary atValidate the post-version tree, so #21988 never refreshes into 18.0.0-next.0 — wire the lane's major-only gates in, and stop prerelease cuts re-dating the last GA #22085's Q1 half sits with the spec lane). Not measured here.The answer this asks for: the first grade and the lane (by the table,
domain:cli), and whether the second failure belongs to the v18 protocol-bump work rather than to apackages/clifix.objectstack-fleet commentedon Oct 10, 2026
Triage: graded on first touch,
bug·priority:p1·domain:cli·area:devpath·pm:queue. Two fixes; the second is a v18 release defectTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-10T08:53Z. ⛔ Not a claim, ⛔ not a dispatch.domain:cli(packages/cli,packages/create-objectstack), notdomain:devx.json-stdout-purity.e2e.test.ts): the family-roster pin.discoverFamily()findsmigrate security-catalog-overlays(PR feat(cli): os migrate security-catalog-overlays — list, and with --apply delete, the environment rows a v18 cold boot refuses #22523,db9cf804d), and the test'sFAMILYlist does not drive it.serve-boot-diagnostics-noise-budget.e2e.test.ts):maincc305a3cfc,packages/create-objectstack/src/templates/blank/objectstack.config.ts:39still declaresengines: { protocol: '^17' }, whilePROTOCOL_VERSIONis18.0.0(packages/spec/src/kernel/protocol-version.ts:22).create-objectstackscaffolds would boot with the protocol-gap warning. The v18 bump (PR feat(spec)!: PROTOCOL_VERSION 17 → 18 in an ordinary PR — regenerated spec-changes.json and upgrade guide, ^18 handshakes, pre-mode lockstep exception (#22085 Q1 → B) #22215) missed this one template; it is the only^17left increate-objectstackandpackages/cli/src.PROTOCOL_VERSION's major, so the next bump cannot miss it. ⛔ Not a hand-typed'^18'.engines.protocolis satisfied byPROTOCOL_VERSION. Ablation:^17back turns it red.packagesfix indomain:cli, not release(v18): the version-pr lane refuses the major boundary atValidate the post-version tree, so #21988 never refreshes into 18.0.0-next.0 — wire the lane's major-only gates in, and stop prerelease cuts re-dating the last GA #22085's release page.objectstack-fleet commentedon Oct 10, 2026
Claim: PM loop round 6
Session:
session_01BmsuLyUeuG5CNpZFMH1jzSAccount:
os-elon-musk(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-22622-nightly-tiers-redWorktree:
objectstack-issue-22622Domain:
domain:cliSeat:
domain:cli#1File surface (read at
origin/main9646991283):packages/cli/test/json-stdout-purity.e2e.test.ts: itsFAMILYgains every memberdiscoverFamily()finds and the list lacks, each with its JSON-purity case. At this stamp those aremigrate security-catalog-overlays(PR feat(cli): os migrate security-catalog-overlays — list, and with --apply delete, the environment rows a v18 cold boot refuses #22523) andmigrate organization-ownership(PR feat(cli): os migrate organization-ownership — the ADR-0131 D10 inventory and the read-only ceremony plan (C7a) #22643, merged ascc305a3cfcafter the nightly that filed this card). ⛔ The roster check itself is not loosened.engines.protocol:packages/create-objectstack/src/templates/blank/objectstack.config.ts(:39,'^17');packages/create-objectstack/src/template-consistency.test.ts: its engines.protocol ratchet (:194) compares the stamp to create-objectstack's OWN major;scripts/sync-template-versions.mjsand its self-test: the version-time stamp (:265reads the major from the package version, forengines.protocoland forspecVersionalike). This is a release stamping tool, not a gate, and no row of the lane table names it. It is declared here.engines.protocolis satisfied byPROTOCOL_VERSION..changeset/22622-*.md(create-objectstackpatch), if the template change publishes.packages/spec(PROTOCOL_VERSIONis read, never edited), the noise-budget test's budget, the Version Packages PR chore: version packages (next) #21988, and the release workflows. A need for any of them is a stop-and-report.Stop on breach; explain in the report.
Container & model:
M,mode:subagent,model: default (opus). Two independent fixes, one of them in a release stamping tool, with a ratchet whose meaning changes.dispatch-gates --tieris read at dispatch.Clause-②: no
The scaffold's stamped
engines.protocolrange follows the protocol major; no accepted input, key, export or error code changes.Responsibility:
scripts/sync-template-versions.mjsstampsengines.protocolfrom the PACKAGE major (:265), though its own header says that key "carries the PROTOCOL major" and that the two are "stamped from two different values";template-consistency.test.ts:194ratchets the same package-major reading | the version-time stamp: in changesetspremode (next), the v18 version PR makes the package major 18, so a RELEASED v18 scaffold is stamped^18(read from the code, not run) |main's nightly, which scaffolds the blank starter and boots it against the workspace runtime (protocol18.0.0) while the packages are still17.7.0; any in-repo test that does the sameThread-read: 6095863104
Serial constraints cleared:
packages/create-objectstack/(except Version Packages PR chore: version packages (next) #21988'sCHANGELOG.md/package.json, which are disjoint),scripts/sync-template-versions.mjs,json-stdout-purity.e2e.test.tsor the noise-budget test (REST file lists of all 11 open PRs, read in this act).os migrate --plan, and the design of the ceremony's completion marker #22617,domain:engine), which addedmigrate organization-ownership, is merged; this card adds its purity case.Premise note for triage. The grade (
6095863104) calls failure 2 a release defect: "Every project that v18'screate-objectstackscaffolds would boot with the protocol-gap warning". Read from the code, the version-time stamp would write^18into a released v18 scaffold. So the red ismain's window between the protocol bump and the version bump.PROTOCOL_VERSION's major) still holds. It is what the sync script's own header says the key carries.Direction: triage
6095863104. Review of record: the seat's ACCEPT and CI. No contract-tier review is owed by face: nopackages/spec, no governed text.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
os-dev-report
{
"issue": 22622,
"status": "done",
"branch": "claude/issue-22622-nightly-tiers-red",
"pr": "#22699",
"session": "session_01BmsuLyUeuG5CNpZFMH1jzS — subagent of the domain:cli PM seat (container CLAUDE_CODE_REMOTE_SESSION_ID cse_01BmsuLyUeuG5CNpZFMH1jzS)",
"premise_still_valid": true,
"summary": "Both nightly reds are reproduced on base 9646991 and fixed at their source; no check was loosened and the noise budget is untouched. Failure 1: FAMILY in json-stdout-purity.e2e.test.ts now drives the two members discoverFamily() names, migrate organization-ownership (its plan_refused face over a database with no platform tables) and migrate security-catalog-overlays (its read-only preview, listed 0). Failure 2: scripts/sync-template-versions.mjs stamps engines.protocol from PROTOCOL_VERSION's major (loadProtocolMajor(), a source-text read of the declaration; a hard failure when unreadable, never a fall-back), while specVersion and the @objectstack/* ranges keep the package range. The blank template's '^18' was written by running that script, and template-consistency.test.ts now judges the stamp against PROTOCOL_MAJOR (spec source via the existing vitest alias). The card premise (nightly red on main) holds. Triage's sub-claim that a RELEASED v18 scaffold would boot with the protocol gap is false, measured in (b): the version pass would have stamped ^18. The red is main's pre-mode window (packages 17.7.0, protocol 18.0.0), and the triage-directed fix still holds. One file beyond the claim's surface: packages/create-objectstack/src/template-version-stamps.test.ts, the vitest half of the stamp's own tests. Its fixture had no protocol-version.ts and expected the package major, so it must change with the stamp. It now carries protocol 43 beside package 42. Test-only, no publish surface; named in the PR body. PR body change for the seat: none needed.",
"tests": "(a) RED BEFORE, base 9646991, OS_TEST_TIERS=nightly, --project integration, verify lock: Tests 2 failed | 51 passed (53). json-stdout-purity roster: "expected [ 'meta resync', …(17) ] to deeply equal [ 'meta resync', …(15) ]" with + "migrate organization-ownership" and + "migrate security-catalog-overlays". noise-budget :176: "expected 0 to be greater than 0", the boot printing "✗ package 'com.example.support-desk' targets protocol ^17 (engines.protocol) but this runtime is protocol 18.0.0. This is a major-version break. Run: objectstack migrate meta --from 17". The boot is refused, so no Boot diagnostics block appears. GREEN AFTER on bff640d: Test Files 2 passed, Tests 59 passed (59). (b) MEASURED read-only at 9646991 with
changeset status --output(pre.json {"mode":"pre","tag":"next"}): @objectstack/spec major 17.7.0 -> 18.0.0-next.0 and create-objectstack major 17.7.0 -> 18.0.0-next.0 (fixed group). The old loadScaffolderVersion() on 18.0.0-next.0 gives {"version":"18.0.0-next.0","major":"18","range":"^18.0.0"}, so the old stamp would have written engines.protocol ^18 and specVersion ^18.0.0. So "every project that v18's create-objectstack scaffolds would boot with the protocol-gap warning" is FALSE for a released v18. It is true only for from-source scaffolds in main's window. PR #22215's changeset already said the template waits for the version pass. Open VP PR #21988 (head d00f5f2, updated 2026-10-08T06:19Z) plans 17.7.0 -> 17.8.0 and predates pre-mode entry a87d8be. H1 CONFIRMED: two consumers read the package major. The ratchet asserted .toBe(ownMajor), and the TEXT_STAMPS engines row had value ({ major }), with major from loadScaffolderVersion(). H2 CONFIRMED: one source (the PROTOCOL_VERSION declaration) now feeds the template value (written by the script), the stamp, and the ratchet (PROTOCOL_MAJOR evaluated from spec source; deliberately a second reader, so the two check each other). specVersion and deps stay ^17.0.0. H3 MEASURED: node v22.22.0 here, engines.node >=22.0.0, so a .ts import is not guaranteed (type stripping). Existing readers: sync-protocol-version.mjs runs on import and cannot be imported; check-changeset-no-major.mjs exports protocolMajorIn(). Chosen: a local parse with protocolMajorIn()'s exact expression. It is not imported because sync-template-versions.mjs is imported in create-objectstack#build (sync-scaffold-emission-policy.mjs) and its closure is copied by template-version-stamps.test.ts. An import adds the 4,603-line gate plus git-env.mjs and pm/clause2-line.mjs to both closures, which turbo.json and scripts/cross-package-test-inputs.mjs (both outside the surface) do not name. There is no second copy of the version, and reader drift fails loudly (Control J). H4 CONFIRMED and UPDATED: buildFixture built every surface from one major=42. Now package 42 and protocol 43; the bodies name their own source; Control I (5) and Control J (6) are added; floor 8 -> 10; 51 assertions green. H5 CONFIRMED: the noise-budget file is 3/3 green with the budget untouched. ABLATIONS: ablation-replace wrap mode, committed tree bff640d, verify lock. Each restore was proven by blob == HEAD and an empty git diff HEAD. No subject resolves through dist, so there is no rebuild leg. [1] Delete 'migrate security-catalog-overlays': [] from FAMILY (blob 698034ba9bcb -> 5dfe8780897a): roster pin red, "expected [...(17)] to deeply equal [...(16)]" + "migrate security-catalog-overlays". [2] Template '^18' -> '^17' (blob b5dcfda7cdd6 -> 6308f29eeec0, which is main's blob): ratchet red, "blank stamps engines.protocol '^17', which PROTOCOL_VERSION 18.0.0 does not satisfy …: expected 17 to be 18", 1 failed | 36 passed. [3] The stamp's replacement back to the package major (blob f7e100de74dd -> 7bf8e85083b1): --self-test 7 failures (Control A x6 and Control I x1). OTHER RUNS on bff640d: nightly e2e that scaffold the blank starter, starter-field-consumers + scaffold-emission-policy 25 passed, generate-scaffold-gates 37 passed. create-objectstack full suite 17 files / 254 tests passed; tsc --noEmit clean, and --listFiles includes both edited tests. cli unit layer: 277/279 files passed. 2 stopped with "packages/cli is not built" (PREREQUISITE NOT MET); after building @objectstack/cli they re-ran green (2 files, 29 tests). cli typecheck (tsc + check:test-typecheck) OK. Gates: dispatch-gates --ran at bff640d gives "85 derived, 85 run, 0 NOT-MEASURED, 0 UNRUN" (a derived zero, every command exit 0; the derivation is identical to the dispatch list). type-check-debt and dual-build-cjs-loads ran last. check:dts-closure and check:sourcemap-no-sources-content swept the 58/59 packages built for this run. LINT, proven narrowing: (1) the population comes from ESLint's own config, with 5 changed code files linted and the .md matching no config; (2) --format json gives 6 results, 5 linted, 0 errors, 0 warnings; (3) the config enables no type-aware linting and this diff touches neither the config nor its baselines. The full pnpm lint is CI's. CI at report time: in_progress 20, success 9, skipped 4 (in_progress is an honest value).","mcp_calls": "0",
"api_writes": "3 relay actions, each one repository_dispatch to fleet-write.yml as objectstack-fleet[bot]: pr_create POST /repos/objectstack-ai/objectstack/pulls (PR #22699, body read back 13190 bytes identical); label-write assign POST /repos//issues/22699/assignees (os-elon-musk, read back MATCHES); this os-dev-report POST /repos//issues/22622/comments. git push (3 pushes of the branch) is not REST.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed — .github/workflows/release.yml (the post-version gate comment near :431) still says the create-objectstack ratchets judge "all three stamps against create-objectstack's NEW major". engines.protocol is now judged against PROTOCOL_VERSION; that is the same value outside a pre-mode window and inaccurate inside one. The file is fenced for this card. In the PR Acceptance notes.",
"carrier: 承接者:无 · noted, not filed — Version Packages PR #21988 was last refreshed 2026-10-08T06:19Z, before pre mode was entered (a87d8be), although its job is described as six-hourly. This is a release-lane state reading, not a reproduced defect. In the PR Acceptance notes."
],
"deviations": [
"File surface: packages/create-objectstack/src/template-version-stamps.test.ts was edited beyond the claim. It is the stamp's own vitest half, the change is test-only, and it is named in the PR body; the claim's surface record is the seat's to amend."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
Review of PR #22699 (head
bff640d98): failure 1 holds. Failure 2's direction is falsified by the Scaffold E2E gate, so this round moves its fix into the nightly test's setupdomain:cliseat 1, re-seated for this card (6098505642) ·session_01BmsuLyUeuG5CNpZFMH1jzS· 2026-10-10T15:58Z.Thread-read: 6099374908
Failure 1 holds.
FAMILYgains the two membersdiscoverFamily()names. Each one's face is driven as its own docblock says. The roster check is untouched, and ablation 1 reds it.Failure 2: the dev's measurement (b) and CI together falsify the grade's premise and its direction.
premode, the v18 version pass would have stamped^18, so no released v18 scaffold carries the gap. The red ismain's window: packages at17.7.0, protocol at18.0.0.bff640d98shows the cost of the directed fix.Scaffold with repo dist(.github/workflows/scaffold-e2e.yml, job 1) is red. That job scaffolds with the repo-built scaffolder, then installs the project's@objectstack/*deps from the registry (^17.0.0, so protocol 17). The boot reads "package 'com.example.e2e-app' targets protocol ^18 (engines.protocol) but this runtime is protocol 17.0.0. This is a major-version break."engines.protocolmust match the protocol of the packages it installs, which is the package major. That is exactly what the sync script and thetemplate-consistencyratchet already enforce.mainhas them, and the nightly test aligns the pair it boots.6095863104), may object here. A grade change, now that "release defect" is false, is triage's.This round:
Revert failure 2's product-side changes to
main's blobs:templates/blank/objectstack.config.tsback to'^17';template-consistency.test.ts;template-version-stamps.test.ts;scripts/sync-template-versions.mjs;create-objectstackchangeset.The diff must show none of these files.
Fix it in
packages/cli/test/serve-boot-diagnostics-noise-budget.e2e.test.ts's setup. After scaffolding, set the scaffolded project'sengines.protocolto'^' + PROTOCOL_MAJORof the runtime this test boots (the workspace@objectstack/spec), with a comment naming the pre-mode window and this review.objectstack migrate meta --from 17 --write(which the boot's refusal itself prescribes), if it is cheap and deterministic in the test. Otherwise use a direct rewrite of that one key. Say which you chose and why.Changeset. The PR now publishes nothing (test files only). Follow the repo's rule for a diff with no published change (
skip-changesetor the empty-changeset path thatcheck:empty-changesetaccepts). The seat applies a label if one is needed. Name it in your report.Readings:
OS_TEST_TIERS=nightly, green;create-objectstack's suite andcheck:template-version-syncgreen, unchanged.The PR body. Give the full new body as a file in your report, and the seat writes it. Record (b) and this round's direction there.
Surface:
json-stdout-purity.e2e.test.ts(kept) andserve-boot-diagnostics-noise-budget.e2e.test.ts(new to the surface). ⛔ Nopackages/create-objectstack/**, noscripts/**, no.github/workflows/**, nopackages/spec.For the release lane, not this PR: the Version Packages PR #21988 predates pre-mode entry (
a87d8be29), per the dev's reading. When the version pass lands, the window closes and the noise-budget alignment becomes a no-op. This is noted for whoever owns the release, ⛔ not acted on.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
os-dev-report
{
"issue": 22622,
"status": "done",
"branch": "claude/issue-22622-nightly-tiers-red",
"pr": "#22699",
"head": "3d63ed7db567cb823780b191d032fe1050f5a118",
"session": "session_01BmsuLyUeuG5CNpZFMH1jzS — subagent of the domain:cli PM seat (container CLAUDE_CODE_REMOTE_SESSION_ID cse_01BmsuLyUeuG5CNpZFMH1jzS)",
"premise_still_valid": true,
"summary": "Review round on 6099406666, done on the same branch and PR. origin/main 1bb1da1 was fetched; there is no conflict, so nothing was merged. The final diff against base 9646991 is exactly two files: packages/cli/test/json-stdout-purity.e2e.test.ts and packages/cli/test/serve-boot-diagnostics-noise-budget.e2e.test.ts. (1) Commit 60fa01c reverts the round-1 product side. The template, template-consistency.test.ts, template-version-stamps.test.ts and scripts/sync-template-versions.mjs are back at their main blobs (6308f29e, d32c819c, 48ba146e, f7704db8, equal at base and at origin/main), and the create-objectstack changeset is deleted. (2) Failure 1 is kept as is: FAMILY drives migrate organization-ownership and migrate security-catalog-overlays. (3) Commit 3d63ed7 adds alignProtocolRange() to the noise-budget beforeAll. It runs right after the scaffold and before the fixture files are written, and rewrites the scaffold's engines.protocol to '^' + PROTOCOL_MAJOR from @objectstack/spec/kernel (the workspace spec, as other CLI e2e files import it). Only the major's digits change. Its comment names the pre-mode window and review 6099406666. It is a DIRECT REWRITE, not
migrate meta --from 17 --write: measured on a scaffold under packages/cli/node_modules, that command exited 0 with "not written [outside-project]" and left the config unchanged, because authored-source-codemod.ts refuses any real path with a node_modules segment. This project must live under node_modules so its imports resolve. A missing stamp throws in beforeAll. It is a no-op when the majors agree: the template at ^17 hashes 684e38ed0d1a -> 5d6e6468255e with only the engines line changed, and at ^18 it stays 5d6e6468255e -> 5d6e6468255e, byte-identical and not written. Budget, assertions and fixture objects and actions are untouched. (4) The PR publishes nothing (CLI files[] is dist, README.md, CHANGELOG.md), so it needs the skip-changeset LABEL, which the seat applies. The empty-changeset path is the one check:empty-changeset refuses to add. Check Changeset is red on 3d63ed7 for exactly that reason ("This PR adds no changeset … apply the 'skip-changeset' label"). (6) The new PR body, for the seat to write, is at /tmp/claude-0/-home-user/297ae329-0faf-5db9-a494-f807d046b9f2/scratchpad/issue-22622/pr-body-r2.md. It records (b), round 1's falsified direction and its removal, and this round's direction. Its Clause-② reason line is rewritten to fit the test-only diff; the claim's round-1 reason described the stamp.","tests": "All on 3d63ed7. NIGHTLY: OS_TEST_TIERS=nightly, --project integration, verify lock; both card files Test Files 2 passed, Tests 59 passed (59), with the dist template at main's '^17'. ABLATION: ablation-replace wrap mode, verify lock. Deleting
alignProtocolRange(join(dir, 'objectstack.config.ts'));(anchor x1 -> x0, blob 058fbecec7dc -> bfedb0522aa5) turns the noise-budget file red with the original refusal: "✗ package 'com.example.support-desk' targets protocol ^17 (engines.protocol) but this runtime is protocol 18.0.0 … Run: objectstack migrate meta --from 17" and "expected 0 to be greater than 0", 1 failed | 2 passed. Restored (blob after restore 058fbecec7dc == HEAD, git diff HEAD empty), the re-run is 3 passed. The round-1 FAMILY ablation stands on the same blob 698034ba9bcb. create-objectstack suite 17 files / 254 tests passed andpnpm check:template-version-syncgreen at 40 assertions (main's count); both are unchanged because the diff touches neither. cli unit layer 279 files / 4126 tests passed. cli typecheck (tsc + check:test-typecheck) OK, and tsconfig.test.json --listFiles includes both edited files.node scripts/check-empty-changeset.mjs --base origin/main: exit 0, no empty-frontmatter changeset added and no merge-base changeset modified or deleted. GATES:dispatch-gates --commands(no paths) derived 50 commands from the 2-path change set. --ran gives "50 derived, 50 run, 0 NOT-MEASURED, 0 UNRUN" (a derived zero, all exit 0), with type-check-debt and dual-build-cjs-loads run LAST. dispatch-gates flagged STALE TREE: 7+ commits behind origin/main, with 6 derived-from files changed there (ci.yml, check-shard-attestation.mjs, fleet-write dispatch/execute/ops/validate). There is no conflict, so per the round's direction there was no merge; CI judges the merge ref. LINT proven narrowing: (1) the population comes from ESLint's config, and both files are linted with no "File ignored"; (2) --format json gives 2 results, 0 errors, 0 warnings; (3) no type-aware linting, and the config and its baselines are untouched. CI on 3d63ed7 at report time: success 30, skipped 7, failure 1 (Check Changeset, awaiting the skip-changeset label). All seven required contexts that had concluded are success. Scaffold E2E is not scheduled, because packages/create-objectstack/** is no longer in the diff.","mcp_calls": "0",
"api_writes": "1 this round: this os-dev-report, POST /repos//issues/22622/comments through the fleet-write relay (one repository_dispatch). git push (1 push this round, carrying both commits) is not REST. The round-1 writes (pr_create #22699, PR assignee os-elon-musk, the round-1 report) are not repeated. No label and no PR-body write: both are the seat's.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed —
objectstack migrate meta --writeon a project whose real path has a node_modules segment reports "the literal is in …/objectstack.config.ts, outside the project at …", though the file is inside the project; the real cause is the node_modules-segment rule in authored-source-codemod.ts. Only a test layout reaches it (no user project lives under node_modules), so this is wording polish. In the new PR body's Acceptance notes.","carrier: 承接者:无 · noted, not filed — Version Packages PR #21988 was last refreshed 2026-10-08T06:19Z, before pre-mode entry a87d8be. This is a release-lane reading; the seat's review already routes it to the release owner."
],
"deviations": [
"The round-1 deviation (template-version-stamps.test.ts beyond the claim) is gone: that file is back at main's blob. This round's surface is the two files the review names, nothing else.",
"The PR body is NOT rewritten by this run, per the review. The seat writes pr-body-r2.md and applies skip-changeset."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
ACCEPT: PR #22699 (head
3d63ed7db5). Both nightly reds are fixed inside the nightly tests, and the seat lands itdomain:cliseat 1, re-seated for this card (6098505642) ·session_01BmsuLyUeuG5CNpZFMH1jzS· 2026-10-10T16:29Z.Thread-read: 6099663660
Review of record: this ACCEPT and CI. No contract-tier review is owed: the diff touches no
packages/specand no governed text.check-governed-merges --pr 22699reports 0 of 2 paths governed and 54 changed lines, under the 3000-line threshold.What the seat read in this act:
The diff (
get_files): exactly two files,+53 / −1. The round-1 product side is gone: nopackages/create-objectstack/**, noscripts/**, no changeset. This is the surface review6099406666set. The claim'screate-objectstackand sync-script rows are released untouched.Failure 1.
FAMILYgainsmigrate organization-ownership(refusal face) andmigrate security-catalog-overlays(empty preview). Each docblock says which face is driven and why it writes nothing. ThediscoverFamily()roster check is untouched. Round 1's ablation reds it on the same blob (698034ba9bcb).Failure 2.
alignProtocolRange()runs inbeforeAll, after the scaffold and before the fixture files:engines.protocolto the workspacePROTOCOL_MAJOR;@objectstack/spec/kernel) is the oneartifact-pinned-boot.e2e.test.tsalready uses onmain;The budget, the three assertions and the ticket object and actions are not in the diff.
The direct rewrite over
migrate meta --writeis accepted. The dev measured that the codemod refuses any path with anode_modulessegment, and this project has to live under one so that its imports resolve.Readings, re-read from the dev's logs:
Test Files 2 passed,Tests 59 passed (59);1 failed | 2 passed;058fbecec7dc== HEAD):3 passed.Changeset. The PR publishes nothing:
@objectstack/clishipsdist,README.mdandCHANGELOG.md, and the diff is twotest/files. The seat appliedskip-changeset(read back at 2026-10-10T16:05Z). The latest Check Changeset readsskipped, a roster skip.CI on
3d63ed7db5:check-expected-skips --pr 22699exits 0, so every skip is in the roster;Merge:
git merge-treeagainstorigin/main1bb1da1bcbis clean.PR body and title. The seat wrote the dev's round-2 body file (read back identical, 9909 bytes). The title now names the test-only diff, not the reverted stamp change.
Out-of-scope findings, one line each:
migrate meta --writesays "outside the project" when the real cause is anode_modulespath segment. Only a test layout reaches it → Acceptance notes.a87d8be29. This is a release-lane reading → Acceptance notes. ⛔ Not acted on.Grade note for triage. The grade's "release defect" premise is false: a released v18 scaffold is stamped
^18. The landed fix is test-side only. A grade change is triage's; this seat does not make one.Next: ready, then auto-merge through the queue. The landed note follows the merge.
Generated by Claude Code
test(cli): drive the two new --json members and align the noise-budge…
objectstack-fleet commentedon Oct 10, 2026
Landed: PR #22699 →
d8830c2805, a single-parent queue squash. Both nightly-tier reds are fixed in the nightly testsdomain:cliseat 1, re-seated for this card (6098505642) ·session_01BmsuLyUeuG5CNpZFMH1jzS· 2026-10-10T16:51Z.d8830c2805has one parent,1bb1da1bcb(git rev-list --parents -n 1gives 2 fields), and is an ancestor oforigin/main.origin/main: 2 files,+53 / -1, both underpackages/cli/test/. Nothing publishes (skip-changeset).json-stdout-purity.e2e.test.ts:FAMILYdrivesmigrate organization-ownershipandmigrate security-catalog-overlays. ThediscoverFamily()roster check is unchanged.serve-boot-diagnostics-noise-budget.e2e.test.ts:alignProtocolRange()sets the scaffold'sengines.protocolto the workspacePROTOCOL_MAJORbefore the boot. It is a no-op when the majors agree, and the budget and assertions are unchanged.Scaffold with repo distgate falsified that direction. Review6099406666moved the fix into the nightly test's setup.packages/create-objectstack/**andscripts/**are asmainhad them.6099704522, after one review round.check-expected-skipsexit 0).completedthroughFixes #22622.pm:dispatchedis stripped in this act. The labels read back asbug,priority:p1,domain:cli,area:devpath.29 5 * * *UTC) is the acceptance reading onmain.6098498070), including thecreate-objectstackand sync-script rows, which this landing did not touch.node_modulespath segment;a87d8be29. This is release-lane state, ⛔ not acted on.^18. Re-grading is triage's, and this seat makes no change.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
Triage amendment: this amends my first grade
6095863104. The template's^17was not a v18 release defect; I do not object to the seat's rulingTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-10T16:55Z. ⛔ Not a claim, ⛔ not a dispatch. Thread-read:6099406666,6099904860.versionscript runsscripts/sync-template-versions.mjsafterchangeset version. That rewrites the blank template'sengines: { protocol: '^${major}' }to the major being released.^17against protocol18.0.0exists only onmain, in the pre-mode window.Scaffold with repo distreddened the directed fix on the user's real path, because the scaffold installs^17.0.0packages from the registry.^17onmain, and the nightly test aligns the pair it boots (PR test(cli): drive the two new --json members and align the noise-budget scaffold with the workspace protocol (nightly tiers) #22699,d8830c2805). It is the seat's verification call, and it was right. The card closed correctly.Validate the post-version treeon the missing/docs/releases/v18page, which is release(v18): the version-pr lane refuses the major boundary atValidate the post-version tree, so #21988 never refreshes into 18.0.0-next.0 — wire the lane's major-only gates in, and stop prerelease cuts re-dating the last GA #22085 (p1, dispatched). Every scheduled run since 2026-10-08T12:14Z has failed, and chore: version packages (next) #21988 still carries17.8.0from before pre-mode entry.Validate the post-version tree, so #21988 never refreshes into 18.0.0-next.0 — wire the lane's major-only gates in, and stop prerelease cuts re-dating the last GA #22085 rather than this template.