Skip to content

feat(types)!: showFilters is retired on object-grid, refused by name with the list view's userActions.filter named (objectui#11068) - #11306

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-11068-object-grid-showfilters-tombstone
Oct 1, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-11068-object-grid-showfilters-tombstone

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #11068
Clause-②: yes

The showFilters half of the card, as triage's retriage answer (comment 5896596687) ruled it: RETIRE, with a named tombstone that points at the list view's userActions.filter. keyboardNavigation is not in this PR. It waits until objectstack-ai/objectstack#20694's row is installable (PR objectstack-ai/objectstack#20882 is not in @objectstack/spec 17.5.0), so the card stays open.

What changed

  • @object-ui/types, zod twin (ObjectGridSchema in zod/objectql.zod.ts): showFilters: z.boolean().optional() is now retirementTombstone(OBJECT_GRID_SHOW_FILTERS_RETIRED), next to the rowSpecActions / bulkSpecActions / name / placeholder tombstones. The one string goes into both .describe() and the parse message. It names the card, says the grid has no filter UI, sends the author to a list-view and its userActions.filter, and names filter for narrowing the grid's own rows.
  • @object-ui/types, TypeScript twin (ObjectGridSchema in objectql.ts): showFilters?: boolean (the deprecated "legacy filters toggle") is now showFilters?: never with a RETIRED docblock. It is not deleted, because the key would then fall back to BaseSchema's index signature and type-check again. That is the same convention rowSpecActions uses.
  • Untouched, on purpose: ObjectViewSchema.showFilters (both faces), which ObjectView reads. The list view's showFilters (zod ListViewSchema), which ListView folds onto userActions.filter. NamedListView.showFilters, already ?: never since objectui#7924. DashboardConfig.showFilters. The object-view table slot's existing by-name refusal.
  • Producers that stopped authoring it: the root README.md object-grid example, and the objectui#9729 byte-ruler corpus in ObjectGrid.operatorsInert-9729.test.tsx. That corpus's "filter surface on" document carried showFilters: true, which never drew anything. It now measures with the grid's search box (searchableFields), and the test is renamed to match.
  • Docs: schema-reference.md gets a retired callout under ObjectGridSchema and an updated history sentence. plugin-grid.mdx gets a paragraph next to the four earlier retirements.
  • Pins: the new packages/types/src/__tests__/object-grid-show-filters-retired-11068.test.ts covers both authoring faces, the metadata channel, member-not-deletion, the upstream half and the TS twin. ObjectGrid.declaredKeys-11068.test.tsx adds showFilters (true and false) to the byte ruler. Comment-only count updates (four to five) in object-view-slot-key-lists.test.ts and the two slot docblocks.
  • Changesets: the new .changeset/11068-object-grid-show-filters.md is @object-ui/types minor, with a BREAKING (authoring) line. The pending .changeset/11068-grid-declared-keys.md (from PR objectui#11130, not yet released) said "showFilters and keyboardNavigation are still declared and still not read". This PR makes that false, so it now names only keyboardNavigation.

Dispatch assumptions, measured

  1. Red first: holds. At base 1563d3e10b, the new pin read 5 failed / 13 passed. { type: 'object-grid', objectName, showFilters: true } parsed green on safeValidateSchema and on StrictAnyComponentSchema ("showFilters: true parsed green: expected true to be false"). The 13 that passed are the controls. The renderer half is a byte ruler: the same grid drawn with and without showFilters (true and false) gives identical bytes, and the lit control description moves them. packages/plugin-grid/src is not edited, so the ruler reads base behaviour.
  2. Which declarations belong to the grid: holds. objectql.ts declares showFilters on three interfaces. These are ObjectGridSchema (retired here), ObjectViewSchema (its own key, read by ObjectView as the fallback behind userActions.filter) and NamedListView (already a tombstone). The zod side declares it on ObjectGridSchema (retired), ObjectViewSchema, ListViewSchema, DashboardConfigSchema, and in the table-slot withheld set.
  3. object-view table slot: holds, and nothing changes there. The slot is ObjectGridSchema.omit(type, objectName).extend(OBJECT_VIEW_TABLE_WITHHELD). The withheld set already refused showFilters by name (objectui#10976), and .extend overrides the grid's tombstone, so the slot's message is byte-for-byte the same. No live read goes through the slot. ObjectView reads only the node-level schema.showFilters, and OBJECT_VIEW_TABLE_RELAY_KEYS does not carry it.
  4. Spec row: holds, and the premise stands. On the installed @objectstack/spec 17.5.0, ComponentPropsMap['object-grid'] is ObjectGridPropsSchema, which does not declare showFilters. It refuses { objectName, showFilters: true } with unrecognized_keys, while { objectName } alone parses green. ListViewSchema.userActions declares filter. The pin re-derives both facts.
  5. Producers and docs: partly falsified. The schema-reference.md table row that names showFilters (the showSearch / showFilters / showCreate row) is in the ObjectViewSchema table, not the grid's, so it stays. The ObjectGridSchema table never listed the key. The card said its only producer was the doc example, which PR objectui#11130 removed. Two more in-repo producers turned up: the root README.md object-grid example and the 9729 ruler corpus. Both now omit the key. The plugin-view.mdx and packages/plugin-view/README.md mentions are about the object view's own key and the table slot, and stay.

Tests (head b87cbca042, after merging main at 1ccb5ba7de, which brought in PR objectui#11292)

  • pnpm --filter @object-ui/types build && pnpm --filter @object-ui/types type-check && pnpm --filter @object-ui/plugin-grid type-check && pnpm --filter @object-ui/plugin-view type-check gives VERDICT command-exit 0. The types type-check runs three legs: tsc --noEmit, tsconfig.examples.json and tsconfig.test.json.
  • pnpm exec vitest run packages/types/ examples/schema-catalog/ gives Test Files 338 passed (338), Tests 9836 passed (9836).
  • pnpm exec vitest run packages/plugin-grid/ plus the ten other suites that git grep -l showFilters finds (app-shell ×3, core ×3, plugin-list ×1, plugin-view ×3) gives Test Files 187 passed (187), Tests 1959 passed (1959).
  • Before the merge, the build ran over the @object-ui/plugin-view dependency closure (turbo run build --filter='@object-ui/plugin-view^...' --concurrency=2: 15/15 tasks).

Ablations ran on committed code (181b9b615a) through objectstack's scripts/ablation-replace.mjs, in WRAP mode. Each anchor went from x1 to x0, the blob changed, and the restore was proven (blob equals HEAD, git diff HEAD empty). The tests read src, so there is no dist leg.

  • (A) In objectql.ts, showFilters?: never changed to boolean. tsc -p tsconfig.test.json then exits 2 with TS2578 Unused '@ts-expect-error' in the new pin, plus TS2322 in the zod-mirror-parity type ratchet.
  • (B) The zod tombstone changed to z.boolean().optional(). The new pin then reads 5 failed / 13 passed, the same red as at base.

Repo checks (at b87cbca042):

  • check-control-bytes: OK.
  • new-cross-file-line-citations: VERDICT … 0 new citation(s).
  • check-changeset-presence: "6 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)".
  • changeset:check: no major.
  • check:doc-types, check:doc-fences, check:doc-example-ids, docs:check-links, check:doc-example-readers and check:test-path-roots: all OK.
  • check:component-surface-parity: report-only, and the report is identical before and after (no object-grid row either way).
  • check:changeset-claims: report-only. The one falsified pending sentence is repaired as described above.
  • check-governed-queue-guard --test on the 11 paths: NOT GOVERNED.

NOT MEASURED:

  • check:doc-snippets and check:doc-examples exit 2 ("THE GATE COULD NOT RUN"): about 20 packages they import are unbuilt. This diff adds or changes no ts / tsx fence line (counted: 0), and the only fenced edit is one line removed from a json fence in README.md. These are left to CI.
  • pnpm lint is CI's to run.
  • Type-check of the other ObjectGridSchema importers (core, plugin-calendar, plugin-dashboard, plugin-designer, plugin-gantt, plugin-kanban, plugin-list, plugin-map, plugin-tree, console) is left to CI. A grep finds no typed writer of showFilters on an ObjectGridSchema value. Every other writer targets an object-view, a list-view or a dashboard.

Acceptance notes

  • The object-view table slot refuses table.showFilters with "ObjectGrid has no read of it". An author who wrote it probably meant the object view's own showFilters, which ObjectView reads, and the message does not name it. This is polish to the wording of a refusal that is already loud. Carrier: none. Left as is, because the dispatch rules out widening or reworking that slot.
  • The operators tombstone's comment in objectql.zod.ts still describes the objectui#9729 reading as "with the filter surface off AND on". That is a historical description of a measurement taken when the corpus carried showFilters, and it is left as written.
  • keyboardNavigation is still declared on ObjectGridSchema and still unread. It is the card's remaining half.

Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ


Generated by Claude Code

claude added 3 commits October 1, 2026 00:55
…ame with `userActions.filter` named (objectui#11068)

An `object-grid` has no filter UI and never read `showFilters`; the one filter
surface is the `list-view` toolbar's builder, switched by `userActions.filter`.
The key is now `?: never` on the `ObjectGridSchema` interface and a
`retirementTombstone()` on its Zod twin, so both authoring faces refuse it by
name. An `object-view`'s and a `list-view`'s own `showFilters` are untouched.

The root README's `object-grid` example and the 9729 byte-ruler corpus stop
authoring the key; the schema reference and the plugin-grid guide name the
retirement.

Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ
Co-authored-by: Claude <noreply@anthropic.com>
…wFilters` is still declared

The retirement in the previous commit made that sentence false; `keyboardNavigation`
is the one key it still describes.

Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added documentation Improvements or additions to documentation package: types plugin tests labels Oct 1, 2026
@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 46 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/10872-container-children-channel.md

  • names objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    Also in this change, with no behaviour change: objectql.zod.ts's two public-block arms (object-metric, object-master-detail-form) build their properties member with the same propsBag helper as the other public-block arms, instead of a byte copy of it. The member's description text is unchanged.

.changeset/10976-table-slot-relay.md

  • names packages/types/src/__tests__/object-view-slot-key-lists.test.ts → packages/types/src/__tests__/object-view-slot-key-lists.test.ts — edited by this change

    The slot's key list and the withheld set are pinned against drift by packages/types/src/__tests__/object-view-slot-key-lists.test.ts, which also requires the validator to refuse every withheld key by name, so the two faces refuse the same keys.

.changeset/3917-retire-action-condition-branch.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    • ActionCondition is removed from @object-ui/types (and from the barrel export). - ActionSchema.condition is retyped to the predicate the runtime actually honours: boolean | string | { dialect?: string; source: string } — the same three arms ActionRunner's own ActionDef.condition carries, and the same vocabulary visible and disabled use. - ActionConditionSchema is removed from @object-ui/types/zod (and from the zod barrel); the condition key now validates against that predicate union. - The two teaching sites (content/docs/core/enhanced-actions.mdx Conditional Execution, content/docs/api/schema-reference.md ActionSchema table) are rewritten to the live vocabulary: condition is a gate; a branch is expressed as separate actions with mutually exclusive conditions.

.changeset/5903-objectgantt-declared-keys.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    Both halves move together. The TS declaration (packages/types/src/objectql.ts) and its zod mirror (src/zod/objectql.zod.ts) gain the same ten keys at the same requiredness — all optional — and no KnownDrift entry is added. navigation is taken from @objectstack/spec's NavigationConfigSchema by reference rather than restated, matching ObjectGridSchema.navigation.

  • names src/zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    Both halves move together. The TS declaration (packages/types/src/objectql.ts) and its zod mirror (src/zod/objectql.zod.ts) gain the same ten keys at the same requiredness — all optional — and no KnownDrift entry is added. navigation is taken from @objectstack/spec's NavigationConfigSchema by reference rather than restated, matching ObjectGridSchema.navigation.

.changeset/6152-object-form-unmirrored-members.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectFormSchema in @object-ui/types (objectql.ts) declared a set of members that its zod mirror in @object-ui/types/zod had never heard of. Every one of them is read by the object-form renderer (ObjectForm in @object-ui/plugin-form). The two published faces answered differently:

.changeset/6170-retire-timeline-dead-keys.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Also in this change: the in-repo example packages/types/examples/data-display-examples.json (its timeline node authored all three) is migrated to items / variant; the two content/docs/api/schema-reference.md snippets that authored events: [] now author items: []; and the plugin-timeline docs callout says retired rather than deprecated.

.changeset/6269-objectview-slot-key-lists.md

  • names packages/types/src/__tests__/object-view-slot-key-lists.test.ts → packages/types/src/__tests__/object-view-slot-key-lists.test.ts — edited by this change

    Each Omit is now a Partial<PickANGLE-BRACKETS(…)> over an explicit key list — at this change 59 keys for table, 64 for form, i.e. every declared member minus the identity keys the view itself fixes. Pick with literal keys never computes keyof T, so it cannot collapse the same way. The key lists are pinned against silent drift by packages/types/src/__tests__/object-view-slot-key-lists.test.ts, which recomputes each source schema's declared members through the TypeScript checker and, at this change, requires set equality; a member added to ObjectGridSchema and not to the list turns it red.

.changeset/6896-retire-chart-inline-data.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    ⚠️ One correction to the record the ruling rests on. The ruling states zero authorship of a populated series[].data outside tests across packages/ / apps/ / examples/. The re-measurement finds one such site inside those roots — packages/types/examples/data-display-examples.json (2 series) — plus four outside them, in documentation: content/docs/api/schema-reference.md (3) and content/docs/core/report-schema.mdx (1).

.changeset/6939-kanban-column-cards.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Breaking, deliberately. KanbanColumn declared its card list as items in complex.ts and in the zod mirror complex.zod.ts. Every board reads cards. Measured on origin/main 78a3cc238: KanbanImpl.tsx reads .cards on 12 lines, KanbanEnhanced.tsx on 8, and bucketCardsIntoColumns twice more as col.cards || []; .items had zero read sites in either board (a same-shaped .title control on the same two files returns 8 and 3, so those zeros are readings and not a mis-shaped probe). Both catalog entries, the plugin docs and content/docs/api/schema-reference.md all author cards.

.changeset/6940-rowactions-boolean-mirror.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    The list view's same-named rowActions in zod/objectql.zod.ts — z.array(z.string()), the legacy bare-name action list on ObjectGridSchema — is a different key that is correct as it stands, is in parity with its own TS twin (rowActions?: string[]), and is not touched.

.changeset/6951-tree-view-data-retired.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    What was measured, on this branch's base. TreeViewSchema declared two spellings for its one inline-nodes slot — nodes (read second) and data (read third: boundData || schema.nodes || schema.data || [] at renderers/data-display/tree-view.tsx:105), both declared by objectui#6150. data had been REQUIRED until 777e5c6f4 (PR fix(types): tree-view mirror stops requiring the limb it reads third (group 2 of objectui#6939) #7533) made it optional, so this retirement starts from a declared-and-optional member on both faces. The in-repo corpus at the retirement: seven tree-view nodes under examples/schema-catalog and packages/types/examples plus one content/docs fence — six on nodes, two on data (packages/types/examples/data-display-examples.json and content/docs/api/schema-reference.md), both rewritten; no package source authored either spelling.

.changeset/7113-chart-data-model.md

  • names objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    .extend() with a NEW key still works and preserves the fold and the refinement; .optional(), z.discriminatedUnion, z.toJSONSchema and safeValidateSchema are all unaffected. Nothing in this repository calls the throwing combinators on either const, and the published surface already ships refined mirrors (objectql.zod.ts, complex.zod.ts, form.zod.ts, app.zod.ts), so the class is not new — but it is a real behaviour change on a published export and it belongs in the release note rather than in a reviewer's file.

.changeset/7200-object-form-section-style-keys-undeclared.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    The authored-metadata type now agrees with @objectstack/spec, whose FormSectionSchema is a strict object declaring neither key, and with the ruling's rationale (maintainer 2026-09-01, verbatim): "retire the reads … Declaring the keys was weighed and not adopted: it would formally invite free Tailwind strings into authored metadata, the exact class the boundary exists to keep out." A ?: never tombstone was not used: ObjectFormSection has no zod mirror (ObjectFormSchema in zod/objectql.zod.ts does not declare sections), so there is no parse door to refuse at, and a tombstone is still a declaration in completion and in the published .d.ts.

.changeset/7265-types-user-filter-field-derives.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    zod/objectql.zod.ts declared two schemas under names @objectstack/spec/ui already exports. They were triaged separately, by reading their sites, and went different ways.

.changeset/7322-object-kanban-group-by-limit.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    Breaking for authored metadata: ObjectKanbanSchema.groupField is RETIRED (objectui#7322, ADR-0049 enforce-or-remove), and the two keys the object-kanban renderer actually reads — groupBy and limit — are now DECLARED and validated on both published faces: the TypeScript interface in objectql.ts and the Zod mirror in zod/objectql.zod.ts.

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    Breaking for authored metadata: ObjectKanbanSchema.groupField is RETIRED (objectui#7322, ADR-0049 enforce-or-remove), and the two keys the object-kanban renderer actually reads — groupBy and limit — are now DECLARED and validated on both published faces: the TypeScript interface in objectql.ts and the Zod mirror in zod/objectql.zod.ts.

.changeset/7352-drill-down-config-mirror.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    DrillDownConfigSchema is the zod mirror of DrillDownConfig, and both declarations that carry drillDown reference it — ChartSchema (zod/data-display.zod.ts) and ObjectDataTableSchema (zod/objectql.zod.ts) — so the published validator under @object-ui/types/zod reads the key for the first time (objectui#7352).

.changeset/7363-objectql-union-arms.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectGallerySchema and ObjectDataTableSchema are members of ObjectQLComponentSchema on both faces — the TS union in objectql.ts and the zod union in zod/objectql.zod.ts — so AnyComponentSchema, and with it validateSchema / safeValidateSchema / objectui validate, has an arm for object-gallery and object-data-table nodes (objectui#7363).

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    ObjectGallerySchema and ObjectDataTableSchema are members of ObjectQLComponentSchema on both faces — the TS union in objectql.ts and the zod union in zod/objectql.zod.ts — so AnyComponentSchema, and with it validateSchema / safeValidateSchema / objectui validate, has an arm for object-gallery and object-data-table nodes (objectui#7363).

.changeset/7632-shared-record-source-config.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    That ladder is published contract on both faces — packages/types/src/objectql.ts and its zod mirror both ship .describe() strings naming getDataConfig's order (77cb489b4, maintainer ruling 2026-09-02), pinned by objectql-record-source-refinement-6939.test.ts — and it was hand-copied into five plugin components with no gate holding them together. A change to the ruled order had five edit sites and nothing that noticed a missed one; that is the AGENTS.md #0.1 drift class.

.changeset/7664-kanban-arm-plugin-dialect.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Migration. Author boards in the plugin dialect — objectName + groupBy for an object-bound board, or columns[].cards[] with badges for a static one. Replace DeclarativeKanbanSchema imports with KanbanSchema (from @object-ui/types, or the Zod KanbanSchema from @object-ui/types/zod; @object-ui/plugin-kanban re-exports the same KanbanSchema type). Delete draggable (drag-and-drop is always on) and column color (style a lane through className). content/docs/api/schema-reference.md's kanban section now documents this dialect.

.changeset/7804-objectql-handler-key-arms.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    The four plain objectql.ts node faces declare the nine handler keys their registered renderers read (the objectql.ts slice): ObjectFormSchema.onCancel / .onError / .onOpenChange / .onStepChange / .onSuccess, ObjectGallerySchema.onCardClick / .onRowClick, ObjectGridSchema.onNavigate and ObjectViewSchema.onNavigate.

.changeset/7804-tree-view-handler-slot.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    'runtime-slot' and not 'retired', measured at this key's own channel. 'retired' publishes "no renderer reads this key, so nothing could ever run it" — true of the two siblings already tombstoned on this arm (onSelectChange, onExpandChange) and flatly false here, since the read is live and INVOKED. ⚠️ No in-repo host builds a tree-view node carrying the key: the channel is wired end to end and only the supplier is absent, which is the same shape as ObjectFormSchema.onStepChange in this card's objectql.ts slice and is not evidence of a dead read. The TypeScript declaration is unchanged and still callable, so a programmatic host supplies it exactly as before.

.changeset/7917-export-breadcrumb-object-tree-zod-schemas.md

  • names objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    AnyComponentSchema declares 107 node component types. 105 of them could be named on the ./zod barrel — ButtonSchema.safeParse(node), which is what a designer, a form builder or a targeted test needs. The arms declaring type: 'breadcrumb' (navigation.zod.ts) and type: 'object-tree' (objectql.zod.ts) could not: both were already export const in their own module, but index.zod.ts — the package's only zod entry point — did not re-export them, so the schemas existed, were maintained, and were applied by the union while no consumer could name them.

.changeset/7963-alert-dialog-footer-keys-retired.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    Nothing else moves. These spellings are overloaded across the tree and every other owner is a live key on a different declaration — FormSchema.cancelLabel, objectql.ts's confirmLabel, plugin-designer's ConfirmDialog React props, plugin-grid's def.confirmLabel, and plugin-form's ModalForm / DrawerForm, which build a local cancelLabel from schema.cancelText. None is an AlertDialogSchema; none is touched, and a pin asserts it. No fixture, catalog schema, example app or doc fence authored any of the three on an alert-dialog node, so no shipped document is stranded.

.changeset/7997-detail-view-related-retired.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Documentation. packages/plugin-detail/README.md and content/docs/api/schema-reference.md stop teaching the retired array and gain a migration block each.

.changeset/8268-testid-emitted-as-data-testid.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    The other direction — retiring the promise — was considered and declined. It is what c1fe272ad did for BaseSchema.hidden, but that key had a working behaviour to describe and zero named consumers, and the ruling's decline turned on exactly that. This promise already has carriers outside the type declaration: content/docs/api/schema-reference.md states it as a table row and authors testId in that page's own base-schema example, @object-ui/cli's OBJECTUI_STRUCTURAL_KEYS identifies a file as an ObjectUI schema node by this key, at this change ObjectGridSlotKey / ObjectFormSlotKey pin it, SchemaBuilder.testId() writes it, and ADR-0054 C4 — shipped — reads "the renderer emits data-testid … derived from metadata".

.changeset/8478-describe-line-addresses.md

.changeset/8653-listview-title-retired-rowactiondefs-pinned.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    title — retired. ListView resolved its export filename through schema.label || (schema as any).title. @objectstack/spec/ui's ListViewSchema refuses title by name (unrecognized_keys: ['title']) while ObjectGridPropsSchema accepts it; packages/types mirrors the platform contract rather than ruling over it, so declaring title on ListViewSchema would have made this repo accept what the platform save gate rejects. That asymmetry is also why objectui#6639 could take the declare branch for ObjectGridSchema.title one package over and this site could not. A parse-based census of apps/ examples/ content/ and packages/ found zero list-view nodes authoring title, so the retirement costs no author a filename. Over that same corpus the instrument reports three object-grid nodes carrying the key: two authored ones, both in content/docs/api/schema-reference.md, plus one that is not authored at all — packages/plugin-view/src/ObjectView.tsx composes title: schema.table?.title onto a grid node it builds, so it is a producer writing the key rather than an author declaring it. ObjectGrid's own title reads are untouched — they remain declared, ruled and read.

.changeset/8735-objectql-mirror-docblocks-not-defaulted.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    Correct four zod/objectql.zod.ts docblocks that described the behaviour objectui#8317 removed. Since that change the zod mirrors strip imported @objectstack/spec defaults at this package's import boundary, but the docblocks on HttpRequestSchema, ListColumnSchema, SelectionConfigSchema and PaginationConfigSchema still said, in the present tense, that method, prefix.type, type and pageSize are defaulted on parse — the opposite of what each export does. Each now says the key is declared and accepted but NOT defaulted on parse.

.changeset/8767-object-grid-refuses-string-sort.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    Migration. Write the array: sort: [{ field: 'name', order: 'desc' }]. Both keys are required. SortConfig.order carries no ? in @object-ui/types (packages/types/src/objectql.ts) and no .optional() in its zod mirror, and the protocol's own reusable SortItemSchema requires order as well — measured: that schema refuses [{ field: 'name' }] with invalid_value at 0.order. Do not omit it: this block's array arm interpolates whatever is present, so an omitted order lowers to $orderby: 'name undefined' today. That is pre-existing behaviour on the arm this change does not touch, and it is filed as a successor card rather than widened into here.

.changeset/8801-object-kanban-allow-collapse-retired.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    • the declarations retired here — packages/types/src/objectql.ts and its mirror packages/types/src/zod/objectql.zod.ts; - the pins that assert the retirement — object-kanban-allow-collapse-retired-8801.test.ts and bare-kanban-node-key-retired-8802.test.ts; - a comment in packages/types/src/zod/complex.zod.ts, recording that the deleted retiredZeroReadKanbanKey helper once carried this spelling on the SIBLING arm; - one row of content/docs/api/schema-reference.md; - the .changeset/ release notes that discuss it — this one, the two historical entries covering the sibling arm's own spelling, and objectui#9629's note recording the correction to this paragraph.
  • names packages/types/src/zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    • the declarations retired here — packages/types/src/objectql.ts and its mirror packages/types/src/zod/objectql.zod.ts; - the pins that assert the retirement — object-kanban-allow-collapse-retired-8801.test.ts and bare-kanban-node-key-retired-8802.test.ts; - a comment in packages/types/src/zod/complex.zod.ts, recording that the deleted retiredZeroReadKanbanKey helper once carried this spelling on the SIBLING arm; - one row of content/docs/api/schema-reference.md; - the .changeset/ release notes that discuss it — this one, the two historical entries covering the sibling arm's own spelling, and objectui#9629's note recording the correction to this paragraph.
  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    • the declarations retired here — packages/types/src/objectql.ts and its mirror packages/types/src/zod/objectql.zod.ts; - the pins that assert the retirement — object-kanban-allow-collapse-retired-8801.test.ts and bare-kanban-node-key-retired-8802.test.ts; - a comment in packages/types/src/zod/complex.zod.ts, recording that the deleted retiredZeroReadKanbanKey helper once carried this spelling on the SIBLING arm; - one row of content/docs/api/schema-reference.md; - the .changeset/ release notes that discuss it — this one, the two historical entries covering the sibling arm's own spelling, and objectui#9629's note recording the correction to this paragraph.

.changeset/8885-object-chart-drilldown-title-compareto.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectChart.tsx reads all three off schema, and until now neither published copy declared any of them: not the TS interface (packages/types/src/objectql.ts) and not the zod mirror (packages/types/src/zod/objectql.zod.ts). They rode BaseSchema's index signature / .passthrough() and arrived unvalidated. drillDown was the sharpest case — this component's registry inputs advertise it to the designer palette, and @objectstack/spec publishes ChartDrillDownSchema for exactly this carrier, so an author was offered a key that neither published shape mentioned.

  • names packages/types/src/zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    ObjectChart.tsx reads all three off schema, and until now neither published copy declared any of them: not the TS interface (packages/types/src/objectql.ts) and not the zod mirror (packages/types/src/zod/objectql.zod.ts). They rode BaseSchema's index signature / .passthrough() and arrived unvalidated. drillDown was the sharpest case — this component's registry inputs advertise it to the designer palette, and @objectstack/spec publishes ChartDrillDownSchema for exactly this carrier, so an author was offered a key that neither published shape mentioned.

.changeset/8913-object-kanban-columns-declared.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    What moved. ObjectKanbanSchema gains columns on both halves that move together — the TypeScript interface (objectql.ts) and its Zod mirror (zod/objectql.zod.ts). Retiring the bare kanban node type key (objectui#8802) removed the only face that judged a lane, and object-kanban had never declared the key, so it rode BaseSchema's [key: string]: any / .passthrough(): read by the renderer at three sites, named by no published face.

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    What moved. ObjectKanbanSchema gains columns on both halves that move together — the TypeScript interface (objectql.ts) and its Zod mirror (zod/objectql.zod.ts). Retiring the bare kanban node type key (objectui#8802) removed the only face that judged a lane, and object-kanban had never declared the key, so it rode BaseSchema's [key: string]: any / .passthrough(): read by the renderer at three sites, named by no published face.

.changeset/8990-object-kanban-groupby-optional.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    @objectstack/spec declares the key optional — groupBy: z.string().optional() on ObjectKanbanPropsSchema — while this package required it on the TypeScript declaration (packages/types/src/objectql.ts) and on the Zod mirror (packages/types/src/zod/objectql.zod.ts). objectui was therefore narrower than the protocol on a published key: ObjectKanbanSchema.safeParse and safeValidateSchema refused an object-kanban node the protocol accepts, and such a node could not be annotated with its own type.

  • names packages/types/src/zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    @objectstack/spec declares the key optional — groupBy: z.string().optional() on ObjectKanbanPropsSchema — while this package required it on the TypeScript declaration (packages/types/src/objectql.ts) and on the Zod mirror (packages/types/src/zod/objectql.zod.ts). objectui was therefore narrower than the protocol on a published key: ObjectKanbanSchema.safeParse and safeValidateSchema refused an object-kanban node the protocol accepts, and such a node could not be annotated with its own type.

.changeset/8992-user-actions-collapse-and-docblock.md

  • names objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    objectql.zod.ts's UserActionsSchema read stripImportedDefaults(Spec).extend({ group, hideFields, rowColor }), an extension that existed only because @objectstack/spec did not declare those three keys while normalizeListViewSchema folded objectui's legacy showGroup / showHideFields / showColor onto them. The protocol adopted all three in 17.3.0 (objectui#5435's ruling), so the extension is now a second local copy of a protocol declaration — the shape two faces start drifting from — and it collapses into the plain by-reference re-export its own note always said it would become.

.changeset/9092-inline-locale-declared-face.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    • AppComponentSchema.label (app.ts) - ObjectGridSchema.label and .description (objectql.ts) - PageNodeSchema.aria.ariaLabel (layout.ts)

.changeset/9187-record-highlights-layout-two-values.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    ⚠️ The census behind this narrowing covers this repository only, and it found no in-repo authoring to migrate: every in-tree layout: 'grid' belongs to a different component (detail-view in content/docs/api/schema-reference.md and phase2-schemas.test.ts, ai-recommendations in packages/plugin-ai/README.md), and the one in-repo consumer of this interface that writes a layout (p1-spec-alignment.test.ts) writes 'horizontal'. So no document in this repository stops type-checking. A TypeScript consumer outside this repo that wrote grid is not observable from here and gets a compile error (TS2322) naming the key — which is why the FROM/TO is spelled out above.

.changeset/9309-object-gallery-filter-destination-typed.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectGallerySchema.filter is typed as the destination its own docblock names — QueryParams['$filter'] — on both faces, the TS interface in objectql.ts and the zod mirror in zod/objectql.zod.ts (objectui#9309).

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    ObjectGallerySchema.filter is typed as the destination its own docblock names — QueryParams['$filter'] — on both faces, the TS interface in objectql.ts and the zod mirror in zod/objectql.zod.ts (objectui#9309).

.changeset/9511-record-id-is-a-string.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    The three authorable keys, each on BOTH faces. ObjectFormSchema.recordId (objectql.ts + zod/objectql.zod.ts), DetailViewSchema.resourceId (views.ts + zod/views.zod.ts) and DetailSchema.resourceId (crud.ts + zod/crud.zod.ts). ⚠️ The crud pair is DetailSchema, not DetailViewSchema, and it reaches the same renderer — not by symbol but by data flow: plugin-detail registers the 'detail' node type onto DetailView. A read that follows TypeScript symbols alone finds two keys and is incomplete.

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    The three authorable keys, each on BOTH faces. ObjectFormSchema.recordId (objectql.ts + zod/objectql.zod.ts), DetailViewSchema.resourceId (views.ts + zod/views.zod.ts) and DetailSchema.resourceId (crud.ts + zod/crud.zod.ts). ⚠️ The crud pair is DetailSchema, not DetailViewSchema, and it reaches the same renderer — not by symbol but by data flow: plugin-detail registers the 'detail' node type onto DetailView. A read that follows TypeScript symbols alone finds two keys and is incomplete.

.changeset/9549-tree-filter-declared.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectTreeSchema.filter is declared on both faces, in the shape objectui#9309 settled for ObjectGallerySchema.filter: QueryParams['$filter'] by indexed access on the TS interface in objectql.ts, and the same two-arm union (array first) on the zod mirror in zod/objectql.zod.ts (objectui#9549).

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    ObjectTreeSchema.filter is declared on both faces, in the shape objectui#9309 settled for ObjectGallerySchema.filter: QueryParams['$filter'] by indexed access on the TS interface in objectql.ts, and the same two-arm union (array first) on the zod mirror in zod/objectql.zod.ts (objectui#9549).

.changeset/9550-object-tree-root-barrel.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectQLComponentSchema declares the node types an ObjectQL block may be. Every one of its arms was a named export of this package's root barrel except ObjectTreeSchema, which was declared in objectql.ts, applied by the union, and re-exported by the ./zod barrel (objectui#7917) — while no TypeScript consumer could name it. There is no ./objectql subpath to reach around the barrel: the package's exports map is pinned by packages/types/src/__tests__/package-exports-manifest.test.ts, and the root barrel was the only route to this type.

.changeset/9606-object-kanban-card-title.md

  • names zod/objectql.zod.ts → packages/types/src/zod/objectql.zod.ts — edited by this change

    Both published faces of the object-kanban arm now name the key: the zod mirror ObjectKanbanSchema in zod/objectql.zod.ts and its TypeScript twin, the ObjectKanbanSchema interface in objectql.ts. Both declare it OPTIONAL, at the same requiredness the other face uses, so the two faces accept and refuse the same documents. (Located and cited by SYMBOL: line addresses in zod/objectql.zod.ts have drifted before, and this change is itself about a drifted mirror.)

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    Both published faces of the object-kanban arm now name the key: the zod mirror ObjectKanbanSchema in zod/objectql.zod.ts and its TypeScript twin, the ObjectKanbanSchema interface in objectql.ts. Both declare it OPTIONAL, at the same requiredness the other face uses, so the two faces accept and refuse the same documents. (Located and cited by SYMBOL: line addresses in zod/objectql.zod.ts have drifted before, and this change is itself about a drifted mirror.)

.changeset/9628-kanban-column-collapsed-honoured.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    The key was declared on both published faces of the object-kanban arm — the lane element of ObjectKanbanSchema (objectql.ts and its Zod mirror) and the runtime lane KanbanColumn (complex.ts and its mirror) — and read by KanbanEnhanced alone, a module no production source imports. An authored { "id": "todo", "title": "To Do", "collapsed": true } therefore parsed green on both faces and reached a board that did nothing with it: KanbanImpl's only collapse is the SWIMLANE row's, held in viewer state under objectui:kanban-collapsed:ANGLE-BRACKETS(swimlaneField) and never keyed to a lane's declared value. That is the ADR-0049 declared-but-unhonoured shape.

.changeset/calendar-view-schema-converge.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Runtime renderer behaviour is unchanged. @object-ui/plugin-calendar's README and content/docs/api/schema-reference.md are repaired to the converged surface in the same change, so no copy of the old contradiction survives.

.changeset/issue-5373-retire-crud-schema.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    crud had four declaration faces and no registered renderer, for the whole life of the key: the TS interface (packages/types/src/crud.ts), the zod mirror (packages/types/src/zod/crud.zod.ts), a dedicated branch in validateSchema that affirmatively PASSED it, and CRUDBuilder in @object-ui/core. A node spelling it painted the OBJUI-001 "Unknown component type" panel, and content/docs/api/schema-reference.md published it as reference material — so a reader (or an AI author) who copied the page got a red panel.

  • names api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Authoring crud is now REFUSED BY NAME rather than passed or silently ignored. validateSchema returns an error with code: 'RETIRED_TYPE' on schema.type — at any depth, since it is what validateChildren recurses with — so assertValidSchema throws and isValidSchema answers false. The message names the migration: object-grid for the record table with its toolbar, filters, pagination and row/batch actions, object-form for the create/edit form, and detail for the record view. api/schema-reference.md is rewritten around those shapes.

.changeset/object-view-unmirrored-keys-7779.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    listViews stays unmirrored, on the ruling's own fallback clause. The declaration's value is the local NamedListView — 64 declared top-level members (⚠️ re-taken at objectui#8980, which added the seventeen the protocol declares on this surface to the 47 this entry first measured), of which the renderer reads 21 off a named view. data is one of the 21 now: it used to reach the renderer through an as any cast on the named-view config in packages/plugin-view/src/ObjectView.tsx and be declared nowhere, and the objectui#8980 ruling declared it by name — objectui#7928's open half, answered. The spec's ViewSchema.listViews is a record of the STRICT ObjectListViewSchema, which requires columns and refuses options, ObjectQL tuple filters and default — that is, it refused the named views this package's own README and content/docs/api/schema-reference.md taught when this entry was written ({ label: 'All Users' } fails at columns; filter: [["owner", "=", "..."]] fails at filter.0), and objectui#8255 has since rewritten them in the spec shape. Mirroring the spec value would have lost documented behaviour; mirroring the local value would enforce 43 unread members (64 declared, minus the 21 that are both declared and read) into the contract — the very thing ruling B refused for the six local keys. The key therefore stays in the parity ledger with that measurement, pinned, until the maintainer decides its value type. It is not papered over with z.any().

.changeset/table-renderer-declared-column-contract-5350.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    What makes this site different from its three siblings is that the alias was not merely tolerated, it was published. content/docs/api/schema-reference.md §TableSchema shipped a copyable { "name": "id", "label": "#" } example and a property row reading "Column definitions with name, label, …", while packages/types declared the opposite pair. Docs and type disagreed about one type they both call TableColumn, each internally consistent. Retiring the alias without correcting the page would have turned a documented, working example into a silently broken one, so both halves land together: the page now authors accessorKey/header. The same row also advertised a render property that TableColumn has never declared — the renderer's hook is cell — and that claim is dropped rather than re-spelled.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Angle-bracketed names in the quoted prose above are rewritten as ANGLE-BRACKETS(name): GitHub deletes tag-shaped fragments from a stored body, and a quote that silently loses the identifier it is about is worse than a visible repair.

Compared the checked-out tree with 1ccb5ba7d (merge-base with origin/main): 9 file(s) changed outside .changeset/, read against 1869 pending declaration(s) that publish a body (2481 pending in total). · run

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 330 chunks) 3584.9 KB 3607.4 KB
Main entry chunk (gzip) 150.1 KB 350 KB
Entry file index-C84MzKBX.js —
Status PASS —

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.88KB 6.25KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.17KB 5.40KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 570.17KB 136.43KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 229.96KB 63.80KB
fields (index.js) 261.11KB 66.26KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.49KB 9.23KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 40.95KB 11.48KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.86KB 5.00KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.52KB 2.26KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.93KB
plugin-calendar (index.js) 52.90KB 15.35KB
plugin-charts (index.js) 84.09KB 22.93KB
plugin-chatbot (index.js) 198.22KB 46.97KB
plugin-dashboard (index.js) 139.27KB 37.26KB
plugin-designer (index.js) 216.45KB 44.60KB
plugin-detail (index.js) 244.79KB 64.47KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 173.75KB 44.64KB
plugin-gantt (index.js) 173.03KB 43.07KB
plugin-grid (index.js) 231.61KB 63.61KB
plugin-kanban (index.js) 49.32KB 15.48KB
plugin-list (index.js) 116.63KB 28.97KB
plugin-map (index.js) 23.50KB 7.82KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.04KB 12.21KB
plugin-timeline (index.js) 33.05KB 9.67KB
plugin-tree (index.js) 11.20KB 3.89KB
plugin-view (index.js) 90.32KB 22.76KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 119.55KB 39.23KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 6.06KB 2.68KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 21.42KB 7.05KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 3.19KB 1.62KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.26KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 21.59KB 7.71KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: b87cbca042e8e8dfd573462caf2de7ba630593ca
Local-runs: none

PR objectui#11306 (Part of #11068, Clause-②: yes), the showFilters half of card objectui#11068 as triage's retriage answer 5896596687 ruled it: RETIRE with a named tombstone whose prescription names userActions.filter on the list view; "the seat may land the showFilters retirement first, alone". Read against the claim 5922355414, the dev report 5923001365, the PR body and file list, the net diff git diff 1ccb5ba7de b87cbca042 (merge-base equals origin/main 1ccb5ba7de; 11 files, +303 / −35, the same 11 the PR's /files lists), and the head's check-runs. Nothing was built, run or re-run locally; where a line below cites a file and line, it is a git show read at the head.

① Derived judgments

  1. Zod face, ObjectGridSchema.showFilters (packages/types/src/zod/objectql.zod.ts): z.boolean().optional() becomes retirementTombstone(OBJECT_GRID_SHOW_FILTERS_RETIRED), placed beside the four objectui#11068 tombstones (rowSpecActions, bulkSpecActions, name, placeholder). retirementTombstone() is z.never({ error }).optional().describe(guidance) (tombstone.zod.ts:64), so an object-grid carrying showFilters at any value now reads red on both authoring faces (safeValidateSchema and StrictAnyComponentSchema), issue code invalid_type at path showFilters, with the one string in both the parse message and .describe(). Right — the ruled retirement, in the shape PR objectui#11130 used for the first four (RETIRED on \object-grid` (objectui#11068, ADR-0049) — …`).
  2. TypeScript face (packages/types/src/objectql.ts:1014): showFilters?: boolean (the old "legacy filters toggle", @deprecated Use filter property instead) becomes showFilters?: never under a RETIRED docblock. Kept as a member, not deleted, because BaseSchema's index signature would otherwise re-admit the key — the rowSpecActions convention. Right; the two faces move in lockstep, and the key set of ObjectGridSchema is unchanged on both, which is why zod-mirror-parity.test.ts needed no edit (the claim allowed it "only if this moves it"; it does not).
  3. The message. It names objectui#11068 and ADR-0049; says the grid has no filter UI and nothing read the key; names list-view and userActions.filter as the place the filter builder lives (the prescription triage ruled); and ends "To narrow the rows this grid fetches, write filter." Right, and the filter naming is honest. filter is a live key on both faces (filter?: any[], "Filter criteria (JSON Rules format)"; zod filter: z.array(z.any()).optional()) read by ObjectGrid.tsx:2028 ({ filter: schema.filter, defaultFilters: schema.defaultFilters }). The wording keeps the two capabilities apart — "switch the builder" versus "narrow the rows this grid fetches" — so it does not sell a static row filter as a filter UI. It is additive to the ruled prescription, which comes first, and it carries the old docblock's own pointer forward. Accepted as a deviation, named in the report.
  4. What stays, and must — none moved; the diff's only non-comment edits in the two type files are the grid's two members:
    • ObjectViewSchema.showFilters?: boolean (objectql.ts:2430; zod objectql.zod.ts:904), read by ObjectView.tsx:1960 as activeViewUserActions?.filter ?? schema.showFilters ?? false.
    • zod ListViewSchema.showFilters (objectql.zod.ts:1792), folded by ListView.tsx:1278 onto ua?.filter.
    • NamedListView.showFilters?: never (objectql.ts:2657), a tombstone since objectui#7924.
    • DashboardConfigSchema.showFilters ("Show global filter bar", complex.zod.ts:1572) — the file is not in the diff.
    • The object-view table slot's showFilters: tableKeyRefusal('showFilters', TABLE_KEY_UNREAD) (objectql.zod.ts:799) is unchanged; the slot is .omit(…).extend(…), so its own refusal overrides the grid's tombstone and its message is byte-identical. object-view-slot-key-lists.test.ts's unread array already carried showFilters; the PR's edit there is comment-only (four to five). Right.
      The pin's controls assert each of these on both faces (a list view's userActions.filter, a list view's own showFilters, an object view's own showFilters, the grid without the key, and an unknown key still kept on the node face — the control that proves the object did not simply turn strict).
  5. The spec row. packages/types/package.json pins @objectstack/spec ^17.5.0 (lock 17.5.0). The dev's reading — ObjectGridPropsSchema does not declare showFilters and refuses it with unrecognized_keys, while ListViewSchema.userActions declares filter — is consistent with the objectui#11130 report (17.4.0 declared none of the eight) and with triage's note that both remaining keys are absent from the strict object-grid row, and the new pin re-derives both facts rather than stating them (AGENTS.md 完善设计器的每一个细节 #9). Consistent. Note that the Spec Main Shape Gate on this head is still in_progress (③ 5).
  6. File surface beyond the claim — in scope, not widening. Each is a producer or a doc the diff makes false, or the renderer half of the pin:
    • README.md: the object-grid example ("type": "object-grid") authored "showFilters": true; one line removed. A producer the retirement would have made invalid.
    • ObjectGrid.operatorsInert-9729.test.tsx: the "filter surface on" corpus carried showFilters: true on an object-grid, which never drew a filter surface; it now measures with the grid's one query affordance (searchableFields) and is renamed. A producer, and a test name the diff made false.
    • content/docs/plugins/plugin-grid.mdx: one paragraph beside the four earlier retirements — AGENTS.md Add automated testing infrastructure and CI/CD workflows #2 (docs-driven).
    • content/docs/api/schema-reference.md: a retired callout under ObjectGridSchema and the history sentence. The dev's Zone 2 Implement component reordering via drag-and-drop in designer canvas #5 falsification holds: the showSearch / showFilters / showCreate row (line 953) sits under ### ObjectViewSchema (line 893), not the grid's table, so leaving it was right.
    • ObjectGrid.declaredKeys-11068.test.tsx: showFilters (true and false) added to the byte ruler — the renderer half, the same split PR objectui#11130 used. packages/plugin-grid/src is otherwise untouched, so the ruler reads base behaviour.
    • .changeset/11068-grid-declared-keys.md (PR objectui#11130's pending, unreleased entry on this same card): its "showFilters and keyboardNavigation are still declared" sentence is the one this PR falsifies; it now names keyboardNavigation only. Frontmatter unchanged. Correcting a pending entry of the same card is the same discipline PR objectui#11130 applied to 10976-table-slot-relay.md. Right.
  7. Pins. The new object-grid-show-filters-retired-11068.test.ts holds 18 tests (3 per-face × 2 faces + 3 singles; 3 per-face × 2 faces of controls; 2 upstream; 1 TS-twin carrier). At base, exactly five can be red by construction: the two by-name refusals, the two message checks, and the metadata-channel check (safeParse succeeds at base); "the tombstone is a MEMBER" passes at base because z.boolean().optional() is a member. That is the reported 5 red / 13 green, and ablation B (zod back to z.boolean().optional()) is the same five. Ablation A (TS twin back to boolean): the @ts-expect-error carrier is at line 169 column 3 of the pin, where the reported TS2578 lands, and the zod-mirror-parity type ratchet's TS2322 is the expected second alarm for a TS/zod type split. Present and sound. Its own file rather than a fifth row in object-grid-declared-keys-11068.test.ts is justified: its lit controls live on other nodes.
  8. keyboardNavigation moves only in prose (the changeset sentence and the slot docblock); its declarations on both faces are untouched. The card stays open for it, serial after finding(spec): ComponentPropsMap['object-grid'] (ObjectGridPropsSchema) declares neither description nor emptyState, which objectui's ObjectGrid reads once objectui#11130 lands objectstack#20694 / PR feat(spec): object-grid declares description, emptyState (the list view's own shape) and keyboardNavigation objectstack#20882 is installable. Right; the claim's ⛔ held.
  9. Public surface. No runtime behaviour changes anywhere: packages/plugin-grid/src and every renderer are untouched. The one published change is the accept set of @object-ui/types — zod (object-grid with showFilters goes green to red) and the .d.ts (showFilters on an ObjectGridSchema literal goes from compiling to refused).

② Semver level

  • One new changeset, .changeset/11068-object-grid-show-filters.md: '@object-ui/types': minor, with a BREAKING (authoring) line that says what stops validating and compiling and what to write instead (userActions.filter on a list-view; filter for the grid's own rows), and an "Unchanged" paragraph for the view's and the list view's own keys and the table slot. Matches the diff: @object-ui/types is the only package whose published output changes.
  • The level is right for this repo: AGENTS.md (line 271) has objectui's own breaking changes marked minor with the breaking semantics written in the body, never major (the fixed group). PR objectui#11130's changeset used the same pair (@object-ui/types: minor, "breaking for a writer of a retired key, hence minor"). The feat(types)!: title is consistent with that body; Changeset Bump Policy on the head is green.
  • Clause-②: yes is right: a published @object-ui/types schema refuses a key it accepted, on both authoring faces — an accept-set narrowing with a named tombstone, which is the clause's case.
  • @object-ui/plugin-grid: only src/__tests__/ files change. The presence gate counts them ("No carve-out for test files under src/"), which is why it reports "6 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)"; the gate is satisfied by a declared changeset in the range and does not ask for one per package. A test-only change publishes nothing from plugin-grid, so none is owed. Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check and Changeset Claim Re-read are all success on the head; the claim re-read's 46 named pending bodies are informational (exit 0), and the one it could not answer — whether the same card's pending sentence was still true — the dev answered by correcting it (① 6).
  • The corrected pending entry 11068-grid-declared-keys.md keeps its frontmatter (plugin-grid minor, types minor); the edit is body-only.

③ Boundary flags

  1. open_questions: none. Nothing to answer or escalate.
  2. Dev deviations, each answered. (i) Zone 2 Implement component reordering via drag-and-drop in designer canvas #5 partly falsified — verified (① 6), accepted. (ii) Zone 2 Implement visual designer for Object UI schemas #1–Add default props to all components to prevent collapse in designer #4 held — consistent with the diff and the pin. (iii) File surface extended — in scope, each item a producer, a doc, or the renderer half (① 6). (iv) zod-mirror-parity.test.ts not edited — right (① 2). (v) The pin in its own file — accepted (① 7). (vi) filter also named in the message — accepted as honest and additive (① 3). (vii) origin/main 1ccb5ba7de merged (PR objectui#11292: kanban/calendar arms of the same files, no overlap) — verified; the merge-base is that commit and the net diff is the PR's 11 files. (viii) Container restart and re-run at the merged head — the dev's own account; the instrument that answers it is the head's check-runs (5 below). (ix) Attribution — the three branch commits carry only the session-URL trailer and the model-free co-author trailer the role file prescribes; no model identifier in the trailers or the diff. (x) Worktree removed — no bearing on the review.
  3. out_of_scope_findings[0] — the table slot refuses table.showFilters with "NOT A TABLE KEY (objectui#10976) — … ObjectGrid has no read of it." (objectql.zod.ts:746-751). The reason stays true after this PR. Naming the object view's own showFilters (or its userActions.filter) would save an author one hop. Acceptance note, not fileable on its own: one string under the objectui#10976 slot, no behaviour, and the dispatch rules out reworking that slot here. Fold it into the next edit of the slot's messages.
  4. out_of_scope_findings[1] — the operators tombstone comment (objectql.zod.ts:377) still says the objectui#9729 byte ruler was taken "with the filter surface off AND on", a surface that never existed; the corpus carried showFilters: true, which drew nothing, and the ruler test now says "with the search box on". A historical description of a measurement as it was taken, comment-only. Acceptance note; nothing to file. A one-line correction belongs with the next touch of that block.
  5. CI on the head b87cbca042, read at 2026-10-01T01:45:34Z: 42 check-runs — 29 success, 3 skipped (the two coverage shards and dependabot, the expected skips), 0 failure, 10 in_progress and not concluded: Test (shard 1/8) through Test (shard 8/8), Type Check, and Spec Main Shape Gate. Those ten are the families that execute the new pin and compile the TS twin, and this record does not treat them as pass or fail; the merge gate reads their conclusions. Concluded green on the head: Lint, Build & E2E, Test (dist pins), Doc Snippet Type Check, Doc Component Type Check, Build Docs, Internal Docs Link Check, Doc Fence Language Check, Doc Example Id Check, README Export Check, the four changeset gates, Line Citation Gate, Control Byte Scan, Governed Surface Queue Guard, Inert vi.mock Specifier Check, Pre-Install Import Graph Check, Bundle Analysis, Live E2E (informational), Docs Route Eager Closure Check, Shell Escape Residue Scan, Action Ref Convention, Skill Guide Path Check, Skill Eval Token Check, Skill Example Check, label.
  6. Scope lines held: no keyboardNavigation work; no edit to the list view's showFilters / userActions.filter; the object-view table slot not widened or reworked; no closing keyword (Part of #11068); no governed surface among the 11 paths.

Implemented-by: claude/issue-11068-object-grid-showfilters-tombstone
Reviewed-by: session_0122Knsowci76D2rBWReCzzZ

VERDICT: PASS

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation package: types plugin tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants