You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
main is RED: Build Docs fails on SchemaNode vs SchemaRenderer's schema prop — the docs site has not built since #4608 landed #4617
Corrected after filing — the original framing ("CI never runs apps/site's type-check") was wrong, and the truth is worse: CI runs it inside next build, and it has been failing on main since PR #4608 merged. The corrected version follows; the false half is retracted at the bottom so the record is not silently rewritten.
Measured while implementing (d1) of #4600 (PR #4615). Filed unassigned. Duplicate-searched: no open issue covers it.
main is red
ci.yml's Build Docs job runs pnpm --filter @object-ui/site build, i.e. next build, and Next runs TypeScript as part of that build. The main push run for c1d939f7f — the merge of PR #4608, "fix(types): one SchemaNode and one label vocabulary — the union wins" (#4580) — failed:
run 31740683664 main push c1d939f7f conclusion: failure
Build Docs -> step "Build Site" -> failure
(the immediately preceding main run, 31736774667, was success)
and the failing step's log is exactly:
app/components/InteractiveDemo.tsx(74,43): error TS2322: Type 'SchemaNode' is not assignable to type 'string | BaseSchema | null | undefined'.
app/components/InteractiveDemo.tsx(119,35): error TS2322: (same)
app/components/LiveSplitDemo.tsx(286,37): error TS2322: (same)
app/components/SchemaThumbnail.tsx(145,35): error TS2322: (same)
app/playground/page.tsx(1413,39): error TS2322: (same)
Type 'number' is not assignable to type 'string | BaseSchema | null | undefined'.
Failed to type check.
Every PR branched after that commit inherits the red — PR #4615 does, and its own gates (Lint, Type Check, Control Byte Scan, Changeset, Docs Link Check, Build and E2E) are all green beside it.
The contract skew underneath
This is not an app bug. @object-ui/core exports SchemaNode; @object-ui/react exports SchemaRenderer; and after #4580 made the union canonical, passing the former to the latter's schema prop no longer type-checks. SchemaNode now includes primitives — number is the member the error names — while the prop takes string | BaseSchema | null | undefined. Any consumer that types a value as SchemaNode and renders it hits this; apps/site is simply the consumer that lives in this repo and is compiled by CI.
So the decision is a contract one and belongs with #4580's ruling, not with a cast at five call sites:
Widen SchemaRenderer's schema prop to SchemaNode — consistent with "the union wins", and the renderer already has to cope with whatever it is handed at runtime. A published prop-type change in @object-ui/react, so it needs a changeset and a look at what else reads that prop type.
⛔ Casting at the call sites to get CI green would be the consumer-side tolerance that AGENTS.md's contract-first rule exists to prevent — it hides the skew in the exact place the next author will copy it from.
Second, smaller half (still true)
apps/site's type-check script is named types:check, not type-check, so turbo run type-check (the Type Check job) skips it and scripts/check-type-check-coverage.mjs reports it as its "1 not compiled" package. That is why the Type Check job is green while Build Docs is red on the same commit — the type errors are only reached through next build, three minutes later in a different job. Renaming the script would surface this class in the job named after it, and is worth doing alongside whichever option above is chosen.
Retraction
The first version of this issue claimed "CI never runs it". False — Build Docs does, via next build. The claim came from noticing the turbo task-name gap and not checking whether another job compiled the package anyway. The gap is real; the conclusion drawn from it was not.
changed the title [-]apps/site's type-check has been red on main and CI never runs it — the script is named `types:check`, so turbo's `type-check` task skips the package[/-][+]main is RED: `Build Docs` fails on `SchemaNode` vs `SchemaRenderer`'s `schema` prop — the docs site has not built since #4608 landed[/+]on Aug 14, 2026
CLAIM — URGENT (main is red) — session session_017Qqyix2QcnpUC9XeYVDzx3, branch claude/issue-4617-site-schemanode-bridge. Build Docs has failed on every main push since #4608 landed; every open PR inherits the red, so this outranks everything else in flight.
PM ruling (delegated, veto window open):
The five apps/site sites route through toRenderableSchema — the documented adapter the finding(react): SchemaRenderer carries the #4422 prop erasure in a spelling every sweep and both guards are blind to — Record< string, any > instead of [key: string]: any #4548-Q2 ruling kept for EXACTLY this: SchemaNode's union deliberately includes number/boolean while SchemaRenderer's component union deliberately excludes them, and the bridge is the sanctioned crossing. NOT a prop widening in @object-ui/react (re-opens a settled contract), NOT as casts (the lenient-consumer form contract-first forbids). If any of the five sites holds a value that provably cannot be a bare primitive, the bridge call is still the right spelling — it is total and self-documenting.
Close the gate gap in the same PR: the turbo task-name mismatch (types:check vs type-check) that kept apps/site's type-check out of the canary graph — align the task name (or add the alias) so turbo run type-check --filter='...@object-ui/react' reaches apps/site, and state the before/after task counts. This is the half that prevents the next silent main-red of this class.
Red-first: the five verbatim TS2322s against origin/main; green = next build's type-check pass locally + the aligned turbo task green; must-not-change = the rendered gallery/demo pages' behavior (the bridge is identity for every object schema).
Mutual exclusion: #4614 (plugin-dashboard src) and #4615 (draft, apps/site gallery files — SchemaThumbnail/registerCatalogBlocks/galleryDataSource) are in flight. #4615's three new/edited apps/site files are NOT on main yet — fix main's five sites as they exist on origin/main; if a merge conflict with #4615 appears later, the queue rebases it. ⛔ packages/react prop types untouched; content/docs/releases/** never.
Activity
[-]apps/site's type-check has been red on main and CI never runs it — the script is named `types:check`, so turbo's `type-check` task skips the package[/-][+]main is RED: `Build Docs` fails on `SchemaNode` vs `SchemaRenderer`'s `schema` prop — the docs site has not built since #4608 landed[/+]yinlianghui commentedon Aug 14, 2026
CLAIM — URGENT (main is red) — session
session_017Qqyix2QcnpUC9XeYVDzx3, branchclaude/issue-4617-site-schemanode-bridge. Build Docs has failed on every main push since #4608 landed; every open PR inherits the red, so this outranks everything else in flight.PM ruling (delegated, veto window open):
toRenderableSchema— the documented adapter the finding(react): SchemaRenderer carries the #4422 prop erasure in a spelling every sweep and both guards are blind to —Record< string, any >instead of[key: string]: any#4548-Q2 ruling kept for EXACTLY this:SchemaNode's union deliberately includesnumber/booleanwhile SchemaRenderer's component union deliberately excludes them, and the bridge is the sanctioned crossing. NOT a prop widening in@object-ui/react(re-opens a settled contract), NOTascasts (the lenient-consumer form contract-first forbids). If any of the five sites holds a value that provably cannot be a bare primitive, the bridge call is still the right spelling — it is total and self-documenting.types:checkvstype-check) that kept apps/site's type-check out of the canary graph — align the task name (or add the alias) soturbo run type-check --filter='...@object-ui/react'reaches apps/site, and state the before/after task counts. This is the half that prevents the next silent main-red of this class.next build's type-check pass locally + the aligned turbo task green; must-not-change = the rendered gallery/demo pages' behavior (the bridge is identity for every object schema).Mutual exclusion: #4614 (plugin-dashboard src) and #4615 (draft, apps/site gallery files — SchemaThumbnail/registerCatalogBlocks/galleryDataSource) are in flight. #4615's three new/edited apps/site files are NOT on main yet — fix main's five sites as they exist on origin/main; if a merge conflict with #4615 appears later, the queue rebases it. ⛔ packages/react prop types untouched;
content/docs/releases/**never.Generated by Claude Code
Generated by Claude Code
fix(site): SchemaNode crosses to SchemaRenderer through the bridge — …
docs(react): scope the union spelling to #4617's logs, so it cannot g…
docs(react): toRenderableSchema's header says the bridge is permanent (…