Uh oh!
There was an error while loading. Please reload this page.
docs(objectui): remove phantom tab-level lazy/source and badge/badgeVariant from layout-dsl - #8402
Merged
Merged
Conversation
…ariant from layout-dsl
The Tabs family in content/docs/protocol/objectui/layout-dsl.mdx taught four
keys that exist on no schema, plus a wrapper shape the form schema rejects.
Measured against packages/spec/authorable-surface/ (7840 authorable keys):
- `lazy` returns 0 hits across the ENTIRE authorable surface, not just ui.
Positive controls, same command shape: `source` 19, `badge` 8,
`badgeVariant` 8, `pagination` 2 - the instrument plainly sees keys.
(A bare grep for `lazy` in packages/spec/src/ui/view.zod.ts hits only the
`lazySchema` import helper - position, not count.)
- All 8 `badge` / `badgeVariant` entries are on NavItem surfaces
(ui/ObjectNavItem and siblings) - app navigation, never a form tab.
None of the 19 `source` entries is a tab or a section.
- ui/ViewTab declares exactly nine keys: filter, icon, isDefault, label,
name, order, pinned, view, visible - and it is a LIST view surface
(ListViewSchema.tabs / UserFiltersSchema.tabs), not a form surface.
- FormViewSchema.layout is a string enum (vertical/horizontal/inline/grid)
and FormViewSchema declares no `tabs` key at all, so the
`layout: {mode: tabbed, tabs: [...]}` wrapper was wrong independently of
the leaf keys. The real shape is `type: tabbed` + `sections`, each section
rendering as its own tab (defaultTab / tabPosition), as
content/docs/protocol/objectui/index.mdx and
examples/app-showcase/src/ui/views/task.view.ts already author it.
ViewTabSchema, FormViewSchema and FormSectionSchema are all strictObject, so
these were parse REJECTIONS, not silent strips.
Fixed by removal/rewrite following PR #8301's shape on this same page,
including its "loud absence" style - never by widening a schema. The page's
internal inconsistency is gone as a side effect: its ## Performance section
stated an absence an earlier passage demonstrated as working syntax.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jqe56GnYFddggeAyfkZFVzThe latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
qq9340100
marked this pull request as ready for review
August 13, 2026 11:18
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 13, 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 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#8303
The Tabs family in
content/docs/protocol/objectui/layout-dsl.mdxtaught four keys that exist on no schema, plus a wrapper shape the form schema rejects. Fixed by removal/rewrite following PR #8301's shape on this same page — including its "loud absence" style — never by widening a schema.Premise re-verified on
origin/main(not taken on trust)Measured against
packages/spec/authorable-surface/— 7840 authorable keys across all shards, 1049 in theuishard (matches the count carried by the absorbed duplicate).lazysourceui/Page,ui/PageVariable,ui/InterfacePageConfig, + 16 non-ui — no tab, no sectionbadgeui/ObjectNavItemand siblings) — app navigationbadgeVariantpaginationui/ListView,ui/ObjectListView(positive control)The positive controls establish the instrument sees keys before any zero was trusted. The
lazySchemagrep trap is real and I walked into it deliberately: a bare grep forlazyinpackages/spec/src/ui/view.zod.tsreturns ~40 hits, every one thelazySchema(() => …)import helper wrapping a schema declaration. Judged by position, not count — there is nolazy:property key.Two counts differ slightly from the issue body:
sourceis 19 whole-surface (issue said 20) andbadgeVariant/badgeare 8 (as stated). The direction is unchanged and immaterial — none of thesourceentries is a tab or a section.ui/ViewTabdeclares exactly nine keys —filter,icon,isDefault,label,name,order,pinned,view,visible— confirmed against the current generated surface. It is a list view surface (ListViewSchema.tabs,UserFiltersSchema.tabs), not a form surface, so the page's form-tab examples could never have reached it.The wrapper was wrong independently of the leaf keys.
FormViewSchema.layoutisz.enum(['vertical','horizontal','inline','grid'])andFormViewSchemadeclares notabskey at all. The real shape istype: tabbed+sections, each section rendering as its own tab, withdefaultTabnaming a section andtabPositionplacing the strip — exactly ascontent/docs/protocol/objectui/index.mdx("In tabbed forms each section renders as its own tab") andexamples/app-showcase/src/ui/views/task.view.tsalready author it.ViewTabSchema,FormViewSchemaandFormSectionSchemaare allstrictObject, so every one of these was a parse rejection, not a silent strip.What changed
### Basic Tabs— rewritten from the rejectedlayout: { mode: tabbed, tabs: [...] }wrapper to the acceptedtype: tabbed+sectionsshape. Dropped the per-tabicon:too:FormSectionSchemadeclares noiconkey, so carrying it over would have planted a fresh phantom.### Lazy-Loaded Tabsand### Tab Badges and Counters— deleted; both were built entirely on phantom keys.### A tab carries no options of its own— new, in the loud-absence style, naming the real section surface and pointing counter-badge seekers at the NavItem surfaces wherebadge/badgeVariantgenuinely live, and tab-option seekers atui/ViewTabon list views.The page's internal inconsistency is gone as a side effect:
## Performancestated an absence that an earlier passage demonstrated as working syntax. That section is untouched — I did not weaken or revert #8301's work.Verification
All five gates green locally (re-derived against the actual changed path via
scripts/pm/dispatch-gates.mjs— identical to the dispatched list, no delta):check:doc-formula-expressions— 24 self-test cases; 22 formula examples across 395 files / 1410 TS blocks judged cleancheck:docs-audit-scope— 56 + 22 self-test cases; 179 hand-written docs in synccheck:quick-reference-counts— 22 self-test cases passcheck:role-word— OK, no new occurrencescheck:nul-bytes— 7589 files scanned, no raw control bytesIts first run failed on
ERR_MODULE_NOT_FOUNDfor@objectstack/formula/dist— the fresh-worktree stale-build trap, not this change. Green afterpnpm --filter '@objectstack/lint^...' build.MDX compiles (
@mdx-js/mdx3.1.1). Instrument proven both ways: a deliberately broken closing tag fails the compile, and the compiled output containsbadge: { count, variant }andmode: tabbed, tabs: [...]as literal text — the braces inside inline code are not parsed as JSX expressions, matching 62 existing Callout precedents incontent/docs.Scope
Declared file surface
content/docs/protocol/objectui/layout-dsl.mdxonly — respected, no breach. Docs-only, no user-visible runtime change ⇒skip-changeset, no changeset file.One out-of-scope phantom found on the same page and filed separately rather than fixed here: the Console Template example (~line 142) authors
properties: { tabs: [...] }on arecord:detailscomponent, andui/RecordDetailsProps— alsostrictObject— declares notabskey (aria,columns,fields,hideFields,inlineEdit,sections,showHeader, + retiredlayout). Different family, different schema, outside this card's fence.Generated by Claude Code