Skip to content

fix(types,core): one authority for ActionContext (objectui#6349, batch 4) - #12041

Merged
objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/issue-6349-batch4-core-types
Oct 9, 2026
Merged

objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/issue-6349-batch4-core-types

Conversation

@objectstack-fleet

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

Copy link
Copy Markdown
Contributor

Refs #6349 (batch 4)
Clause-②: yes

Batch 4 of the one-authority burn-down: the three core and types rows of KNOWN_COLLISIONS (ActionContext, ActionResult, ComponentMeta). All three rows converge here. ActionContext converged in the first round. ActionResult and ComponentMeta were stop-and-report in the first round (measured below). The seat's claim amendment 6077155250 answered them (ActionResult A1, ComponentMeta A), and the second round converged both (the dev's addendum 6077857371; summary in the next section). Types only: the emitted JavaScript of both packages is byte-identical to the base.

Notation: REC means Record keyed by string with any values. Generic arguments are spelled in words because GitHub strips angle-bracket spans from bodies.

Round 2: the amendment, converged (head 7fc6d14e)

  • Ledger: KNOWN_COLLISIONS had 28 rows at base and has 25 at head. The gate is 11 of 11.
    • Stale legs on ActionResult and ComponentMeta read no longer collides at:, naming both files.
    • Fresh legs on ActionResult, ComponentMeta and the moved UndoableOperation read a NEW colliding name.
  • ActionResult (A1): @object-ui/types is the one declaration.
    • It gains the runner's reload, redirect, modal, silent and undo, and its unread refresh is retired.
    • UndoableOperation moves into ui-action.ts and is published from the types entry. It needs no core-only type.
    • core's ActionRunner.ts re-exports ActionResult, and UndoManager.ts imports and re-exports UndoableOperation.
  • ComponentMeta (A): core's derived declaration is renamed RegistryComponentMeta, and core's ComponentMeta re-exports types'.
    • register, registerLazy, getMeta and the registry's internal readers use the new name, and PluginScopeImpl.ts imports it.
    • The derivation pin is re-aimed, and it gains a pin that core's ComponentMeta is the canonical one.
    • The three ComponentMeta['labelling'] readers (fields index.tsx, app-shell widgets.tsx, DashboardWidgetInspector.tsx) read RegistryComponentMeta['labelling'].
  • Published surface, one program per tree:
    • core's ActionResult and UndoableOperation keep identical members.
    • core's ComponentMeta loses exactly deprecated, labelling, namespace, skipFallback and tier, and core's RegistryComponentMeta equals the old one.
    • types' ActionResult gains five members and loses refresh.
    • Exported names only grow: core 512 → 513 (RegistryComponentMeta), types 710 → 711 (UndoableOperation).
    • Emitted JS is byte-identical for types, fields and app-shell. In core it differs in one JSDoc line in registry/Registry.js, with a code-only diff of 0.
  • Consumer impact: 15 of 15 type-checks exit 0: types, core, react, sdui-parser, fields, plugin-dashboard, plugin-report, plugin-timeline, components, app-shell, plugin-grid, plugin-detail, plugin-view, plugin-designer and console. They cover every package that names these types or drives an ActionRunner.
  • Suites:
    • types + core + the gate: 566 files and 14,054 tests passed;
    • fields: 242 files and 3,956 tests passed;
    • app-shell, narrowed to the 37 files that import the two changed modules: 550 tests passed. Its emitted JS is unchanged, and CI runs the full suite.
  • Changesets: minor on types, core, fields and app-shell, each with a breaking-change note. ⛔ No major.

ActionContext: converged on @object-ui/types

