Repository navigation
feat(types)!: an authored object-grid takes its props in the spec's properties bag; the flat spelling is refused by name (objectui#11276) - #11399
Conversation
…roperties bag (objectui#11276) New ObjectGridBlockSchema: BaseSchema + the object-grid literal + NODE_ENVELOPE + properties = the spec's ComponentPropsMap['object-grid'] row by reference, with flatPropRefusals for the flat spelling, the flat mirror's tombstones and runtime slot by reference, and the record-source rule read in the bag. ObjectGridSchema leaves ObjectQLComponentSchema and keeps building the object-view table slot. Part of #11276 Claude-Session: https://claude.ai/code/session_01JG2jy8a9su7ia4Hx7zxv42 Co-authored-by: Claude <noreply@anthropic.com>
…rm (objectui#11276) The census rows the new export forces (parity EXCLUSIONS, the import boundary's IMPORTED row, the union counts and literal lists, the public-block envelope population, flatPropRefusals coverage, the grouping census), and fixtures that a face now judges respelled to the bag; mirror rows keep the post-hoist spelling. Claude-Session: https://claude.ai/code/session_01JG2jy8a9su7ia4Hx7zxv42 Co-authored-by: Claude <noreply@anthropic.com>
…ctui#11276) Both showcase queues pass both faces, a flat objectName on a page object-grid is refused with the bag's prescription, the bag is the spec row by reference, the record source is read in the bag, and the mirror keeps the object-view table slot. Type-level block read by tsconfig.test.json. Claude-Session: https://claude.ai/code/session_01JG2jy8a9su7ia4Hx7zxv42 Co-authored-by: Claude <noreply@anthropic.com>
…properties bag (objectui#11276)
The root README, the schema reference, the fields grid page, the CRUD and
layout guides, the ObjectOS integration guide, the plugin-grid page and
README, the data adapter pages and both schema-catalog object-grid entries
move to { type: 'object-grid', properties: { ... } }. Component mounts
(<ObjectGrid schema>) keep the flat node they read. A render pin shows the
bag and a stored flat node draw the same grid.
Claude-Session: https://claude.ai/code/session_01JG2jy8a9su7ia4Hx7zxv42
Co-authored-by: Claude <noreply@anthropic.com>
@object-ui/types minor with a BREAKING (authoring) banner; @object-ui/plugin-grid patch for the README and the two src/ test files. Claude-Session: https://claude.ai/code/session_01JG2jy8a9su7ia4Hx7zxv42 Co-authored-by: Claude <noreply@anthropic.com>
…rties-bag Claude-Session: https://claude.ai/code/session_01JG2jy8a9su7ia4Hx7zxv42 Co-authored-by: Claude <noreply@anthropic.com>
…i#11276) The selected object-grid arm now reports its record source at properties.objectName, and the provider-keyed union sits at properties.data; both rows keep their subject. Claude-Session: https://claude.ai/code/session_01JG2jy8a9su7ia4Hx7zxv42 Co-authored-by: Claude <noreply@anthropic.com>
…lper on the bag arm (objectui#11276) check:handler-key-reads reads a disposition off the helper call, as on ObjectFormBlockSchema; a reference to the mirror's member read as null. The Retool migration fragment drops the selection literal the doc-types gate reads as a component type. Claude-Session: https://claude.ai/code/session_01JG2jy8a9su7ia4Hx7zxv42 Co-authored-by: Claude <noreply@anthropic.com>
…ui#11276) The file is in parked PR objectui#11069's diff, which this batch's order keeps off its surface; its object-grid node is listed as held by that PR, as batch 4 listed validate.ts. The line returns to main's bytes. Claude-Session: https://claude.ai/code/session_01JG2jy8a9su7ia4Hx7zxv42 Co-authored-by: Claude <noreply@anthropic.com>
|
changeset-claim-re-read
|
✅ 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
|
… bag (objectui#11276) The seat's call on the PR's first deviation: triage's no-interval rule wins, so the 'With Action Buttons' object-grid node moves to the bag here, the same one-line change that merges cleanly with PR objectui#11069's version of the file. Claude-Session: https://claude.ai/code/session_01JG2jy8a9su7ia4Hx7zxv42 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
|
|
CI note from the claiming seat (
Generated by Claude Code |
…rties-bag Claude-Session: https://claude.ai/code/session_01JG2jy8a9su7ia4Hx7zxv42 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
|
Part of #11276
Clause-②: yes
Clause-②: yes, copied from the PM claim5936810446: the strict face starts accepting thepropertiesbag on an authoredobject-grid, which widens it, while the flat spelling narrows. This is objectui's narrowing-as-minorrule with a BREAKING (authoring) banner in the changeset, as in PR objectui#11328 and objectui#10859 batch 5.The
object-gridbatch of objectui#11276. It executes triage's answer5922517855Q2 ("object-gridcomes next, in the shape PR objectui#11291 set forobject-form. A block schema takes thepropertiesbag, while the flat mirror keeps theobject-viewtable slot.") under routing call A (5921136804). The card stays open:flexis the next batch (the maintainer's ruling A on objectui#11300).What changed
packages/types/src/zod/objectql.zod.ts: newObjectGridBlockSchema, the construct ofObjectFormBlockSchema/ObjectMapBlockSchema/ObjectGanttBlockSchema:BaseSchema+ theobject-gridliteral +NODE_ENVELOPE+properties = propsBag('object-grid', stripImportedDefaults(SpecObjectGridPropsSchema)), the installed 17.5.0 row by reference, no copy. Beside it:flatPropRefusals('object-grid', …), the shared helperobject-metric/object-master-detail-form/object-timelinealready spread. It refuses every row member written flat by name ("Did you meanKEY→properties.KEY?"), and it already encodes the two exceptions this row needs:label(also a node-level key of the spec's page component) stays on the node, anddefaultSort(az.nevermember of the row) keeps the row's own retirement. Chosen over a fourth per-arm map: it is the one copy, and the per-arm maps exist only because they predate it.dataSource, the spec'sElementDataSourceSchemaby reference (the registration iselementDataSourceBlock-wrapped).operators(objectui#9739),rowSpecActions,bulkSpecActions,name,placeholder,showFilters(objectui#11068).nameandplaceholderareBaseSchemakeys, so without them they would parse again.onNavigateas the objectui#6124 runtime slot, spelled as the helper call the mirror uses (asObjectFormBlockSchemaspells its five), socheck:handler-key-readsreads the disposition off this arm.body/children, the mirror's objectui#9256 refusals by reference.requireRecordSource('object-grid', ['objectName'], 'properties').ObjectQLPublicBlockComponentSchema(object-gridis inPUBLIC_BLOCKS).ObjectGridSchema(the flat mirror) leavesObjectQLComponentSchema(8 to 7 arms), stays exported and paired with its TypeScript twin, and still builds theobject-viewtableslot (unchanged, pinned).packages/types/src/objectql.ts: the TypeScriptObjectGridSchemais re-declared, not retired (docblock only: the node asObjectGridreads it after the hoist, and as code composes it); the union docblock names the count.index.zod.ts(one barrel export),public-blocks.zod.ts(one docblock sentence naming the new spreader offlatPropRefusals),zod/README.md.packages/types/src/__tests__/object-grid-properties-bag-11276.test.ts(88 rows + a type-level block) andpackages/plugin-grid/src/__tests__/ObjectGrid.propertiesBag-11276.test.tsx(render through the real registry: the bag and a stored flat node make the identicalfindcall and paint the same row;SchemaRenderer's hoist is untouched)..changeset/11276-object-grid-properties-bag.md(@object-ui/typesminor, BREAKING (authoring) banner) and.changeset/11276-plugin-grid-properties-bag-docs.md(@object-ui/plugin-gridpatch: README and twosrc/test files, no runtime change).Files beyond the claimed surface, each forced:
zod-mirror-parity.test.ts(oneEXCLUSIONSrow;EXPECTED_MIRROR_PAIRSand theObjectGridSchemadrift ledger untouched),imported-defaults-8317.test.ts(oneIMPORTEDrow),objectql-union-arms-7363.test.ts(7 arms),registered-type-arms-10859-b2.test.ts(literal list),public-block-responsive-styles-10872.test.ts(object-gridjoinsDECLARES_DATA_SOURCEand the smallest-bag table),flat-arm-responsive-styles-10872.test.ts(the flat population isflexalone; a row pins the mirror keeps the member),flat-props-refusal-10872.test.ts(oneVALID_BAGrow: the arm spreads that helper),grouping-field-padded-refused-7347.test.ts(aNOT_COVEREDrow: the row typesgroupingas unknown, see notes),any-component-union-fanout.test.ts(its literal control readsobject-view);content-channel-e3-residual-9256.test.ts,strict-face-read-keys-11070.test.ts,object-grid-show-filters-retired-11068.test.ts,packages/cli/src/__tests__/validate-union-arm-selection.test.ts(paths nowproperties → objectNameandproperties → data → provider; not a PR objectui#11069 file),packages/plugin-grid/src/__tests__/guideCrudAppRenders.test.tsx(reads the guide's bag).Zone 2, measured first
063119f, through the built faces: the showcase's twoobject-gridnodes (bag) were refused bysafeValidateSchema(objectNamecustom, "has no record source") and by the strict face (unrecognized_keys [properties]plus the same); the flat control passed both. The spec'sPageComponentSchemaaccepted both bag nodes and refused the flat one (unrecognized_keys [objectName, columns]); control: flataction:buttonactionTyperefused the same way.object-form, a spec row) rather than PR objectui#11328's (object-chart, no row, bag = mirror members), becauseobject-gridhas a row; refusals via the sharedflatPropRefusals(as batch 10's arms), the record source as batches 5/6.ComponentPropsMap['object-grid']exists in installed@objectstack/spec17.5.0: it is the exportedObjectGridPropsSchema(ComponentPropsMap['object-grid'] === ObjectGridPropsSchema, 37 keys, strict). So the bag is that row by reference; no row invented, no mirror members used.git grep -lEfor atypekey equal toobject-gridin any quoting, at base063119f, minus tests/snapshots/e2e; 27 files):README.md,content/docs/api/schema-reference.md(3, one in aview-switcherviews[].schemaslot, which the faces judge as a node),content/docs/fields/grid.mdx,content/docs/guide/building-crud-app.md(2 of 3; the third binds throughdataSourceonly),content/docs/guide/objectos-integration.mdx(5),content/docs/plugins/plugin-grid.mdx(13),content/docs/utilities/data-objectstack.mdx(1 of 3; two bind throughdataSourceonly),content/docs/utilities/index.md,packages/plugin-grid/README.md(13), bothexamples/schema-catalogplugin-gridentriescontent/docs/guide/layout.md(1 node)skills/objectui/guides/page-builder.md("Grid plugin example",os:check-marked)ObjectGridmounted directly with its flatschemaprop, no hoist)rowOperationsand TypeScript-support examples inplugin-grid.mdxand the plugin-grid READMEapps/console/src/dev/DevRowActions.tsx, plugin-designerFieldDesigner.tsx/ObjectManager.tsx,packages/plugin-grid/demo/bulk-actions.tsx, plugin-listListView.tsx, plugin-viewObjectView.tsxRecordPickerDialog.tsx, plugin-calendarObjectCalendar.tsx,scripts/check-doc-component-types.mjs,scripts/regenerate-known-schema-types.mjsobjectql.ts,objectql.zod.ts;.changeset/11117-…,.changeset/7762-…Triage's "12 authored docs and 2 catalog documents" re-derives as 11 rewritten files (9 docs + 2 catalog) plus
layout.md(held) and the governed skill. TS-typed doc nodes handed toSchemaRendererwere authored documents: their annotation moves toBaseSchema, and each bag is checked withsatisfies ObjectGridProps(the spec's row type), so the examples keep a key-checking annotation.Stop line: not tripped. The zod
ObjectGridSchemaobject's readers are the union (left) and theobject-viewtableslot, which the ruling keeps on the mirror; every other flat context reads the TypeScript twin.5. Showcase. objectstack
origin/main862f12chas twoobject-gridnodes, not one:command-center.page.ts(cc_queue_g, withresponsiveStyles) andmy-work.page.ts(with aViewFilterRulefilter). Both passsafeValidateSchemaandStrictAnyComponentSchema(the face PR objectui#11069 wires), pinned verbatim. PR objectui#11069's own census script is not in the tree, so its count is NOT MEASURED; its verdict is the strict face's, which accepts them.Tests (heavy runs through
os-verify-lock.sh, slotissue-11276-grid; Node v22.22.2 from/opt/nvm)a63b228d:pnpm exec vitest run packages/types/gaveTests 23 failed | 8369 passed (8392), 12 files, exactly the census and fixture rows above.e4927b7d:pnpm exec vitest run packages/types/ packages/cli/ examples/schema-catalog/:Test Files 379 passed (379),Tests 11090 passed (11090), VERDICT 0.scripts/__tests__/:Test Files 177 passed | 2 skipped (179),Tests 5417 passed | 2 skipped (5419), VERDICT 0.e4927b7d: 414 test files outsidepackages/types/packages/cli/scripts/ the catalog that nameAnyComponentSchema,StrictAnyComponentSchema,safeValidateSchema, either ObjectQL union,ObjectGridSchema,object-grid,plugin-grid,PUBLIC_BLOCKS,ComponentPropsMap,validateSchemaor a moved doc; three chunks:135 / 2219,141 / 1230,138 / 1586(files / tests), each VERDICT 0.9f45be6donly returns one line oflayout.mdtomain's bytes; its 10 reader test files re-ran there:Tests 107 passed (107).pnpm --filter @object-ui/types type-checkVERDICT 0, the pin intsconfig.test.json's program (--listFilesOnly).pnpm --filter @object-ui/plugin-grid type-checkVERDICT 0 after building its closure (13 tasks).scripts/ablation-replace.mjs, two nested legs, plus an EXIT/INT/TERM trap restoring by absolute path):ObjectGridBlockSchemaout of the public union (anchor x1 to x0, blobb3fb5a65tofb23a21b) andObjectGridSchemaback intoObjectQLComponentSchema(x1 to x0, blob toe277bcf6); on disk 0 / 1. Over 13 files:Tests 84 failed | 761 passed (845): red = 69 rows of the new pin + 15 census/triage rows; green = the untouchedobject-ganttb6 andobject-chartpins and the pin's arm-independent rows. Restored: blob == HEADb3fb5a65,git diff HEADempty. A first attempt was refused by the tool (ANCHOR MISS on a quoting error) and ran nothing.flatPropRefusalsspread deleted gavetsc -p tsconfig.test.jsonexit 2 with exactly 8 errors, all on the pin's flat-key and every-row-key rows (TS2339 x6, TS2344 x2). Restored, blob == HEAD.*.md/*.mdx/*.jsonthat holds anobject-gridnode (23) through both faces: refused = 2,layout.md(held) and the governed skill; that refusal is the instrument's lit control.check:doc-snippetsneeds the whole tree built, below): the 13BaseSchemabag statements compile against the built@object-ui/typesand the installed spec withsatisfies ObjectGridProps(control: a misspeltobjectNamis TS2561); the 6 changedtsxblocks compile in full against the builtreact/data-objectstack/typesclosure (control: an injected TS2322 fires). Scratch harness, removed.Gates (exit codes captured before any pipe, at
9f45be6dunless marked)check:new-line-citations("VERDICT new-cross-file-line-citations: 0 new citation(s)"),check:control-bytes("OK (scanned 9915 tracked text file(s); skipped 85 binary)"),check:doc-types("Every documented component type is registered."),docs:check-links,check:handler-key-reads("OK 140 arm(s), 212 registration(s) (138 keyed onto an arm), 56 reachable handler read(s), 56 judged"),check:spec-symbols,check:doc-example-ids,check:doc-fences,check:pending-changeset-literals,changeset:check("No changeset declares amajorbump."),check:governed-queue-guard,node scripts/markdown-test-inputs.mjs --audit("109 candidate test files, all adjudicated; 81 declared entries, all present"),node scripts/check-changeset-presence.mjs("21 source file(s) of 3 released package(s) changed, and this change declares 2 changeset(s)"),check-governed-queue-guard.mjs --testover the 34 paths ("NOT GOVERNED"). Ate4927b7d:check:element-data-source-declaration,check:component-surface-parity,check:prompt-keys,check:test-path-roots,check:installed-pin-claims,check:vi-mock-specifiers,check:changeset-claims(report-only; the pendingobject-gridchangesets are answered in this PR's changeset).eslint --no-inline-config --format jsonover the 20 changed.ts/.tsxfiles: 0 errors, 59 warnings, allno-explicit-any, 0 on an added line.eslint.config.jssets noprojectService/parserOptions.project, so no untouched file's verdict can move. The fullpnpm lintis CI's.check:doc-snippets(exit 2),check:doc-examples(exit 2; no@examplechanged),check:skill-examples(exit 2; no skill changed),check:sdui-registration-pins(exit 2, no console build),check:readme-exports(exit 1 with "the population COLLAPSED", 22 packages unbuilt; among what it did judge, 0 wrong-path, 0 fabricated). CI builds first.Deviations
content/docs/guide/layout.mdis not moved. The order says both "⛔ Not PR objectui#11069's files" and "move every non-governed one … so no interval exists whereobjectui validaterefuses objectui's own documents". The claim's read ("None touches … the docs this batch moves") is false for this file: PR objectui#11069 edits its prose two lines below the JSON block. I kept off the file (batch 4 did the same withvalidate.ts), so its one flatobject-gridnode is refused byobjectui validateuntil it moves. Measured for the seat's call: the one-line move merges cleanly with PR objectui#11069's version of the file (git merge-fileexit 0, no markers); PR objectui#11069 already conflicts withmainatpackages/cli/src/commands/check.ts, and this branch adds no conflict.@object-ui/plugin-gridpatch) beside the ordered one: the two plugin-gridsrc/test files require one, and the README is that package's (batches 4 and 6 did the same).Part of #11276line; the card relationship is declared here, and the history is not rewritten.Acceptance notes
filter/defaultFilterstake theViewFilterRulearray only, so the tuple form, the record form and a record-formdefaultFiltersare refused in the bag. The row typescolumnsentries,selection,exportOptions,operations,navigation,groupingand a few display keys as unknown, so those shapes are not judged in the bag.exportOptions: a bare format array, refused by name on the flat mirror (objectui#7762), parses in the bag (the row'sz.unknown()), andObjectGridstill reads onlyexportOptions.formats, so it is dropped for the csv/json default. Not re-added on the consumer side (the row is the declaration); reported as a finding on the spec row.emptyState:ObjectGridreads it (objectui#11068) but the row does not declare it, so it is refused in the bag and, on the node, by the strict face: not authorable in a document today. The docs now say so; reported as a finding on the spec row. (keyboardNavigationis refused the same way, and nothing reads it.)rowHeight,grouping,aggregations,conditionalFormatting,rowColor,bulkActionDefs,navigation,singleClickEdit,resizableColumns,reorderableColumns,operations): they parse in the bag, judged by the row. The mirror's drift ledger inzod-mirror-parity.test.ts(objectui#6152's) is untouched.groupingin the bag is unjudged (the row'sz.unknown()), so objectui#7347's padded-field refusal does not reach it; the census recordsobject-gridas not covered, with that reason pinned.properties.objectNameor a binding). The spec row is looser (the recorded divergence, as onobject-map/object-gantt).objectos-integration.mdxfragments also dropped keys no grid reads (rowData,callbacks,rowSelection,exportConfig, the adapter written on the node): the hooks block hands its rows over as inlineViewData, the callback block became a compiledtsxblock passingonRowClickas a component prop, the Retool block maps tobulkActions/exportOptions, and the unit-test block passes the adapter as the renderer'sdataSourceprop.Overlap
Merged
mainatd59f11c0(two commits,app-shellandlayoutonly) before opening; no open PR namesobjectql.zod.ts.Session:
https://claude.ai/code/session_01JG2jy8a9su7ia4Hx7zxv42(dispatched by seatdomain:ui#2; this run is its subagent on branchclaude/issue-11276-object-grid-properties-bag).Generated by Claude Code