Skip to content

refactor(plugins): one authority each for AggregationConfig, ConditionalFormattingRule and ViewType (objectui#6349, batch 7) - #12071

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-6349-batch7-plugins-types
Oct 9, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-6349-batch7-plugins-types

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Refs #6349 (batch 7)

Clause-②: yes

Batch 7 of the one-authority burn-down, on claim 6088763852 (seat domain:ui#3, session https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8). Three "plugin vs @object-ui/types" rows of KNOWN_COLLISIONS converge, so the ledger goes from 19 rows to 16. Each row was two meanings behind one name. In all three, @object-ui/types keeps the general name and the plugin side gives up the name. Types and comments only: no runtime behaviour changes, and no emitted JavaScript changes.

This PR has no closing keyword. The card stays open for later batches.

What each row was (measured on base e391f876)

The member lists below come from one TypeScript program over each package's BUILT root entry (exports["."].types), with dist rebuilt for the base tree.

AggregationConfig: two meanings, so the plugin side is renamed.

site members meaning built entry
packages/types/src/data-protocol.ts function (8 arms, incl. array_agg and string_agg), field?, alias?, distinct?, separator? a query-AST aggregation: DriverQueryConfig.aggregations, compiled by @object-ui/core's QueryASTBuilder exported at the types root and read through it by core's query-ast.ts
packages/plugin-grid/src/useGroupedData.ts field, type (AggregationType, 6 arms) one per-group aggregation drawn in a group header (ObjectGridSchema.aggregations) exported at the plugin-grid root; 0 readers through it in the repo, and 0 hits in @objectstack/spec 17.7.0

The two share only field, and even that differs (field? against field). A re-point would retype the grid's type key as function, which the grid's runtime reads, so it is not a types-only move. The grid's declaration is the narrower meaning. It becomes GroupAggregationConfig, and the plugin-grid root publishes that name in place of AggregationConfig. The members are unchanged.

ConditionalFormattingRule: the plugin side was an alias of a name that already exists. The kanban site was export type ConditionalFormattingRule = KanbanConditionalFormattingRule in KanbanImpl.tsx. @object-ui/types declares both ConditionalFormattingRule (the object-grid and list-view rule) and KanbanConditionalFormattingRule (the object-kanban rule). They differ by one member: the grid's rule carries the retired expression?: never tombstone, and the kanban rule does not. So the alias put the kanban meaning behind the grid's name. The kanban meaning already has its specific name, so the alias is deleted and the board spells KanbanConditionalFormattingRule. The alias had 0 importers. No package entry reaches KanbanImpl.d.ts: a program rooted at the plugin-kanban entry loads 7 of the package's own declaration files, and KanbanImpl.d.ts is not one of them. So the alias published nothing.

ViewType: two unions, so the plugin side's alias is deleted. @object-ui/types' ViewType has 11 members: the spec's list-view types plus the list and detail categories. plugin-list's ViewType was an alias of @object-ui/core's ListViewVisualization, which has 9 members: the same set without list and detail. The switcher's two total maps (icons and labels) are keyed on the 9-member union. A re-point to the 11-member union would make both maps incomplete, which is a compile error. Filling that gap would need icons and labels for list and detail, which is a runtime change. The narrower meaning already has its own name, so the alias is deleted. ViewSwitcher.tsx and ListView.tsx spell ListViewVisualization, and the plugin-list root no longer publishes a ViewType. It had 0 readers through that entry in the repo (control: the same scan of import clauses finds 23 other bindings from that root, ListView ×21 among them), and @objectstack/spec 17.7.0 has 0 hits.

Why no re-point anywhere. Batch 3's rule makes @object-ui/types the only legal authority. In each row the plugin side means something narrower than the types name, and both meanings are live. So the rule of batches 4 to 6 applies: rename the narrower side, and keep the general name on types. Where the narrower side was only an alias of a name that already exists, the alias goes, and no new name is coined.

Published surface, base vs head

This is one TypeScript program per tree over each package's built root entry. Dist was rebuilt for each tree, and every head marker was read in dist before measuring.

  • Exported name sets:

    • types 708 = 708; core 513 = 513; plugin-kanban 25 = 25; plugin-view 39 = 39;
    • plugin-grid 50 = 50: AggregationConfig out, GroupAggregationConfig in, with identical members;
    • plugin-list 20 to 19: ViewType out.
  • Unchanged shapes: types' AggregationConfig, ConditionalFormattingRule, KanbanConditionalFormattingRule and ViewType (11 members); core's ListViewVisualization (9 members); plugin-list's ViewSwitcherProps, whose members are still typed on ListViewVisualization.

  • An external consumer, probed as a virtual file that resolves the packages through node_modules:

    • the base spelling import type { AggregationConfig } from '@object-ui/plugin-grid' fails loudly at head with TS2724, which names the replacement: "Did you mean 'GroupAggregationConfig'?";
    • import type { ViewType } from '@object-ui/plugin-list' fails with TS2305;
    • the migration targets compile at head (GroupAggregationConfig; ListViewVisualization from @object-ui/core; ViewSwitcherProps['currentView']): 0 diagnostics;
    • the control leg is the four general names imported from @object-ui/types. It reads 0 diagnostics on base and on head;
    • on base, the old spellings read 0 diagnostics, and the new grid name reads TS2724, so the probe is lit.
  • Emitted output: base and head dist differ only in declaration files and their maps:

    • plugin-grid: index, useGroupedData, useServerGrouping;
    • plugin-kanban: KanbanImpl;
    • plugin-list: index, ListView, ViewSwitcher.

    No .js file differs in any of the six packages, and types, core and plugin-view dist are byte-identical. So no first-load bytes move.

Changesets

file grade why
6349-batch7-plugin-grid.md minor A published name leaves the root (AggregationConfig) and its replacement arrives (GroupAggregationConfig). Breaking-change note with the migration.
6349-batch7-plugin-list.md minor A published name leaves the root (ViewType). Breaking-change note naming ListViewVisualization from @object-ui/core.
6349-batch7-plugin-kanban.md patch A module-local alias no entry reached. Nothing published moves.

@object-ui/types is not touched, so it gets no changeset. The grades follow the claim's per-package criterion. ⛔ No major.

Docs

packages/plugin-grid/README.md lists the package's type exports, and it now names GroupAggregationConfig. check:readme-exports proves the edit was needed: when the base README is fed against head dist (--readme override), it flags AggregationConfig at that line as wrong-path, owned by @object-ui/types. No README or docs page names plugin-list's ViewType or the kanban alias.

Gates

All gates were read at head ceb7b297f. Heavy runs went through os-verify-lock.

  • The gate, pnpm exec vitest run scripts/__tests__/one-authority-per-exported-name-6273.test.ts: exit 0, Tests 11 passed (11). The ledger has 16 rows.
  • pnpm exec vitest run --maxWorkers=2 over packages/plugin-kanban/, packages/plugin-list/ and 31 test files elsewhere that read a touched file's text or path (types, core, app-shell, the console, i18n, react, sdui-parser, calendar, gantt, map, view and scripts): exit 0, Test Files 223 passed (223), Tests 3076 passed (3076).
  • pnpm exec vitest run --maxWorkers=2 packages/plugin-grid/: exit 0, Test Files 197 passed (197), Tests 1851 passed (1851).
  • pnpm --filter @object-ui/PKG type-check for plugin-grid, plugin-kanban, plugin-list, plugin-view, core and types, with dist rebuilt and the script names echoed: one chained run, exit 0, 0 error TS lines.
  • pnpm type-check:scripts: exit 0.
  • check:doc-snippets: 785 of 785 blocks judged, 0 failed. It ran after its own scoped build.
  • check:readme-exports: OK, with 582 of 582 self-imports real.
  • Other gates, each exit 0:
    • check:control-bytes, check:test-path-roots, check:changeset-claims and check:pending-changeset-literals;
    • check:icon-record-names (it anchors on the plugin-list switcher's VIEW_ICONS), check:spec-symbols and check:handler-key-reads;
    • check:new-line-citations, which reports 0 new;
    • check-changeset-no-major;
    • check-changeset-presence, which reads 7 source files of 3 released packages and 3 changesets.
  • pnpm exec eslint on the 8 touched TS files: 0 errors. Two warnings fall on changed lines in ListView.tsx, and both are the same rule on the same construct at base (no-explicit-any on a filter callback, set-state-in-effect). Those lines changed only their type name. The file has 187 warnings at base and 187 at head.
  • The governed-queue guard reads NOT GOVERNED over 12 paths.
  • git merge-tree against main e391f876 is clean.

Not run locally:

  • The full app-shell suite. CI runs it. app-shell names none of these three types, and it reads the touched packages only through dist whose JS is byte-identical.
  • The type-checks of app-shell, the console and the other dependants of these plugins. No file outside the three plugins names a removed or renamed export (a repo-wide grep), and every other published shape is unchanged.
  • The i18n gates. No locale pack changed.

Reverse verification

Every leg went through ablation-replace in wrap mode. The predictions were written before any leg ran. Each leg landed on disk: the anchor count went from 1 to 0, the replacement count from 0 to 1, and the blob changed. Each was restored with blob equal to HEAD and an empty git diff HEAD, which the tool checked and the driver checked again. The gate is a source scan, so no dist leg applies.

leg mutation result (as predicted)
S1 the AggregationConfig row put back Tests 1 failed / 10 passed; no longer collides at: lists useGroupedData.ts and data-protocol.ts
S2 the ConditionalFormattingRule row put back same verdict; lists KanbanImpl.tsx and objectql.ts
S3 the ViewType row put back same verdict; lists ViewSwitcher.tsx and views.ts
F1 the plugin-grid barrel aliases GroupAggregationConfig as AggregationConfig (the tempting back-compat shim) AggregationConfig — a NEW colliding name: the plugin-grid barrel (aliasing re-export) and data-protocol.ts (interface declaration)
F2 KanbanImpl.tsx re-declares the alias ConditionalFormattingRule — a NEW colliding name: KanbanImpl.tsx (type declaration) and objectql.ts (interface declaration)
F3 the plugin-list barrel publishes ListViewVisualization as ViewType ViewType — a NEW colliding name: the plugin-list barrel (aliasing re-export) and views.ts (type declaration)
control unmutated Tests 11 passed (11)

Acceptance notes

  • One new published name. GroupAggregationConfig is new on the plugin-grid root. It is the rename target the claim's rule implies for a published site, so this PR does not treat it as an extra export. If the seat reads it otherwise, the claim needs an amendment for it.
  • No replacement export on plugin-list. The root drops ViewType and does not re-export ListViewVisualization. That name is already published at the @object-ui/core root, and a second export site would add nothing. ViewSwitcherProps['currentView'] names the same union from this package.
  • Gate prose. Two prose lines in the gate file described ConditionalFormattingRule as "the contested name". They now say "the bare name", because it is no longer contested. The near-spelling fixtures themselves are unchanged.
  • JSDoc on the changed sites. GroupAggregationConfig, the kanban comment and the switcher comment each say why the general name is not used, so the next author does not restore it.
  • The grid shape is still declared twice, unnamed. GroupAggregationConfig has the same members as the inline element type of ObjectGridSchema.aggregations in @object-ui/types (and its zod twin). That is a structural copy, not a name collision under the gate. It is noted here and not filed.

Generated by Claude Code

…nalFormattingRule and ViewType (objectui#6349, batch 7)

Three plugin <-> @object-ui/types rows of the one-authority ledger, each two
meanings behind one name. @object-ui/types keeps the general name in all three.

- AggregationConfig: the grid's per-group header aggregation (field, type) is
  renamed GroupAggregationConfig; types' is the query-AST aggregation
  (function, alias, distinct, separator). The plugin-grid root publishes the
  new name in place of the old one.
- ConditionalFormattingRule: KanbanImpl's module-local alias of
  KanbanConditionalFormattingRule is deleted; the board spells the kanban rule
  by its own name. No package entry reached the alias.
- ViewType: plugin-list's alias of core's ListViewVisualization (nine arms,
  without list and detail) is deleted; the switcher and ListView spell
  ListViewVisualization, and the plugin-list root no longer publishes ViewType.

KNOWN_COLLISIONS goes from 19 to 16 rows. Types only: emitted JS is
byte-identical. Changesets: plugin-grid and plugin-list minor with breaking
notes, plugin-kanban patch.

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

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 290 chunks) 3167.9 KB 3204.6 KB
Main entry chunk (gzip) 73.7 KB 350 KB
Entry file index-DvFAgLii.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) 19.75KB 7.29KB
app-shell (runtime-config.js) 22.59KB 7.89KB
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.15KB 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) 41.19KB 11.12KB
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.11KB 7.97KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 587.83KB 141.44KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 240.39KB 67.09KB
fields (index.js) 269.42KB 68.20KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
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.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 40.26KB 11.71KB
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.04KB 3.92KB
plugin-calendar (index.js) 53.43KB 15.54KB
plugin-charts (index.js) 84.72KB 23.27KB
plugin-chatbot (index.js) 201.52KB 47.99KB
plugin-dashboard (index.js) 144.20KB 38.95KB
plugin-designer (index.js) 233.53KB 49.80KB
plugin-detail (index.js) 249.09KB 65.63KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 177.11KB 45.88KB
plugin-gantt (index.js) 179.17KB 45.07KB
plugin-grid (index.js) 249.62KB 69.16KB
plugin-kanban (index.js) 52.77KB 16.56KB
plugin-list (index.js) 120.10KB 30.28KB
plugin-map (index.js) 27.24KB 9.03KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.12KB 12.29KB
plugin-timeline (index.js) 39.06KB 11.80KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 91.93KB 23.24KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
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) 120.63KB 39.56KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.31KB 2.07KB
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.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
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) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
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 (node-slots.js) 7.18KB 2.34KB
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) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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: ceb7b297f8394167fb6801e4714901d18c056595
Local-runs: none

