Skip to content
This repository was archived by the owner on Oct 26, 2026. It is now read-only.

fix(app-shell): the translation preview draws the positions and permissions groups, at an objectstack pin that declares them (objectui#13478) - #13485

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-l2l45j
Oct 25, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-l2l45j

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

Fixes #13478
Clause-②: yes
Metadata-protocol: none

objectstack's Console Pin Gate is red on main because app-shell no longer type-checks against objectstack 47af3dde42 (objectstack-ai/objectstack#25701). That change added the positions and permissions groups to the per-app TranslationDataSchema, and TranslationPreview's CATEGORY_DEFS is exhaustive over that schema's shape by satisfies. This PR adds the two rows and moves objectui's own pin to 47af3dde42, so objectui type-checks against the same spec. Once it merges, objectstack can move its .objectui-sha past the merge commit (objectstack's own card names this one as its blocker).

What changed

  • TranslationPreview.tsx: two CATEGORY_DEFS rows, in the schema's order (after flows, before metadataForms): positions with Users and permissions with ShieldCheck, the icons PositionPreview and PermissionPreview already draw. Both are nested groups (flat: false), so each card counts the group's top-level keys and samples them with their inner key count, as objects and flows do.
  • metadata-admin/i18n.ts (the designer table, the only pack these keys live in, en and zh): engine.translationPreview.category.positions = "Positions" / "岗位" and engine.translationPreview.category.permissions = "Permission Sets" / "权限集", the words the same table already uses for the two metadata types.
  • Tests: TranslationPreview.categories-11765.test.tsx gets a spec-valid fixture for each new group (its first case requires one per schema group). adminPreviews.i18n-10862-s2.test.tsx lists the two headings among the rendered locale sites and reads coverage over 13 groups (2/13 (15%), was 2/11 (18%)).
  • Changeset .changeset/13478-translation-preview-positions-permissions.md: @object-ui/app-shell patch.

The pin

  • .objectstack-sha moves from e649c2d91e (the 18.1.0 release commit) to 47af3dde42bb4e77fd92025605b89b4a473295a4. REST compare e649c2d91e...47af3dde42: status: ahead, ahead_by: 51, behind_by: 0; the bump script also reported "(on origin/main)". It is pinned at the card's floor, not at objectstack main's head: the four commits after it on objectstack main are left for the next bump.
  • Path: scripts/bump-objectstack.sh 47af3dde42bb4e77fd92025605b89b4a473295a4 --no-commit (built and packed the 7 packages), then pnpm install.
  • What moved besides the sha: three packed manifests in .objectstack-pin/ (core, lint, spec), each only zod ^4.6.5 to ^4.6.6 (fix(deps): move zod to ^4.6.6 and clear the lockfile's high and critical advisories objectstack#25657). The lockfile already resolves zod@4.6.7, so pnpm-lock.yaml is unchanged and pnpm install --frozen-lockfile exits 0.
  • Why the rows and the pin land together (the seat's hypothesis; it held). At e649c2d91e the schema declares neither group: grep -c '^ positions: z.record' over that commit's packages/spec/src/system/translation.zod.ts reads 0, and 1 at 47af3dde42; the same for permissions. Under satisfies, an extra key in an object literal is TS2353 "Object literal may only specify known properties" (probed with this repo's tsc 6.0.3 on a two-key Record). So the rows alone fail at the old pin, and the pin alone fails as the gate does.

Clause-② reading (the claim asked for it)

The claim declares yes because the seat could not tell whether metadata-admin/i18n.ts reaches app-shell's published entry, and the two lines above are copied from the claim. Measured on the built declaration closure (packages/app-shell/dist, walking the relative imports from index.d.ts, the only exports entry with types):

  • The closure holds 182 .d.ts files. views/metadata-admin/i18n.d.ts is one of them (the positive control), but its face is t(key: string, …), tFormat(key: string, …) and the other helpers: the key table is not exported, and no key is a type.
  • Closure files that carry the string translationPreview: 0. previews/TranslationPreview.d.ts is not in the closure at all.

So the diff widens no published accept set and no public face of app-shell, and the reading is no. The declaration is the seat's, so the lines stay as claimed.

Verification (local, this worktree, at the new pin)

  • pnpm exec turbo run build --filter=@object-ui/console... --concurrency=2 (under the verify lock, 6144 MB heap): 35 of 35 tasks, including @object-ui/app-shell's tsc and the console's vite build, SDUI manifest and plugin tsc. That is the build the Console Pin Gate runs, here at objectui's own pin.
  • pnpm exec vitest run packages/app-shell/src/views/metadata-admin/ packages/types/ (under the lock): 980 files passed; 17091 tests passed, 1 skipped.
  • The three TranslationPreview test files: 63 of 63. Reverse check: with the two rows removed from TranslationPreview.tsx (on-disk count 0, back to 2 after the restore), the categories-11765 file goes red on its order-and-coverage case and on every per-group case, the two new groups included.
  • Gates, each exit 0: check:i18n-keys, check:i18n-designer-parity, check:i18n-dead-keys, check:i18n-drift, check:installed-pin-claims, check:spec-symbols, check:icon-record-names, check:control-bytes, check:new-line-citations (0 new), check-changeset-presence, check-changeset-no-major, and eslint on the four changed source files.
  • check:spec-floors: exit 1 with the same two floor-too-low findings (@object-ui/auth MEMBERSHIP_ROLE_EXTERNAL, @object-ui/types navItemVisibleDataNeedsDataSource) that tooling(objectui-readiness): make the objectui tree merge-ready in its own repo before cutover (objectstack#25685) #13472 recorded as pre-existing on main. This diff touches neither package. The gate runs on push and schedule with --cross-check, which is its measurement, and that run is green on main cd70b78.

NOT MEASURED locally (left to CI): the rest of the workspace vitest shards, lint and type-check across all packages, and e2e.

Acceptance notes

  • objectui#13477 (the label render of the same objectstack change) is a different defect; it remains open and nothing here touches it.

  • Adds no product-specific widget, dialog, hook or string (see AGENTS.md › Product-neutral renderer)

Implemented by the ui lane card thread, session https://claude.ai/code/session_01Usjyy1hT9FNxZHea9u7drp; claim on the card, comment 6391374949.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Usjyy1hT9FNxZHea9u7drp


Generated by Claude Code

…ssions groups, at an objectstack pin that declares them

objectstack 47af3dde42 added `positions` and `permissions` to the per-app
TranslationDataSchema. TranslationPreview's CATEGORY_DEFS is exhaustive by
`satisfies Record<TranslationGroup, ...>` over that schema's shape, so at that
spec app-shell no longer type-checked (TS1360, missing positions, permissions),
which is what turned objectstack's Console Pin Gate red.

- CATEGORY_DEFS gains the two rows in the schema's order (after flows, before
  metadataForms): Users for positions, ShieldCheck for permissions, the icons
  PositionPreview and PermissionPreview already use.
- The designer table gains engine.translationPreview.category.positions and
  .permissions in en ("Positions", "Permission Sets") and zh ("岗位", "权限集",
  the table's existing words for the two metadata types).
- .objectstack-sha moves e649c2d91e -> 47af3dde42 (on objectstack main, 51
  commits ahead, 0 behind). The bump repacked three manifests in
  .objectstack-pin (core, lint, spec), whose only change is zod ^4.6.5 ->
  ^4.6.6; pnpm-lock.yaml is unchanged and a frozen install passes.
- The two rows and the pin move land together: at the old pin the rows are
  excess properties under the same `satisfies`, and at the new pin the old
  table is missing two.
- Tests: the objectui#11765 fixture table gets a spec-valid entry for each new
  group, and the objectui#10862 locale sites list the two headings and read
  coverage over 13 groups.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 85 chunks) 3033.6 KB 3496.0 KB
Main entry chunk (gzip) 80.3 KB 350 KB
Entry file index-CLrfs7Ml.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 (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.41KB 7.90KB
app-shell (runtime-config.js) 24.52KB 8.48KB
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) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
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) 8.84KB 3.61KB
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.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
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) 614.94KB 150.52KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 253.04KB 70.68KB
fields (index.js) 295.90KB 75.88KB
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.17KB 11.96KB
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) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (ServerReadScope.js) 4.03KB 1.82KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.99KB 0.43KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.91KB
plugin-calendar (index.js) 55.41KB 16.19KB
plugin-charts (index.js) 88.30KB 24.33KB
plugin-chatbot (core.js) 5.22KB 2.18KB
plugin-chatbot (index.js) 237.93KB 56.26KB
plugin-dashboard (index.js) 147.15KB 39.95KB
plugin-designer (index.js) 232.83KB 50.01KB
plugin-detail (index.js) 267.21KB 71.14KB
plugin-editor (index.js) 2.21KB 1.04KB
plugin-form (index.js) 185.46KB 48.48KB
plugin-gantt (index.js) 178.19KB 45.06KB
plugin-grid (index.js) 278.30KB 77.57KB
plugin-kanban (index.js) 64.27KB 19.81KB
plugin-list (index.js) 149.60KB 39.26KB
plugin-map (index.js) 27.11KB 8.99KB
plugin-markdown (index.js) 13.79KB 4.79KB
plugin-report (index.js) 46.42KB 13.06KB
plugin-timeline (index.js) 39.30KB 11.87KB
plugin-tree (index.js) 15.25KB 5.38KB
plugin-view (index.js) 94.26KB 24.27KB
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) 129.13KB 42.23KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
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.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
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 (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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

…nd permissions groups

The pin move to objectstack 47af3dde42 adds `positions` and `permissions` to
the served document's shape (GetTranslationsResponseSchema). The console's
loadLanguage pin walks that shape and requires a payload carrying any one
group, alone, to take the transform branch; SPEC_TRANSLATION_GROUPS lacked
the two, so Test shard 16/16 went red with "positions: expected
[ 'positions' ] to deeply equal [ 'app' ]". Both groups join the list, and
the transform copies them through onto `app` like the others. The changeset
gains an @object-ui/i18n patch.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 85 chunks) 3033.6 KB 3496.0 KB
Main entry chunk (gzip) 80.3 KB 350 KB
Entry file index-DH73So6l.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 (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.41KB 7.90KB
app-shell (runtime-config.js) 24.52KB 8.48KB
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) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
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) 8.84KB 3.61KB
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.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
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) 614.94KB 150.52KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 253.04KB 70.68KB
fields (index.js) 295.90KB 75.88KB
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.17KB 11.96KB
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) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (ServerReadScope.js) 4.03KB 1.82KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.99KB 0.43KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.91KB
plugin-calendar (index.js) 55.41KB 16.19KB
plugin-charts (index.js) 88.30KB 24.33KB
plugin-chatbot (core.js) 5.22KB 2.18KB
plugin-chatbot (index.js) 237.93KB 56.26KB
plugin-dashboard (index.js) 147.15KB 39.95KB
plugin-designer (index.js) 232.83KB 50.01KB
plugin-detail (index.js) 267.21KB 71.14KB
plugin-editor (index.js) 2.21KB 1.04KB
plugin-form (index.js) 185.46KB 48.48KB
plugin-gantt (index.js) 178.19KB 45.06KB
plugin-grid (index.js) 278.30KB 77.57KB
plugin-kanban (index.js) 64.27KB 19.81KB
plugin-list (index.js) 149.60KB 39.26KB
plugin-map (index.js) 27.11KB 8.99KB
plugin-markdown (index.js) 13.79KB 4.79KB
plugin-report (index.js) 46.42KB 13.06KB
plugin-timeline (index.js) 39.30KB 11.87KB
plugin-tree (index.js) 15.25KB 5.38KB
plugin-view (index.js) 94.26KB 24.27KB
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) 129.13KB 42.23KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
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.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
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 (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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

席位核对 — ACCEPT · PR #13485 @ 762922fe230d2b770d2cdccc7b09c89cc73e0d72 · domain:ui#4 · 2026-10-25T01:28Z

Reviewer of record: session_01XWGTsmqrtrt1Zqh1ioWqsT (seat 4). Implemented-by: claude/project-thread-l2l45j (card session session_01Usjyy1hT9FNxZHea9u7drp). Card objectui#13478 (p1), claim 6391374949.

  1. Shape: draft, base main, author objectstack-fleet[bot], Fixes #13478. 10 files (+37 −5) — inside the claimed surface.
  2. Premise and pin: REST compare e649c2d91e...47af3dde42 = ahead 51, behind 0 (card session's reading). .objectstack-sha moves to exactly 47af3dde42, the card's floor; the seat's hypothesis held — at the old pin the two rows are TS2353 excess properties, so rows and pin land together. metadata-admin/i18n.ts has two packs (EN, ZH) on origin/main; both gain the two keys ("every locale pack").
  3. Gates on this head: 33 check-runs success (Lint, Type Check, Test shards 1–16 + Test, Test (dist pins), Build & E2E, Build Docs, Repo Gates, changeset family, Line Citation Gate, Governed Surface Queue Guard, Bundle Analysis, label, Live E2E (informational)); 3 skipped. mergeable_state: clean. Shard 16 was red on ff3e117 (loadLanguage.test.tsx, groups not namespaced under app), fixed here by the SPEC_TRANSLATION_GROUPS addition.
  4. Contract review: the Clause-②: yes declaration owes a TIER_DEFAULT record — the seat's record follows this comment.
  5. Accepted deviations: the PR body's "What changed" list predates the shard-16 fix and does not name packages/i18n/src/utils/spec-translations.ts; the changeset does. Not re-edited.
  6. Landing: not governed; 42 changed lines. After merge, objectstack's Console Pin Gate turns green only once objectstack moves its console pin past this merge — that is objectstack's own card (the one naming objectui#13478 as its blocker). Landing waits for the maintainer's word in this seat's project thread.

Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: TIER_DEFAULT
Head-sha: 762922fe230d2b770d2cdccc7b09c89cc73e0d72
Local-runs: none

① Derived judgments

  • The claim declared Clause-②: yes because the seat could not tell whether the two new engine.translationPreview.category.* keys reach @object-ui/app-shell's published surface. The card session measured the built declaration closure from index.d.ts (182 files): i18n.d.ts is in it but exposes only t(key: string)-style helpers, no file in the closure names translationPreview, and TranslationPreview.d.ts is outside it. Right: the keys are internal strings, no published type or accept set widens.
  • SPEC_TRANSLATION_GROUPS in @object-ui/i18n gains positions and permissions: isSpecTranslationData now recognises a served document by those two groups as well. This follows the spec's own TranslationDataSchema at the new pin (objectstack 47af3dde42, feat(spec,cli): positions and permission sets are translatable — positions and permissions in the translation bundle objectstack#25701), so it tracks the contract rather than widening it. Right.
  • CATEGORY_DEFS gains the two rows the satisfies Record<TranslationGroup, …> requires at the new pin. Right.

② Semver level

  • Changeset: @object-ui/app-shell patch, @object-ui/i18n patch, Metadata-protocol: none. No public export, prop or type changes; a recognised-shape fix and two preview rows are patch. Matches the diff. The Clause-②: yes line in the PR body and changeset is the claim's over-declaration, left as is on purpose (the measurement above reads no).

③ Boundary flags

  • The dev's one flag: the pin move dragged .objectstack-pin/{core,lint,spec}/package.json (zod ^4.6.5 → ^4.6.6) and @object-ui/i18n's group list (Test shard 16/16 red on ff3e117, fixed in this head). Both are inside the claimed "what a pin move drags with it" surface. pnpm-lock.yaml unchanged; frozen install passed.
  • No open_questions.

Implemented-by: claude/project-thread-l2l45j
Reviewed-by: session_01XWGTsmqrtrt1Zqh1ioWqsT

VERDICT: PASS

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

Projects

None yet

2 participants