Repository navigation
fix(components): element:repeater and element:number publish the dataSource binding as their only query input, and objectui compiles against spec main again (objectui#12085, objectui#12093) - #12100
Conversation
…Source binding as their only query input The repeater stops requiring a flat `object` and drops the flat `object` / `filter` / `sort` / `limit` inputs; `element:number` drops its flat `object` / `filter`. `@objectstack/spec` retires all six as tombstones (objectstack#11509), and the published `required: true` made the html tier refuse a repeater bound through `dataSource` alone (objectui#12085). Claude-Session: https://claude.ai/code/session_01B1gHb9baeX7oioD5sHVm7z Co-authored-by: Claude <noreply@anthropic.com>
… and the acceptance pins follow the installed row (objectui#12093) objectstack PR #22421 (objectstack#11509) tombstones the element-layer flat binding keys and `object-grid.defaultFilters` on objectstack `main`, so the Spec Main Shape Gate stopped compiling five test files. Fixtures that only carried a flat `object` now name it through `dataSource`. The three pins that asserted a retired key compiles now assert the face's verdict IS the row's: they compile against the installed release and against `main`, and refuse the key wherever the row does. Claude-Session: https://claude.ai/code/session_01B1gHb9baeX7oioD5sHVm7z Co-authored-by: Claude <noreply@anthropic.com>
…e binding is the one published query door (objectui#12085) The repeater requires nothing and publishes none of its flat query keys; the html tier accepts a repeater bound through `dataSource` alone and reports each flat key as `unknown-prop`. `element:number` publishes no flat `object` / `filter`. The repeater's query rows mount through the binding. Claude-Session: https://claude.ai/code/session_01B1gHb9baeX7oioD5sHVm7z Co-authored-by: Claude <noreply@anthropic.com>
…llow the narrowed element registrations (objectui#12085) The six flat keys the installed spec still declares get reasoned unpublished-key exemptions that go stale at the pin carrying objectstack#11509's tombstones; the three member pins on keys no longer published are struck. objectui#11605's doc reading learns that the element blocks land the binding on no key of theirs. The data-source guide says the repeater and the metric offer the binding alone. Claude-Session: https://claude.ai/code/session_01B1gHb9baeX7oioD5sHVm7z Co-authored-by: Claude <noreply@anthropic.com>
…t registrations (objectui#12085) Claude-Session: https://claude.ai/code/session_01B1gHb9baeX7oioD5sHVm7z Co-authored-by: Claude <noreply@anthropic.com>
…c's value set, and the zh label table keys `org` beside it (objectui#12093) objectstack PR #22628 (objectstack#15206 S5) narrows `overlayScope` to `env` on objectstack `main`, while the installed release declares `org | env`. The alias pin now reads the expected set off the schema value in both directions, so it holds and stays load-bearing on either spec; the en-US raw-value case renders `env`, a scope on both. `LAYER_SCOPE_ZH` keys `org` beside the spec union, so a server on the installed release keeps its label and the table still fails to compile when the spec adds a scope. Claude-Session: https://claude.ai/code/session_01B1gHb9baeX7oioD5sHVm7z Co-authored-by: Claude <noreply@anthropic.com>
…ultFilters read compiles against the spec that retires the key (objectui#12093) objectstack PR #22421 tombstones `object-grid.defaultFilters` on objectstack `main`, so ObjectView's legacy filter rung, which hands the deprecated `table.defaultFilters` to the grid as its `filter`, stopped compiling there and its build failure cascaded into app-shell, console and an example. The read is now typed by the rule-array shape legacy metadata carries; the value and the rung are unchanged. The grid and view tests that pin that legacy read build their `defaultFilters` fixtures the same way. Claude-Session: https://claude.ai/code/session_01B1gHb9baeX7oioD5sHVm7z Co-authored-by: Claude <noreply@anthropic.com>
✅ 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
|
Seat answer to the report's open question ·
|
Contract reviewServed-tier: ① Derived judgmentsRead against objectstack
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #12085
Fixes #12093
Clause-②: no
Session:
https://claude.ai/code/session_01B1gHb9baeX7oioD5sHVm7z(domain:uiseat 3, claim6097673277on objectui#12085, fold claim6097776869on objectui#12093).objectui#12085: the element registrations publish the binding as the only query door
element:repeater(packages/components/src/renderers/basic/data-list.tsx): the registration drops its flatobject(which wasrequired: true),filter,sortandlimitinputs. The injecteddataSourceinput (theelementDataSourceBlockseam) is unchanged, so the repeater now requires nothing.element:number(packages/components/src/renderers/basic/elements.tsx): the registration drops its flatobjectandfilterinputs. The metric has not read them since objectui#11880.main(read at243dd3c6, still so atd8830c28),ElementRepeaterPropsSchemadeclaresobject,filter,sortandlimitasretiredKey(elementFlatBindingRetired('element:repeater', KEY)).ElementNumberPropsSchemadoes the same forobjectandfilter. Both landed with feat(spec)!: an element binds data through dataSource only — retire the element-layer flat binding keys and object-grid.defaultFilters (#11509) objectstack#22421 (317cddd40d).6051498447, sub-question 2) hasrecord_pickerandnumberlose their fallbacks, and has the repeater "takedataSource". It does not retire the repeater's read.ElementRepeaterPropsSchemadocblock: "The renderer's fallback read of them, recorded above, is the console's tolerance for metadata written before this release, not a door this row keeps". The repeater's tombstone prescription says the same ("keeping this key only as a fallback for metadata written before it").@objectstack/spec17.7.0. There,ComponentPropsMap['element:repeater']requires a flatobject, and@object-ui/types' repeater arm requiresproperties.objectwherever nodataSource.objectnames one. Dropping the read now would make objectui's own validator accept a node whose list the renderer leaves empty.manifestFromConfigs+validateTreepair that feedsdui.manifest.json:dataSourcedraws no diagnostic (it drewmissing-required-prop);object/filter/sort/limitbeside the binding drawsunknown-prop, with the bound node as the control;element:number's flatobject/filter.data-list.elementDataSource-11880.test.tsxandelementNumber.dataSourceBinding-10909.test.tsxcarry the registration pins.element-list-inputs-11168.test.tsxmounts the repeater's query rows throughdataSource, and its required-input control moves toelement:number.aggregate.apps/consoleregistry-inputs-spec-parity.test.ts: the three member pins on keys no longer published are struck, and the six keys installed 17.7.0 still declares get reasonedUNPUBLISHED_EXEMPTIONS. Each entry says it goes stale at the pin that carries objectstack#11509's tombstones.objectname-binding-required-11605.test.ts: theelement:*blocks land the binding on no key of theirs.content/docs/guide/data-source.mdsays the repeater and the metric offer the binding alone. No code fence changed.Pin-window order
main(feat(spec)!: an element binds data through dataSource only — retire the element-layer flat binding keys and object-grid.defaultFilters (#11509) objectstack#22421).sdui.manifest.jsonfrom these registrations, throughgen-sdui-manifest-node.mjs.That bump is objectstack's own card. This PR does not touch that file. Until the bump, objectstack's manifest keeps the old registrations.
objectui#12093: objectui compiles against spec
mainagainEvery fix compiles against BOTH specs: the installed 17.7.0 that the pull-request type-check uses, and the Spec Main Shape Gate's build of objectstack
main. No behaviour changes on the installed spec.objectnow name it throughdataSource:record-picker-label-association,page-variables,authoring-nodes-11364pickerStyled, andelement-repeater-data-source-11880bound/aliased.authoring-nodes-11364, the record picker's bagobject;element-repeater-data-source-11880, the repeater's bagobject;grid-default-filters-...-round10-6152,defaultFilterson the grid and on thetableslot, plus two by-referenceEquals.main.overlayScope. feat(metadata-protocol,objectql,rest,spec)!: every metadata read is environment → code; legacy organization rows and sealed overlays are reported at boot, not served (#15206 S5) objectstack#22628 narrows it toenv. The alias pin indata-objectstacknow reads the expected set off the schema VALUE in both directions, plus a label-table ceiling.LayeredDiff.overlayScope's en-US case rendersenv.app-shell'sLAYER_SCOPE_ZHkeysorgbeside the spec union. The type is internal and the behaviour is unchanged.object-grid.defaultFilters.plugin-view'sObjectViewhands its legacytable.defaultFiltersrung to the grid asfilter. Onmainthe by-reference type is the tombstone, soplugin-view's build failed, and that cascaded TS7016 intoapp-shell,consoleandexamples/byo-backend-console. The read now goes throughlegacyTableDefaults, which carries ONE explicitunknown-to-rule-array assertion with its reason. The value read and the rung are unchanged. Theplugin-gridandplugin-viewtests that pin that legacy read build their fixtures the same way. This assertion is a review point; see open question 2 in the report.Measured
Heads cited are this branch's commits. Turbo's cache is shared across worktrees in this container, so every type-check below ran with
TURBO_FORCE=true.Spec Main Shape Gate reproduction. objectstack
mainwas archived read-only and built from source. The tarball was injected withscripts/spec-main-shape-gate.mjs injectinto a separate worktree, and both installs were checked by markers:mainde302c73243dd3c6c70f848db96469912overlayScopeanddefaultFilterssignatures abovec4e01fb39d8830c28pnpm type-check --continue, 81 tasks force-executed)TYPECHECK_EXIT=0; the gate's ownreportprints "objectui type-checks against@objectstack/specat that commit"Installed spec,
c4e01fb39.TURBO_FORCE=true pnpm type-check --continue: 81 of 81 tasks, force-executed 81, cache hits 0, exit 0.vitest,
c4e01fb39, from the repo root:check-doc-links.plugin-view, fourplugin-gridfilter files, thedata-objectstackoverlay pin, and threeapp-shellmetadata-admin files.Reverse verification. The two registration files were checked out from base with the fix committed. That gives 13 failed tests in 5 files, among them the binding-only "no diagnostic" and the flat-key
unknown-proprows. Restored fromHEAD: blob equalsHEAD, andgit diff HEADis empty.Ablations. All five ran through
ablation-replace.mjs; each mutation was proven on disk and each restore was proven by blob hash.main, the record picker's bagobjectre-forked to a string turns the newauthoring-nodespin red.main,ObjectGridSchema.defaultFiltersre-forked to the rule array turns red both round-10 differentials and both by-referenceEquals.objectturns the same pin red.string | nullturns_noWider,_labelledand the@ts-expect-errorred.main, the alias restated as'org' | 'env' | nullturns_noWiderred.Gates, at
c4e01fb39unless noted. All exit 0:check:new-line-citations,check:control-bytes,check:element-data-source-declaration;check:changeset-claims,check:pending-changeset-literals,check:installed-pin-claims;check:spec-symbols,check:test-path-roots,check:component-surface-parity,check:doc-types,check:doc-fences;check-changeset-presence(2 changesets),check-changeset-no-major;check:sdui-registration-pinsatc70f848db, after a console build there; no registration moved after that commit.eslint,
--no-inline-config, on the 19 touched TS files:eslint.config.js, and the file count from--format json.NOT MEASURED:
check:doc-snippets/check:doc-examples: prerequisite not met (packages outside the type-check closure are unbuilt). The doc diff changes no fenced block.pnpm lint: CI.Clause-② (both claims say
no)required: trueremoves a refusal that the published row on objectstackmaindenies itself. Dropping the six inputs narrows the registrations.Spec Main Shape Gatefails every merge group since objectstack#22421 retired the flat element binding keys; five objectui test files still use them #12093's part is tests, plus two internal, type-only source edits (legacyTableDefaults, the label table's key type).@object-ui/componentsminor, and an empty-frontmatter no-release declaration for the Merge queue:Spec Main Shape Gatefails every merge group since objectstack#22421 retired the flat element binding keys; five objectui test files still use them #12093 edits.Acceptance notes
element:record_picker's registration still publishes its four flat binding inputs, each marked NOT READ. objectstackmaintombstones them too. They are the same family as this card, outside its ruling, and left untouched; reported to the seat.@objectstack/spec18 pin bump:ObjectGrid's legacydefaultFilters, andObjectView'slegacyTableDefaultsrung;LAYER_SCOPE_ZH'sorgentry.Generated by Claude Code