Inputs: card objectui#6349 (body and all 29 comments, the batch 7 claim 6088763852, the dev report 6089402631 and the amendment 6089430007 included), PR objectui#12071 (body, 12-file list, the net diff against main at this head: one commit on e391f876, which is the main tip, ahead 1 / behind 0, mergeable clean), and the 43 check-runs on this head. Reads only: gh api REST and git show / git grep against the fetched base and head refs. Nothing built, run or re-run.

① Derived judgments

Each accept-set and public-surface change the diff implies, read off the diff and the head tree, with my own census of in-repo readers at base.

  1. @object-ui/plugin-grid root: AggregationConfig leaves, GroupAggregationConfig arrives, members identical — RIGHT. useGroupedData.ts:26-31 at head declares GroupAggregationConfig { field: string; type: AggregationType }, the same two members the old interface carried; index.tsx:53 publishes the new name in the old one's slot. The two meanings share only field (types' AggregationConfig in data-protocol.ts:416 is the query-AST aggregation with function, alias, distinct, separator), so a re-point would have retyped the grid's type key, which its runtime reads. Renaming the narrower side and keeping the general name on @object-ui/types is batch 3's rule (5548770074) and the shape batches 4–6 landed. Accept set: an external import type { AggregationConfig } from '@object-ui/plugin-grid' stops compiling (TS2724 names the replacement); authored object-grid.aggregations entries are accepted unchanged. Census at base: no TS source imports AggregationConfig from the plugin-grid root or from ./useGroupedData beyond the two changed files, and the only prose reader was the README line this PR edits. ServerGroupHeadersInput is not on the grid root; its aggregations member keeps the same shape.

  2. @object-ui/plugin-kanban: the module-local alias ConditionalFormattingRule = KanbanConditionalFormattingRule in KanbanImpl.tsx is deleted; nothing published moves — RIGHT. The exports map has only . and ./style.css; the entry index.tsx re-exports nothing from ./KanbanImpl and reaches it only through a React.lazy dynamic import in KanbanBoardCore.tsx; KanbanRendererProps.conditionalFormatting already spelled KanbanConditionalFormattingRule at base. So the alias published nothing, and its five uses now spell the specific name the authority already declares (objectql.ts). KanbanBoardProps.conditionalFormatting is the same type as before. DELETE branch, no new name coined: right, the narrower meaning already had its own name. At head the only remaining mentions in the package are the explanatory comment and a historical CHANGELOG line.

  3. @object-ui/plugin-list root: ViewType leaves, no replacement export on this root — RIGHT. Base index.tsx:28 published ViewSwitcherProps, ViewType; head publishes ViewSwitcherProps only. ViewSwitcherProps.currentView / availableViews / onViewChange and ListViewProps.onViewChange are now typed on @object-ui/core's ListViewVisualization, the same nine-member union the alias named, so their published shapes are unchanged; VIEW_ICONS and VIEW_LABEL_KEYS stay total over that union, so the exhaustiveness guard still fires on the next spec visualization. Accept set: import type { ViewType } from '@object-ui/plugin-list' stops compiling (TS2305). The migration target is real: ListViewVisualization is declared at packages/core/src/utils/normalize-list-view.ts:208 and reaches the core root through export * from './utils/normalize-list-view.js' (packages/core/src/index.ts:155). Not re-exporting it from plugin-list is right: a second export site would be exactly the aliasing re-export the gate counts (the dev's F3 leg lit on it). Re-pointing at types' 11-member ViewType was rightly refused: it makes both total maps incomplete, and filling them needs icons and labels for list and detail, a runtime change off the claim. Census at base: the only importers of ViewType from ./ViewSwitcher were ListView.tsx and the barrel, both changed; no file in the repo imports ViewType from @object-ui/plugin-list (CHANGELOG and ROADMAP prose are records, not readers); no docs page or README names it.

  4. Ledger: KNOWN_COLLISIONS 19 rows at base, 16 at head — RIGHT, counted on both files. The three removed rows are exactly AggregationConfig, ConditionalFormattingRule and ViewType; the other sixteen names are unchanged, the Filter rows and CalendarEvent among them. Each removed row is replaced by a comment naming the branch taken.

  5. @object-ui/types and @object-ui/core untouched; the general names stay on types — RIGHT. No file under packages/types or packages/core is in the 12-file list; at head the only AggregationConfig / ConditionalFormattingRule / ViewType declarations under packages/ are the three authority sites.

  6. Types and comments only; no emitted JavaScript moves — RIGHT. Every hunk is a type name, a type declaration, a comment, a changeset or the README line; no value-level code changes. Bundle Analysis is success on the head and the console eager-closure budget reads PASS.

  7. Fences held — RIGHT. No packages/components/src/ui/**, no packages/i18n/**, no runtime behaviour, no other ledger row. Governed Surface Queue Guard is success.

  8. PR shape — RIGHT. Draft; first line Refs #6349 (batch 7); no closing keyword (scanned the body: none); the Clause-②: yes line at line start; one commit; no angle bracket in the body.

Check-runs on this head (the gate verdicts): 43 runs, 40 success, 3 skipped (dependabot, Test (coverage), Test (coverage shard): the expected three), 0 failure. Type Check, Lint, Test shards 1–8 plus the Test aggregate, Test (dist pins), Build & E2E, Build Docs, Doc Snippet Type Check, README Export Check, Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check, Changeset Claim Re-read, Changeset Overwrite Report, Governed Surface Queue Guard, Spec Main Shape Gate, Line Citation Gate, Control Byte Scan and Bundle Analysis all read success. The legacy Vercel status is success. The one-authority gate runs under the Test shards; the dev's seven ablation legs (three stale, three fresh, one control, each restore proven) are the non-vacuity evidence, read and not re-run.

② Semver level

  • Clause-②: yes — RIGHT. Two published names leave package roots (AggregationConfig from plugin-grid, ViewType from plugin-list) and one arrives (GroupAggregationConfig).
  • 6349-batch7-plugin-grid.md: @object-ui/plugin-grid minor, breaking note with the migration — RIGHT. A published name leaves and its replacement arrives; the note names GroupAggregationConfig, the unchanged members and the TS2724 hint.
  • 6349-batch7-plugin-list.md: @object-ui/plugin-list minor, breaking note naming ListViewVisualization from @object-ui/core — RIGHT. A published name leaves; the named replacement is on the core root (item 3 of ① above).
  • 6349-batch7-plugin-kanban.md: @object-ui/plugin-kanban patch — RIGHT. The deleted alias reached no entry; nothing published moves.
  • No changeset for types, core or plugin-view — RIGHT. None is touched.
  • The three grades are the ones the amendment 6089430007 fixed per package; none is major (Changeset Bump Policy success). Changeset Declaration is success on the head.

③ Boundary flags

  • open_questions[0] — is GroupAggregationConfig on the plugin-grid root covered by the claim? Answered by the amendment 6089430007: A (B as the record). The diff does exactly that: the new name takes the old one's slot on the root, nothing else is added. Right.
  • Deviation: packages/plugin-grid/README.md outside the named surface. Answered by the same amendment, which accepted the file; README Export Check is success on the head. Right.
  • Deviation: two prose lines in the gate file outside KNOWN_COLLISIONS ("the contested name" to "the bare name", the header JSDoc and one fixture comment). Judged acceptable here: comment-only, in the file the claim already places on the surface for the row removals; the near-spelling fixtures themselves are unchanged; batch 5's declared fixture-comment line was accepted the same way (6079810246). No escalation.
  • Deviation: JSDoc and comments at the changed sites, each saying why the general name is not used. Comment-only, in claim files. Acceptable.
  • Deviation: commit trailers are the repo's model-free pair. The one commit matches the shape batches 4–6 landed with. Acceptable.
  • Deviation: not run locally — the full app-shell suite (covered: Test shards 1–8 and the Test aggregate are success), the type-checks of app-shell, the console and the other dependants (covered: Type Check is success), the i18n gates (no locale pack in the file list). Each is answered by a passing check-run on this head.
  • Deviations: type-checks re-run after the commit; worktree removed. Housekeeping, acceptable.
  • out_of_scope_findings (both noted, not filed): GroupAggregationConfig restates the inline element type of ObjectGridSchema.aggregations (a structural copy, not a name collision under the gate), and types' grid and kanban rule names differ only by the retired tombstone. Neither is a defect under the gate; nothing to answer.
  • Tier notice 5612085492 lifted this card's contract-review-tier requirement; the seat runs the review at the ceiling because of the Clause-②: yes line, as it did for batches 4–6. Noted, no conflict.
  • Reviewer observation, noted and not filed (no gate reads it): packages/plugin-list/src/ViewSwitcher.tsx:74 still says "the same glyph for the same ViewType". After this PR the bare name inside plugin-list means types' wider vocabulary, so "visualization" is the precise word. A one-word comment rider for a later batch on this card; not a reason to re-run CI now.

Implemented-by: claude/issue-6349-batch7-plugins-types
Reviewed-by: session_01CGZy1BGCjdN5cXqL9cnvB8

VERDICT: PASS

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 9, 2026 21:42
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 9, 2026 21:42
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 9, 2026
Merged via the queue into main with commit c0c0a0d Oct 9, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-6349-batch7-plugins-types branch October 9, 2026 22:00
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 plugin: kanban plugin tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants