Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
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

Closed

Description

@yinlianghui

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:

  1. 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.
  2. Keep the prop narrow and say the union is not what a host holds — then the five call sites are wrong and each needs a real narrowing (not as never), and the guidance that came with finding(types): two competing SchemaNode declarations — core's interface vs types' union #4580 needs to say so.

⛔ 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.

Refs #4600, PR #4615, #4580, PR #4608.


Generated by Claude Code

Activity

  1. 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
  2. self-assigned this
    on Aug 14, 2026
  3. yinlianghui commented on Aug 14, 2026

    @yinlianghui
    ContributorAuthor

    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):

    1. 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.
    2. 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.
    3. 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.


    Generated by Claude Code


    Generated by Claude Code

  4. added a commit that references this issue on Aug 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions