Uh oh!
There was an error while loading. Please reload this page.
docs(guide,api): one disposition per fabricated export, applied at every site (#5343) - #5364
Merged
Merged
Conversation
…ery site (#5343) The getting-started guides under `content/docs/guide/**` and `content/docs/api/schema-reference.md` documented 14 symbols the packages do not export. A reader copying one of those imports got a compile error, not a degraded render — the same class as #5160, one directory over. Every name set was taken from each package's built `dist/index.d.ts`, never from a grep of `src/`. Each symbol got ONE disposition, applied at every site: - renamed: `PageSchema` -> `PageNodeSchema`, `DashboardSchema` -> `DashboardComponentSchema`, `AppSchema` / `ThemeSchema` / `ReportSchema` -> `AppComponentSchema` / `ThemeComponentSchema` / `ReportComponentSchema` (type AND zod entries), `componentSchema` -> `ComponentSchema`, `registerDefaultRenderers` / `registerAllComponents` -> `initializeComponents()` plus the side-effect `@object-ui/fields` import, `getComponentRegistry()` -> the `ComponentRegistry` singleton; - wrong package: `BaseSchema`, `PageSchema` and `FormSchema` were claimed from `@object-ui/core` while they live in `@object-ui/types`; - removed with nothing replacing it: `InputRenderer`, the `ObjectSchema` / `Field` builder pair and `getExpressionEvaluator` — those examples are gone and the pages teach the real surface instead. The seven `UNGATED_DOCS` entries are rewritten to the mix each page now measures. Every bucket is equal or lower; no new diagnostic class appears. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RV6yuVCxymHYE16PL9vQkE
os-support-ai
marked this pull request as ready for review
August 20, 2026 01:53
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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.
Fixes#5343
Part of #5174
The getting-started guides taught 14 symbols the packages do not export. A reader who copied one of those imports did not get a degraded render — they got a compile error. Same class as #5160 (five published READMEs), one directory over, on the pages people copy from most.
Every name set comes from each package's built
dist/index.d.ts, resolved exactly ascheck-doc-snippet-types.mjsresolves it (each package'sexports.types), never from a grep ofsrc/— the #5053 rule. The measurement harness reuses that script's ownanalyze()/compileSnippets(), so the numbers below are produced by the same pipeline that writes the ledger, over the whole corpus in one program (637 blocks, 541 semantically judged). Build artifacts sit between every edit and the thing under test, so the packages were built first (turbo run build, 43 tasks) and every measurement ran against thatdist/.Re-measured before working — and it agrees with the card
The card said its symbol table came from PR5341's run and the tree had moved. Re-derived here, the baseline reproduced the ledger's recorded mix exactly, for all seven entries — so this tree had not moved on these pages. One number disagrees with the card's body table:
AppSchema/ThemeSchema/ReportSchemaare 8 occurrences, not 9 (TS2305x2 + TS2724x6 inschema-overview.md). The card'sObjectStackProviderrow lives atcontent/docs/utilities/index.md:163, outside this card's file surface; it is untouched, still on the ledger, and now filed on its own (see Findings).One disposition per symbol, applied at every site
getComponentRegistry@object-ui/reactComponentRegistry, the process-level singleton@object-ui/coreexports (Registry.d.ts:341; the spelling PR5260 landed in the core/react/components READMEs)registerDefaultRenderers@object-ui/componentsinitializeComponents()plus the side-effectimport '@object-ui/fields'(apps/site/app/components/ObjectUIProvider.tsx)registerAllComponents@object-ui/componentsregisterAllFields(Registry)arity error — the real one takes no arguments and the module calls it itself at load)BaseSchema@object-ui/core@object-ui/types(base.d.ts:65, and it declaresclassName— which is what retired the page's TS2339)PageSchema@object-ui/types/@object-ui/corePageNodeSchemain@object-ui/types— renamed by objectui#3074, which split the renderer NODE off the spec'sPagedocumentFormSchema@object-ui/core@object-ui/types(form.d.ts:1073)DashboardSchema@object-ui/typesDashboardComponentSchema(complex.d.ts:657)AppSchema@object-ui/types,/zodAppComponentSchema(app.d.ts:283, zodapp.zod)ThemeSchema@object-ui/types,/zodThemeComponentSchema(theme.d.ts:79, zodtheme.zod)ReportSchema@object-ui/types,/zodReportComponentSchema— the presentation layer;Spec*is the definition layer (spec-report.d.tsheader)componentSchema@object-ui/types/zodComponentSchema(zod/blocks.zod.d.ts:482) — aliased at the site, because the same block already imports the TYPE of that nameInputRenderer@object-ui/componentsObjectSchema/Field@object-ui/typesDataSource.getObjectSchema()returnsPromise<any>); the example now writes it as a literal whosefieldsrecord is typed against the realFieldMetadatauniongetExpressionEvaluator@object-ui/coreSchemaRenderer.tsx:420constructs a freshExpressionEvaluatorper evaluation, and each one builds its ownFormulaFunctions. The section now teachesevaluateExpression(expr, context)andnew ExpressionEvaluator(context)Two same-spelling names were checked and deliberately not touched, because their source is real:
layout.md's prose "anAppSchemaJSON document" anddashboard-filters.md's "DashboardSchema.dateRange… are part of@objectstack/spec" both name spec exports (@objectstack/spec/uidoes exportAppSchema). The defect was always the claimed source, never the spelling in the abstract.The two replacement claims in
expressions.mdwere verified by running them against the builtdist/, not by reading: a context-supplied function is callable under its exact name (evaluateExpression('${formatCurrency(price)}', { formatCurrency, price: 1234.5 })→'$1,234.50'), and${user.permissions.includes('admin')}returnstrue/falseagainst the two obvious contexts.Adjacent falsehoods the renames exposed — fixed here, and why that is not scope creep
Re-pointing an import at the real type turns a previously-unchecked literal into a checked one. Three blocks would have gained a new diagnostic class, which the ratchet forbids, so they were corrected in the same pass, each pinned by the same built
d.tsthe disposition came from:schema-overview.mdtheme example —mode: 'system'(the vocabulary isauto/light/dark) and per-themelight/darkpalettes (the specThemecarries onecolorsmap). Measured: TS2322x1 + TS2353x1 appeared, then went.schema-rendering.mdtyped page —PageNodeSchema.bodyisSchemaNode[], so the nested form is an array element. Measured: TS2353x1 appeared, then went.component-registry.mdregister(…)metadata —displayName/description/tags/schema/lazy: trueare notComponentMetakeys; the real ones (label,category,icon,inputs,labelling) are used, and lazy registration isregisterLazy(type, loader). In the same pagegetRegisteredTypes()/getMetadata()becamegetAllTypes()/getMeta(), the names theRegistryclass declares.Ledger — rewritten to the new measured mix, never widened
Every entry stays: none of the seven pages reaches zero, because #5174's fragment / self-containment half is a separate job.
api/schema-reference.mdguide/building-crud-app.mdguide/component-registry.mdguide/expressions.mdguide/schema-overview.mdguide/schema-rendering.mdguide/troubleshooting.mdEvery bucket is equal or lower and no new class appears. Nothing was added to the ledger, no threshold moved, and no export was added to any package — the accept set is untouched.
The ledger's header note is updated with it: after this change, exactly one entry in the whole file still names a missing export (
content/docs/utilities/index.md,ObjectStackProvider), and it says so by name.Verification (at
d975803fb, the final commit)Corpus re-derivation at the same commit: over all 35 guide pages plus
schema-reference.md, and again over the whole 637-block corpus, zero TS2305 / TS2724 / TS2614 remain anywhere under this card's file surface. The only missing-export diagnostic left in the corpus isObjectStackProvideratcontent/docs/utilities/index.md:163.Changeset: empty frontmatter (
.changeset/guide-fabricated-exports-5343.md) — docs and gate ledger only, no packagesrc/touched, so nothing publishes. That is this repo's declared "no release" form (AGENTS.md §9; precedent.changeset/app-shell-docs-nav-examples.md) and it is whatcheck-changeset-presence.mjsconfirms is owed. The dispatch suggestedpatch; a patch would move all 39 packages of the fixed group for a change with no runtime effect, so the empty declaration is used instead and flagged here.Findings, filed not fixed
content/docs/utilities/index.mdstill documents theObjectStackProviderphantom API that #4124 removed from the page one file over #5360 —content/docs/utilities/index.mdstill documents theObjectStackProviderphantom React API that data-objectstack docs page documents an ObjectStackProvider / useObjectStack React API the package does not export (the package is headless) #4124 / PR4129 removed from the sibling page one file over. Outside this card's file surface.ObjectSchemaMetadatadeclares neithertitleFormatnorlist_views/listViewsnoricon, and the runtime reads all three #5362 —ObjectSchemaMetadatadeclares neithertitleFormatnorlist_views/listViewsnoricon, all of which the runtime reads. Adding them is a contract change and a different card; this PR left the guide's metadata document a plain literal and typed only thefieldsrecord.ExpressionEvaluator.registerFunctionupper-cases the name, so a lower-case call in an expression renders its own${...}source #5363 —ExpressionEvaluator.registerFunction(name, fn)upper-cases the name, so${formatCurrency(x)}never resolves to a function registered asformatCurrencyand renders its own source instead. Measured, not inferred.Generated by Claude Code