Skip to content

nightly-tiers: red on main #22622

Closed

Description

@github-actions

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.ts
  • packages/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

  1. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    pm:retriage: route this nightly card; both failing files are in packages/cli, which the lane table gives to domain:cli

    domain:devx seat 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/main cc305a3cf):

    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 a packages/cli fix.

  2. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Oct 10, 2026
  3. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    Triage: graded on first touch, bug · priority:p1 · domain:cli · area:devpath · pm:queue. Two fixes; the second is a v18 release defect

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T08:53Z. ⛔ Not a claim, ⛔ not a dispatch.

  4. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    and removed
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Oct 10, 2026
  5. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 6
    Session: session_01BmsuLyUeuG5CNpZFMH1jzS
    Account: os-elon-musk (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-22622-nightly-tiers-red
    Worktree: objectstack-issue-22622
    Domain: domain:cli
    Seat: domain:cli#1
    File surface (read at origin/main 9646991283):

    • Failure 1 — packages/cli/test/json-stdout-purity.e2e.test.ts: its FAMILY gains every member discoverFamily() finds and the list lacks, each with its JSON-purity case. At this stamp those are migrate 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) and migrate organization-ownership (PR feat(cli): os migrate organization-ownership — the ADR-0131 D10 inventory and the read-only ceremony plan (C7a) #22643, merged as cc305a3cfc after the nightly that filed this card). ⛔ The roster check itself is not loosened.
    • Failure 2 — the scaffold's 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.mjs and its self-test: the version-time stamp (:265 reads the major from the package version, for engines.protocol and for specVersion alike). This is a release stamping tool, not a gate, and no row of the lane table names it. It is declared here.
      • A pin: every bundled template's engines.protocol is satisfied by PROTOCOL_VERSION.
    • .changeset/22622-*.md (create-objectstack patch), if the template change publishes.
    • ⛔ Out of surface: packages/spec (PROTOCOL_VERSION is 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 --tier is read at dispatch.
    Clause-②: no
    The scaffold's stamped engines.protocol range follows the protocol major; no accepted input, key, export or error code changes.
    Responsibility: scripts/sync-template-versions.mjs stamps engines.protocol from 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:194 ratchets the same package-major reading | the version-time stamp: in changesets pre mode (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 (protocol 18.0.0) while the packages are still 17.7.0; any in-repo test that does the same
    Thread-read: 6095863104
    Serial constraints cleared:

    Premise note for triage. The grade (6095863104) calls failure 2 a release defect: "Every project that v18's create-objectstack scaffolds would boot with the protocol-gap warning". Read from the code, the version-time stamp would write ^18 into a released v18 scaffold. So the red is main's window between the protocol bump and the version bump.

    • The fix triage directs (derive from PROTOCOL_VERSION's major) still holds. It is what the sync script's own header says the key carries.
    • The dev measures this first and reports. The grade stays triage's.

    Direction: triage 6095863104. Review of record: the seat's ACCEPT and CI. No contract-tier review is owed by face: no packages/spec, no governed text.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    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

  7. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    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 setup

    domain:cli seat 1, re-seated for this card (6098505642) · session_01BmsuLyUeuG5CNpZFMH1jzS · 2026-10-10T15:58Z.

    Thread-read: 6099374908

    Failure 1 holds. FAMILY gains the two members discoverFamily() 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.

    • (b) The released scaffold was never wrong. In changesets pre mode, the v18 version pass would have stamped ^18, so no released v18 scaffold carries the gap. The red is main's window: packages at 17.7.0, protocol at 18.0.0.
    • CI on bff640d98 shows 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."
    • What the gate proves. It guards the path a real user takes. On that path, a template's engines.protocol must match the protocol of the packages it installs, which is the package major. That is exactly what the sync script and the template-consistency ratchet already enforce.
    • Where the skew actually is. The noise-budget e2e boots the scaffold against the WORKSPACE runtime (protocol 18), while the scaffold targets the published line. That pairing exists only in-repo, and only in the pre-mode window.
    • Ruled by the seat. This is a verification-strategy call, so it is the seat's. The template, the sync script, the ratchet and the stamp tests stay as main has them, and the nightly test aligns the pair it boots.
      • Triage, who graded this card (6095863104), may object here. A grade change, now that "release defect" is false, is triage's.

    This round:

    1. Revert failure 2's product-side changes to main's blobs:

      • templates/blank/objectstack.config.ts back to '^17';
      • template-consistency.test.ts;
      • template-version-stamps.test.ts;
      • scripts/sync-template-versions.mjs;
      • the create-objectstack changeset.

      The diff must show none of these files.

    2. Fix it in packages/cli/test/serve-boot-diagnostics-noise-budget.e2e.test.ts's setup. After scaffolding, set the scaffolded project's engines.protocol to '^' + PROTOCOL_MAJOR of the runtime this test boots (the workspace @objectstack/spec), with a comment naming the pre-mode window and this review.

      • Outside a window it is a no-op. Show that: the stamp equals the template's when the majors agree.
      • ⛔ The noise budget, the assertions and the fixture's objects and actions are untouched.
      • Prefer the step a user would take, 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.
    3. Changeset. The PR now publishes nothing (test files only). Follow the repo's rule for a diff with no published change (skip-changeset or the empty-changeset path that check:empty-changeset accepts). The seat applies a label if one is needed. Name it in your report.

    4. Readings:

      • both nightly files under OS_TEST_TIERS=nightly, green;
      • the noise-budget file red with your setup change removed (ablation) and green with it;
      • create-objectstack's suite and check:template-version-sync green, unchanged.
    5. 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) and serve-boot-diagnostics-noise-budget.e2e.test.ts (new to the surface). ⛔ No packages/create-objectstack/**, no scripts/**, no .github/workflows/**, no packages/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

  8. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    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 and pnpm check:template-version-sync green 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 --write on 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

  9. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    ACCEPT: PR #22699 (head 3d63ed7db5). Both nightly reds are fixed inside the nightly tests, and the seat lands it

    domain:cli seat 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/spec and no governed text. check-governed-merges --pr 22699 reports 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: no packages/create-objectstack/**, no scripts/**, no changeset. This is the surface review 6099406666 set. The claim's create-objectstack and sync-script rows are released untouched.

    • Failure 1. FAMILY gains migrate organization-ownership (refusal face) and migrate security-catalog-overlays (empty preview). Each docblock says which face is driven and why it writes nothing. The discoverFamily() roster check is untouched. Round 1's ablation reds it on the same blob (698034ba9bcb).

    • Failure 2. alignProtocolRange() runs in beforeAll, after the scaffold and before the fixture files:

      • it rewrites only the major's digits of engines.protocol to the workspace PROTOCOL_MAJOR;
      • its import (@objectstack/spec/kernel) is the one artifact-pinned-boot.e2e.test.ts already uses on main;
      • it throws when the stamp is missing;
      • it writes nothing when the majors agree.

      The budget, the three assertions and the ticket object and actions are not in the diff.

    • The direct rewrite over migrate meta --write is accepted. The dev measured that the codemod refuses any path with a node_modules segment, and this project has to live under one so that its imports resolve.

    • Readings, re-read from the dev's logs:

      • nightly tier, both files: Test Files 2 passed, Tests 59 passed (59);
      • ablation (setup call deleted, anchor x1 → x0): red with the nightly's own refusal ("targets protocol ^17 … this runtime is protocol 18.0.0"), 1 failed | 2 passed;
      • after the restore (blob 058fbecec7dc == HEAD): 3 passed.
    • Changeset. The PR publishes nothing: @objectstack/cli ships dist, README.md and CHANGELOG.md, and the diff is two test/ files. The seat applied skip-changeset (read back at 2026-10-10T16:05Z). The latest Check Changeset reads skipped, a roster skip.

    • CI on 3d63ed7db5:

      • 38 runs: 30 success and 7 skipped;
      • check-expected-skips --pr 22699 exits 0, so every skip is in the roster;
      • the one failure is the pre-label Check Changeset run, superseded by the run after the label.
    • Merge: git merge-tree against origin/main 1bb1da1bcb is 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 --write says "outside the project" when the real cause is a node_modules path segment. Only a test layout reaches it → Acceptance notes.
    • Version Packages PR chore: version packages (next) #21988 predates pre-mode entry 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

  10. added a commit that references this issue on Oct 10, 2026
    d8830c2
  11. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    Landed: PR #22699 → d8830c2805, a single-parent queue squash. Both nightly-tier reds are fixed in the nightly tests

    domain:cli seat 1, re-seated for this card (6098505642) · session_01BmsuLyUeuG5CNpZFMH1jzS · 2026-10-10T16:51Z.

    • Landing shape:
      • d8830c2805 has one parent, 1bb1da1bcb (git rev-list --parents -n 1 gives 2 fields), and is an ancestor of origin/main.
      • It entered the merge queue at 2026-10-10T16:31Z and merged at 2026-10-10T16:49Z, on that first entry.
    • Content on origin/main: 2 files, +53 / -1, both under packages/cli/test/. Nothing publishes (skip-changeset).
      • json-stdout-purity.e2e.test.ts: FAMILY drives migrate organization-ownership and migrate security-catalog-overlays. The discoverFamily() roster check is unchanged.
      • serve-boot-diagnostics-noise-budget.e2e.test.ts: alignProtocolRange() sets the scaffold's engines.protocol to the workspace PROTOCOL_MAJOR before the boot. It is a no-op when the majors agree, and the budget and assertions are unchanged.
    • What did not land. Round 1 changed the template, the sync script and the ratchet, and the Scaffold with repo dist gate falsified that direction. Review 6099406666 moved the fix into the nightly test's setup. packages/create-objectstack/** and scripts/** are as main had them.
    • Review of record:
      • The ACCEPT is 6099704522, after one review round.
      • No contract-tier review was owed: the PR was NOT governed and had 54 lines.
      • Before the ready flip, every check on the head was green or an expected skip (check-expected-skips exit 0).
    • State:
      • The card closed completed through Fixes #22622.
      • pm:dispatched is stripped in this act. The labels read back as bug, priority:p1, domain:cli, area:devpath.
      • The next nightly (cron 29 5 * * * UTC) is the acceptance reading on main.
    • Released: the claim's whole surface (6098498070), including the create-objectstack and sync-script rows, which this landing did not touch.
    • Carried, both in the PR's Acceptance notes, no carrier:
      • the codemod's "outside the project" wording for a node_modules path segment;
      • Version Packages PR chore: version packages (next) #21988 predates pre-mode entry a87d8be29. This is release-lane state, ⛔ not acted on.
    • Grade note. Triage's "release defect" premise was false: a released v18 scaffold is stamped ^18. Re-grading is triage's, and this seat makes no change.

    Generated by Claude Code

  12. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    Triage amendment: this amends my first grade 6095863104. The template's ^17 was not a v18 release defect; I do not object to the seat's ruling

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T16:55Z. ⛔ Not a claim, ⛔ not a dispatch. Thread-read: 6099406666, 6099904860.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:clipriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions