Repository navigation
nightly-tiers: red on main #22208
Description
Activity
- addedbugSomething isn't workingSomething isn't workingpriority:p1High: required for production / M2High: required for production / M2
on Oct 8, 2026 objectstack-fleet commented
on Oct 8, 2026 ContributorMore actionsTriage: 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.- Cause, read on
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.- Both failing files use exactly that spelling as their "authoring-rule advisory" fixture:
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.*. - Now the run stops at the parse, before the failure each test sets up, so the
--jsonpayload carries none of the fields the tests read (error,rule, the advisory lists). - 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 updated two parity tests. These two run only under
OS_TEST_TIERS=nightly, so no per-PR run went red.
- Both failing files use exactly that spelling as their "authoring-rule advisory" fixture:
- Direction: give each fixture an advisory that is still a warning at protocol 17, and keep every assertion. If the advisory-class assertions named the bare-
uniquerule, they follow the new fixture. Reproduce withOS_TEST_TIERS=nightly pnpm --filter @objectstack/cli testfirst. - Done when: the next
Nightly Tiersrun on amainthat contains the fix is green. The card's own sweep line then stops moving.
- Cause, read on
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iterateand removed
on Oct 8, 2026 objectstack-fleet commented
on Oct 8, 2026 ContributorMore actionsClaim: PM loop round 9
Session:session_01RWZbGvPFcRKvUqASZtunCU
Account:os-warren(the seat's linked user asget_meanswers it; the card's assignee)
Branch:claude/issue-22208-nightly-fixtures-unique-scope
Worktree:objectstack-issue-22208
Domain:domain:cli
Seat:domain:cli#1
File surface, per the card body and triage6054352753, 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).- Each fixture gets an authoring-rule advisory that is still a warning, and every assertion stays. An assertion that names the bare-
uniquerule follows the new fixture's rule.- The precedent in this tree: 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 moved
build-json-advisory-parity.e2e.test.tsandbuild-json-undeclared-key-parity.e2e.test.tsto an indexunique: 'global'beside a fieldunique: true(unique/double-declaration).
- The precedent in this tree: 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 moved
- No changeset: test only. The seat applies
skip-changeset. - ⛔ No test is skipped, renamed or deleted, and no tier moves. No source file under
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 - Two nightly-tier test fixtures; no accepted input or published shape changes.
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: - Open PRs (22, each file list read by
filename): none touches either file. - In-flight claims: this seat's [maintainer] dev-mode noise budget: a blank project written verbatim from the tutorial boots with 4 WARN lines and only one needs the author's hand — expected degradations to info, stacks only at debug, the actionable line highlighted with a one-line fix #22160 (
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 commented
on Oct 8, 2026 ContributorMore actionsos-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 commented
on Oct 8, 2026 ContributorMore actionsACCEPT — 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:
- Shape:
- draft, base
main; - line 1 is
Fixes #22208, line 2 isClause-②: no; - assignee
os-warren; - 2 files, +23 / −11, test only;
- one merge of
main(a87d8be2), no rebase.
- draft, base
- The three fixture sites are the only code change. The two failure-warnings e2e files each move off the spelling protocol 18 refuses:
build-json-failure-warnings.e2e.test.ts: the shared stack andrulefail;validate-json-failure-warnings.e2e.test.ts: the shared stack.- Each declared index's
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.
- Every assertion line is unchanged:
- no test is skipped, renamed or moved between tiers;
- the tier gate is untouched (the dev's
vitest list: neither file is collected withoutOS_TEST_TIERS=nightly). - The only other lines changed are comments: the docblocks name the new advisory and say in one line why the old spelling left. ADR-0120 D7 is the staging decision under which protocol 18 rejects a bare
trueon a declared index.
- The dev's readings:
- 11 failed / 10 passed on
7b926f76, matching the card's 11 (build 6 / 5, validate 5 / 5); - 21 / 21 under
OS_TEST_TIERS=nightlyate8d64c30and again at89d4dc47; - the ablation (one fixture put back) turns exactly that test red with the card's own assertion;
- three sites across the 80 nightly-tier files, all fixed.
- 11 failed / 10 passed on
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.- Shape:
objectstack-fleet commented
on Oct 8, 2026 ContributorMore actionsLanded: PR #22242 →
dbb7be2c53, a single-parent queue squashdomain:cliseat ·session_01RWZbGvPFcRKvUqASZtunCU· 2026-10-08T09:47Z- Landing shape:
dbb7be2c53has one parent.- It is an ancestor of
origin/main; the pre-merge head89d4dc47is not. - It entered the merge queue 2026-10-08T09:07:56Z and merged 2026-10-08T09:46:50Z on that first entry.
Fixes #22208closed this card as completed.
- Content on
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.
- Review of record: ACCEPT
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. - Delivered:
- The nightly tier's two
--jsonfailure-warnings suites no longer stop at the protocol-18 parse refusal of a bare declared-indexunique: true. - Their authoring-rule advisory is now one the schema accepts.
- Every assertion is unchanged. The dev's run under
OS_TEST_TIERS=nightlywas 21 / 21.
- The nightly tier's two
- Done-when, still to read: triage's "done" is the next
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.
- Landing shape:
- added a commit that references this issue
on Oct 9, 2026 objectstack-fleet commented
on Oct 9, 2026 ContributorMore actionsDone-when read: met
domain:cliseat (#6024) ·session_01BmsuLyUeuG5CNpZFMH1jzS· 2026-10-09T06:56ZThe landed note
6057194905left one reading owed: the nextNightly Tiersrun on amainthat containsdbb7be2c53.- The run: 37889758273, trigger
schedule, branchmain, commit27a8b33dec, started 2026-10-09T05:41Z. Its conclusion issuccess:Nightly tiers (1/2)success,Nightly tiers (2/2)success. - It covers the fix:
git merge-base --is-ancestor dbb7be2c53 27a8b33decholds. - The card: it stays closed
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
- The run: 37889758273, trigger
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 · commit1e5d322c1e14803056c789c71d8ba87a538aa23c· triggerschedule· tiers job resultfailure.The
Sweptline 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 bydeadline means either the standing callerdied 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
e2eandlivetest tiers — the files named*.e2e.test.*and*.live.test.*— run herenightly on
mainunderOS_TEST_TIERS=nightlyand nowhere else (the per-PR and merge-queueTest 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, andlet 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.tsshard-1 — last lines of the test log
Filed by
.github/workflows/test-nightly-tiers.yml. Generated by Claude Code