Skip to content

refactor(types,collaboration,data-objectstack,plugin-designer,providers): one authority each for ConnectionState, VersionEntry and ThemeProviderProps (objectui#6349, batch 10) - #12083

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-6349-batch10-collab-providers
Oct 10, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-6349-batch10-collab-providers

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Refs #6349 (batch 10)

Clause-②: yes

Batch 10 of the one-authority burn-down, on the claim 6093179763. It covers three KNOWN_COLLISIONS rows from the collaboration and providers packages, none with an @object-ui/types side. Two rows converge here. The third, ConnectionState, stopped with measured options in round 1 and converges in round 2 (above), because the rules this card has applied do not settle it (see "The stop" below).

(Round 1.) Implemented in session https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 (the seat's session; this was a subagent dispatch).

Round 2 (head 65da7a995): all three rows converge

Brought up to round 2 by the seat (domain:ui seat 3). The round-1 text below is kept and marked where round 2 supersedes it.

  • ConnectionState: ruled A by the seat's claim amendment 6093405166 on objectui#6349, under batch 3's rule and batch 4's UndoableOperation precedent, with the maintainer's veto window open.
    • The one declaration now lives in @object-ui/types (data.ts, beside DataSource) and is published from the types barrel.
    • collaboration's useRealtimeSubscription.ts and data-objectstack's index.ts are plain re-exports of it.
  • KNOWN_COLLISIONS: 10 → 7 rows.
  • Published surface: types 708 → 709 (ConnectionState joins). collaboration 39 = 39 and data-objectstack 104 = 104, with each copy type-equal to the types declaration. plugin-designer, providers and react are unchanged by round 2.
  • Emitted output: no .js file differs.
  • Changesets added in round 2: @object-ui/types minor (a new name), and @object-ui/collaboration and @object-ui/data-objectstack patch. ⛔ No major.
  • Round-2 gates at 65da7a995:
    • the gate: 11 of 11 pass;
    • types, collaboration and data-objectstack with the gate: 457 files and 11,307 tests passed;
    • the types, collaboration, data-objectstack and app-shell type-checks and type-check:scripts exit 0;
    • check:doc-snippets: 785 of 785 blocks judged, 0 failed. check:readme-exports is OK;
    • ablation S3 (stale) and F3a/F3b (fresh) went red as predicted, with restores proven blob-equal.

What converged: KNOWN_COLLISIONS goes from 10 to 8 rows (round 1; 7 after round 2)

VersionEntry: two meanings. The designer's side becomes VersionHistoryEntry

  • Member diff. Both have version, timestamp, userId and userName; userName is optional in collaboration and required in the designer. Only collaboration's has id, changes (a per-field before/after diff that revertToVersion and compareVersions replay) and message. Only the designer's has description and isCurrent. Collaboration's is a version its useConflictResolution hook records. The designer's is a row its VersionHistory timeline displays.
  • Dependency edge: neither package depends on the other. collaboration depends on i18n and types, and plugin-designer's dependency list has no collaboration.
  • Reach, read on the built entries: the collaboration root publishes VersionEntry. The plugin-designer root does not. Its entry exports the VersionHistory component, but neither VersionEntry nor VersionHistoryProps, and the components/index.ts barrel that re-exported it has no importer. So the rename removes no published name: the plugin-designer root has 38 names before and 38 after. Batch 6's DesignerConfirmDialogState row had the same shape.
  • Readers: none in the repo outside each package's own files, and 0 hits in @objectstack/spec 17.7.0 (control: RealtimeConfig and ThemeMode hit there).

ThemeProviderProps: two providers. providers' side becomes ThemePreferenceProviderProps

  • Member diff. providers' has defaultTheme?: ThemePreference, storageKey? and children. react's has themes?, defaultTheme?: string, defaultMode?: ThemeMode, persist?, storageKey?, target? and children. The shared key defaultTheme means two things: a MODE on providers' side ('dark') and a theme NAME on react's ('my-theme'). Neither provider wraps the other. providers' provider stores one mode and toggles the light / dark class. react's registers Theme documents and writes CSS variables.
  • Dependency edge: neither package depends on the other. providers depends only on types; react depends on core, data-objectstack, i18n, types and the spec.
  • Reach: both roots published the name, measured on the built entries. The providers root now publishes ThemePreferenceProviderProps instead, with identical members (23 names before and 23 after). The react root is unchanged (300 = 300). react's theme system is the general one: @object-ui/types' theme module names react's ThemeProvider as the one that applies a Theme. So react keeps the general name.
  • Readers: none in the repo through either entry. The README, docs and examples teach the components, never the props type. 0 hits in @objectstack/spec 17.7.0. This is therefore the zero-reader rename of a published name that the card's rules already settle (batch 7's GroupAggregationConfig, batch 8's ListViewSwitcherProps), and it is not a stop.
  • What an old import does now, measured against the rebuilt entry: it fails with TS2724. That error's "Did you mean" names the ThemeProvider component, not the replacement. Following the suggestion fails too (TS2749, a value used as a type). Nothing compiles silently wrong, and the changeset says this.
  • Value names: the two ThemeProvider components (and useTheme) keep their names. They are outside the gate's type-level bound, in the same way batch 9 kept the two AppShell components.

The stop: ConnectionState (round 1; ruled A in 6093405166 and implemented in round 2)

  • Measured. The two declarations are the SAME five-member union in a different source order. The two built entries' ConnectionState are type-equal: a mutual-equality probe exits 0, the same assertion flipped exits 2 (TS2322), and a control that drops one member is not equal.
  • Dependency edge: neither depends on the other. collaboration has i18n and types; data-objectstack has core, types, client and the spec. Both already depend on @object-ui/types.
  • Readers through the entries: data-objectstack's has 5 reader files, app-shell's AppContent, AppHeader, ConnectionStatus and ConsoleLayout, and the console's dataSource.ts re-export. collaboration's has 0 named readers, but it is the published state type of useRealtimeSubscription, which app-shell's ObjectView mounts. 0 hits in @objectstack/spec 17.7.0.
  • So: same thing ⇒ re-point. The re-point is dependency-illegal, and batch 3's rule forbids adding a dependency, so the rules do not settle the row.
option what files beyond the claim grades
A (recommended) Move the one declaration down into @object-ui/types, which both packages already depend on. collaboration and data-objectstack each re-export it. a types source file (beside DataSource in data.ts is natural) and the types barrel types minor (one new name); collaboration and data-objectstack patch (shape and name sets unchanged)
B Rename collaboration's to RealtimeConnectionState, published at its root in place of the old name (0 readers) none collaboration minor, breaking note
C Retire collaboration's exported name (0 readers) and keep a module-local type none collaboration minor, breaking note
D (refused) Re-point one package at the other needs a new dependency n/a: batch 3's rule, and a realtime hook would pull in the ObjectStack adapter and client

Why A, along the four axes:

  • Real business need: both sides are live and measured identical. A is the only option that keeps them identical by construction.
  • Long-term fitness: A gives one authority. B and C name one vocabulary twice, so the gate stops seeing the pair while the two copies stay free to drift. That trades a visible collision for an invisible one. Precedents for moving a declaration down: batch 4's UndoableOperation, objectui#8261's TranslateFn and objectui#7664's Kanban trio.
  • Keeping AI from writing it wrong: with A, one name has one meaning and an auto-import cannot pick the wrong copy. With B, an author must know that two identically shaped names exist.
  • Startup scope: A adds one name to types and removes a duplicate. No capability is added.

Changeset grades

  • @object-ui/providers minor with a breaking note: a name leaves the root, and the note names the migration and the measured TS2724 / TS2749.
  • @object-ui/plugin-designer minor with a nothing-breaks note: only the type name in the published declaration of VersionHistory's versions prop changes. This is the same grading batch 6 gave useConfirmDialog's DesignerConfirmDialogState.
  • Round 2 adds @object-ui/types minor (ConnectionState joins), and @object-ui/collaboration and @object-ui/data-objectstack patch (each site becomes a re-export).

Verification (head 48285b125, base 1b2d0160)

  • Built entries: one TypeScript program over all five entries per tree, with dist rebuilt for the two touched packages. The name sets are collaboration 39 = 39, data-objectstack 104 = 104, plugin-designer 38 = 38, providers 23 = 23 (ThemeProviderProps leaves, ThemePreferenceProviderProps joins) and react 300 = 300.
  • Emitted JS is byte-identical in providers and plugin-designer. Only .d.ts / .d.ts.map files differ, so no first-load byte moves.
  • The gate (one-authority-per-exported-name-6273) passes 11 of 11.
  • Suites: the providers suite, the VersionHistory locale test and the gate ran at the final head: 5 files and 26 tests passed. The plugin-designer package suite ran at ef2e5845b, whose code is identical to the head (the later commit changes one changeset only): 46 files and 449 tests passed.
  • Type-checks (each script name echoed): providers, plugin-designer, react, collaboration, data-objectstack, fields (a providers dependant), app-shell (a dependant of both) and type-check:scripts all exit 0. app-shell's first attempt exited 2 with TS2307 on unbuilt dependencies. That was an unmet prerequisite, not a measurement, and it exited 0 once its dependency closure was built.
  • Checks: check:control-bytes OK, check:test-path-roots OK, check:changeset-claims OK, check:pending-changeset-literals OK, check:readme-exports OK (582 of 582 self-imports judged, after building the 7 packages its first run reported unbuilt), check:doc-snippets (785 of 785 blocks judged, 0 failed), check:new-line-citations (0 new), changeset presence OK and no-major OK. eslint on the touched files reports 0 errors and 3 warnings, all on lines this diff does not touch.
  • Ablation through ablation-replace, with predictions written first. Control: 11 passed. All four legs went red as predicted, each with 1 failed and 10 passed in "declares no name twice outside the named, shrinking baseline":
    • S1 (VersionEntry row restored): stale, both files listed;
    • F1 (the designer spelling VersionEntry again): fresh, "a NEW colliding name";
    • S2 (ThemeProviderProps row restored): stale, both files;
    • F2 (providers spelling ThemeProviderProps again): fresh.
    • Every leg was restored blob-equal to HEAD, and the tree is clean afterwards.
    • The first S1 and S2 attempts were no-ops: my replacement re-contained the anchor, so the tool refused before running the gate. They were re-run with a replacement that does not.
  • Governed-queue guard: NOT GOVERNED over the 8 paths.

Acceptance notes (observations, not filed)

  • Three components share the value name ThemeProvider: providers', react's and app-shell's chrome one, which the app-shell root exports. This is outside the gate's type-level bound, like the AppShell pair.
  • plugin-designer's CollaborationProvider spells a fourth, unnamed connection-state union inline: four members, no reconnecting. It is not a collision under the gate. If option A lands, it has a name to point at.
  • plugin-designer's components/index.ts barrel has no importer, like the hooks/index.ts barrel batch 6 noted.
  • Batch 8's comment riders wait for a batch that touches their files. None of them is in this batch.

Generated by Claude Code

…try and ThemeProviderProps (objectui#6349, batch 10)

Two of batch 10's three ledger rows, each two meanings behind one name:

- VersionEntry: collaboration's is a version useConflictResolution
  records (id plus a per-field changes diff); the designer's is a row
  the VersionHistory timeline displays (description, isCurrent). The
  designer's entry never exported the name, so its declaration now
  spells VersionHistoryEntry.
- ThemeProviderProps: react's is its theme-system ThemeProvider
  (Theme documents, a theme-name defaultTheme, defaultMode); providers'
  is a mode-only provider whose defaultTheme is the mode. providers'
  declaration now spells ThemePreferenceProviderProps and its root
  publishes that name instead; react keeps the general name.

Both rows leave KNOWN_COLLISIONS. ConnectionState stays: the two sites
are one identical union, and neither package depends on the other.

Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8
Co-authored-by: Claude <noreply@anthropic.com>
…ally gets (objectui#6349, batch 10)

Measured against the rebuilt providers entry: the old import fails with
TS2724, whose suggestion names the ThemeProvider component rather than
the replacement, and following that suggestion fails with TS2749. The
changeset said TS2305.

Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 290 chunks) 3168.0 KB 3204.6 KB
Main entry chunk (gzip) 73.7 KB 350 KB
Entry file index-BvRmWNQP.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

…nectionState (objectui#6349, batch 10)

Round 2, on the seat's amendment to the batch 10 claim (option A).
collaboration's and data-objectstack's ConnectionState were the same
five-state union, type-equal on both built entries, and neither package
depends on the other. Both depend on @object-ui/types, so the one
declaration moves down into types' data.ts beside DataSource, the types
root publishes it, and both former sites re-export it. Both package
roots keep the name and the shape. The row leaves KNOWN_COLLISIONS.

Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 290 chunks) 3168.0 KB 3204.6 KB
Main entry chunk (gzip) 73.7 KB 350 KB
Entry file index-BvRmWNQP.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: 65da7a99503807fec972a8c8c4969fa4a0edc5ff
Local-runs: none

Isolated, read-only review of PR objectui#12083 (card objectui#6349, batch 10): base main at 1b2d0160, 3 commits ahead, 15 files, +129/−13. Inputs: the card's body and all 44 comments (claim 6093179763, dev report 6093391418, amendment 6093405166 among them), the PR body, its file list and the net diff against main, and the check-runs on the head, read 2026-10-10T04:14Z. The shared checkout was read with git show / git grep at the head and base refs only; nothing was built, run or re-run.

① Derived judgments

Check-runs on 65da7a99: 43 completed, 40 success, 3 skipped (Test (coverage), Test (coverage shard), dependabot, the same three every earlier batch recorded as expected), 0 failure. Among the successes: Type Check; Test (8 shards and dist pins); Lint; Build & E2E; Build Docs; Doc Snippet Type Check; README Export Check; Changeset Declaration, Bump Policy, Fixed Group Check, Claim Re-read and Overwrite Report; Governed Surface Queue Guard; Line Citation Gate; Control Byte Scan; Pre-Install Import Graph Check; Bundle Analysis; Docs Route Eager Closure Check; Spec Main Shape Gate. Commit status: Vercel success (ignored build step). These are the gate verdicts.

Each accept-set and public-surface change the diff implies, judged:

  1. @object-ui/types gains ConnectionState ('disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error') at the root and, since data.ts is the ./data subpath in its exports map, there too. Right. One declaration in the head tree (packages/types/src/data.ts:989; git grep at the head finds no other declaration of the name in any package), published from the barrel's from './data.js' block (index.ts:439); the barrel carries no export * that could shadow it. Both re-exporting packages already depend on @object-ui/types (their package.json at head), so this is the dependency-legal authority under batch 3's rule, and it is amendment 6093405166 option A implemented verbatim: beside DataSource, the barrel, two plain re-exports, the row removed. The JSDoc's named members (getConnectionState(), onConnectionStateChange, useRealtimeSubscription's connectionState) all exist at head.
  2. @object-ui/collaboration keeps publishing ConnectionState, now as a re-export (useRealtimeSubscription.ts:48, reached by the root at index.ts:26); RealtimeResult['connectionState'] is still typed by it. The old local union listed the same five members in another order, so the accept-set is unchanged. Right; patch.
  3. @object-ui/data-objectstack keeps publishing ConnectionState as a re-export from its entry (index.ts:2039); getConnectionState(), ConnectionStateEvent and ConnectionStateListener are untouched, and the five in-repo readers (app-shell AppContent, AppHeader, ConnectionStatus, ConsoleLayout, and the console re-export) still import it from this package. Right; patch.
  4. @object-ui/providers: ThemeProviderProps leaves the root and ThemePreferenceProviderProps joins with identical members (defaultTheme?: ThemePreference, storageKey?, children); ThemeProvider and useTheme keep their names. Right. Two meanings (react's theme-system provider takes themes documents and a theme-NAME defaultTheme; providers' stores one mode), neither package depends on the other, so the narrower side takes the specific name and @object-ui/react keeps ThemeProviderProps (ThemeContext.tsx:71, unchanged), which is the card's remedy and the batch 4 rule. At head no file imports ThemeProviderProps from @object-ui/providers, and no README, docs page or doc snippet names it; the only other spellings are react's declaration and two non-exported module-local type ThemeProviderProps (app-shell chrome/ThemeProvider.tsx, cli app-generator.ts), which are neither importers nor exported names under the gate. An external importer breaks loudly, and the changeset says so.
  5. @object-ui/plugin-designer: VersionEntry becomes VersionHistoryEntry; the root's name set is unchanged. Right. The entry src/index.tsx exports only the VersionHistory component (line 62), never VersionEntry or VersionHistoryProps, and the components/index.ts barrel that re-exported them has 0 importers. The two meanings differ as stated (collaboration's carries id, changes and message?; the designer's carries description and isCurrent?; the members at head match both the changeset and the PR body), neither package depends on the other, and @object-ui/collaboration keeps VersionEntry on its root (index.ts:41). Same shape as batch 6's DesignerConfirmDialogState and batch 8's DashboardRecordDetailDrawerProps. Only the type name inside the published declaration of VersionHistory's versions prop moves.
  6. KNOWN_COLLISIONS goes 10 → 7, and nothing else in that ledger. Right, counted by printing the rows between the map's new Map([ (line 353) and its closing ]); (line 630 at base, 658 at head): ConnectionState, ThemeProviderProps and VersionEntry leave, each replaced by a "sat here" comment; CalendarEvent, DataSource, DomProps, the three Filter rows and SchemaNode remain. A naive regex over the whole file reads 11 → 8, because the KanbanCard row at line 818 (846 at head) belongs to the ratchet test's own control baseline, not to the ledger. The gate passed inside the Test shards on this head.
  7. No runtime change. Every source hunk is a type or interface declaration, an import type / export type line, or a comment, so emitted JS cannot move; Bundle Analysis and the Console Performance Budget pass on the head. Right.
  8. Scope. 15 files, all on claim 6093179763 as amended by 6093405166; nothing under packages/components/src/ui/** or packages/i18n/**; Governed Surface Queue Guard: success. Draft, first line Refs #6349 (batch 10), no closing keyword, Clause-②: yes at line start. Right.

② Semver level

  • Clause-②: yes is right: the providers root loses a published name and the types root gains one; the claim set it and the amendment kept it.
  • Five changesets, one per graded package, each naming the card and batch: @object-ui/types minor (a new published name; nothing removed or narrowed); @object-ui/providers minor with a breaking note that names the migration and the measured TS2724 / TS2749; @object-ui/plugin-designer minor with a nothing-breaks note (a name inside a published declaration moves, batch 6's grading for DesignerConfirmDialogState); @object-ui/collaboration and @object-ui/data-objectstack patch (names and shapes unchanged; both sites become re-exports). Each matches the claim's per-package criterion and the amendment's grades. ⛔ No major: Changeset Bump Policy, Changeset Declaration and Changeset Fixed Group Check are all success. Right.
  • Prose checked against the head tree: the providers note's ThemePreference members, the designer note's six row members and the types note's five states all read true.

③ Boundary flags

  • open_questions[0], the ConnectionState route: answered A by amendment 6093405166 and implemented verbatim in 65da7a99 (round 2): declaration beside DataSource, barrel export, both sites plain re-exports, row removed, grades types minor / collaboration patch / data-objectstack patch. The amendment's conditional item, "a types test beside the declaration if the package pins its exports": packages/types pins no export list (no test under packages/types names the barrel's members), so none is owed. The amendment leaves the maintainer's veto window open; nothing in the inputs vetoes it.
  • Deviations, all six answered: (1) the row not converged in round 1, superseded by round 2; (2) ablation legs S1 / S2 first ran as refused no-ops and were re-run, which is reporting, and the gate's CI run on the head is the verdict; (3) base dist restored from the turbo cache, a measurement-method note that is not load-bearing (type-only hunks by construction, and CI built the head); (4) the plugin-designer suite ran at ef2e5845b rather than the round-1 head, moot because CI ran the suites at 65da7a99; (5) the first app-shell type-check and check:readme-exports runs were PREREQUISITE NOT MET and were re-run, and Type Check and README Export Check are success on the head; (6) commit trailers use the repo's model-free pair, which the three commits carry while naming no model, so repo-rule precedence and not a conflict.
  • out_of_scope_findings, all three acknowledged, none owed here: the ThemeProvider value-name triple (outside the gate's type-level bound, as batch 9's AppShell pair); the designer CollaborationProvider's unnamed four-member inline union (not a collision, and the amendment keeps it out); the designer components/index.ts barrel with 0 importers (an observation, as hooks/index.ts was in batch 6).
  • PR-body Acceptance notes: batch 8's comment riders touch none of this batch's files, so leaving them is right.
  • Not relied on: the round-2 readings in the PR body (gate 11 of 11; 457 files and 11,307 tests; ablation S3, F3a and F3b) are the dispatching seat's own conclusions; the check-runs on the head stand in for them.
  • Tier notice 5612085492 lifted this card's contract-review-tier requirement; the seat runs the review at that tier anyway on the Clause-②: yes line, as in batches 4–9. Noted.
  • Escalated to the seat, non-blocking: the PR title still names only the two round-1 rows (VersionEntry, ThemeProviderProps); round 2 added ConnectionState across types, collaboration and data-objectstack. The body is current, the title is stale.

Implemented-by: claude/issue-6349-batch10-collab-providers
Reviewed-by: session_01CGZy1BGCjdN5cXqL9cnvB8

VERDICT: PASS

@objectstack-fleet objectstack-fleet Bot changed the title refactor(plugin-designer,providers): one authority each for VersionEntry and ThemeProviderProps (objectui#6349, batch 10) refactor(types,collaboration,data-objectstack,plugin-designer,providers): one authority each for ConnectionState, VersionEntry and ThemeProviderProps (objectui#6349, batch 10) Oct 10, 2026
@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 10, 2026 04:17
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 10, 2026 04:17
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 10, 2026
Merged via the queue into main with commit 12ff256 Oct 10, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-6349-batch10-collab-providers branch October 10, 2026 04:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants