Repository navigation
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-03T06:09:56.461Z · expected every 24h while this card stands (cron 29 5 * * * UTC) · next by 2026-10-04T05:29Z · run log · commit 24dc7c113460d1c8dfb4d0fb7b45542b86dd1ea6 · 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/migrate-exit-code.e2e.test.ts
shard-1 — last lines of the test log
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m `--eval` with the flag absent still runs the offline eval �[33m 7282�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m `--eval --generator <module>` still loads the generator and runs live �[33m 6761�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m an unresolvable generator path refuses exactly as it always has �[33m 7088�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m a plain project lint is untouched �[33m 7217�[2mms�[22m�[39m
@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 173505�[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 24652�[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 93353�[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 7110�[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 7050�[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 7041�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m offline mode is untouched: exit 0 and every golden case passes �[33m 7407�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m a generator that THROWS is still a generation error, not a scoring one �[33m 7251�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m ⭐ every generation threw ⇒ meanScore 0 on the --json face, never 100 �[33m 6942�[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 7505�[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 7303�[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 7057�[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 7254�[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 6988�[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 7265�[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 58133�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m boots an https:// artifact, overriding the image's OS_ARTIFACT_PATH default �[33m 10141�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m boots a file:// artifact — the volume-mount workflow �[33m 9649�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m boots unpinned, and says so rather than claiming verification �[33m 9955�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses a hash mismatch, naming expected AND actual, and exits non-zero �[33m 7014�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses an unreachable artifact instead of degrading to an empty kernel �[33m 7134�[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 7269�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses an artifact built for another protocol major (acceptance #4) �[33m 6950�[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 43880�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m honours --no-metadata-forms under --no-objects-only (the reported defect) �[33m 7378�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m keeps the baseline out of the stack module even with --metadata-forms ON �[33m 7388�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m is unchanged under the default --objects-only, in both flag positions �[33m 14573�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m --json mirrors the file set in BOTH flag states �[33m 14534�[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 30944�[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 43060�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m bare: all four structural advisories at once (the card's measurement) �[33m 14320�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m mixed: a registry advisory (structured) beside a structural one (string) �[33m 14509�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: a config with nothing to warn about is empty on BOTH faces �[33m 14225�[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 20719�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m loads its command set anyway, and says what it re-ran �[33m 7403�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m still explains itself when the pin is defeated, and refuses the rebuild remedy �[33m 6141�[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 7171�[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 31621�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses to boot with the ADR-0093 D5 "could not be loaded" diagnosis �[33m 7189�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m boots degraded when the operator explicitly sets OS_ALLOW_DEGRADED_TENANCY=1 �[33m 9737�[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 7329�[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 7358�[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 54348�[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 13814�[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 13508�[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 13644�[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 13381�[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 21536�[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 24223�[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 9583�[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 7302�[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 7334�[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 293144�[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 6426�[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 2801�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m leaves a healthy boot printing exactly the tick it always printed �[33m 3621�[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 28589�[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 49374�[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 40856�[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 7420�[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 7236�[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 6867�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m the three runs are DISTINGUISHABLE — the defect was that they were not �[33m 11414�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m `--json` prints no step line at all and stays one JSON document �[33m 7906�[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 37123�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses the card's input and writes NOTHING �[33m 7207�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m accepts a valid name — the positive control for the absence check above �[33m 10061�[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 19850�[2mms�[22m�[39m
@objectstack/cli:test: �[31m❯�[39m �[30m�[45m integration �[49m�[39m test/migrate-exit-code.e2e.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m | �[22m�[31m2 failed�[39m�[2m)�[22m�[33m 32842�[2mms�[22m�[39m
@objectstack/cli:test: �[31m �[31m�[31m exits 0 on every run, not a fresh non-zero code each time�[39m�[32m 7�[2mms�[22m�[39m
@objectstack/cli:test: �[31m �[31m×�[31m really did the work it is reporting success for — this is not a masked exit�[39m�[32m 3�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m reports its duration IN THE PAYLOAD — the value that used to be the exit code�[32m 0�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m still exits promptly — #4813 stays fixed�[32m 0�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m reports a boot failure as exit 1, not as a clean 0 �[33m 7325�[2mms�[22m�[39m
@objectstack/cli:test: �[32m✓�[39m �[30m�[45m integration �[49m�[39m test/build-package-docs-attachment.e2e.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 21635�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m attaches to packages[i].manifest.docs and ⛔ not to the artifact top level �[33m 7246�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m reports the whole collection on the step line, package directories named �[33m 7261�[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 7119�[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 57859�[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 14235�[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 29459�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m writes `manifest` and NO `packages` key �[33m 7216�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m carries both package manifests through to the written artifact, in order �[33m 7571�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m keeps the singular `manifest` beside it — retained, not replaced �[33m 7195�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m exits non-zero rather than writing an artifact in the unreserved shape �[33m 7471�[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 48852�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m refuses on the human face, naming the flag it requires �[33m 7036�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m the --json face stays a machine face — one JSON document, nothing on stderr �[33m 6970�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m nothing is minted — the payload key set is exactly `error` �[33m 6646�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m is judged on the flag being TYPED, not on the path resolving �[33m 6828�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m `--eval --generator` still loads the generator and runs live �[33m 7041�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m offline `--eval` with no generator is untouched �[33m 7319�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m a plain project lint is untouched �[33m 7005�[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 36064�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m reports 100% and exits 0 under --strict --threshold=100 �[33m 7253�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m is the SAME invocation that failed before — the control is --include-platform �[33m 7108�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m prints the hidden-bucket hint on the console face �[33m 7140�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m ⛔ still gates the package that SHIPS the baseline, with no flag at all �[33m 7136�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m accepts --no-include-platform, so the third state really is three states �[33m 7410�[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 35558�[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 30020�[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 15116�[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 14898�[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 273943�[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 5027�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m returns from a composed host stack that armed an unreleasable handle in init() �[33m 5026�[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 22643�[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 21092�[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 14623�[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 7074�[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 7544�[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 19829�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m prints the boot WARN a plugin logged while the banner was being assembled �[33m 9853�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m streams boot output live at --log-level debug instead of hiding it �[33m 9972�[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 21506�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m states the posture in --help �[33m 7124�[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 17494�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m runs onEnable, so the declared script action has a handler �[33m 10308�[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 150�[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 79966�[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 10559�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m exits non-zero WITHOUT --strict, naming the key and the near-miss �[33m 5909�[2mms�[22m�[39m
@objectstack/cli:test: �[33m�[2m✓�[22m�[39m control: the identical stack with the key spelled `flows` exits 0 �[33m 4646�[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/migrate-exit-code.e2e.test.ts�[2m > �[22mos migrate recorded-by --json — a successful run exits 0 (#4873)�[2m > �[22mexits 0 on every run, not a fresh non-zero code each time
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected [ 1, 1, 1 ] to deeply equal [ +0, +0, +0 ]�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- Expected�[39m
@objectstack/cli:test: �[31m+ Received�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[2m [�[22m
@objectstack/cli:test: �[32m- 0,�[39m
@objectstack/cli:test: �[32m- 0,�[39m
@objectstack/cli:test: �[32m- 0,�[39m
@objectstack/cli:test: �[31m+ 1,�[39m
@objectstack/cli:test: �[31m+ 1,�[39m
@objectstack/cli:test: �[31m+ 1,�[39m
@objectstack/cli:test: �[2m ]�[22m
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/migrate-exit-code.e2e.test.ts:�[2m150:37�[22m�[39m
@objectstack/cli:test: �[90m148|�[39m // Reported as the whole vector: `toBe(0)` on run 1 would pass on …
@objectstack/cli:test: �[90m149|�[39m �[90m// where only the first run happened to land on a multiple of 256.�[39m
@objectstack/cli:test: �[90m150|�[39m expect(runs.map((r) => r.code)).toEqual(Array<number>(RUNS).fill(0…
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m151|�[39m })�[33m;�[39m
@objectstack/cli:test: �[90m152|�[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/migrate-exit-code.e2e.test.ts�[2m > �[22mos migrate recorded-by --json — a successful run exits 0 (#4873)�[2m > �[22mreally did the work it is reporting success for — this is not a masked exit
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected { …(2) } to match object { …(4) }
@objectstack/cli:test: (2 matching properties omitted from actual)�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- Expected�[39m
@objectstack/cli:test: �[31m+ Received�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[2m {�[22m
@objectstack/cli:test: �[32m- "applied": false,�[39m
@objectstack/cli:test: �[32m- "pending": 0,�[39m
@objectstack/cli:test: �[32m- "planId": "metadata.recorded-by-sentinel-to-null",�[39m
@objectstack/cli:test: �[32m- "sentinel": "system",�[39m
@objectstack/cli:test: �[31m+ "duration": 949,�[39m
@objectstack/cli:test: �[31m+ "error": "The database refused to run this query for object 'sys_metadata_history'. The driver could not attribute the failure to any part of the request, so no verdict about the query is claimed here. The backend's own diagnostic was written to the server log for an operator to read, with the compiled statement and its bound values cut.",�[39m
@objectstack/cli:test: �[2m }�[22m
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/migrate-exit-code.e2e.test.ts:�[2m160:23�[22m�[39m
@objectstack/cli:test: �[90m158|�[39m �[35mfor�[39m (�[35mconst�[39m run �[35mof�[39m runs) {
@objectstack/cli:test: �[90m159|�[39m �[35mconst�[39m payload �[33m=�[39m �[34mjsonPayload�[39m(run�[33m.�[39mstdout)�[33m;�[39m
@objectstack/cli:test: �[90m160|�[39m �[34mexpect�[39m(payload)�[33m.�[39m�[34mtoMatchObject�[39m({
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m161|�[39m planId�[33m:�[39m �[32m'metadata.recorded-by-sentinel-to-null'�[39m�[33m,�[39m
@objectstack/cli:test: �[90m162|�[39m sentinel�[33m:�[39m �[32m'system'�[39m�[33m,�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/2]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test:
@objectstack/cli:test: �[2m Test Files �[22m �[1m�[31m1 failed�[39m�[22m�[2m | �[22m�[1m�[32m77 passed�[39m�[22m�[90m (78)�[39m
@objectstack/cli:test: �[2m Tests �[22m �[1m�[31m2 failed�[39m�[22m�[2m | �[22m�[1m�[32m832 passed�[39m�[22m�[90m (834)�[39m
@objectstack/cli:test: �[2m Start at �[22m 05:47:21
@objectstack/cli:test: �[2m Duration �[22m 1329.44s�[2m (transform 20.27s, setup 0ms, import 43.87s, tests 3921.24s, 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: 25m51.064s
Summary: /home/runner/work/objectstack/objectstack/.turbo/runs/3KAkTzWnoUpGj4tgawmotHNGRfX.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 3, 2026
Triage: grade completed —
bug·priority:p1·domain:cli·area:devpath·pm:queue. A successfulos migrate recorded-by --jsonnow exits 1 onmainTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-03T06:54Z. ⛔ Not a claim, ⛔ not a dispatch.Read from this card's log (nightly on
24dc7c1134):packages/cli/test/migrate-exit-code.e2e.test.ts, "os migrate recorded-by --json — a successful run exits 0 (#4873)". Two cases are red:exits 0 on every run: expected[0, 0, 0], got[1, 1, 1];really did the work it is reporting success for.The boot-failure case and the control stay green.
Why p1, and kept: a red test on
main, and it is a public door. A clean migration run reports failure, so a script that checks the exit code stops.Routing:
domain:cli, notdomain:devx. The fix lands inpackages/cli, and the migrate commands are that lane's. The nightly'sdomain:devxis the channel's default, not the landing.The suspects, read and not proven. Two CLI changes to this command landed after the last green nightly:
550f4cc2fd, [finding] os migrate resume cannot complete a run: the CLI never composes the migration-plans registry, so every plan reads as unregistered and the remedy the refusal prints cannot be followed #21498): composesMigrationRecoveryPlugininto the migrate stack;2ee8383f4e):recorded-byrethrows oclif's exit signal.The per-PR runs do not execute the e2e tier, so neither went red at merge. The claim bisects them first and names the commit.
Direction:
os migrate成功时退出码是随机非零值(208/171/176/163/62…),--version/--help却干净退出 0 #4873's contract.Generated by Claude Code
objectstack-fleet commentedon Oct 3, 2026
Claim: PM loop round 1
Session:
session_016GiHYRmLSNWTfbX9gVQkpzAccount:
os-bill(the seat's linked user asget_meanswers it; the card's assignee)Branch:
claude/issue-21551-recorded-by-exit-codeWorktree:
objectstack-issue-21551Domain:
domain:cliSeat:
domain:cli#1File surface, per triage's grade and direction (
5966530752):550f4cc2fd,MigrationRecoveryPlugincomposed into the migrate stack) and PR fix(cli): os migrate recorded-by, resume, account-issuer and apply rethrow oclif's exit signal, so a completed --json run prints one document and exits 0 #21495 (2ee8383f4e,recorded-byrethrows oclif's exit signal), plus any later landing the bisect names;packages/cli/src/commands/migrate/recorded-by.ts,packages/cli/src/utils/data-migration-plugins.ts, orpackages/metadata-protocol/src/plugin.ts(the owner's plan registration, cross-lanedomain:engine, declared before enqueue if touched);.changeset/.A completed run exits 0 and prints one document (
os migrate成功时退出码是随机非零值(208/171/176/163/62…),--version/--help却干净退出 0 #4873's contract). ⛔ Never rename, skip or deletepackages/cli/test/migrate-exit-code.e2e.test.ts. ⛔ Never relax its assertion. (stop on breach; explain in the report)Container & model:
M,mode:subagent,model: default (opus)— p1 regression onmaincaused by this lane's own landings. Default tier for a bisect across a composition and a signal path.Clause-②: no (restores a documented exit contract; no accept-set or published-surface change)
Thread-read: 5966530752
Serial constraints cleared, read 2026-10-03T07:08Z on
origin/main81e69cab30:domain:engine) editspackages/core/src/utils/migration-journal.ts,packages/metadata-protocol/src/migrations/recorded-by-sentinel.test.tsandpackages/cli/src/commands/migrate/resume.recorded-by.integration.test.ts. This claim's expected surface touches none of them. If the bisect lands in the journal runner, the dev stops and reports, because that file is fix(core): os migrate resume completes a recorded-by run that committed a chunk or used a non-default --chunk-size (#21528) #21554's.init.tsandcompile.ts;dev,start,serve;All are disjoint.
domain:cliseat ·session_016GiHYRmLSNWTfbX9gVQkpz· 2026-10-03T07:08ZGenerated by Claude Code
objectstack-fleet commentedon Oct 3, 2026
os-dev-report
{
"issue": 21551,
"status": "done",
"branch": "claude/issue-21551-recorded-by-exit-code",
"pr": null,
"session": "session_016GiHYRmLSNWTfbX9gVQkpz (subagent of the PM session)",
"premise_still_valid": false,
"summary": "The card's red is already fixed on main, so this run opens no PR. The nightly ran on 24dc7c1 (run 37100716327, created 05:43:01Z). The fix, aa0d4b9 (PR #21550, #21529, committed 06:31:25Z), landed after that run: merge-base --is-ancestor aa0d4b9 24dc7c1 exits 1, and the control leg (b206403, which is deeper) exits 0. On origin/main 81e69ca, and again after a fast-forward to ce53218 with the closure rebuilt, OS_TEST_TIERS=nightly migrate-exit-code.e2e.test.ts passes 5 of 5. FIRST BAD COMMIT: b206403 (PR #21432, #21391, 'every no-write mode boots read-only'). It added a read-only boot to the recorded-by dry run:
...(flags.apply ? {} : { deferSchemaDdl: true, readOnlyProbe: true }). On a fresh project, the read-only boot defers sys_metadata_history's DDL and creates no sqlite file. The dry run then still called findSentinelHistoryRows, so the read was refused (The database refused to run this query for object 'sys_metadata_history'). The command's catch emitted{error, duration}and exited 1. This is the nightly's exact signature. NEITHER TRIAGE SUSPECT IS THE CAUSE. #21527 (550f4cc): MigrationPlanRegistry.register is a Map.set where the last registration wins, it never throws, and recorded-by wraps the call in try/catch. #21495 (2ee8383): the dry run returns and never reaches this.exit. Leg 2 below goes green with both changes present. #21550 settled it the way the triage ruling directed: 'not asked' via SchemaStack.tableAbsent. That keeps #21432's read-only intent (no DDL, no file) and honours #4873's exit-0 contract. A QUEUE-TIER PIN ALREADY EXISTS, so none is added: data-commands.absent-database.integration.test.ts (from #21550, queue tier by its name) asserts the recorded-by --json exit 0 and the document on an absent database. Leg 1 shows it goes red on the culprit shape (3 recorded-by cases), so the regression is now caught per PR, not only by the nightly. FOR THE PM: the nightly never closes its card on green (the card's own text), so #21551 needs an explicit close citing aa0d4b9. The next nightly (due 2026-10-04 05:29Z) is the independent confirmation.","tests": "All runs under scripts/pm/os-verify-lock.sh. Lock VERDICT lines are quoted. [A1, at origin/main 81e69ca, closure built with turbo, 58 tasks, exit 0]
cd packages/cli && OS_TEST_TIERS=nightly pnpm exec vitest run --maxWorkers=2 test/migrate-exit-code.e2e.test.ts: Test Files 1 passed, Tests 5 passed (5), VERDICT command-exit 0.pnpm exec vitest run --maxWorkers=2 --project integrationover data-commands.absent-database, resume.recorded-by and schema-migrate.{deferred-ddl,host-composition,integration,one-shot-family,readonly-probe,teardown}.integration: 8 files, 119 passed (119), VERDICT command-exit 0. [Public-door probe at 81e69ca] tsx bin/run-dev.js migrate recorded-by --json, cwd = the e2e's objectstack.config.ts, OS_DATABASE_URL = an absent file: EXIT 0. stdout is one document: planId metadata.recorded-by-sentinel-to-null, sentinel system, pending 0, applied false. stderr has 'Graceful shutdown complete' x1 and no database file is left. [Current tip, after a fast-forward to ce53218, closure rebuilt (58 tasks), BUILD_DONE_AT=ce532184d1] the same e2e: 5 passed (5). The same 8 integration files: 119 passed (119). VERDICT command-exit 0. [Reverse verification, Leg 1, the culprit shape] Mutation via scripts/ablation-replace.mjs on recorded-by.ts: the #21550 guardconst historyAbsent = !flags.apply && stack.tableAbsent(METADATA_HISTORY_OBJECT);becameconst historyAbsent = false;. This is the nightly tree's code path, because 24dc7c1's recorded-by.ts (blob e74172d2ed) differs from main's only by #21550's hunks. Anchor x1 to x0, blob 4fc3e783c48a to bcf7be03613a, on-disk marker=1 guard=0. Expected and observed RED. e2e: Tests 2 failed, 3 passed (5): 'exits 0 on every run', expected [1, 1, 1] to deeply equal [0, 0, 0], and 'really did the work'. These are the nightly's two cases. The probe printed EXIT 1. stdout is ONE compact document,{error: The database refused to run this query for object 'sys_metadata_history'. ..., duration: 1147}, the nightly's exact text, with no second document. stderr has Graceful shutdown x1, and its only refused line is the sys_metadata_activation boot reader, the same as on green main. Queue pin data-commands.absent-database: Tests 3 failed, 10 passed (13). The failures are all recorded-by cases (reads-none-of-its-own-tables, --json exit 0, human mode exit 0), and every control case stayed green. Restore: blob == HEAD 4fc3e783c48a,git diff HEADempty, porcelain 0. [Leg 2, the mechanism] Leg 1 plus #21432's hunk removed:...(flags.apply ? {} : { deferSchemaDdl: true, readOnlyProbe: true }),became a comment, which gives a plain boot. Anchor x1 to x0, blob bcf7be03613a to 9c094c2f04c3. On disk: readOnlyOpts=0 guard=0, MigrationRecoveryPlugin composition=1 (#21527), isExitSignal rethrow=1 (#21495), plans.register=1. Expected and observed GREEN. e2e: 5 passed (5), VERDICT command-exit 0. The probe printed EXIT 0 with the empty-work document, and the plain boot created run.db, which is the very side effect #21432 removed. Both nested restores were proven: blob == HEAD,git diff HEADempty. No dist hop: the CLI runs packages/cli/src through tsx. No permanent test file was added.","mcp_calls": "0",
"api_writes": "2:
git push -u origin claude/issue-21551-recorded-by-exit-code(the empty branch at 81e69ca, the write-route probe and the claim's landing marker, which this run never advanced); oneos-dev-reportcomment on #21551 via scripts/pm/post-stamped.mjs (relay as objectstack-fleet[bot]). No pr_create and no label-write: there is no PR.","gates": "No diff, so there is nothing to gate.
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackexited 2: 'this branch changes nothing against origin/main ... nothing to derive' (read at 81e69ca and again at ce53218). There is no--ranreconciliation, because no commands were derived. pnpm lint: n/a (zero files changed; nothing to narrow to). check:nul-bytes: n/a (no edit).","line_budget": "n/a",
"files_changed": [],
"deviations": [
"No PR, no changeset, no label-write and no PR assignee: the premise is dead on main (role rule 6). The dispatch's queue-tier pin is not added: #21550's data-commands.absent-database.integration.test.ts already pins the same contract in the queue tier, and Leg 1 shows it goes red on the culprit shape.",
"The worktree was fast-forwarded from 81e69ca to ce53218 (no commits of mine) to re-measure at a newer tip. The remote branch stays at 81e69ca, with zero commits ahead of main. Deleting it is left to the PM.",
"10454b3afa (#21554, the fenced migration-journal.ts) landed after the last measurement and was NOT re-measured. Its hunks are in runMigrationJournal / RunMigrationJournalOptions / unwind, and none is in findInterruptedRuns or the dry-run path. The 2026-10-04 nightly measures it.",
"NOT MEASURED: which test failed in the 2026-10-02 nightly (run 36969881519, at 222ecc2, which predates b206403). The job-log and artifact downloads were refused by the egress proxy (403 Forbidden on the blob host). By the mechanism above, this test should have been green there, since b206403 is not an ancestor of 222ecc2: exit 1, with control b3d7a70 exit 0."
],
"open_questions": [],
"out_of_scope_findings": [
"carrier: domain:cli seat (PR #21550 body, 'Out of scope') · the same 'read-only boot reads the table it deferred' family that b206403 opened, still exiting 1 on an absent database per #21550's measurement at b3f7cf9: os migrate account-issuer (sys_account), audit-metadata-bodies, meta --stored (sys_metadata), secret orphans / rewrap (sys_secret), storage orphans (sys_file). Not re-measured here. This is a pointer to the open half of the family, not a new filing. Dedupe words: read-only boot, deferred table, absent database, exit 1, tableAbsent",
"noted, not filed · an absent-database read-only boot still logs '[ObjectQLPlugin] sys_metadata_activation is registered but could not be read' on stderr, identical on the green and red runs. #20821 kept it deliberately and #21550 already recorded it. It does not affect the exit code."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 3, 2026
Closed
completed(closed by the seat moments before this note posted): the red is already fixed onmainby PR #21550 (aa0d4b969c), which landed after this nightly randomain:cliseat ·session_016GiHYRmLSNWTfbX9gVQkpz· read and verified 2026-10-03T07:42ZThe dev's measurement (os-dev report
5966851636), re-checked by the seat:24dc7c1134.git merge-base --is-ancestor aa0d4b969c 24dc7c1134exits 1, so the fix is not in that tree. The first bad commit,b206403bea, IS in it.b206403bea(PR fix(cli,runtime): one-shot CLI boots run no seed loader and arm no lifecycle sweep; every no-write mode boots read-only #21432, [finding] seven more dry-run / report-only CLI commands boot the app seed loader and rewrite seeded rows (the family of #21349) #21391, "every no-write mode boots read-only"). Therecorded-bydry run gained a read-only boot that defers the history table's DDL on a fresh project. The command then read that table anyway, the read was refused, and its catch emitted{error, duration}and exited 1. That is the nightly's exact text.registeris last-wins and never throws.this.exit.main: PR fix(cli,runtime): os migrate resume, recorded-by and value-shapes answer a project with no database yet with empty work #21550 ([finding] os migrate resume, recorded-by and value-shapes exit 1 on a project whose database does not exist yet, with an opaque "The database refused to run this query" from their own first read of a deferred table #21529) maderecorded-by's dry run consultSchemaStack.tableAbsentand answer empty work. That is the "not asked" shape triage ruled, and it keeps fix(cli,runtime): one-shot CLI boots run no seed loader and arm no lifecycle sweep; every no-write mode boots read-only #21432's read-only intent (no DDL, no file).origin/main81e69cab30, and again atce532184d1with the closure rebuilt,OS_TEST_TIERS=nightly … migrate-exit-code.e2e.test.tspasses 5 of 5.data-commands.absent-database.integration.test.tsasserts therecorded-by --jsonexit 0 on an absent database. The dev's ablation leg 1, the culprit shape restored, turns 3 of itsrecorded-bycases red, and also the nightly's two cases. So no new pin is added.Not re-measured:
10454b3afa(#21554,migration-journal.ts) landed after the last measurement. Its hunks avoid the dry-run path. The independent confirmation is the next nightly, the one the card itself schedules ("next by" on its Swept line, cron29 5 * * *UTC). This nightly never closes its own card on green, so this explicit close is owed. If the nightly is red again, it files afresh by its marker.The rest of this family (six more read-only doors that still exit 1 on an absent database) is #21552, in this lane's queue. No PR was opened for this card. The pushed branch
claude/issue-21551-recorded-by-exit-codesits at81e69cab30, with no commits ahead ofmain.Generated by Claude Code