member core (ActionRunner.ts, before) types (ui-action.ts, before) the one declaration (after)
data optional REC none (index signature, so any) optional REC (core's member moves down)
record optional any optional REC optional REC
selectedRecords optional REC array same same
pageVariables optional REC same same
user optional any optional REC optional REC
index signature string key to any same same
  • One concept, drifted copies. Both are the runner's execution data bag. @object-ui/types is the dependency-legal authority: it has no @object-ui/* dependency, and core depends on it. ActionRunner.ts now RE-EXPORTS it (export type { ActionContext } from '@object-ui/types'), and its row leaves the ledger.
  • data moved down because the runner reads it: as the fallback record id in executeForm, and as the API request body in buildApiRequestBody. record / user keep the narrower REC, because every package below compiles against it.
  • Consumers, enumerated before reshaping. Name importers: 33 import sites of ActionContext point at @object-ui/core and 7 point at ActionRunner relatively, against 2 of the @object-ui/types copy (its barrel, and one action-group-retired lit control). Implicit users drive an ActionRunner without naming the type. pnpm --filter PKG type-check is green on 15 packages against the converged shape, with types and core dist rebuilt first: types, core, react, sdui-parser, fields, plugin-dashboard, plugin-report, plugin-timeline, components, app-shell, plugin-grid, plugin-detail, plugin-view, plugin-designer and console. All 15 read exit 0 with zero error TS lines, and each run echoed its script name. The same set was exit 0 at base.

Published surface, read off the BUILT entry declarations

  • An acceptance probe compiled against each tree's dist/index.d.ts, with predictions written first. All matched.
    • Identity of core's and types' ActionContext: base TS2322 (two types), head clean (one type).
    • Narrowings, on base and head:
      • core's record given a string: base clean, head TS2322.
      • core's user given a string: base clean, head TS2322.
      • types' data given a string: base clean, head TS2322.
    • Controls:
      • An object-shaped context compiles on both trees.
      • The negative control (selectedRecords given a string) is TS2322 on both trees, at the same columns.
  • Exported name sets are unchanged. Enumerated through the type checker over dist/index.d.ts: core 512 = 512 and types 710 = 710, with zero diff lines.
  • Emitted JS is byte-identical: core 107 of 107 files and types 74 of 74.
  • Declaration diffs:
    • core: exactly actions/ActionRunner.d.ts.
    • types: ui-action.d.ts (+311 tokens, 0 removed: the docblock and data).
    • types: 15 zod/*.d.ts files read different, but every one is token-multiset-equal. That is literal-union member ORDER between a cached base build and a fresh head build, not content.
  • Grade: minor for both packages, because a member type narrows on each (objectui never declares major). The breaking semantics are written into both changesets.

ActionResult: round 1's stop, answered A1 by amendment 6077155250 (the measurement that led there)

member core types
success, data, error, close yes yes
reload yes no
redirect optional string no
modal optional any no
silent yes no
undo optional UndoableOperation (declared in core's UndoManager.ts) no
refresh no yes (in-repo readers and writers found: none)

One concept, the result of executing an action, but the only legal direction cannot carry undo. Two probes, both run with the mutation proven on disk and restored under a trap (blob equal to HEAD, git diff HEAD empty):

  • R1, a re-point at today's types shape. core tsc --noEmit exits 2 with 20 errors, every one on a core-only member: redirect ×7, reload ×7, undo ×4, modal ×1, silent ×1.
  • R2, a widened authority. types gains reload / redirect / modal / silent, plus undo typed unknown, the most types can say without reaching core. The types and core dist were rebuilt inside the trap, and the probe marker read 1 in types/dist. The core build itself fails. The tsconfig.test.json legs read: core src 1 error, core tests 17, app-shell tests 9. All 27 are reads of undo as an UndoableOperation: the runner's globalUndoManager.push(result.undo), plus tests reading undoData / redoData / objectName. The restore leg rebuilt and read the marker at 0.

So the one blocker is that UndoableOperation lives in core. Converging means declaring it in @object-ui/types, which is a new published name, and having UndoManager.ts re-export it. Both are outside this claim, so the row stays in the ledger.

ComponentMeta: round 1's stop, answered A by amendment 6077155250 (the measurement that led there)

core's is CanonicalComponentMeta & RegistryComponentMetaExtras: types' declaration plus five registry-only keys (tier, namespace, skipFallback, labelling, deprecated). That is a different, narrower meaning, registration metadata, so the card's remedy is the rename branch. A rename probe was run, with core dist rebuilt inside the trap (marker present) and rebuilt again on restore (marker 0). It renamed core's declaration to RegistryComponentMeta and re-pointed @object-ui/core's ComponentMeta at types. The breaks, all outside this claim's files:

  • fields src/index.tsx: 1, TS2339 on ComponentMeta['labelling'];
  • app-shell widgets.tsx and DashboardWidgetInspector.tsx: 2, the same read;
  • core component-meta-derives-from-canonical.test.ts: 8, the derivation pin;
  • sdui-parser, plugin-dashboard, plugin-report and plugin-timeline: 0.

@object-ui/core's published ComponentMeta would lose five keys, which is a reshaped published name. The row stays in the ledger.

Verification, round 1 (commit 9495823c2; round 2's readings are above)

  • The gate is green (scripts/__tests__/one-authority-per-exported-name-6273.test.ts, 11 of 11). Its ledger had 28 rows at base and 27 after round 1, and has 25 at head after round 2. The re-derivation instrument is the test itself.
  • Gate non-vacuity, mutations proven and restored by state:
    • Stale leg: re-adding the ActionContext row reads 1 failed | 10 passed with ActionContext — no longer collides at: naming both files.
    • Fresh leg: re-declaring it in ActionRunner.ts reads ActionContext — a NEW colliding name with both sites.
    • The first stale attempt was refused by ablation-replace (its replacement contained its own anchor), so it ran nothing. It was redone with a non-overlapping anchor.
  • The moved pin. actionKeys.pin.test.ts now reads ActionContext's index signature off ui-action.ts. Ablating the signature there reads ActionContext: false (red), and the restore is proven.
  • Root-form vitest on packages/types/ + packages/core/ + the gate, run at 84f668973: 565 of 566 files. The one failure was the pin above, which read the runner module; it was repaired in 9495823c2. At 9495823c2, the three changed or affected test files read 32 of 32.
  • type-check (hyphenated, script echoed): types and core are exit 0. Core's tsconfig.test.json is exit 0 at 9495823c2, and --listFiles includes the pin file. type-check:scripts is exit 0 and covers the ledger file.
  • Other gates: eslint on the 4 touched files has 0 errors (22 warnings, 27 at base). check:control-bytes, check:test-path-roots, check:changeset-claims, check:pending-changeset-literals, check:new-line-citations, changeset presence and no-major are all exit 0. The governed-queue guard reads NOT GOVERNED.
  • Declared narrowings:
    • The verify lock was held by other worktrees for most of an hour (repeated queue-timeouts). The final-commit runs of the core test type-check, type-check:scripts and the three test files therefore ran outside the lock, on a shared box.
    • The full types + core suite was not re-run at 9495823c2. The only delta since 84f668973 is the one test file, which was run alone.
    • Downstream type-check covers 15 of the 38 packages that depend on core: the name importers plus every package that drives an ActionRunner. CI runs the rest.
  • Eager first-load bytes: not affected, because no emitted JS moved.

Acceptance notes

  • types' ActionResult.refresh has no in-repo reader or writer: the runner reads reload. A handler typed against the types copy that sets refresh is ignored at runtime. This belongs to the ActionResult decision above, not to this PR.
  • ActionExecutor (in ui-action.ts) has no implementer and no importer outside its own barrel. It is an observation only.

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


Generated by Claude Code

claude added 3 commits October 9, 2026 06:00
…h 4)

@object-ui/types' ui-action module is the one declaration of
ActionContext; @object-ui/core's ActionRunner module re-exports it
instead of declaring a second copy. The copies had drifted on three
members: `data` existed only on the runner's copy (now declared on the
authority), and `record` / `user` were `any` there and
`Record<string, any>` here (the narrower spelling stays). The row
leaves KNOWN_COLLISIONS in the same change.

Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8
Co-authored-by: Claude <noreply@anthropic.com>
…jectui#6349, batch 4)

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

The pin that keeps ActionContext an open data bag (and ActionDef closed)
read both interfaces off ActionRunner.ts by AST. ActionContext is now
declared once, in @object-ui/types' ui-action.ts, and re-exported by the
runner module, so the ActionContext half reads the authority. A missing
interface still throws rather than reading as "no index signature".

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

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 289 chunks) 3162.5 KB 3204.6 KB
Main entry chunk (gzip) 71.6 KB 350 KB
Entry file index-Dwnuf-wp.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.52KB 7.19KB
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) 268.74KB 68.04KB
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) 41.50KB 11.82KB
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.71KB 23.25KB
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) 248.57KB 65.47KB
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.25KB 30.26KB
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.10KB 11.81KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 91.20KB 23.04KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 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.25KB
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

…jectui#6349, batch 4)

Claim amendment 6077155250 (ActionResult A1, ComponentMeta A).

ActionResult: @object-ui/types' ui-action module is the one
declaration. It takes the runner's members (reload, redirect, modal,
silent, undo); its unread `refresh` member is retired. UndoableOperation,
which types `undo`, moves down beside it and is published from the types
entry; core's UndoManager and ActionRunner modules re-export both.

ComponentMeta: the two declarations meant different things, so the
registry's derived type is renamed RegistryComponentMeta (register,
registerLazy, getMeta and the registry's internal readers use it), and
@object-ui/core's ComponentMeta re-exports @object-ui/types' one.
PluginScopeImpl, the registry pins, and the three
`ComponentMeta['labelling']` readers in fields and app-shell move to the
new name.

Both rows leave KNOWN_COLLISIONS in the same change.

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

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 289 chunks) 3162.5 KB 3204.6 KB
Main entry chunk (gzip) 71.6 KB 350 KB
Entry file index-BKWKfr6w.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.52KB 7.19KB
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) 268.74KB 68.04KB
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) 41.50KB 11.82KB
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.71KB 23.25KB
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) 248.57KB 65.47KB
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.25KB 30.26KB
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.10KB 11.81KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 91.20KB 23.04KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 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.25KB
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

…ds and app-shell (objectui#6349)

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

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 289 chunks) 3162.5 KB 3204.6 KB
Main entry chunk (gzip) 71.6 KB 350 KB
Entry file index-BKWKfr6w.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.52KB 7.19KB
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) 268.74KB 68.04KB
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) 41.50KB 11.82KB
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.71KB 23.25KB
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) 248.57KB 65.47KB
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.25KB 30.26KB
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.10KB 11.81KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 91.20KB 23.04KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 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.25KB
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: 7fc6d14ed5ca66b075b0744ea00abdddb7ae21bb
Local-runs: none

Inputs, and nothing else: card #6349 (body and all 14 comments, the batch 4 claim 6074985223, the dev reports 6077109230 / 6077857371 and the claim amendment 6077155250 included); PR #12041's body, its 17-file list and the net diff against main (base 049012bf0d) at the head above; the 43 check-runs on that head: 40 success, 3 skipped (two coverage shards, dependabot), 0 failed — Type Check, Lint, Test shards 1–8, Test (dist pins), Changeset Declaration / Bump Policy / Claim Re-read / Fixed Group, Governed Surface Queue Guard, Build & E2E all green. Tree facts below were read off the head and base commits with git grep / git show and the contents API; nothing was built, run or re-run. Notation: REC means Record keyed by string with any values (spelled in words because the sanitizer strips angle-bracket spans).

① Derived judgments

Every public-surface and accept-set change the diff implies, each named right or wrong:

surface what the diff does accept-set consequence judgment
@object-ui/types ActionContext (ui-action.ts) gains data?: REC; record, selectedRecords, pageVariables, user and the index signature unchanged (verified against the base declaration) data was reachable only through the index signature as any; a non-object data is now refused right — the runner reads data.id and sends data as a request body, so an object is the real contract; the one member only core declared moves down to the dependency-legal side
@object-ui/core ActionContext (ActionRunner.ts) second declaration deleted; export type { ActionContext } from '@object-ui/types' record and user narrow from any to REC; under strict, context.record.id now needs ?.; identity with types' declaration holds right — every in-repo consumer already compiled against the narrower REC (CI Type Check green on the head); the core changeset names exactly this narrowing
@object-ui/types ActionResult gains reload, redirect, modal, silent, undo?: UndoableOperation; refresh removed widens by five members (now writable from the protocol package); a fresh literal naming refresh is now an excess-property error right — I searched the head tree myself: the 68 src files naming ActionResult carry no ActionResult.refresh read or write (the only nearby refresh members are flowResponse.ts's own { result, refresh } envelope and useConsoleActionRuntime's judged.refresh, neither on an ActionResult); the runner reads reload. A declared member the runtime ignores is retired, not kept beside its twin, as amendment 6077155250 (A1) rules
@object-ui/core ActionResult second declaration deleted; re-export of types' members identical to before; undo now names types' UndoableOperation, member-identical to the old core one right — no accept-set change at the runner's door
UndoableOperation declared in ui-action.ts, added to the types barrel; UndoManager.ts imports and re-exports it +1 published name on @object-ui/types; the core name keeps resolving (core's barrel does export * from './actions/index.js', which exports UndoManager.js) right — a member-identical move in the only legal direction (packages/types/src imports nothing from @object-ui/core, verified); the amendment's "stop if it needs a core-only type" does not fire: its members are primitives and two unknown-valued records
@object-ui/core ComponentMeta (Registry.ts) derived declaration renamed; export type { ComponentMeta } from '@object-ui/types' loses exactly tier, namespace, skipFallback, labelling, deprecated; a registry key on a value annotated with core's ComponentMeta is now a compile error right — two meanings, two names: the card's rename branch, as AppMenuItem / FieldValidationFunction did; route B (keys onto the general, zod-mirrored type) would reopen objectui#6067's rejection. In-repo, the only remaining importers of core's ComponentMeta are three plugin bare-key-ownership tests that cast with as, which still compile (CI green)
@object-ui/core RegistryComponentMeta new exported name = CanonicalComponentMeta & RegistryComponentMetaExtras, the old core ComponentMeta verbatim; register, registerLazy, getMeta, PublicComponentConfig, LazyEntry.meta, withElementDataSourceInput typed with it; PluginScopeImpl.ts drops its local alias for the exported name +1 published name on core; registration literals keep accepting the five registry keys at the registry's doors right — the registration accept-set is unchanged; export * from './registry/Registry.js' publishes it (verified on the head barrel)
@object-ui/fields FIELD_WIDGET_LABELLING; @object-ui/app-shell WidgetLabelling and Field.labelling ComponentMeta['labelling'] → RegistryComponentMeta['labelling'] (type references and the prose that named them) resolved vocabulary unchanged (`'control' 'group'
Ledger KNOWN_COLLISIONS the ActionContext, ActionResult, ComponentMeta rows removed, each replaced by an annotation naming the remedy; 28 → 25 the shrink-only gate (11 of 11) runs inside the green Test shards on this head right — the dev's stale and fresh legs are reported per row, including a fresh leg on the moved UndoableOperation; not re-run here by design
Runtime none: every hunk is a type declaration, import type, type annotation, test or comment; ActionRunner.ts keeps its value import of globalUndoManager emitted JS unchanged (the dev measured one JSDoc line in Registry.js) right — "types only" from the claim holds
Pins actionKeys.pin.test.ts reads ActionContext's index signature off the authority file, rooted on import.meta.url; component-meta-derives-from-canonical.test.ts re-aims the derivation pin and adds a key-set pin plus a source-identity pin with a lit control that core's ComponentMeta is a re-export, not a declaration; default-children-retired.test.ts keeps pinning the registration surface — right

Exported name sets only grow (core +RegistryComponentMeta, types +UndoableOperation); no published name is removed, so the claim's "a rename that removes a published name is a stop" does not fire. No zod mirror exists for any of the three names (no ui-action file under packages/types/src/zod), so no mirror parity is owed.

② Semver level

  • The PR's line-initial Clause-②: yes is right: @object-ui/types removes a member (ActionResult.refresh) and narrows one (ActionContext.data); @object-ui/core drops five keys from its published ComponentMeta and narrows ActionContext.record / user.
  • .changeset/6349-batch4-types.md and 6349-batch4-core.md: minor, right. objectui AGENTS.md §9 版本号策略 forbids major outside the @objectstack major sync and grades objectui's own breaking changes minor with the breaking semantics in the body. Both files carry a Type changes, breaking for some consumers block naming the exact members and the migration (RegistryComponentMeta['labelling'], reload for refresh, ?. on record). The check-changeset-no-major reading and the Changeset Bump Policy / Declaration / Claim Re-read / Fixed Group check-runs are green.
  • .changeset/6349-batch4-fields.md and 6349-batch4-app-shell.md: minor, acceptable. Their src changed, so a declaration is owed (presence: 4 released packages, 4 changesets); the published .d.ts of each retargets to a core name that only exists from this release, which is a reason for a real bump rather than an empty one, and the amendment asked for minor here. Because the 39-package fixed group takes the highest bump in the set, the grade on these two is immaterial to the version number and only heads their CHANGELOG entries; each says plainly that nothing breaks for its own consumers.

③ Boundary flags

Dev report 6077109230:

  • open_questions[0] ActionResult → answered A1 by 6077155250, executed in round 2 (above).
  • open_questions[1] ComponentMeta → answered A by 6077155250, executed in round 2 (above).
  • deviation "final-commit checks outside the verify lock; full types+core suite NOT MEASURED at 9495823c2" → superseded: the addendum ran the full types+core suite at this head (566 files), and the head's own check-runs are the gate verdicts (all green).
  • deviation "data moved down, flagged for the seat's Clause-② judgement" → judged: a declared-member narrowing on the authority, covered by the types changeset's breaking note; Clause-②: yes stands.
  • out-of-scope ActionResult.refresh unread → resolved by A1 (retired). ActionExecutor (a function type returning Promise of ActionResult, no implementer) → nothing owed; it now returns the widened type. zod .d.ts ordering across cache states → informational.

Dev addendum 6077857371:

  • deviation "app-shell suite narrowed to 37 files" → covered: Test shards 1–8 on this head run the full suite and are green.
  • deviation "files beyond the amendment's list": packages/types/src/index.ts is on the original claim's barrel surface ("only for the re-point", here the amendment's one new published name); default-children-retired.test.ts is "the tests beside these" (Registry.ts). Both inside the claim as written. Every one of the 17 files is covered by 6074985223 + 6077155250; base.ts and packages/core/src/index.ts, listed in the claim, were not needed and are untouched.
  • deviation "did not merge origin/main" → mergeable_state is clean at the head; CI ran against the merge.
  • pr_body_update: the body read today carries the amendment's round-2 readings at the top, with the round-1 stop sections kept as the measurements that led to the stops; consistent with the head.
  • out-of-scope, noted for a follow-up and not blocking: packages/types/README.md:278 still describes ComponentMeta as "Metadata for component registration" (that is now core's RegistryComponentMeta); the three plugin bare-key-ownership tests cast as ComponentMeta from core with a namespace key and would be more precise as RegistryComponentMeta. No gate reads either.
  • open_questions: none.

Other facts on the card, recorded so the seat need not re-derive them:

Implemented-by: claude/issue-6349-batch4-core-types
Reviewed-by: session_01CGZy1BGCjdN5cXqL9cnvB8

VERDICT: PASS

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 9, 2026 09:19
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 9, 2026 09:19
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 9, 2026
Merged via the queue into main with commit d328698 Oct 9, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-6349-batch4-core-types branch October 9, 2026 09:37
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