Repository navigation
feat(plugin-list): list-view publishes the spec keys its renderer honours on a page node (objectui#13047) - #13072
Merged
objectstack-fleet[bot] merged 3 commits intoOct 19, 2026
Conversation
…ours on a page node Measure each of the 38 keys the spec's list-view row declares and the registration did not publish, through the real SchemaRenderer and the list-view registration. Publish the 33 the renderer honours in one shared input list for list-view and view:list; record name, requiredPermissions, sharing, addRecord and filterableFields as unpublished by measurement in the console parity gate. Write the six booked member pins and a pin for every structured key published, strike the OWED rows and restore the caps. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
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 Oct 19, 2026
…st-view-spec-inputs
… cannot derive The options row authored the fixture's only select field, the board's derived default, so it passed with options ignored. Author `owner` and assert a bare kanban node lanes elsewhere. Trim the label, description and userActions descriptions to what the measurement covers. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
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
|
2 tasks
This was referenced Oct 19, 2026
objectstack-fleet
Bot
deleted the
claude/issue-13047-list-view-spec-inputs
branch
October 19, 2026 19:32
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.
Fixes #13047
Clause-②: yes
What this does
@objectstack/spec18 gavelist-viewaComponentPropsMaprow (objectstack-ai/objectstack#22444), the list view's ownListViewSchema, and PR #13043 booked the 38 keys of that row the registration did not publish, plus 6 member pins, as OWED to this card (objectui#11111 decision 3 = B).Each of the 38 keys was measured on a page node: authored in the node's
properties, rendered through the realSchemaRendererand the reallist-viewregistration, and asserted at what it draws, what it queries, or what it hands the child view that draws it. Every row has a control that differs only by that key. Every fixture is first parsed by the spec's ownlist-viewrow.pagination,searchableFields,label,description,userFilters,userActions,compactToolbar,appearance,exportOptions,allowPrinting,showRecordCount,emptyState,hiddenFields,fieldOrder,rowHeight,resizable,selection,navigation,grouping,rowColor,conditionalFormatting,inlineEdit,rowActions,bulkActions,bulkActionDefs,kanban,calendar,gantt,gallery,timeline,map,tree,chart. Each description names the spec's member shape.label/descriptiondeclare both I18nLabel arms; the array keys whose contract admits one member kind declareof.UNPUBLISHED_EXEMPTIONSwith its reason:name: read by nothing on a page node (same query, same DOM, same grid node with and without it).requiredPermissions: no audience gate on this block; a capability nobody holds still draws and queries the list.sharing: draws a Share button with no click handler; nothing enforces the config.addRecord: draws an Add button that calls the host'sonAddRecord, and a page node has no host to pass one, so the click does nothing.filterableFields: the row declares it as the legacy shorthand ofuserFilters.fields; the list draws no quick-filter bar from it and reads it as the Filter panel's field list instead.appearance.allowedVisualizationsnarrows the view switcher, which a page node does not draw (showViewSwitcheris a host prop, not a row key), so an authoredtypestill draws.appearance.showDescriptionacts, so the key is published and its description says the member does nothing on a page.list-viewand theview:listalias (same renderer) now share one input list,LIST_VIEW_INPUTS. The descriptions of the six keys already published are filled in. No reader, prop, export or type member is added; nothing changes at render time.Ledger
In
apps/console/src/__tests__/registry-inputs-spec-parity.test.ts:list-viewOWED rows inUNPUBLISHED_EXEMPTIONSand the 6 inMEMBER_PIN_EXEMPTIONSare struck.OBJECTUI_11111_LEDGER_CAPS.unpublishedKeys38 to 0,memberPins6 to 0, the per-owner total for objectui#13047 44 to 0,MEMBER_PIN_EXEMPTION_CEILING6 to 0.OWED_TO/owedEntrieshelpers left with their last entries. The comment where they stood says a future bump writes them back.MEMBER_PINSgains 33list-viewentries: the 6 booked (data,columns,filter,sort,optionsin the new file;dataSourceinListView.elementDataSource.test.tsx, read end to end), and one for every structured key published.Measurement level, said plainly
plugin-grid,plugin-kanbanand the other view packages are not dependencies ofplugin-list, so the child views are stand-ins that record the nodeListViewbuilds, as every other test in this package does. For the grid's row keys and each kind's own block, the measurement is the hand-off: the member reaches the node of the view that draws it, on the page path. What each child view draws from its own node is pinned in that view's package under its own published key. The toolbar, query and chrome keys are measured at the DOM or the adapter's query.Tests (all at
215edf59d5)packages/plugin-list/src/__tests__/ListViewBlock.specInputs-13047.test.tsx(new): 49 passed.apps/console/src/__tests__/registry-inputs-spec-parity.test.ts: 260 passed.os-verify-lock,--maxWorkers=1:type-check:@object-ui/plugin-list(both projects;--listFilesOnlyshows the test project compiles the new file) and@object-ui/console, each exit 0 after a turbo build of its dependency closure.eslint --no-inline-configover the 3 changed source files: 0 errors (3 pre-existingreact-refresh/only-export-componentswarnings on the barrel's export line). The root config enables no type-aware linting, so the change cannot move a verdict on an untouched file. Repo-widepnpm lintis declared to CI.check:phantom-deps,self-import,unreferenced-sources,doc-example-readers,handler-key-reads,side-effects-array,element-data-source-declaration,spec-symbols,action-forward-parity,designer-field-key-parity,icon-record-names,i18n-keys,i18n-drift,i18n-designer-parity,control-bytes,check-hand-rolled-comment-mask.mjsandcheck-changeset-fixed.mjsall exit 0.check:spec-floorsexits 1 withno-artifact(it wants a whole-workspace build), as it does on main.packages/plugin-listandapps/consoledirectories are declared to CI.Ablation (the parity gate can fail)
allowPrinting's input line was deleted frompackages/plugin-list/src/index.tsxwithablation-replace.mjs(anchor 1 to 0, blob2ed1ea1932b1to780b8c1b9265). The parity file then went red on exactly one test:list-view publishes every top-level key its spec props schema declares,expected [ 'allowPrinting' ] to deeply equal [](1 failed, 259 passed). The tool restored the file, and the restore was checked by blob hash:git hash-object=HEAD:packages/plugin-list/src/index.tsx=2ed1ea1932b1, andgit diff HEADis empty. The alias resolves@object-ui/plugin-listtosrc, so no build sat between the mutation and the run.Acceptance notes
Renderer gaps the seat may card (not built here, per the dispatch):
requiredPermissionson a pagelist-view: the record blocks gate on it and this block does not.addRecordon a pagelist-view: the Add button needs a hostonAddRecordthat a page node never has.A contract question on
filterableFields: the row calls it the shorthand ofuserFilters.fields, and the renderer reads it as the Filter panel whitelist. Either the spec describes it wrong or the renderer reads it wrong; that is the seat's call.sharingdraws a Share button with no handler whereverListViewrenders, the object list page included. Not measured on that page here.Generated by Claude Code