Console Pin Gate fails on main and will fail for every PR queued behind it until objectui stops importing five retired schemas. Filed unassigned, no domain:* label — that surface is triage's.
Noticed from a merge-queue triage comment on an unrelated PR (#10635, a packages/spec/src/api/ change). The bot's own checklist item 2 — "失败测试与本 PR 无关" — is the right verdict here, but the failure is not flaky and not environmental: it is a deterministic build break on main.
The failure
Queue build 32489707012, job Console Pin Gate, step Build the Console SPA at the pinned objectui SHA:
✗ Build failed in 5.89s
error during build:
Build failed with 6 errors:
[MISSING_EXPORT] "ColorPaletteSchema" is not exported by "../../../../packages/spec/dist/ui/index.mjs"
╭─[ ../../packages/types/src/zod/theme.zod.ts:18:10 ]
[MISSING_EXPORT] "TypographySchema" … theme.zod.ts:18:56
[MISSING_EXPORT] "BorderRadiusSchema" … theme.zod.ts:18:98
[MISSING_EXPORT] "ShadowSchema" … theme.zod.ts:18:144
[MISSING_EXPORT] "ThemeModeSchema" … theme.zod.ts:18:178
Note the shape: MISSING_EXPORT at bundle time, 5.89s, no test ran. This is the build, not a suite — so the usual timeout-vs-assertion triage does not apply, and re-running cannot change the answer.
Root cause, established by content on both repos
objectstack main (08318f7c0e) no longer exports them. Removed by 35ad101bc3 — feat(spec): retire the themes carrier key and ThemeSchema — app.branding is the one colour surface (#10485, ADR-0049), landed as PR #10695. packages/spec/src/ui/index.ts now says so in as many words:
// `ThemeSchema`, its sub-blocks (`ColorPaletteSchema`, `TypographySchema`,
// `BorderRadiusSchema`, `ShadowSchema`, `ThemeModeSchema`) and `defineTheme`
// are gone with the `defineStack({ themes })` carrier key
objectui still imports them — and this is the part that matters:
| where | theme.zod.ts imports the retired schemas? |
|---|
objectui @ pinned 9a3daf8d37ad (.objectui-sha) | yes |
objectui main @ ac73c24b01, ahead of the pin | yes |
// packages/types/src/zod/theme.zod.ts:19-21 — identical at the pin and at objectui's tipimport{ColorPaletteSchemaasSpecColorPaletteSchema,TypographySchemaasSpecTypographySchema,So this is not a stale pin. Bumping .objectui-sha to objectui's tip would reproduce the identical failure. objectui has no counterpart to this retirement anywhere — the removal landed one-sided.
Why the same commit's own reasoning predicts this
packages/spec/src/ui/index.ts records that "objectui's ThemeEngine/ThemeContext and their unit tests are retained" — i.e. the retirement knew objectui still has live theme machinery, and kept it. What was missed is narrower and mechanical: that machinery re-derives its zod types from @objectstack/spec/ui rather than declaring them locally, so retaining the engine while deleting the schemas leaves a dangling import. ADR-0049 enforce-or-remove was applied to the spec half only.
What it does not appear to have blocked
35ad101bc3 (#10695), and then #10633, #10635 and #10839, all merged after this gate went red — main advanced dccbcec2e4 → 35ad101bc3 → 16cef9725c → 08318f7c0e. So Console Pin Gate is evidently not a required check for the queue, which is exactly why a one-sided retirement could land: the gate that would have caught it does not stop anything. Whether that is intended is worth a separate ruling; as it stands the signal exists and is being emitted into merge-queue triage comments on innocent PRs, where it reads as someone else's flake.
Suggested shape (not a ruling — this is a finding)
Two halves, and the ordering is forced:
- objectui: drop the five
@objectstack/spec/ui imports from packages/types/src/zod/theme.zod.ts and declare the shapes locally, or re-point them at whatever app.branding now provides. This must land in objectui first. - objectstack: advance
.objectui-sha past that commit. Only then does the gate go green.
Until both land, every PR's queue build carries this red, and the merge-queue triage bot will keep attributing it to whichever PR happens to be in the batch.
Reproduction (free, no CI)
git -C objectstack show origin/main:packages/spec/src/ui/index.ts | grep -n 'are gone'
git -C objectui show $(cat objectstack/.objectui-sha):packages/types/src/zod/theme.zod.ts | sed -n '19,21p'
git -C objectui show origin/main:packages/types/src/zod/theme.zod.ts | sed -n '19,21p'
Provenance
Console Pin Gatefails onmainand will fail for every PR queued behind it until objectui stops importing five retired schemas. Filed unassigned, nodomain:*label — that surface is triage's.Noticed from a merge-queue triage comment on an unrelated PR (#10635, a
packages/spec/src/api/change). The bot's own checklist item 2 — "失败测试与本 PR 无关" — is the right verdict here, but the failure is not flaky and not environmental: it is a deterministic build break onmain.The failure
Queue build 32489707012, job
Console Pin Gate, step Build the Console SPA at the pinned objectui SHA:Note the shape:
MISSING_EXPORTat bundle time, 5.89s, no test ran. This is the build, not a suite — so the usual timeout-vs-assertion triage does not apply, and re-running cannot change the answer.Root cause, established by content on both repos
objectstack
main(08318f7c0e) no longer exports them. Removed by35ad101bc3— feat(spec): retire thethemescarrier key and ThemeSchema —app.brandingis the one colour surface (#10485, ADR-0049), landed as PR #10695.packages/spec/src/ui/index.tsnow says so in as many words:objectui still imports them — and this is the part that matters:
theme.zod.tsimports the retired schemas?9a3daf8d37ad(.objectui-sha)main@ac73c24b01, ahead of the pinSo this is not a stale pin. Bumping
.objectui-shato objectui's tip would reproduce the identical failure. objectui has no counterpart to this retirement anywhere — the removal landed one-sided.Why the same commit's own reasoning predicts this
packages/spec/src/ui/index.tsrecords that "objectui's ThemeEngine/ThemeContext and their unit tests are retained" — i.e. the retirement knew objectui still has live theme machinery, and kept it. What was missed is narrower and mechanical: that machinery re-derives its zod types from@objectstack/spec/uirather than declaring them locally, so retaining the engine while deleting the schemas leaves a dangling import. ADR-0049 enforce-or-remove was applied to the spec half only.What it does not appear to have blocked
35ad101bc3(#10695), and then #10633, #10635 and #10839, all merged after this gate went red —mainadvanceddccbcec2e4 → 35ad101bc3 → 16cef9725c → 08318f7c0e. SoConsole Pin Gateis evidently not a required check for the queue, which is exactly why a one-sided retirement could land: the gate that would have caught it does not stop anything. Whether that is intended is worth a separate ruling; as it stands the signal exists and is being emitted into merge-queue triage comments on innocent PRs, where it reads as someone else's flake.Suggested shape (not a ruling — this is a finding)
Two halves, and the ordering is forced:
@objectstack/spec/uiimports frompackages/types/src/zod/theme.zod.tsand declare the shapes locally, or re-point them at whateverapp.brandingnow provides. This must land in objectui first..objectui-shapast that commit. Only then does the gate go green.Until both land, every PR's queue build carries this red, and the merge-queue triage bot will keep attributing it to whichever PR happens to be in the batch.
Reproduction (free, no CI)
Provenance
main@08318f7c0eand objectuimain@ac73c24b01, 2026-08-21 ~14:15Z.outcomediscriminant on publishPackageDrafts response (#10462) #10635; [RESCUED — evidence complete] feat(metadata-protocol,spec): declareoutcomediscriminant on publishPackageDrafts response (#10462) #10635 is not the cause and needs no change — its diff ispackages/spec/src/api/protocol.zod.ts, a different subpath frompackages/spec/src/ui/.6d5368ac8: the lazy-linter counter-probe is blind to the OBJECTSTACK_SPEC_DIST injection #10136, spec declaresicononpage:accordionitems, but the console pinned after objectui#4652 no longer reads it — ADR-0049 enforce-or-remove #9397, chore: bump the console pin — 405 objectui commits behind, and the gap now holds a shipped bug fix plus the spec key #7804 added #8051 are Console-Pin-Gate-adjacent but all closed and none is this.