Repository navigation
nightly-tiers: red on main #22208
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-08T06:22:44.747Z · expected every 24h while this card stands (cron 29 5 * * * UTC) · next by 2026-10-09T05:29Z · run log · commit 1e5d322c1e14803056c789c71d8ba87a538aa23c · 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/build-json-failure-warnings.e2e.test.tspackages/cli/test/validate-json-failure-warnings.e2e.test.ts
shard-1 — last lines of the test log
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/11]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/build-json-failure-warnings.e2e.test.ts�[2m > �[22m#11772 — every `os build --json` failure exit carries the advisory lists the run computed�[2m > �[22mthe catch-all — a THROWN failure still reports what the run had computed
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected 'undefined' to contain 'EISDIR'�[39m
@objectstack/cli:test:
@objectstack/cli:test: Expected: �[32m"EISDIR"�[39m
@objectstack/cli:test: Received: �[31m"undefined"�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/build-json-failure-warnings.e2e.test.ts:�[2m416:35�[22m�[39m
@objectstack/cli:test: �[90m414|�[39m expect(run.code, `expected the write to throw:\n${run.stdout}${run…
@objectstack/cli:test: �[90m415|�[39m �[35mconst�[39m payload �[33m=�[39m �[34mpayloadOf�[39m(run�[33m,�[39m �[32m'thrown'�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m416|�[39m �[34mexpect�[39m(�[33mString�[39m(payload�[33m.�[39merror))�[33m.�[39m�[34mtoContain�[39m(�[32m'EISDIR'�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m417|�[39m �[34mexpect�[39m(
@objectstack/cli:test: �[90m418|�[39m �[34mclasses�[39m(payload�[33m.�[39mwarnings)�[33m,�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/11]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/build-json-failure-warnings.e2e.test.ts�[2m > �[22m#11772 — every `os build --json` failure exit carries the advisory lists the run computed�[2m > �[22m3b (author-time rules) — REGRESSION GUARD: this exit already carried `ruleAdvisories`
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected undefined to be 'author-time rules failed' // Object.is equality�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- Expected:�[39m
@objectstack/cli:test: "author-time rules failed"
@objectstack/cli:test:
@objectstack/cli:test: �[31m+ Received:�[39m
@objectstack/cli:test: undefined
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/build-json-failure-warnings.e2e.test.ts:�[2m453:27�[22m�[39m
@objectstack/cli:test: �[90m451|�[39m expect(run.code, `expected the rule gate to fail:\n${run.stdout}${…
@objectstack/cli:test: �[90m452|�[39m �[35mconst�[39m payload �[33m=�[39m �[34mpayloadOf�[39m(run�[33m,�[39m �[32m'rulefail'�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m453|�[39m �[34mexpect�[39m(payload�[33m.�[39merror)�[33m.�[39m�[34mtoBe�[39m(�[32m'author-time rules failed'�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m454|�[39m expect((payload.issues as Array<{ rule: string }>).map((i) => i.ru…
@objectstack/cli:test: �[90m455|�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/11]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/validate-json-failure-warnings.e2e.test.ts�[2m > �[22m#12047 — every `os validate --json` failure exit carries the advisory lists the run computed�[2m > �[22mrule errors — carries rule + key, and NOT the capability hint one step later
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected [ undefined ] to include 'expression-invalid'�[39m
@objectstack/cli:test: �[36m �[2m❯�[22m test/validate-json-failure-warnings.e2e.test.ts:�[2m360:76�[22m�[39m
@objectstack/cli:test: �[90m358|�[39m �[35mconst�[39m payload �[33m=�[39m �[34mpayloadOf�[39m(run�[33m,�[39m �[32m'rulefail'�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m359|�[39m �[34mexpect�[39m(payload�[33m.�[39mvalid)�[33m.�[39m�[34mtoBe�[39m(�[35mfalse�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m360|�[39m expect((payload.errors as Array<{ rule: string }>).map((i) => i.ru…
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m361|�[39m
@objectstack/cli:test: �[90m362|�[39m // This exit already published `ruleAdvisories` before the change;…
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/11]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/validate-json-failure-warnings.e2e.test.ts�[2m > �[22m#12047 — every `os validate --json` failure exit carries the advisory lists the run computed�[2m > �[22mcapability errors — carries rule + key + cap; the doc advisory is not computed yet
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected [ undefined ] to deeply equal [ 'governance' ]�[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- "governance",�[39m
@objectstack/cli:test: �[31m+ undefined,�[39m
@objectstack/cli:test: �[2m ]�[22m
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/validate-json-failure-warnings.e2e.test.ts:�[2m374:78�[22m�[39m
@objectstack/cli:test: �[90m372|�[39m �[35mconst�[39m payload �[33m=�[39m �[34mpayloadOf�[39m(run�[33m,�[39m �[32m'capfail'�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m373|�[39m �[34mexpect�[39m(payload�[33m.�[39mvalid)�[33m.�[39m�[34mtoBe�[39m(�[35mfalse�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m374|�[39m expect((payload.errors as Array<{ token: string }>).map((i) => i.t…
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m375|�[39m
@objectstack/cli:test: �[90m376|�[39m // The fixture ships a doc raising an advisory, and the docs gate …
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/11]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/validate-json-failure-warnings.e2e.test.ts�[2m > �[22m#12047 — every `os validate --json` failure exit carries the advisory lists the run computed�[2m > �[22mdoc errors — all four computed lists ride the payload
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected [ undefined ] to deeply equal [ 'docs/namespace-prefix' ]�[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- "docs/namespace-prefix",�[39m
@objectstack/cli:test: �[31m+ undefined,�[39m
@objectstack/cli:test: �[2m ]�[22m
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/validate-json-failure-warnings.e2e.test.ts:�[2m392:76�[22m�[39m
@objectstack/cli:test: �[90m390|�[39m �[35mconst�[39m payload �[33m=�[39m �[34mpayloadOf�[39m(run�[33m,�[39m �[32m'docsfail'�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m391|�[39m �[34mexpect�[39m(payload�[33m.�[39mvalid)�[33m.�[39m�[34mtoBe�[39m(�[35mfalse�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m392|�[39m expect((payload.errors as Array<{ rule: string }>).map((i) => i.ru…
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m393|�[39m
@objectstack/cli:test: �[90m394|�[39m �[34mexpect�[39m(
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/11]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/validate-json-failure-warnings.e2e.test.ts�[2m > �[22m#12047 — every `os validate --json` failure exit carries the advisory lists the run computed�[2m > �[22mcatch-all (late throw) — a THROWN failure still reports what the run had computed
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected 'undefined' to contain 'ENOTDIR'�[39m
@objectstack/cli:test:
@objectstack/cli:test: Expected: �[32m"ENOTDIR"�[39m
@objectstack/cli:test: Received: �[31m"undefined"�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/validate-json-failure-warnings.e2e.test.ts:�[2m413:35�[22m�[39m
@objectstack/cli:test: �[90m411|�[39m expect(run.code, `expected the docs read to throw:\n${run.stdout}$…
@objectstack/cli:test: �[90m412|�[39m �[35mconst�[39m payload �[33m=�[39m �[34mpayloadOf�[39m(run�[33m,�[39m �[32m'thrown'�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m413|�[39m �[34mexpect�[39m(�[33mString�[39m(payload�[33m.�[39merror))�[33m.�[39m�[34mtoContain�[39m(�[32m'ENOTDIR'�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m414|�[39m �[34mexpect�[39m(
@objectstack/cli:test: �[90m415|�[39m �[34mclasses�[39m(payload�[33m.�[39mwarnings)�[33m,�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/11]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[41m�[1m FAIL �[22m�[49m �[30m�[45m integration �[49m�[39m test/validate-json-failure-warnings.e2e.test.ts�[2m > �[22m#12047 — every `os validate --json` failure exit carries the advisory lists the run computed�[2m > �[22mstructural control — the fixture shape DOES raise a structural advisory on success
@objectstack/cli:test: �[31m�[1mAssertionError�[22m: expected the control to pass:
@objectstack/cli:test: {
@objectstack/cli:test: "valid": false,
@objectstack/cli:test: "errors": [
@objectstack/cli:test: {
@objectstack/cli:test: "code": "invalid_union",
@objectstack/cli:test: "errors": [
@objectstack/cli:test: [
@objectstack/cli:test: {
@objectstack/cli:test: "code": "invalid_value",
@objectstack/cli:test: "values": [
@objectstack/cli:test: false
@objectstack/cli:test: ],
@objectstack/cli:test: "path": [],
@objectstack/cli:test: "message": "Invalid input: expected false"
@objectstack/cli:test: }
@objectstack/cli:test: ],
@objectstack/cli:test: [
@objectstack/cli:test: {
@objectstack/cli:test: "code": "invalid_value",
@objectstack/cli:test: "values": [
@objectstack/cli:test: "global"
@objectstack/cli:test: ],
@objectstack/cli:test: "path": [],
@objectstack/cli:test: "message": "Invalid input: expected \"global\""
@objectstack/cli:test: }
@objectstack/cli:test: ],
@objectstack/cli:test: [
@objectstack/cli:test: {
@objectstack/cli:test: "code": "invalid_value",
@objectstack/cli:test: "values": [
@objectstack/cli:test: "organization"
@objectstack/cli:test: ],
@objectstack/cli:test: "path": [],
@objectstack/cli:test: "message": "Invalid input: expected \"organization\""
@objectstack/cli:test: }
@objectstack/cli:test: ]
@objectstack/cli:test: ],
@objectstack/cli:test: "path": [
@objectstack/cli:test: "objects",
@objectstack/cli:test: 0,
@objectstack/cli:test: "indexes",
@objectstack/cli:test: 0,
@objectstack/cli:test: "unique"
@objectstack/cli:test: ],
@objectstack/cli:test: "message": "`indexes[].unique: true` was retired at protocol 18 (ADR-0120 D1) — on a declared index bare `true` never stated a scope: it built the index over exactly `fields`, one holder across the whole installation, while reading like \"unique per organization\". State the scope: `unique: 'global'` (installation-wide — the exact index bare `true` built, so nothing on disk changes) or `unique: 'organization'` (one holder per organization — the driver prepends the NULL-safe organization key part to `fields` at registration). Field-level `unique: true` is unaffected. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand."
@objectstack/cli:test: }
@objectstack/cli:test: ],
@objectstack/cli:test: "warnings": [
@objectstack/cli:test: "objects.ctrl_ticket.fields.title.visibleWhen.zzzUndeclaredProbeKey: 'zzzUndeclaredProbeKey' is not a declared field key, so its value is dropped at load."
@objectstack/cli:test: ],
@objectstack/cli:test: "conversions": [],
@objectstack/cli:test: "duration": 102
@objectstack/cli:test: }
@objectstack/cli:test: defineStack: objects.ctrl_ticket.fields.title.visibleWhen.zzzUndeclaredProbeKey: 'zzzUndeclaredProbeKey' is not a declared field key, so its value is dropped at load.
@objectstack/cli:test: : expected 1 to be +0 // Object.is equality�[39m
@objectstack/cli:test:
@objectstack/cli:test:
@objectstack/cli:test: �[32m- Expected�[39m
@objectstack/cli:test: �[31m+ Received�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[32m- 0�[39m
@objectstack/cli:test: �[31m+ 1�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[36m �[2m❯�[22m test/validate-json-failure-warnings.e2e.test.ts:�[2m441:83�[22m�[39m
@objectstack/cli:test: �[90m439|�[39m �[90m// stay off the failure payloads.�[39m
@objectstack/cli:test: �[90m440|�[39m �[35mconst�[39m run �[33m=�[39m �[35mawait�[39m �[34mrunCli�[39m([�[32m'validate'�[39m�[33m,�[39m �[32m'--json'�[39m]�[33m,�[39m dirs�[33m.�[39mcontrol)�[33m;�[39m
@objectstack/cli:test: �[90m441|�[39m expect(run.code, `expected the control to pass:\n${run.stdout}${ru…
@objectstack/cli:test: �[90m |�[39m �[31m^�[39m
@objectstack/cli:test: �[90m442|�[39m �[35mconst�[39m payload �[33m=�[39m �[34mpayloadOf�[39m(run�[33m,�[39m �[32m'control'�[39m)�[33m;�[39m
@objectstack/cli:test: �[90m443|�[39m �[34mexpect�[39m(payload�[33m.�[39mvalid)�[33m.�[39m�[34mtoBe�[39m(�[35mtrue�[39m)�[33m;�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/11]⎯�[22m�[39m
@objectstack/cli:test:
@objectstack/cli:test: �[2m Test Files �[22m �[1m�[31m2 failed�[39m�[22m�[2m | �[22m�[1m�[32m78 passed�[39m�[22m�[90m (80)�[39m
@objectstack/cli:test: �[2m Tests �[22m �[1m�[31m11 failed�[39m�[22m�[2m | �[22m�[1m�[32m839 passed�[39m�[22m�[90m (850)�[39m
@objectstack/cli:test: �[2m Start at �[22m 05:46:29
@objectstack/cli:test: �[2m Duration �[22m 2149.52s�[2m (transform 29.79s, setup 0ms, import 67.29s, tests 6345.77s, environment 15ms)�[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: 41m26.293s
Summary: /home/runner/work/objectstack/objectstack/.turbo/runs/3KOtep1ngfA0Fas7zQiBzcOjZYH.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 8, 2026
Triage: re-routed,
priority:p1stands ·domain:devx→domain:cli·area:devpath·pm:queue. Direction: move the two nightly-tier fixtures off the spelling #22103 retired; ⛔ never skip or rename a testTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-08T06:57Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
packages/cli/test/build-json-failure-warnings.e2e.test.tsandpackages/cli/test/validate-json-failure-warnings.e2e.test.ts⇒domain:cli; rationale: the failing files are the CLI's, and every earlier nightly-red card went to that lane (#17633, #21347, #21551). The generator'sdomain:devxdefault does not fit here.main: the nightly ran on1e5d322c1eand the previous green one ond5a14dd5c0. In between, PR feat(spec)!: refuse bare unique: true on a declared index at protocol 18 — stated scope, zero-drift conversion (ADR-0120 D2/D5a/D7) #22103 (ef1fcb26a2, Fixes ADR-0120 协议 18 项:D2 conversion(声明索引 unique: true → 'global')+ 裸 true 硬拒 + synonym pin 退役 —— 挂 18 列车,现在勿动工 #5082) made a bareunique: trueon a declared index a gating error that the schema parse refuses.build-json-failure-warnings.e2e.test.ts:165and:300, andvalidate-json-failure-warnings.e2e.test.ts:192. Those are the only three such sites across*.e2e.test.*and*.live.test.*.--jsonpayload carries none of the fields the tests read (error,rule, the advisory lists).OS_TEST_TIERS=nightly, so no per-PR run went red.uniquerule, they follow the new fixture. Reproduce withOS_TEST_TIERS=nightly pnpm --filter @objectstack/cli testfirst.Nightly Tiersrun on amainthat contains the fix is green. The card's own sweep line then stops moving.objectstack-fleet commentedon Oct 8, 2026
Claim: PM loop round 9
Session:
session_01RWZbGvPFcRKvUqASZtunCUAccount:
os-warren(the seat's linked user asget_meanswers it; the card's assignee)Branch:
claude/issue-22208-nightly-fixtures-unique-scopeWorktree:
objectstack-issue-22208Domain:
domain:cliSeat:
domain:cli#1File surface, per the card body and triage
6054352753, read onorigin/main7b926f76:packages/cli/test/build-json-failure-warnings.e2e.test.ts: the two fixtures that spell a bareunique: trueon a declared index (:165,:300), and the docblock lines that name that advisory (:143,:292).packages/cli/test/validate-json-failure-warnings.e2e.test.ts: the same fixture (:192) and its docblock lines (:170,:296).uniquerule follows the new fixture's rule.build-json-advisory-parity.e2e.test.tsandbuild-json-undeclared-key-parity.e2e.test.tsto an indexunique: 'global'beside a fieldunique: true(unique/double-declaration).skip-changeset.packages/cli/srcorpackages/specis touched. (Stop on breach and explain in the report.)Container & model:
S,mode:subagent,model: default (opus).dispatch-gates --tierover the path gives no path-derived mandate.Clause-②: no
Responsibility:
n/a — not a defect card(a test fixture the protocol-18 refusal in PR feat(spec)!: refuse bare unique: true on a declared index at protocol 18 — stated scope, zero-drift conversion (ADR-0120 D2/D5a/D7) #22103 outdated; the refusal is correct)Thread-read: 6054352753
Serial constraints cleared: read 2026-10-08T07:41Z:
filename): none touches either file.utils/format.ts) and [maintainer]os doctorin a freshly scaffolded dev project warns "NODE_ENV Not set — this environment is being treated as production"; beside anobjectstack.config.tswith no artifact it should read as development #22163 (commands/doctor.tsand its pins) do not hold these files.domain:spec's PR feat(spec)!: PROTOCOL_VERSION 17 → 18 in an ordinary PR — regenerated spec-changes.json and upgrade guide, ^18 handshakes, pre-mode lockstep exception (#22085 Q1 → B) #22215 (spec(v18): move PROTOCOL_VERSION 17 → 18 in an ordinary pull request with full CI: regenerate spec-changes.json and the 17 → 18 upgrade-guide section, rewrite the in-repo ^17 handshakes, and give the lockstep test one pre-mode exception (#22085 Q1) #22130) rewrites^17strings elsewhere, not these two files.domain:cliseat ·session_01RWZbGvPFcRKvUqASZtunCU· 2026-10-08T07:41Zobjectstack-fleet commentedon Oct 8, 2026
os-dev-report
{ "issue": 22208, "status": "done", "branch": "claude/issue-22208-nightly-fixtures-unique-scope", "pr": "https://github.com/objectstack-ai/objectstack/pull/22242", "session": "session_01RWZbGvPFcRKvUqASZtunCU — this run's harness-stamped id (Claude-Session line), the session claim 6055142389 names", "premise_still_valid": true, "summary": "Moved the three nightly-tier fixture sites (build-json-failure-warnings.e2e.test.ts :165 and :300, validate-json-failure-warnings.e2e.test.ts :192) off a bare declared-index `unique: true`, which protocol 18 refuses at the schema parse. They now raise the `unique/double-declaration` advisory: field `unique: true` beside index `unique: 'global'`, the shape PR #22103 already gave the two parity suites. It is a warning from the author-time rule registry, so it rides `ruleAdvisories`. The docblocks name the new advisory and say in one line why the old spelling left. Zero assertion lines changed, and no test was skipped, renamed or re-tiered: every assertion counts the rule class and none named the bare-unique rule id. H1-H5 all held: 11 failed | 10 passed on base 7b926f76 (build 6/5, validate 5/5); the structural control and a direct probe show every run stopping at the `indexes.0.unique` invalid_union; these three are the only sites across 80 tier files. The branch was merged with origin/main a87d8be2 before the PR (AGENTS §10). PR #22242 is a draft with assignee os-warren; the card's assignee is untouched; the worktree removal follows this comment. Three notes that were not filed are in the PR's Acceptance notes.", "tests": "H1 repro on 7b926f76: `OS_TEST_TIERS=nightly pnpm --filter @objectstack/cli exec vitest run --project integration --maxWorkers=2 --reporter=verbose` over the two files gave `Tests 11 failed | 10 passed (21)` (build 6 failed / 5 passed, validate 5 failed / 5 passed). Fixed, same command, on e8d64c30 and again on 89d4dc47: `Test Files 2 passed (2)`, `Tests 21 passed (21)`, every test named. Tier gate: `vitest list --filesOnly` with OS_TEST_TIERS unset or queue collects 356 files and neither file; nightly collects 80 files with both in [integration]. Ablation (scripts/ablation-replace.mjs wrap mode plus an outer EXIT/INT/TERM trap; no dist on the path, because the subject is the test file itself, loaded from source): the build 3b fixture went back to its base spelling; anchor x1->x0, replacement x0->x1, blob 7dfddae7->bd478edf, in-flight base-spelling count 1. Result `Tests 1 failed | 10 passed (11)`; the red is 3b, `expected undefined to be 'author-time rules failed'`. Restored: blob 7dfddae7 equals HEAD and the index, `git diff HEAD` empty, porcelain empty; the direction was the one predicted. Probes: the base 3b payload is {success:false, errors:[invalid_union at objects.0.indexes.0.unique], warnings:[]}; the new 3b payload has error 'author-time rules failed', issues ['expression-invalid'] and warnings [unique/double-declaration, warning]. On 89d4dc47: `pnpm --filter @objectstack/cli typecheck` exit 0 (check:test-typecheck OK; both files are in the 1970-file tsconfig.test.json program; the 28 raw errors are the ledgered 28 in 3 other files, 0 here). Unit project `Test Files 263 passed (263)` / `Tests 3874 passed (3874)`. 50/50 derived gates exit 0, and `dispatch-gates --ran` reads 0 NOT-MEASURED, 0 UNRUN. Full `pnpm lint` exit 0, and both files are linted (2 results, 0 errors, not ignored). Declared to CI: the integration tier beyond these two files and the other nightly-tier files.", "mcp_calls": "0 — no MCP GitHub tool was called; reads were `gh api` REST GETs and writes went through the scripts/pm relay", "api_writes": "3 — each is one repository_dispatch (POST /repos/objectstack-ai/objectstack/dispatches) that the fleet-write relay executed as objectstack-fleet[bot]: (1) pr_create -> POST /repos/objectstack-ai/objectstack/pulls (draft #22242, run 37750236362, body read back byte-identical, 7834/7834); (2) assign -> POST /repos/objectstack-ai/objectstack/issues/22242/assignees [os-warren] (run 37750323597, read back); (3) comment -> POST /repos/objectstack-ai/objectstack/issues/22208/comments (this report). Not REST: three `git push` of the branch (empty probe at 7b926f76, e8d64c30, merge 89d4dc47). No label write: the order leaves skip-changeset to the seat.", "open_questions": [], "out_of_scope_findings": [], "files_changed": [ "packages/cli/test/build-json-failure-warnings.e2e.test.ts (+12 / -6)", "packages/cli/test/validate-json-failure-warnings.e2e.test.ts (+11 / -5)" ], "gates": { "derived": "50 commands from `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` at 89d4dc47: the same set as the order's list (sorted diff empty)", "result": "50/50 exit 0; `dispatch-gates --ran`: 50 derived, 50 run, 0 NOT-MEASURED, 0 UNRUN", "refused_then_measured": "check:dual-build-cjs-loads first exited 3 (PREREQUISITE NOT MET: 9 packages outside the cli closure had no dist/). After a full `pnpm build` (72/72 tasks) it exits 0.", "reading_with_empty_population": "check-issue-citations: exit 0, but it read 0 files, because packages/cli/test is outside its declared surface, so it judged nothing about the added `PR #22103` citation", "added": [ "OS_TEST_TIERS=nightly, integration project, the two files: 21/21 on 89d4dc47", "pnpm --filter @objectstack/cli typecheck: exit 0", "pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2: 263 files / 3874 tests passed", "pnpm lint (full): exit 0" ], "ci": "in_progress at report time on head 89d4dc47: 13 check runs completed with 0 failures, 18 in progress" }, "line_budget": "n/a: no governed or line-ratcheted surface touched (no skills/**, .claude/**, AGENTS.md); the diff is +23 / -11 across 2 files, under the 5000-line human-merge threshold", "deviations": [ "I built the dependency closure with `pnpm turbo run build --filter='@objectstack/cli^...'` (after the merge, `'@objectstack/cli...'`, plus a full `pnpm build` for the dual-build gate's prerequisite) instead of `pnpm --filter '@objectstack/cli^...' build`. The dist outputs are the same, replayed from the shared turbo cache where the inputs matched (first pass 58/58 cached).", "I merged origin/main a87d8be2 into the branch (merge commit 89d4dc47; no rebase, no force-push) before opening the PR, per AGENTS §10 and the dispatch-gates STALE TREE warning (3 gate inputs had moved). The change set against the merge base is still exactly the 2 files.", "The post-merge closure build hit the ~10 min foreground cap and the harness moved it to the background; it finished with exit 0 and I waited on it with tail --pid. The unit run, the gate battery and both full lints ran detached (nohup), and I waited on each in the foreground with tail --pid. No watcher outlives this report.", "The first full `pnpm lint` crashed (exit 2, ENOENT on a transient tsup.config.bundled_*.mjs) because it ran beside my own concurrent `pnpm build`. I read it as NOT MEASURED and re-ran it after the build: exit 0.", "The commits carry the model-free trailer pair (Claude-Session plus `Co-authored-by: Claude`), and the PR body ends with the AGENTS.md session-URL footer. The harness attribution reminder proposed a model-named trailer and a different footer; AGENTS.md, os-dev.md and the order take precedence. Reported here; it is not a departure from the contract." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
ACCEPT — PR #22242 at
89d4dc47, pending CIdomain:cliseat ·session_01RWZbGvPFcRKvUqASZtunCU· read on GitHub 2026-10-08T08:34ZChecked on GitHub and in the diff, not from the report:
main;Fixes #22208, line 2 isClause-②: no;os-warren;main(a87d8be2), no rebase.build-json-failure-warnings.e2e.test.ts: the shared stack andrulefail;validate-json-failure-warnings.e2e.test.ts: the shared stack.unique: truebecomesunique: 'global', and the field gainsunique: true. That is the shape PR feat(spec)!: refuse bare unique: true on a declared index at protocol 18 — stated scope, zero-drift conversion (ADR-0120 D2/D5a/D7) #22103 gave the two parity suites (build-json-advisory-parity.e2e.test.ts:131,:307onorigin/main), and it raisesunique/double-declaration, an authoring-rule advisory (字段级unique: true与同列的声明式全局 unique 索引意图矛盾,authoring 层零提示 #3991), so each test's rule-advisory class is still exercised.vitest list: neither file is collected withoutOS_TEST_TIERS=nightly).trueon a declared index.7b926f76, matching the card's 11 (build 6 / 5, validate 5 / 5);OS_TEST_TIERS=nightlyate8d64c30and again at89d4dc47;Changeset: none, and the seat applies
skip-changesetin this stroke. Two test files publish nothing; the order said so.Done, per triage: the next
Nightly Tiersrun on amainthat contains this PR is green. The card closes when the PR merges, and the seat reads that run after the next nightly (cron29 5 * * *UTC).Next: CI on
89d4dc47, then the landing pre-checks and the queue.objectstack-fleet commentedon Oct 8, 2026
Landed: PR #22242 →
dbb7be2c53, a single-parent queue squashdomain:cliseat ·session_01RWZbGvPFcRKvUqASZtunCU· 2026-10-08T09:47Zdbb7be2c53has one parent.origin/main; the pre-merge head89d4dc47is not.Fixes #22208closed this card as completed.origin/main: each fixture's declared index carriesunique: 'global'and its field carriesunique: true, raisingunique/double-declaration:packages/cli/test/build-json-failure-warnings.e2e.test.ts: two sites;packages/cli/test/validate-json-failure-warnings.e2e.test.ts: one site.6056015814at89d4dc47, in one round. Test only,skip-changeset,Clause-②: no; no contract review was owed. CI on the head was green (34 runs) before the PR was armed.--jsonfailure-warnings suites no longer stop at the protocol-18 parse refusal of a bare declared-indexunique: true.OS_TEST_TIERS=nightlywas 21 / 21.Nightly Tiersrun on amainthat contains this commit (cron29 5 * * *UTC, so the 2026-10-09 run). If that run is red on these files again, the nightly refreshes its own card, and the seat reads it then.test(cli): move the nightly-tier failure-warnings fixtures off the ba…
objectstack-fleet commentedon Oct 9, 2026
Done-when read: met
domain:cliseat (#6024) ·session_01BmsuLyUeuG5CNpZFMH1jzS· 2026-10-09T06:56ZThe landed note
6057194905left one reading owed: the nextNightly Tiersrun on amainthat containsdbb7be2c53.schedule, branchmain, commit27a8b33dec, started 2026-10-09T05:41Z. Its conclusion issuccess:Nightly tiers (1/2)success,Nightly tiers (2/2)success.git merge-base --is-ancestor dbb7be2c53 27a8b33decholds.completed. Both failure-warnings e2e files ran green underOS_TEST_TIERS=nightly, and nothing re-filed this generated card.Nothing is left on this card for the seat.
Generated by Claude Code