docs(types,api): name the component node BaseSchema and pin the vocabulary - #8064
Merged
Conversation
…abulary objectui#7434's maintainer ruling (option 1) names the object half a renderer receives `BaseSchema`. Three things, so the gap cannot regrow: - `packages/types/README.md`: the inheritance chain listed a `UIComponent` rung above `BaseSchema`. `UIComponent` is not exported by `@object-ui/types` (0 files under `packages/types/src`, against 101 for `BaseSchema`), and `BaseSchema` extends nothing -- so the rung was a phantom sitting above a row that already described it. The two rows collapse into one true row. - `content/docs/api/schema-reference.md`: the definitional statement, placed in the section that already defines both names side by side, including when `SchemaNode` is the right word instead. - `scripts/__tests__/component-node-vocabulary-7434.test.ts`: pins zero `UIComponent` and zero generic-sense `ComponentSchema` across `content/docs/**` and `packages/*/README.md`, with a live control and a counter-probe. The leading `\b` spares the seven legitimate compound symbols (`AppComponentSchema` and friends) structurally. The #7082 distinction is kept, not flattened: `BaseSchema` for node-slot positions, `SchemaNode` only where the wider union is genuinely correct (`content/docs/guide/layout.md`), which is untouched. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contributor
Author
|
Standing down on Generated by Claude Code |
baozhoutao
marked this pull request as ready for review
September 6, 2026 14:05
This was referenced Sep 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #7434 — PR A only, the
domain:devxhalf.Maintainer ruling (comment 5556352576, option 1): the concept "a component node — the object half a renderer receives" is named
BaseSchema. This PR writes that name where docs authors look, repairs the one surviving residue, and pins the vocabulary so the gap cannot regrow.Three changes
1.
packages/types/README.md— the residue. The inheritance chain carried aUIComponentrung aboveBaseSchema. Two things are wrong with it, and only the first was on the card:UIComponentis not exported by@object-ui/types(0 files underpackages/types/src, against 101 forBaseSchema, so that zero is a real zero and not a dead grep), andBaseSchemaextends nothing — it is the standalone base. The rung was therefore a phantom sitting directly above a row that already described the same interface. The repair collapses the two rows into one true row, rather than renaming the phantom, which would have produced twoBaseSchemarungs.That line sits inside an untagged ASCII-diagram fence, so it is not compiled. The page's
typescriptblocks are untouched, and the page is incheck:doc-snippets' covered set (not among the 16 ungated — verified against the gate's own exportedUNGATED_DOCS, 16 keys matching its printed count).2.
content/docs/api/schema-reference.md— the definitional statement. One page, no sweep, no new page. This page already owns the concept: its## Base Schemasection definesSchemaNodeandBaseSchemain adjacent subsections. The statement goes at the top of that section, so the "which word when" answer sits directly above both definitions. It adds no fenced block, so it adds no compile surface.3.
scripts/__tests__/component-node-vocabulary-7434.test.ts— the pin. ZeroUIComponentand zero generic-senseComponentSchemaacrosscontent/docs/**(.md+.mdx) andpackages/*/README.md, with a live control and a counter-probe. Relative imports only.The distinction is kept, not flattened
BaseSchemafor node-slot positions;SchemaNodeonly where the wider union is genuinely correct.content/docs/guide/layout.mdis untouched. The pin asserts the absence of the two spellings that name nothing real — it says nothing aboutSchemaNode, so it cannot push a future author toward flattening the two.Verified rather than copied from the card:
SchemaNodeisBaseSchema | string | number | boolean | null | undefinedatpackages/types/src/base.ts:483, and the narrowing guard the card cites is real atpackages/components/src/renderers/feedback/empty.tsx:37(actionSchema && typeof actionSchema === 'object'). The statement describes that mechanism without over-claiming it as a universal renderer guard, which it is not — the only othertypeof ... === 'object'inSchemaRenderer.tsxguardsboundRecord, a different thing.Why the pin uses a word boundary rather than a substring test
Seven legitimate compound symbols live on the scan surface:
AppComponentSchema,DashboardComponentSchema,MyComponentSchema,PageComponentSchema,ReportComponentSchema,ThemeComponentSchema,AnyComponentSchema. A substring scan would flag all seven, and the natural repair would be to weaken the scan until it no longer caught the class it exists for. A leading word boundary excludes them structurally. The allow-list exists and is empty, with the rule written into it: add an entry with its reason, never widen the regex.Ablation — the must-fail leg
The implementation was committed first, so the restore leg had a real commit to return to.
UIComponentcount 0, blobd1ba9bc39:34residue:UIComponentcount 1, blobd2745532c— a different hash, so the mutation provably reached diskpackages/types/README.md:34and quoting the residue line back1 failed | 3 passed— the control and the counter-probe stayed green, so the red is the banned-spelling assertion specifically, not a broken harnesstrapusing absolute paths: blob back tod1ba9bc39,git diff HEADemptyWhat this PR deliberately leaves alone
AGENTS.mdlines 73, 82 and 124 still teachUIComponent. They are left for PR B, thedomain:skillshalf, per triage 5556499148's two-PR prescription. The reason is mechanical rather than preference:AGENTS.mdis a governed surface, and a single governed path turns an entire PR governed (draft plus human merge). Carrying those three lines here would send an ordinary documentation change to the manual-merge queue. That half stays open and is out of scope here.The pin's scan surface excludes
AGENTS.mdfor the same reason — including it would red this pin onmainuntil that separate PR lands.docs/audits/**and repo-rootdocs/**are excluded too: historical audit records rather than teaching surfaces, and one of them legitimately carriesComponentSchemainside a verbatim symbol list of what the repo once exported.Gates — all on merged head
5032f3cd6mainmoved 3 commits under this branch (a8f4bd75ftobfa4fe728, disjoint files); merged, rebuilt forced, and every reading below is from the merged head.turbo run build --filter=./packages/* --forcecheck:doc-snippetscheck:doc-fencescheck:readme-exportscheck:doc-typescheck:doc-example-readerscheck:control-bytescheck-doc-links.mjstype-check:scriptslint:rootvitest run scripts/__tests__/check-changeset-presence.mjscheck-governed-queue-guard.mjs --testcheck:doc-snippetsjudgment line, quoted:The new pin was confirmed collected by name (JSON reporter), not inferred from a green total: 4 assertions, all passing.
No changeset is owed —
check-changeset-presence.mjsdecided it against merge-basebfa4fe728: 3 files changed, 0 published source, 0 moved manifest contracts.Manual control-byte scan of all three changed paths: clean.
Live E2E (informational)is red on every branch today for an upstream reason (#7990, objectstack#16186) and is not from this change.🤖 Generated with Claude Code
Session:
https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKrGenerated by Claude Code