docs(plugin-charts, plugin-form, plugin-list, app-shell): census of the object-schema snake lookup reads — all seven legs keep, with the evidence recorded at each site - #7649
Draft
os-sam wants to merge 1 commit into
Conversation
…object-schema snake-lookup census at each site, retiring none Census only, no runtime change. Each of the six sites now carries the verdict for the bag it actually reads, traced to its producer. Three measurements moved every site to KEEP: 1. The serve path runs no parse. `ObjectStackAdapter.getObjectSchema` returns the server document verbatim plus `normalizeSchemaReferenceKeys` and `applyFieldWidgetOverrides` only, so a stored pre-strict document still delivers these keys. `FieldSchema`'s strictness gates authoring, not serving. 2. Five of the six sites have no camelCase leg, so retiring the snake read deletes the only read of the value rather than re-pointing it — and, conversely, those five already ignore a spec-compliant `displayField`/`idField`/`descriptionField`/ `lookupFilters` today (objectui#7435 for two of them; this census adds three). 3. The object-schema field def and the widget bag are the same object at runtime: `ObjectForm` threads each `getObjectSchema` field def to the widget, where `LookupField` reads the snake spellings first and `LookupFieldMetadata` declares all four. Retiring here would split one stored document's rendering between the form and the chart/list/filter/action consumers. One site of the six is not the object-schema def at all: `ListView`'s declared-columns branch reads a list-view column, and `ListColumnSchema` refuses both castings of every key involved (objectui#7531). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KbJQ1y1J12nZxYzFWhP8Q3
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
|
This was referenced Sep 4, 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 #7642
Census only. Zero sites retired, zero runtime change (102 insertions, 0 deletions:
comments plus one empty-frontmatter changeset). Per the dispatching ruling, the census
is the deliverable and the retirements were conditional on it.
Verdict: all seven legs KEEP
The card's argument is that
FieldSchemais strict, the four snake spellings areabsent, therefore no producer can emit them. Measured against the spec installed in
this repo, with all controls lit, that is true — of the authoring path. Three
further measurements moved every site to KEEP.
1. The serve path runs no parse
ObjectStackAdapter.getObjectSchemareturns the server document verbatim plus exactlytwo rewrites (
normalizeSchemaReferenceKeys,applyFieldWidgetOverrides). Count ofObjectSchema.parse/safeParseon that path: 0, against a lit control (the samefile does use
DroppedFieldsEventSchemaandisFilterAST). SoFieldSchema'sstrictness gates authoring, not serving: a stored pre-strict document still
delivers these keys to every one of these consumers. The legs are not unreachable.
2. Five of the six sites have no camelCase leg at all
Measured per file, control lit. Only
ObjectFieldInspectorreads a camel spelling offthe field def. For the other five, retiring the snake read does not re-point the read
to the declared spelling — it deletes the only read of the value.
The corollary is the more interesting half, and it inverts the card's disposition:
those five sites already ignore a spec-compliant
displayField/idField/descriptionField/lookupFilterstoday. The user-serving change is to add thedeclared camel reads, not to remove the snake ones. objectui#7435 already carries that
finding for two of the five; this census adds three more (
deriveMasterDetail,ListView's object-def branch,UserFilters).3. The object-schema def and the widget bag are the same object at runtime
ObjectFormbuilds its fields fromgetObjectSchemaand threads each def to thewidget.
LookupFieldstates this in-file ("the actual objectSchema field metadata ...the form path is the real producer") and reads
display_field/description_field/id_field/lookup_filterssnake-first.LookupFieldMetadatain@object-ui/types— published, and documented as authorable incontent/docs/fields/lookup.mdx— declares all four.This is the objectui#7155 shape exactly: the "no producer can emit it" argument is
true of the object contract and false of a second published one. Retiring the legs at
the object-schema consumers while the form widget keeps reading snake-first off the
same def would split one stored document's rendering between the form and the
chart, list, filters and action dialogs.
The census
plugin-chartsObjectChartds.getObjectSchema(schema.objectName), sole producer; the function is not in the package's public APIplugin-formderiveMasterDetaildataSource.getObjectSchema(d.childObject)in-repo, butderiveColumnsis a public export so external bags are untraceableplugin-listListView, columns branchschema.columnsListColumnSchema, a third contractplugin-listListView, object-def branchdataSource.getObjectSchema(...), sole producerplugin-listUserFiltersobjectDef, a public prop typed loosely on a publicly exported componentapp-shellresolveActionParamsuseMetadata().objects, the meta-API object documentsapp-shellObjectFieldInspectorThe card's table lists
ListViewas one site. It is two, on two differentcontracts: the columns branch reads a list-view column, where
ListColumnSchemarefuses
display_fieldanddisplayField,id_fieldandidField,reference_toandreference— measured, with a positive and a negative control.That is objectui#7531's population, not this card's.
Measurements
FieldSchema.safeParse, installed spec, every control lit:ListColumnSchema.safeParse, same controls: minimal column ACCEPTED, bogus keyREJECTED, and all ten keys tested (both castings) REJECTED with
unrecognized_keys.ObjectSchema.fieldsis a record; an array is refused withinvalid_type: expected record, received array— noted because two of these sitescarry an
Array.isArray(objectDef.fields)branch the object contract cannot produce.One live disagreement, reported not fixed
The designer reads
lookupFilters ?? lookup_filters(camel first) while the runtimeLookupFieldreadslookup_filters ?? lookupFilters(snake first), so a documentcarrying both keys with different values is displayed one way and honoured the other.
Measured on
main. PR #7641 is in flight and flips the runtime half, which retiresthis disagreement on its own — so no card was filed for it.
Clause-2 determination
No — and it holds for the diff actually shipped, which is comments plus a
changeset. Worth recording, though, that the proposed retirement would not have been
Clause-2-no in the assumed way: because five sites carry no camel leg, removing the
snake reads would have removed the only read of four authorable keys, a user-visible
behaviour change rather than a dead-code deletion.
Verification
Gate union re-run at
09a2726a, the final commit:type-checkforapp-shell,plugin-list,plugin-charts,plugin-form— all four echoed the script name (Scope: 4 of 47 workspace projects) and passed, so this is not a zero-match false green. The scriptin this repo is spelled
type-check, nottypecheck.0 lint messages land on any of the 44 added lines. The narrowing is a
measurement, not a skip: file count read from
--format json(6), and the flatconfig declares no
project/projectService, so no file's verdict can depend onanother file's contents.
issue-7642.Scope
packages/types/**,plugin-grid/relationalMetaKeys.tsand the widget-metadata bagwere not touched. Verified zero file overlap with PR #7641's 30 files.
reference_fieldis reported on but not retired.
Labelled
needs:contract-reviewon both carriers, as the dispatching ruling directswhen the census concludes a second published contract declares these spellings.
Generated by Claude Code