Repository navigation
feat(types)!: object-grid operations and the grid / kanban / calendar filter follow the @objectstack/spec 17.7.0 rows (objectui#6152, round 8) - #11969
Conversation
…ter follow the 17.7.0 rows
`ObjectGridSchema.operations` takes the `object-grid` row's strict
`{ create, update, delete, export }` block by reference; `read` / `import`
are retired on both faces (`?: never`, `retirementTombstone()`), and the
`read` refusal names the object-view's own spelling. `filter` on the grid,
kanban and calendar faces takes each row's own `ViewFilterRule` array member
by reference. ObjectView no longer hands its own `read` toggle to the grid
node it composes. Registration descriptions, the root README grid example,
the console parity pins prose and the fixtures that wrote the tuple array as
the documented value follow.
Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DBZ9bntPZ7VKyQNtJeNsgw
…e array; escape the calendar pins sentence The two plugin-grid files that type their node as `ObjectGridSchema` wrote the AST tuple array as the authored `filter`; they now write the `ViewFilterRule` array and read the lowered AST off `$filter`. The console parity pins sentence for `object-calendar.filter` carried an unescaped apostrophe that broke the file's parse. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DBZ9bntPZ7VKyQNtJeNsgw
✅ 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
|
Contract reviewServed-tier: Round 8 of objectui#6152 (the ① Derived judgmentsEach accept-set or public-surface change the diff implies, judged against the installed protocol and the renderers' reads.
Conclusion of ①: every move is a narrowing toward the installed protocol (items 1 to 6) or prose (7 to 9); nothing widens an accept set or the public surface. ② Semver level
③ Boundary flagsDeviations in
Check-runs on the headPolled from 2026-10-08T12:53Z (42 runs: 26 success, 3 skipped, 13 in progress) until settled at 2026-10-08T13:04Z: 43 check-runs, 40 success, 3 skipped by design ( Implemented-by: VERDICT: PASS Generated by Claude Code |
Part of #6152 (round 8)
Clause-②: no
Round 8 of this card: the
@objectstack/spec17.7.0 member moves onobject-grid,object-kanbanandobject-calendar, as triage booked them in comment6029312212. Round 9 (ObjectCalendarSchema.calendar's.passthrough()) is not in this PR; #6152 remains open for it. Claim: comment6058878246(branchclaude/issue-6152-r8-17-7-member-moves, cut frommain70e3d772).This round narrows and widens nothing, hence
Clause-②: no. The contract review atCONTRACT_REVIEW_TIERthat the claim names is owed before the queue.What changed
@object-ui/typesObjectGridSchema.operationstakes theobject-gridrow's strict{ create?, update?, delete?, export? }block by reference:NonNullableofObjectGridProps['operations']on the interface, the row's own member.extend()-ed on the flat zod mirror (theConditionalFormattingRuleSchemaprecedent).readandimportare retired on both faces:?: neverwith@deprecatedon the interface, aretirementTombstone()on the mirror. Noobject-gridcode reads either, and the row refuses both by name. Thereadrefusal also names the view-level spelling, because the mirror is the source of theobject-viewtableslot: writenavigation: { mode: 'none' }oroperations: { read: false }on theobject-viewnode.filteronObjectGridSchema,ObjectKanbanSchemaandObjectCalendarSchematakes its row's own member by reference, theViewFilterRulearray, on the interface (ObjectGridProps['filter'],ObjectKanbanProps['filter'],ObjectCalendarProps['filter']) and on the mirror (stripImportedDefaults(...).shape.filter). These wereany[]andz.array(z.any()), so the AST tuple array and the MongoDB-style record the rows refuse type-checked and parsed. The kanban and calendar flat mirrors are the authored arms, so their doors narrow. The grid's authored door already was the row (objectui#11276); its flat mirror narrows theobject-viewtableslot.operatorstombstone's guidance named{ create, read, update, delete }as the shape to write; it now names the four toggles.conditionalFormattingneeded no stroke here. objectui#11533 (grid) and objectui#11522 (kanban) had already moved both rules onto the list view's{ condition, style }.@object-ui/plugin-view:ObjectViewcomposed its grid node'soperationswhole ({ ...operations, create: false }). With nooperationsauthored, that is the view's default,read: trueincluded, so every such grid node carried a member its row refuses. The view keepsread(its row-click gate inhandleRowClick) and hands the grid the other toggles.Registrations (
plugin-grid,plugin-kanban,plugin-calendar): thefilterinputs describe theViewFilterRulearray instead of "JSON-rules form", and the grid'soperationsinput names the four toggles instead of "create/read/update/delete/export/import".Root
README.md: the Data Grid example drops"read": truefromoperations. Itspropertiesnow parse on the installedobject-gridrow. Restoringreadgivesunrecognized_keysatoperations, the lit control.Console parity
pinssentences:object-calendar.filter,object-kanban.filter,object-kanban.conditionalFormattingandobject-grid.conditionalFormattingstop saying the row isz.unknown()or "constrains nothing inside a member". The kanban wire pin's header says the same.Fixture triage over the rule's consumer radius:
kanban-calendar-filter-sort-8174.test.ts(it also gains tuple and record refusal rows);object-kanban-allow-collapse-retired-8801.test.ts;ObjectGrid.filterContextTokens-10607.test.tsx;ObjectGrid.recordIdFilterToken-7297.test.tsx. The wire assertions there followtoFilterNode's lowering, so the operator arrives asequals.object-gallery-filter-9309.test.ts.ElementDataSourceGate, the element data-source tests, export and grouping). They pin what a host composes, which the renderers still lower. The objectui#10199 split is written out on each interface member.imported-defaults-8317.test.tsregisters the two new spec crossings,ObjectKanbanPropsSchemaandObjectCalendarPropsSchema.New pins:
packages/types/src/__tests__/grid-kanban-calendar-members-round8-6152.test.ts(56 tests) andpackages/plugin-view/src/__tests__/ObjectView.gridOperationsWithoutRead-6152.test.tsx(3 tests).Measured before editing (the dispatch's mechanism assumptions)
operations,ObjectViewand the console pins sentences.conditionalFormatting. Both twins were already the list view's rule (objectui#11533, objectui#11522), andgridRowDecorationMembers-8071.test.tsxalready pins its native rows as stored-rule compatibility reads.operationsand the mirror's other two (ObjectViewSchema, objectui'sListViewSchema) belong to other blocks, measured below, and are untouched.@objectstack/spec@17.7.0, probed with lit controls):ComponentPropsMap['object-grid']takes{ create, update, delete, export }and refusesread/importwith guidance. An unknown toggle is refused too (the strictness control).conditionalFormattingtakes[{ condition, style }]and refuses the native members and an extralabel.filteron all three rows takes[{ field, operator, value }]and an empty array, and refuses the tuple array (atfilter.0), the record and a string. The kanban and calendar rows declare nooperations.ComponentPropsMap['object-view']is undefined, and the spec'sListViewSchema/ObjectListViewSchemadeclare nooperations. So theobject-view's ownoperationsand objectui'slist-viewoperationsare this package's own members, not the grid row's.filterrows were already the rule array at the 17.6.0 tag (git showof the taggedcomponent.zod.ts). The bump PR's table attributes them to 17.7.0. The mirrors were behind either way.operations.read !== falseinObjectViewreadsschema.operations || schema.table?.operations || default. Its first feed is the view's own declared member, which the protocol does not govern (noobject-viewrow) and which stays.table.operationsfallback was fed by the grid's now-retired key. The behaviour stays reachable from the view node, and the slot's refusal names that spelling.table.operations.readis unchanged. Corpus census (fence-aware JSON and markdown walk plus a TS literal scan): zero authoredtable.operations.read/.import. The only grid-rowreadin the tree was the root README.Tests and gates (head
e8dee5a4)pnpm exec vitest run --maxWorkers=2 packages/types/ packages/plugin-grid/ packages/plugin-kanban/ packages/plugin-calendar/ packages/plugin-view/ apps/console/src/__tests__/registry-inputs-spec-parity.test.ts, under the verify lock:Test Files 749 passed (749),Tests 13272 passed | 95 skipped (13367).pnpm exec vitest run --maxWorkers=2 scripts/__tests__/, under the lock:Test Files 179 passed | 2 skipped (181),Tests 5452 passed | 2 skipped (5454).Test Files 12 passed (12),Tests 667 passed (667). Each file was counted non-zero.type-check(the script echoed in every row):@object-ui/types,core,plugin-list,sdui-parser,plugin-dashboard,plugin-detail,plugin-map,plugin-timeline,plugin-calendar,plugin-gantt,plugin-kanban,plugin-grid,plugin-tree,plugin-view,plugin-designer,app-shellandconsole. All areDone. That is every package whose source namesObjectGridSchema,ObjectKanbanSchema,ObjectCalendarSchemaorObjectViewSchema: the downstream consumers of the narrowed types, read against the rebuilt@object-ui/typesdist.plugin-gridfirst went red on the two typed fixtures above, which are now re-spelled.pnpm check:doc-snippets(784 of 784 blocks, 0 failed),check:doc-examples,check:skill-examples,check:doc-types,check:readme-exports,check:spec-symbols,check:component-surface-parity(report-only),check:changeset-claims,check:pending-changeset-literals,check:new-line-citations(0 new),check:control-bytesandnode scripts/check-changeset-presence.mjs: all exit 0. The doc gates ran after a scopedturbo run build(35 tasks) of their own--build-filter.no-explicit-anywarnings only).Ablations (one-shot, through
ablation-replace.mjs, mutation proven on disk, restored to theHEADblob with an emptygit diff HEAD):ObjectView's...gridOperationsset back to...operations.plugin-view'stscagainst the rebuilt types dist gives TS2322 ("Types of property 'read' are incompatible"), which proves the narrowed declaration is the one consumers read. The new view pin goes 2 red / 1 green, and the green one is itstable.operationscontrol.filterset back toz.array(z.any()). The round-8 pin and the 8174 pin go 8 red / 70 green: identity, the differential rows on the tuple array, the AST node and the unknown operator, and the authored-door rows.Acceptance notes (observations, not filed)
ObjectGridSchema.defaultFiltersis a string-keyedRecordofanyon the interface andz.recordon the mirror. The grid row has declared it as the same rule array asfiltersince 17.6.0. It reaches an author only throughobject-viewtable.defaultFilters, whereObjectViewcomposes it with named-view filters. It is not one of this round's three members. No carrier.ObjectGanttSchema/ObjectMapSchemaflatfilterstayany[]while their rows take the rule array. Their authored arms are the rows themselves (thepropertiesbag), so the flat members reach no authored door. Same family, not booked here. No carrier.pinssentences still call their spec rowsz.unknown()orz.array(z.unknown())(object-grid.bulkActionDefsamong them, which 17.7.0 types). They are not this round's members. Carrier: the next PR that touches that file.Deviations
main70e3d772, not thed92b2a15read at dispatch.mainmoved by one unrelated commit (objectui#11923) before the worktree was cut.Clause-②: noline too.Size
18 files, +675 / −131 against
70e3d772. Not governed:node scripts/check-governed-queue-guard.mjs --testover the 18 paths prints "NOT GOVERNED".Implemented in session
https://claude.ai/code/session_01DBZ9bntPZ7VKyQNtJeNsgw(os-dev,domain:spec @ objectuiseat 1).Generated by Claude Code