Skip to content

fix(plugin-list,plugin-gantt,types): toolbar Filter and chips reach the tree and chart queries; toolbar Search reaches the gantt query (objectui#10250) - #10323

Merged
objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/issue-10250-self-querying-views-toolbar-state
Sep 24, 2026
Merged

objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/issue-10250-self-querying-views-toolbar-state

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #10250
Clause-②: yes (widening)

What was wrong (re-measured on main at 8b1f06619, real renderers)

ListView's toolbar offers Filter, the UserFilters chips and Search on every view, and its own fetch applies all three. Three views do not draw those rows; they run their own query from their node, and their nodes did not carry the toolbar state. A temporary probe (not committed) rendered ListView over the REAL registered object-tree, object-chart and object-gantt renderers, with toolbar status equals open, authored name != zzz and search needle:

view host fetch the view's own query on main
tree $filter = ["and",[["name","!=","zzz"]],["status","=","open"]], $search = "needle" find with $top 2001, $filter = [["name","!=","zzz"]], no $search
chart (object-bound) same aggregate with filter = [["name","!=","zzz"]]
gantt same find with $top 2001, the full effective $filter (objectui#10037), no $search

All three sites reproduce as the card describes.

The change

  • packages/plugin-list/src/ListView.tsx
    • The objectui#10037 value is generalised from gantt to the three self-querying views and renamed selfQueryFilter. It is the same buildEffectiveFilter(...) value ListView's own fetch sends, cached by its serialised payload (AGENTS.md [WIP] Enhance every detail of the designer #10), and a refused filter (FilterOperatorError) keeps the last value instead of widening.
    • The tree node and the object-bound chart node now carry filter: selfQueryFilter (the tree after the baseProps spread, the chart in place of filter: schema.filter). The dataset-bound chart shape is unchanged; see the findings below.
    • The gantt node also carries the toolbar term as search and, with a term, the view's searchableFields. That is the same pair ListView's own fetch sends ($search, plus $searchFields when the view declares searchableFields). The term is held as a gantt-only primitive (ganttSearchTerm), so a keystroke does not rebuild other views' nodes.
  • packages/plugin-gantt/src/ObjectGantt.tsx: reload sends search as $search and, only alongside a term, searchableFields as $searchFields. Both reload dependency lists take the term (a string) and a serialised key for the field list, never an array identity (objectui#10036's parity pair).
  • packages/types: ObjectGanttSchema declares search?: string and searchableFields?: string[] on the interface and on the zod mirror. This is why the claim carries Clause-②: yes: two new optional keys on a published schema. A declared key is validated, and the renderer reads both.
  • Docs: the plugin-gantt.mdx Schema API block and the plugin README name the pair (AGENTS.md Add automated testing infrastructure and CI/CD workflows #2). These two files are outside the claim's file fence. They are the documentation of the declared keys.
  • Changesets: 10250-self-querying-views-toolbar-state.md (@object-ui/types minor, @object-ui/plugin-gantt minor, @object-ui/plugin-list patch). The pending 10037-gantt-toolbar-filter-reaches-chart.md said "Every other view draws the rows ListView fetched" and "The gantt chart is the one view that queries for itself". Both statements were false (tree and chart query for themselves), so that paragraph is corrected here. Its other claims still hold.

Mechanism assumptions (from the dispatch), measured

  • A1 holds. On the object-bound shape, the node's filter is the only filter input ObjectChart's aggregate reads. ListView writes no dataSource binding, compareTo or drillDown onto that node. The probe's aggregate filter after the fix is exactly the host's $filter (no double AND). @objectstack/spec's isFilterAST accepts that shape, and parseFilterAST lowers it to {"$and":[{"name":{"$ne":"zzz"}},{"status":"open"}]}. That is the path data-objectstack uses to lower an array filter for aggregate.
  • A2 holds. ObjectTree's object-provider branch reads schema.filter, so plugin-tree is untouched.
  • A3: the search goes through a node key, the same channel as the objectui#10037 filter. It needed two declarations in @object-ui/types, listed above. If the server refuses a term for an object, ListView's own fetch fails inside its load try and the load-error panel replaces the chart. The chart's query receives the same term, so the behaviour matches ListView's and no fallback was added.
  • A4: ListView's own fetch sends $search on tree and chart too, and neither view's query carries it. It is not a one-line forwarding: ObjectTree has no search channel (it would need a new key and a plugin-tree change), and the aggregate call has no search parameter at all. It is reported as a finding and not handled here.

Tests and measurements (final head 3bd041e6a)

  • New pin packages/plugin-list/src/__tests__/ListView.selfQueryingViewsToolbarState-10250.test.tsx. Its stand-ins follow each registered renderer's query contract: the tree keys on the identity of schema.filter and of the host data; the chart keys on the serialised filter; the gantt takes only schema. Tree and chart each get CONTROL, FORWARDS (toolbar Filter at mount), CHANGE (a UserFilters toggle chip clicked after mount) and STABILITY (unrelated re-renders cause no new view query). Gantt search gets CONTROL, FORWARDS (term typed into the toolbar box), SEARCHABLE FIELDS, CLEARED and STABILITY. 13 passed.
  • New pin packages/plugin-gantt/src/ObjectGantt.searchTerm-10250.test.tsx: CONTROL, TERM, FIELDS, INERT FIELDS (a field list with no term sends neither key), CHANGE, STABILITY (a new but equal node does not re-query) and INLINE (a value provider is narrowed by ValueDataSource). 7 passed.
  • New pin packages/types/src/__tests__/gantt-search-keys-10250.test.ts: both keys are declared, optional and without defaults, wrong-typed values are refused on their path, and a @ts-expect-error pair is compiled by tsconfig.test.json. 5 passed.
  • End-to-end probe with the REAL renderers after the fix (not committed; it imports packages plugin-list does not declare):
    • tree: own find $filter = the host's effective filter.
    • chart: aggregate filter = the host's effective filter.
    • gantt: own find carries $search: "needle", and with searchableFields: ['name'] also $searchFields: ["name"], identical to the host's.
    • A chip clicked after mount changes each view's query exactly once (tree 1 then 2, chart 1 then 2).
    • Two unrelated re-renders afterwards issue no further view query.
  • Reverse verification. Every mutation went through ablation-replace.mjs: the anchor hit once, the blob changed, and the restore was proven by blob equal to HEAD and an empty git diff HEAD. Tests resolve ../ListView and ./ObjectGantt from source, so no dist was involved.
    • Tree node back to schema.filter: 3 failed / 10 passed (tree FORWARDS, CHANGE, STABILITY).
    • Chart node back to schema.filter: 3 failed / 10 passed (chart FORWARDS, CHANGE, STABILITY).
    • Gantt search spread disabled: 4 failed / 9 passed (FORWARDS, SEARCHABLE FIELDS, CLEARED, STABILITY). CLEARED and STABILITY fail because their preconditions wait for the term.
    • Payload cache disabled: 1 failed / 12 passed. Only the tree STABILITY case fails; the chart keys on the serialised filter.
    • reload's $search spread disabled: 5 failed / 2 passed (TERM, FIELDS, CHANGE, INLINE, STABILITY).
    • Field-list key replaced by the array identity: 1 failed / 6 passed (STABILITY).
  • Type side: the dependency closure was rebuilt (pnpm --filter '@object-ui/plugin-list^...' --filter '@object-ui/plugin-gantt^...' build). A throwaway file assigning search: 5 to ObjectGanttSchema in plugin-gantt's test program failed with TS2322, which proves the rebuilt declaration was read. The file was deleted.
  • Gates:
    • pnpm exec vitest run packages/plugin-list/ packages/plugin-gantt/ on 838eff69e: 155 files / 1576 tests passed.
    • pnpm exec vitest run packages/types/ on 838eff69e: 215 files / 4928 tests passed.
    • The commits after 838eff69e change only the two new pins' header comments and one unused lint directive. On 3bd041e6a the union of the three new pins, the objectui#10037 pin, zod-mirror-parity and the objectui#10036 reload-identity pin passed: 6 files / 72 tests.
    • pnpm --filter @object-ui/types --filter @object-ui/plugin-list --filter @object-ui/plugin-gantt type-check: exit 0, and each new test file is in its package's tsconfig.test.json (--listFilesOnly).
    • lint for the same three packages: exit 0, 0 errors.
    • All exit 0 on 3bd041e6a: check:new-line-citations (0 new), changeset:check, check-changeset-presence.mjs, check:changeset-claims (report-only), check:control-bytes, check:vi-mock-specifiers / -inherit / -override-shape, check:test-path-roots, check:phantom-deps, check:unreferenced-sources, check:doc-types, check:doc-fences, check:doc-example-ids, check:spec-symbols, check-doc-links.mjs.
    • NOT MEASURED: check:doc-snippets and check:doc-examples (PRECONDITION NOT MET, exit 2) and check-readme-exports.mjs (population collapse). All three need a build of about 34 packages. Both doc edits are prose or a plaintext fence, which none of those gates compiles. Left to CI.

Findings outside this card (for the seat; not fixed here)

  • The toolbar Search does not reach the tree view's own query (the probe: host $search present, the tree's own find has none).
  • The toolbar Search does not reach an object-bound chart (the aggregate call has no search parameter).
  • A chart view bound to a semantic dataset: its node carries no filter at all, so neither the authored filter nor the toolbar Filter and chips reach queryDataset. The probe's call was ["task_ds",{"dimensions":["status"],"measures":["total_estimate"]}] with no runtimeFilter. This one is not a one-line forwarding: runtimeFilter is the spec's FilterCondition, and a dataset's field namespace need not be the list object's.

Acceptance notes

  • The real ObjectTree also keys its record effect on the host data identity. When a host fetch returns a fresh rows array, one toolbar change therefore gives the tree two queries with the same new filter: one when the node filter changes, one when the host rows land. Measured with the probe: after one chip click the tree queries went from 1 to 3 with fresh arrays, and from 1 to 2 with a stable array. The same dependency means a host refetch on main also re-queried the tree, with the authored filter. That is read from the effect's dependency list and was not measured on main. The duplicate comes from that pre-existing dependency in plugin-tree and is not changed here.
  • searchableFields is forwarded only alongside a term, matching ListView's own fetch and ObjectGrid. On a standalone gantt it acts only when search is authored.
  • react-hooks/refs lint warnings in ListView.tsx go from 7 on main to 9 (ESLint --format json, same config, both files linted in one run). The five in the cache block are the objectui#10037 ones on the renamed ref. The rule also fires once per read site of the cached value: gantt before, now tree and chart too. They are warnings, and the file has 0 errors.

Generated by Claude Code

…and chart queries; toolbar Search reaches the gantt query

Tree and object-bound chart list views run their own query from the node's
`filter`, which carried only the authored filter; the gantt node carried no
search term. Each toolbar control changed ListView's own fetch and nothing
drawn.

- ListView: the effective filter (`buildEffectiveFilter`, payload-cached,
  refusal keeps the last value) now goes onto the tree and chart nodes as it
  already did for gantt; the gantt node also carries the toolbar Search term
  and the view's `searchableFields`.
- ObjectGantt.reload sends `search` as `$search` and, with a term,
  `searchableFields` as `$searchFields`.
- ObjectGanttSchema declares both keys on the interface and the zod mirror.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BP8CMtACxTdLjqR6rhd33C
@github-actions github-actions Bot added documentation Improvements or additions to documentation package: types plugin tests labels Sep 24, 2026
@github-actions

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 37 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/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/6470-gantt-dependency-field-deprecated.md

  • names packages/plugin-gantt/README.md → packages/plugin-gantt/README.md — edited by this change

    packages/plugin-gantt/README.md's ObjectGanttSchema example authored the singular; it was the only in-repo site that did, and it now authors the plural with the alias named as legacy. No runtime code, fixture, example app or catalog schema authored it.

.changeset/6475-gantt-block-face-declared.md

  • names plugin-gantt/src/ObjectGantt.tsx → packages/plugin-gantt/src/ObjectGantt.tsx — edited by this change

    The gantt nested-block spelling of a gantt config ({ type: 'object-gantt', gantt: { … } }) had no mirror entry at all: it rode through BaseSchema's .passthrough() entirely unvalidated, and the published TypeScript never taught the shape either — an author writing gantt: { … } got no completion, no type checking, no error on a misspelt member. It was the 28th and last of the keys getGanttConfig (plugin-gantt/src/ObjectGantt.tsx) reads off the schema that objectui#6051 (PR feat(types,plugin-gantt): declare the flattened GanttConfig face ObjectGantt reads (#6051) #6472) did not declare — severed into its own card because, unlike the other 27, declaring it changes what a published tool refuses.

  • names content/docs/plugins/plugin-gantt.mdx → content/docs/plugins/plugin-gantt.mdx — edited by this change

    Maintainer ruling, objectui#6475 (2026-08-27), Option A — enforce as-is, immediately, no warning window (the startup-stage no-gradualism rule, objectstack#12668: transitions do not get phased windows without named external-user evidence, and none exists here). A census of every gantt block reachable through ObjectGanttSchema in this repository — the examples/schema-catalog fixtures, content/docs/plugins/plugin-gantt.mdx, and the published skills/objectui/guides/page-builder.md guide — found zero blocks missing the trio.

.changeset/6939-objectql-record-source-refinement.md

  • names plugin-gantt/src/ObjectGantt.tsx → packages/plugin-gantt/src/ObjectGantt.tsx — edited by this change

    Both renderers resolve their records from one of three keys, in this order — getDataConfig in plugin-map/src/ObjectMap.tsx and plugin-gantt/src/ObjectGantt.tsx: data, then staticData, then objectName. Both mirrors required objectName alone, so a document authored on staticData drew correctly and was refused by safeValidateSchema — six catalog entries, three per component.

.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/7070-no-invented-gantt-date-fields.md

  • names plugin-list/src/ListView.tsx → packages/plugin-list/src/ListView.tsx — edited by this change

    • app-shell/src/views/ObjectView.tsx — the console object page. The inline branch becomes ganttViewOptions, the sibling of calendarViewOptions and timelineViewOptions: the declared block spread whole, title floored at 'name', no date field invented. - plugin-list/src/ListView.tsx — the render branch AND the capability gate. - plugin-view/src/ObjectView.tsx — generateViewSchema, the authored object-view element route, which bypasses ListView entirely.

.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/7499-gantt-non-axis-floors-omitted.md

  • names plugin-list/src/ListView.tsx → packages/plugin-list/src/ListView.tsx — edited by this change

    • plugin-list/src/ListView.tsx — the object-gantt render branch. - plugin-view/src/ObjectView.tsx — generateViewSchema, the authored object-view element route, which bypasses ListView entirely.

.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 (objectui#6939, 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/7773-kanban-adapter-groupfield-write.md

  • names ListView.tsx → packages/plugin-list/src/ListView.tsx — edited by this change

    Who is NOT affected — the boundary is node-local. Every VIEW-LEVEL groupField read is untouched and still live: it is a legacy alias of the spec's groupByField on the kanban view config, mapped by normalize-list-view.ts, and both adapters still resolve lanes through it (ObjectView.tsx's kanbanCfg.groupField ||, ListView.tsx's groupByField || groupField). Authoring options.kanban.groupField on a list-view or object-view keeps working exactly as documented in packages/plugin-list/README.md. groupField is dead only on the generated object-kanban NODE.

.changeset/7780-object-kanban-record-source.md

.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 (objectui#7804, 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/8478-describe-line-addresses.md

.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.

.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.

  • names packages/plugin-list/src/ListView.tsx → packages/plugin-list/src/ListView.tsx — edited by this change

    • packages/plugin-list/src/ListView.tsx generates the node as groupBy: laneField. objectDef loads asynchronously, so laneField is undefined on every load until it lands, and stays undefined whenever the object offers no stageField hint and none of status / stage / state / phase. The renderer serves that node; both published faces refused it. - content/docs/utilities/data-objectstack.mdx documents an object-kanban node that is exactly { type, dataSource }, with no groupBy. ⚠️ This one is weaker and is cited for what it is: that fragment is still refused after this change, at RECORD_SOURCE_REQUIRED, because dataSource is not a rung of the record-source ladder. It shows a lane-less board is a documented authoring; it is not a document this change admits.

.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/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/list-user-actions-collision-5398.md

  • names ListView.tsx → packages/plugin-list/src/ListView.tsx — edited by this change

    The harvest now reads the object block only. Both userActions read sites in ListView.tsx carry a comment naming the collision, and __tests__/ListView.userActionsCollision.test.tsx pins each clause of it: the two shapes, a producer that manufactures the view one, the harvest's blindness to it, and the projection that must keep the object's operand with a toolbar block — or an empty block — present on the view.

.changeset/listview-comment-pair-4559.md

  • names ListView.tsx → packages/plugin-list/src/ListView.tsx — edited by this change

    Two comment corrections in ListView.tsx (objectui#4559, objectui#4966). No runtime behaviour changes and the emitted bundle is byte-identical; the published .d.ts does change, which is why this is a patch rather than an empty frontmatter.

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 7a564e004 (merge-base with origin/main): 10 file(s) changed outside .changeset/, read against 1300 pending declaration(s) that publish a body (1869 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3039.2 KB 3104.5 KB
Main entry chunk (gzip) 147.8 KB 350 KB
Entry file index-D5lsDQki.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.68KB 6.20KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
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) 26.08KB 7.56KB
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) 541.66KB 129.51KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 222.47KB 61.83KB
fields (index.js) 253.41KB 64.01KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 33.36KB 10.88KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.15KB 11.05KB
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.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
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) 14.81KB 3.63KB
plugin-calendar (index.js) 51.44KB 14.62KB
plugin-charts (index.js) 71.82KB 20.13KB
plugin-chatbot (index.js) 198.27KB 47.18KB
plugin-dashboard (index.js) 133.00KB 35.19KB
plugin-designer (index.js) 216.12KB 44.37KB
plugin-detail (index.js) 258.85KB 67.53KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 144.77KB 37.17KB
plugin-gantt (index.js) 168.31KB 41.45KB
plugin-grid (index.js) 215.46KB 58.88KB
plugin-kanban (index.js) 48.83KB 15.21KB
plugin-list (index.js) 114.13KB 28.14KB
plugin-map (index.js) 21.74KB 7.07KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.68KB 8.95KB
plugin-tree (index.js) 10.56KB 3.71KB
plugin-view (index.js) 85.18KB 21.05KB
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.66KB 3.50KB
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) 110.46KB 36.33KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.78KB 2.56KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.20KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
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.25KB
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) 0.20KB 0.18KB
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) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
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: 3bd041e6aaccfd05bebaf6c0845000baf3d0c3de

Rendered by an isolated review subagent spawned by the domain:ui#4 seat; its served tier was checked against its transcript stamps (all at the review tier). Adopted by this seat.

① Derived judgments

  • Base and inputs. Head 3bd041e6aaccfd05bebaf6c0845000baf3d0c3de (3 commits) merges onto main at 8b1f06619; 1dbb9933c (PR fix(plugin-designer): NAV_TYPE_META has an entry for the spec's doc navigation item type (#10287) #10315) is not an ancestor, as the dispatch anticipated. 12 files, +717/−41. Read via git fetch origin pull/10323/head in the local checkout plus REST; the pre-change state was read from origin/main. No gate family was re-run locally and no node probe was needed.
  • Tree: forwarded value equals the host's. object-tree node now carries filter: selfQueryFilter after the ...baseProps spread; selfQueryFilter is buildEffectiveFilter(schema.filter, currentFilters, userFilterConditions), the identical call ListView's own fetch makes for finalFilter and sends as $filter (omitted when undefined; the node then carries undefined, exactly what ObjectTree sent for the authored filter before). ObjectTree's object-provider branch sends $filter: schema.filter before its host-data fallback (plugin-tree untouched, A2 holds). The trailing ...treeCfg spread cannot shadow it: the spec TreeConfigSchema is a strictObject of parentField, labelField, fields, defaultExpandedDepth and declares no filter.
  • Tree: payload cache is real and load-bearing. The ref keyed on JSON.stringify(value ?? null) hands back the previous object for an equal payload; ObjectTree's record effect lists schema.filter by identity, so without the cache every ListView re-render would re-query. The tree STABILITY case asserts +0 across two unrelated re-renders with a stand-in keyed on identity; the report's ablation (cache disabled ⇒ tree STABILITY alone red, chart green because ObjectChart keys on the serialised filter) is consistent with the code as read.
  • Refusal keeps the last value. FilterOperatorError ⇒ selfQueryFilterRef.current?.value, else the authored schema.filter; never undefined; any other error is rethrown. Not widened. ListView's own fetch throws the same refusal inside its load try and raises the load-error panel.
  • Chart: only the object-bound shape changed. The diff replaces filter: schema.filter with filter: selfQueryFilter solely in the legacy inline-aggregate branch; the dataset branch still builds a node with no filter. In ObjectChart, resolvedFilter = resolveFilterPlaceholders(schema.filter, filterScope) feeds runAggregate ⇒ ds.aggregate(objectName, { filter, ... }); compareTo and drillDown are read off the node, which ListView never writes, so the aggregate filter is exactly the host's $filter (A1 holds). ObjectChartSchema declares filter. The dataset path does read schema.filter as runtimeFilter, but the list node carries none — the dev's separate finding is accurate and correctly left out (dataset field namespace).
  • Gantt: the search pair equals the host's. Node: search: ganttSearchTerm plus searchableFields: schema.searchableFields only when a term exists and the view's list is non-empty — the same conditional spread as the host's $search / $searchFields. ObjectGantt.reload sends $search and, only alongside a term, $searchFields; both dependency lists (the callback's and the mount effect's, objectui#10036's parity pair) take searchTerm (string) and searchFieldsKey (serialised), never the array identity. ganttSearchTerm is '' off the gantt view, so a keystroke rebuilds no other view's node.
  • searchableFields forwarding is required, not scope creep. The dispatch named the term, but ListView's own fetch sends $searchFields whenever the view declares searchableFields and a term exists; a gantt query carrying $search without it would match the server-resolved default field set while the host narrows — two different row sets for one toolbar. It is the minimum second key for "the same value the host sends", and it is read by the renderer.
  • Declared-key discipline. objectql.ts: search?: string, searchableFields?: string[]; zod: z.string().optional(), z.array(z.string()).optional(); no .default(). zod-mirror-parity.test.ts registers objectql.zod.ts#ObjectGanttSchema against Ts_ObjectGanttSchema (derived key census, judged by tsc -p tsconfig.test.json); zod-mirror-authors-no-defaults-7735 unaffected; gantt-declared-keys.test.ts hand-lists only the ObjectGantt reads 11 top-level schema keys that ObjectGanttSchema does not declare — all via as any, so nothing connects read to declaration #5903 ten; check-component-surface-parity (TS = spec ∪ renderer-read, inputs ⊆ TS) is satisfied since the renderer reads both and TS declares both. Type Check, Doc Component Type Check, README Export Check, Doc Snippet Type Check are green on the head, so the three gates the dev reported NOT MEASURED locally are measured in CI. No packages/types schema-reference docs census covers gantt keys (the 7923 census is list-view keys); the docs surface is plugin-gantt.mdx and the README, both updated. TSDoc link target ObjectGridSchema.searchableFields exists.
  • Author-writable, declared ⇒ enforced. An author may write search on a standalone gantt node: it is validated as a string, read by reload, sent as $search, and documented as authoring surface. Acceptable. One nuance the docs do not state: on provider: 'value', ValueDataSource honours $search (all string fields) but ignores $searchFields, so searchableFields does not narrow an inline gantt. The mdx sentence attributes narrowing to "the server", which is true; the README's "writes both onto its gantt node" means both when the view declares a list. Pre-existing adapter behaviour, outside this card; not a false sentence.
  • Changeset 10250-self-querying-views-toolbar-state.md: every sentence true against the head — the three views query for themselves; tree and chart nodes carried only the authored filter and the gantt node no term; both nodes now carry the effective filter as gantt has since finding(plugin-list): on a gantt view the toolbar offers Filter and UserFilters chips, but neither reaches the chart — the authored schema.filter is all that is written onto the node #10037; identity kept for an equal payload; two optional keys declared; $search and $searchFields sent as described; the "Unchanged" paragraph (dataset chart; Search on tree and chart) is accurate.
  • 10037 paragraph: the two removed sentences were already false on origin/main. At 8b1f06619, ObjectTree ran its own find with $filter: schema.filter before the host-data branch and ObjectChart aggregated with schema.filter, so "Every other view draws the rows ListView fetched" and "The gantt chart is the one view that queries for itself" were false when written. The rewritten paragraph is true; the untouched sentences (identity kept, A gantt lens fetches its rows twice — once paged (which feeds the footer) and once unbounded (which feeds the chart), so the footer misdescribes the chart and the real fetch has no ceiling #7210 ceiling untouched) still hold. The changeset is still pending on main and appears in no CHANGELOG.md, so this edits an unpublished record; Changeset Overwrite Report (report-only) is green.
  • Docs/README text true (with the inline-provider nuance above). ADR-0061 (objectstack docs/adr/0061-record-search-architecture.md: server-resolved $search, $searchFields narrowing) exists and says what the comments attribute to it; objectui already cites it in data-objectstack and fields.
  • Pins real and able to fail. Three new files, 25 cases. The plugin-gantt pin drives the real ObjectGantt (7 cases incl. INERT FIELDS and INLINE). The plugin-list pin (13) uses stand-ins that reproduce each renderer's dependency contract and cross-checks the host's $filter list toContainEqual the view's filter, so FORWARDS asserts equality with the host, not mere presence; CONTROL cases guard the harness. The six ablation legs in the report are consistent with the code as read (e.g. only the tree STABILITY case can depend on the ref cache; removing reload's $search spread leaves exactly CONTROL and INERT FIELDS green). Not re-run here. Weakness noted: tree/chart stand-ins are models; the dev supplemented with an uncommitted real-renderer probe.

② Semver level

Inconsistent — the sole blocker. Frontmatter: '@object-ui/plugin-list': patch, '@object-ui/plugin-gantt': patch, '@object-ui/types': patch. The claim (comment 5818240284) and the PR body declare Clause-②: yes for exactly these two new optional keys on the published ObjectGanttSchema. The dispatch protocol that line belongs to (objectstack AGENTS.md, "Add a changeset for anything that publishes") states: "yes takes at least minor". In-repo precedent on this very schema agrees: .changeset/5903-objectgantt-declared-keys.md and .changeset/6051-gantt-flat-config-declared-keys.md both declare '@object-ui/types': minor and '@object-ui/plugin-gantt': minor; the types CHANGELOG.md files "declar…" paragraphs 151 under Minor versus 57 under Patch. objectui AGENTS.md's version rule only forbids major (its own breaking changes ship as minor); the green Changeset Bump Policy job runs check-changeset-no-major.mjs alone and does not judge patch versus minor, so a green gate is no evidence here. The fixed group makes the release arithmetic identical either way, but the declaration is the published record and contradicts the PR's own Clause-② line. Remedy: '@object-ui/types': minor (required), '@object-ui/plugin-gantt': minor (by precedent — the renderer gains an authorable capability); plugin-list stays patch. The Clause-②: yes line carries no (widening) arm; the protocol allows at most one, so it is well-formed, though (widening) would be the precise spelling.

③ Boundary flags

Implemented-by: claude/issue-10250-self-querying-views-toolbar-state
Reviewed-by: session_01BP8CMtACxTdLjqR6rhd33C

VERDICT: FAIL


Generated by Claude Code

…lugin-gantt (objectui#10250)

The change adds two optional authorable keys (`search`, `searchableFields`)
to the published `ObjectGanttSchema` and its zod mirror, which the renderer
now reads. That is a widening of a published schema, declared `minor` as the
earlier declarations on this schema were. `@object-ui/plugin-list` stays
`patch`.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BP8CMtACxTdLjqR6rhd33C
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3039.5 KB 3104.5 KB
Main entry chunk (gzip) 147.8 KB 350 KB
Entry file index-BkhmN9xb.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.68KB 6.20KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
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) 26.08KB 7.56KB
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) 541.66KB 129.51KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 222.47KB 61.83KB
fields (index.js) 253.41KB 64.01KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 33.36KB 10.88KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.15KB 11.05KB
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.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
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) 14.81KB 3.63KB
plugin-calendar (index.js) 51.44KB 14.62KB
plugin-charts (index.js) 71.82KB 20.13KB
plugin-chatbot (index.js) 198.27KB 47.18KB
plugin-dashboard (index.js) 133.00KB 35.19KB
plugin-designer (index.js) 216.12KB 44.37KB
plugin-detail (index.js) 260.44KB 67.80KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 144.77KB 37.17KB
plugin-gantt (index.js) 168.31KB 41.45KB
plugin-grid (index.js) 215.46KB 58.88KB
plugin-kanban (index.js) 49.30KB 15.39KB
plugin-list (index.js) 114.13KB 28.14KB
plugin-map (index.js) 21.74KB 7.07KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.68KB 8.95KB
plugin-tree (index.js) 10.56KB 3.71KB
plugin-view (index.js) 85.18KB 21.05KB
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.66KB 3.50KB
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) 110.46KB 36.33KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.78KB 2.56KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.20KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
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.25KB
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) 0.20KB 0.18KB
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) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
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: 30911751dbad3e0cafb8c9e2acdb1ff237022b35

Rendered by an isolated review subagent spawned by the domain:ui#4 seat; its served tier was checked against its transcript stamps (all at the review tier). Adopted by this seat. Supersedes the FAIL record 5819599081 (head 3bd041e6a) for the current head.

① Derived judgments

  • Inputs. Head 30911751dbad3e0cafb8c9e2acdb1ff237022b35, 5 commits: the three reviewed before, then 7bcb29bde (frontmatter) and the merge 30911751d (parents 7bcb29bde, 879ecac78). Merge-base with origin/main is 879ecac789ffe75f0a669e2b99eb7c0e4f6797a2; 1dbb9933c (PR fix(plugin-designer): NAV_TYPE_META has an entry for the spec's doc navigation item type (#10287) #10315) is an ancestor of it and of the head. Read via git fetch origin / git fetch origin pull/10323/head against the local object store plus REST GETs; no gate family re-run, no tool started in the checkout.
  • (a) Delta is exactly the two frontmatter lines plus a clean merge. git diff 8b1f06619..3bd041e6a and git diff 879ecac78..30911751d, each with index lines dropped and @@ hunk headers normalised, are 935 lines apiece and differ in exactly two lines: +'@object-ui/plugin-gantt': patch → minor and +'@object-ui/types': patch → minor. Same 12 files, +717/−41 on both. 7bcb29bde touches one file, 2 insertions / 2 deletions, those two lines. The merge is recomputable: git merge-tree --write-tree 7bcb29bde 879ecac78 yields tree 6ab4b5c03d2769bb8fa66365870e2e522aeb41aa, byte-identical to the merge commit's tree, so no hand resolution entered it; no conflict markers in any touched source. Blob identity between 3bd041e6a and the head: every PR file is the same blob except .changeset/10250-self-querying-views-toolbar-state.md (the frontmatter) and packages/types/src/objectql.ts (main's own change, next bullet). The three new pins, the 10037 changeset, ListView.tsx, ObjectGantt.tsx, the zod mirror, the mdx and the README are unchanged blobs.
  • (b) main's move on objectql.ts does not touch the gantt pair. Between the bases main changed one PR-touched file, packages/types/src/objectql.ts, in one commit, aa083cd69 (PR feat(types)!: retire sixteen NamedListView members as ?: never tombstones (objectui#7924) #10285, objectui#7924): sixteen NamedListView members become ?: never tombstones plus docblock edits, all inside NamedListView (around lines 2214–2510), a different interface from ObjectGanttSchema (line 2928 onward). packages/types/src/zod/objectql.zod.ts was not changed by main. At the head ObjectGanttSchema declares search?: string and searchableFields?: string[] (TSDoc citing objectui#10250, ADR-0061 and ObjectGridSchema.searchableFields), and the mirror declares search: z.string().optional() and searchableFields: z.array(z.string()).optional(), no .default(), inside the BaseSchema.extend({…}).superRefine(requireRecordSource('object-gantt')) — same requiredness on both faces. No census interacts: object-view-unmirrored-keys-7779.test.ts (extended by main) partitions NamedListView, not the gantt arm; main's diff of zod-mirror-parity.test.ts and p1-spec-alignment.test.ts mentions neither gantt nor search; zod-mirror-parity.test.ts still registers objectql.zod.ts#ObjectGanttSchema in both maps (derived key census, no hand-written key list); gantt-declared-keys.test.ts still hand-lists only the ObjectGantt reads 11 top-level schema keys that ObjectGanttSchema does not declare — all via as any, so nothing connects read to declaration #5903 ten.
  • (c) Sibling pending changesets — 37 read in full at the head (bot comment 5819341974), every one still present under .changeset/ and in no CHANGELOG.md. Judged on sentences that state CURRENT behaviour or a COUNT on the touched files; each is TRUE against this PR:
    • 5903-objectgantt-declared-keys — TRUE. "declares the ten gantt keys ObjectGantt actually reads" names the ten and is the 2026-08-24 triage (already followed by getGanttConfig reads 24 more top-level keys ObjectGanttSchema does not declare — same defect as #5903, hidden by the index signature instead of a cast #6051's flat face and ObjectGanttSchema still does not declare the gantt block face — declaring it enforces the spec's required trio and changes the CLI's refusal behaviour (severed from #6051) #6475's block); all ten remain declared and read. "registers objectql.zod.ts#ObjectGanttSchema in both its mirror map and its declaration map" holds at the head; the new pair is declared on both faces at equal requiredness, so the "required no MirroredUndeclared entry" reading is unchanged. ObjectGanttProps.schema still typed ObjectGanttSchema; gantt-declared-keys.test.ts still present.
    • 6470-gantt-dependency-field-deprecated — TRUE. getGanttConfig still reads dependenciesField || dependencyField; the README example still authors dependenciesField (the PR adds a paragraph, not an example key).
    • 6475-gantt-block-face-declared — TRUE for this PR. "28th and last of the keys getGanttConfig reads" is historical and about getGanttConfig, which reads neither new key (the reads sit in the component body at ObjectGantt.tsx 776–778). The mdx census sentence is historical; the PR adds no gantt block to the mdx. Noted, not attributable: its code snippet gantt: SpecGanttConfigSchema.extend(GanttConfigExtensionFields).optional() was already stale on main since objectui#7845 retired the field map.
    • 6939-objectql-record-source-refinement — TRUE. getDataConfig order data → staticData → objectName untouched; data still declared.
    • 6940-rowactions-boolean-mirror — TRUE. ObjectGridSchema.rowActions in the mirror untouched (0 rowActions lines in the PR's zod diff).
    • 7070-no-invented-gantt-date-fields — TRUE. The gantt render branch still forwards the declared block whole; the PR adds node keys, not date floors.
    • 7113-chart-data-model — TRUE. objectql.zod.ts still ships refined mirrors.
    • 7200-object-form-section-style-keys-undeclared — TRUE. ObjectFormSchema mirror still declares no sections.
    • 7265-types-user-filter-field-derives — TRUE (historical).
    • 7322-object-kanban-group-by-limit — TRUE. ListView still reads the view-level groupField alias (groupByField || groupField, line 3028).
    • 7352-drill-down-config-mirror — TRUE. ObjectDataTableSchema.drillDown untouched.
    • 7363-objectql-union-arms — TRUE. Union arms untouched.
    • 7499-gantt-non-axis-floors-omitted — TRUE. The gantt branch still passes no progress / dependencies floor; unchanged lines.
    • 7632-shared-record-source-config — TRUE. Both faces still ship the getDataConfig-order .describe() strings; ObjectGantt still calls the shared reader.
    • 7773-kanban-adapter-groupfield-write — TRUE. ListView.tsx writes no groupField: (0 hits) and still reads groupByField || groupField.
    • 7780-object-kanban-record-source — TRUE. Kanban node generation untouched.
    • 7804-objectql-handler-key-arms — TRUE. Nine handler keys untouched.
    • 7804-tree-view-handler-slot — TRUE (historical).
    • 7917-export-breadcrumb-object-tree-zod-schemas — TRUE for this PR. "107 node component types" counts types; the PR adds keys, not a type.
    • 7963-alert-dialog-footer-keys-retired — TRUE. objectql.ts's confirmLabel untouched.
    • 8478-describe-line-addresses — TRUE. The two new .describe() strings carry no NAME.ext:NNN address; Line Citation Gate green.
    • 8735-objectql-mirror-docblocks-not-defaulted — TRUE. The four docblocks untouched.
    • 8767-object-grid-refuses-string-sort — TRUE. SortConfig.order still required on both faces.
    • 8801-object-kanban-allow-collapse-retired — TRUE. The PR adds no occurrence of allowCollapse, so the enumerated census holds.
    • 8885-object-chart-drilldown-title-compareto — TRUE (historical); filter still ledgered to objectui#7946, still read.
    • 8913-object-kanban-columns-declared — TRUE. Kanban columns untouched.
    • 8990-object-kanban-groupby-optional — TRUE. ListView.tsx still generates groupBy: laneField (line 3050).
    • 8992-user-actions-collapse-and-docblock — TRUE. UserActionsSchema untouched.
    • 9092-inline-locale-declared-face — TRUE (historical).
    • 9309-object-gallery-filter-destination-typed — TRUE. Gallery filter untouched.
    • 9511-record-id-is-a-string — TRUE. ObjectFormSchema.recordId untouched.
    • 9549-tree-filter-declared — TRUE. "ListView puts filter on the baseProps every child view receives" still holds (baseProps.filter: schema.filter, line 2924, unchanged); the tree node then overrides it with the effective filter after the spread, which the sentence does not contradict. "ObjectTree sends $filter: schema.filter" — plugin-tree untouched.
    • 9550-object-tree-root-barrel — TRUE. Root barrel and ObjectTreeSchema untouched.
    • 9606-object-kanban-card-title — TRUE. cardTitle untouched.
    • 9628-kanban-column-collapsed-honoured — TRUE. Lane collapsed untouched.
    • list-user-actions-collision-5398 — TRUE. "Both userActions read sites in ListView.tsx carry a comment naming the collision": the PR's ListView.tsx diff has no userActions line; userActions occurrences are 26 on both base and head.
    • listview-comment-pair-4559 — TRUE (historical); the PR adds no copy of the retired formula-field sort advice.
    • Result: 37 judged, 37 TRUE, 0 FALSE. Nothing this PR does turns a pending body false.
  • (d) Previously-true judgments survive the merge. Read at the head: object-tree node carries filter: selfQueryFilter after ...baseProps; the object-bound chart branch carries filter: selfQueryFilter, the dataset branch still builds no filter; the gantt node spreads search and (with a term and a non-empty list) searchableFields; selfQueryFilterRef cache keyed on JSON.stringify(value ?? null), FilterOperatorError keeps the last value; ganttSearchTerm is '' off the gantt view; ObjectGantt.reload spreads $search and, only alongside a term, $searchFields; both dependency lists carry searchTerm and searchFieldsKey; getGanttConfig reads no search key. The 10037 changeset, the two docs edits and the three pins (297 / 165 / 79 lines) are the same blobs as at 3bd041e6a, so the ablation and gate measurements the PR body reports at 3bd041e6a carry over to code that is byte-identical except for main's NamedListView edit.

② Semver level

Correct. Frontmatter at the head: '@object-ui/plugin-list': patch, '@object-ui/plugin-gantt': minor, '@object-ui/types': minor — exactly the rework's remedy. types: minor is required by the protocol the PR's own Clause-②: yes line belongs to (objectstack AGENTS.md: "yes takes at least minor") for two new optional authorable keys on the published ObjectGanttSchema and its mirror. plugin-gantt: minor follows the in-repo precedent on this same schema (.changeset/5903-objectgantt-declared-keys.md and .changeset/6051-gantt-flat-config-declared-keys.md, both types: minor + plugin-gantt: minor): the renderer gains an authorable capability it reads and documents. plugin-list: patch is right: ListView gains no authorable key; it forwards values it already computed. No major anywhere (Changeset Bump Policy and Changeset Fixed Group Check both success). The commit message of 7bcb29bde states the same reasoning. The fixed group makes the release arithmetic identical either way; what changed is that the published declaration now agrees with the PR's own Clause-② line.

③ Boundary flags

  • Commit messages. 7bcb29bde: conventional subject, body explaining the level, trailers Co-Authored-By: Claude (product name only) and Claude-Session: URL — no model identifier or version name. 30911751d: a plain hand-written merge subject, Merge origin/main (879ecac78) into claude/issue-10250-self-querying-views-toolbar-state (not git's verbatim default wording, but equivalent), no body, no trailers, SSH-signed — no model identifier.
  • Closing keyword. PR body still opens Fixes #10250 and Clause-②: yes; it is the only closing keyword in the body (regex over fix|close|resolve + #N); the two new commits carry none.
  • PR body, non-blocking. One line is now stale: "Changesets: 10250-self-querying-views-toolbar-state.md (patch for the three packages)". The changeset is patch / minor / minor. The body is not a published record; a body edit fixing the parenthetical needs no commit. The "Tests and measurements (final head 3bd041e6a)" heading is dated but accurate — the measured files are unchanged blobs at this head.
  • Check-runs on 30911751dbad3e0cafb8c9e2acdb1ff237022b35, polled every ~60 s from 18:20:34Z (16 in_progress) to 18:31:33Z: 43 total — 40 success, 3 skipped (dependabot, Test (coverage), Test (coverage shard ${{ matrix.shard }}/4)), 0 failure, 0 in_progress. Spec Main Shape Gate completed success at 18:30:20Z on the post-fix(plugin-designer): NAV_TYPE_META has an entry for the spec's doc navigation item type (#10287) #10315 base, as the rework expected; its single annotation is a notice about the ubuntu-latest runner image migrating in October, not a gate finding. Changeset Claim Re-read, Changeset Declaration, Changeset Overwrite Report, Line Citation Gate, Type Check, Lint, README Export Check, Doc Snippet Type Check, Doc Component Type Check all success, so the three gates the PR body left NOT MEASURED locally are measured green in CI on this head.
  • File surface. Unchanged from the prior record: 12 files, the same fence and the same disclosed outside-fence edits; the two new commits add no file.

Implemented-by: claude/issue-10250-self-querying-views-toolbar-state
Reviewed-by: session_01BP8CMtACxTdLjqR6rhd33C

VERDICT: PASS


Generated by Claude Code

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

1 participant