Skip to content

fix(app-shell,i18n): gate Home's authoring CTAs on the manage_metadata capability - #4654

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-8270-cta-capability-gate
Aug 14, 2026
Merged

fix(app-shell,i18n): gate Home's authoring CTAs on the manage_metadata capability#4654
yinlianghui merged 2 commits into
mainfrom
claude/issue-8270-cta-capability-gate

Conversation

@yinlianghui

@yinlianghuiyinlianghui commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator

Fixesobjectstack-ai/objectstack#8270

Implements both halves of the maintainer ruling of 2026-08-13: the capability gate on the console home, and the localized refusal at submit. The second half landed in a patch round after the PM lifted this card's file fence for one file.

Premise: verified, still valid

The dispatch flagged that the defect was measured on a stale 2026-08-12 EE deploy and that HomePage.tsx:58 already carried a cloud#816 capability check. Checked against origin/main at a99233fff:

  • The cloud#816 check gates something else entirely. agentHasCapability(agents, a.name, 'authoring') asks whether an AI agent with the authoring capability is deployed, driving the "Build with AI" CTA. It never reads the user's permissions.
  • The two ruled CTAs (HomePage.tsx:405-446 on main) were gated on isAdmin alone, and useIsWorkspaceAdmin (packages/auth/src/useIsWorkspaceAdmin.ts:42) reads rolesorg_owner is in its ADMIN_ROLES set. So the EE workspace owner from the report is isAdmin === true and saw both CTAs, exactly as filed.

The premise holds; nothing here is stale-deploy residue.

Half 1 — the home gate (c13a37f92)

The gate consumes the answer the server already gives — GET /api/v1/auth/me/permissionssystemPermissions, surfaced through MePermissionsProvider — via usePermissions().hasCapabilities(['manage_metadata']). No permission logic is re-derived client-side.

  • Build an app / Start with a template — disabled, not hidden, with the reason on screen beneath the cover and on the cards' title. A vanished primary CTA reads as a broken page; a dimmed one explains the deployment's posture.
  • Browse App Marketplace (apps-strip header) — withheld with them. It targets the same route as "Start with a template", so leaving it live would have made the gate cosmetic.
  • Build with AI — withheld. Its output is draft metadata that cannot be published without the capability. "Ask AI" is read-only and stays.
  • Zero-app admin empty state — explains the posture instead of directing the owner to "set up your first application from the Administration menu", which is the same dead end in prose.
  • New key home.build.noCapability in all ten @object-ui/i18n locale packs.

Half 2 — the localized refusal at submit (2f8631f2d)

PackageFormDialog's catch mapped 409 to a localized key and passed every other server message straight to the banner. For a session without the capability that message is the server's own English sentence, "Managing packages requires the manage_metadata capability." — measured verbatim in a zh console, which is the untranslated half of the report.

A capability arm now sits beside the 409 arm, probed the same way (the status when the transport reports one, the message when it does not). The copy states the posture rather than inviting a retry, since the deployment withholds the capability deliberately.

One deviation from the patch-round instruction, which asked for "all ten packs": this engine.* namespace does not use the ten-pack system. It resolves through the metadata-admin module-local table, which is a two-locale table (ENGINE_STRINGS_EN / ENGINE_STRINGS_ZH) read by t(key, locale). The key was added to both, matching every other engine.packages.* string — and zh is precisely the locale the defect was reported in. Routing this one key through @object-ui/i18n instead would have split the namespace across two i18n systems.

The one judgement call worth review

Unknown capabilities fail OPEN.MePermissionsProvider collapses an absentsystemPermissions (a backend predating ADR-0066) and a genuinely empty one into the same [], so a bare hasCapabilities gate would strip the product's front door from every admin on such a deployment — silently. This follows the doctrine useCapabilityGate already states for ADR-0066 gates (framework#3923): the server enforces regardless, and hiding a permitted user's button on missing client data is the worse failure. The ruled case is unaffected — the EE owner's set is non-empty (manage_org_users, setup.access, setup.write), so it gates closed. Pinned by the "fail OPEN" case in the test file. Teaching the provider to preserve absent-vs-empty is a separate follow-up the PM seat owns; packages/permissions is untouched here.

Verification — all at 2f8631f2d (the final commit)

pnpm exec vitest run packages/app-shell/src/console/home \
packages/app-shell/src/views/metadata-admin packages/i18n --maxWorkers=2
→ 217 files, 2506 passed, 1 skipped
pnpm --filter '@object-ui/app-shell^...' --filter '@object-ui/i18n^...' build → exit 0
pnpm --filter @object-ui/app-shell --filter @object-ui/i18n type-check → Done, Done
pnpm check:i18n-keys → every call-site key resolves; every literal inline
defaultValue matches the value the pack serves
pnpm check:i18n-drift → 1 key added, 0 en values changed
pnpm check:control-bytes → OK (4182 files)
pnpm check:phantom-deps → OK
eslint (touched files) → 0 errors

Correcting the first round's report: it listed pnpm --filter ... typecheck as exit 0. That script name does not exist in these packages (it is type-check), so pnpm matched nothing and the run was vacuous — it proved nothing. The hyphenated command above is a real pass, and it needed the dependency closure built first (a fresh worktree has no dist/, and without it tsc fails on TS6305 for @object-ui/core).

Reverse verification, both halves, direction predicted before running:

  • Home gate — ablated to a constant true (refactor and testids kept, so only the gate is under test): the 4 ruled-case cases plus the zero-app no-capability case should redden and the capability-held / fail-open / zero-app-held cases stay green. Observed exactly: 5 failed, 3 passed.
  • Refusal arm — arm condition ablated to false: the two localization cases plus the message-probe case should redden, while the over-broadness guard (an unrelated 500 still surfaces the server's reason) and the 409-ordering guard stay green. Observed exactly: 3 failed, 4 passed.

Both restored with git checkout from their commits; ablation markers grepped clean and git status empty each time.

The de pack's pinned quote-pairing counts move 50 to 51 for the German value's „Metadaten verwalten“ span. The invariant itself is untouched: open === close, rdq === 0, and the mismatch scan stays empty — only the literal ledger moved, with provenance added alongside the existing entries.

Generated by Claude Code

…a capability
"Build an app" and "Start with a template" were gated on
`useIsWorkspaceAdmin()`, a ROLE check. On the EE single-database multi-tenant
deployment a workspace owner is `org_owner` + `organization_admin` yet
deliberately holds no `manage_metadata`, so the most prominent CTA on their home
page led into /studio, a filled-in new-package dialog, and a raw capability
refusal at submit.
The missing grant is intended (maintainer ruling 2026-08-13: hosted tenants do
not author metadata), so the fix is presentational. Both cover cards are now
disabled with the reason shown on screen and in the tooltip; the marketplace
shortcut in the apps strip goes with them (same route, so leaving it live would
make the gate cosmetic), as does the "Build with AI" hero CTA (its output is
draft metadata that cannot be published without the capability). The zero-app
admin empty state explains the posture instead of directing the owner to build.
The gate consumes the answer /api/v1/auth/me/permissions already returns via the
permissions provider; no permission logic is re-derived client-side. Unknown
capabilities fail OPEN, the doctrine useCapabilityGate states for ADR-0066
gates: MePermissionsProvider collapses an absent `systemPermissions` into the
same `[]` an empty one produces, and reading that as denial would strip the
product's front door from every admin on a backend predating ADR-0066.
New key `home.build.noCapability` in all ten locale packs. The de pack's
pinned quote-pairing counts move 50 -> 51 for the German value's
„Metadaten verwalten“ span; the invariant itself (open === close, rdq 0) holds.
Part of objectstack-ai/objectstack#8270
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RnQd8iMMUwXQEV1crFmQiQ
@vercel

vercelBot commented Aug 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredAug 14, 2026 4:32pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)24.7 KB350 KB
Entry fileindex-4t64_KP0.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)9.56KB3.59KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)8.92KB3.41KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)25.13KB5.40KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)38.46KB10.17KB
auth (createAuthenticatedFetch.js)6.34KB2.43KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.02KB0.88KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)489.88KB108.67KB
core (index.js)3.79KB1.52KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)163.56KB44.83KB
fields (index.js)230.37KB57.17KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)3.35KB1.38KB
i18n (pickLocalized.js)3.69KB1.73KB
i18n (provider.js)23.12KB7.62KB
i18n (useDisplayLocale.js)2.84KB1.45KB
i18n (useObjectLabel.js)27.59KB6.63KB
i18n (useSafeTranslation.js)7.77KB3.13KB
layout (index.js)38.98KB10.85KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.86KB12.91KB
plugin-charts (index.js)62.10KB17.67KB
plugin-chatbot (index.js)181.21KB43.14KB
plugin-dashboard (index.js)121.84KB31.74KB
plugin-designer (index.js)212.58KB42.83KB
plugin-detail (index.js)239.93KB60.01KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)114.72KB27.70KB
plugin-gantt (index.js)164.30KB40.02KB
plugin-grid (index.js)190.02KB50.48KB
plugin-kanban (index.js)52.74KB14.53KB
plugin-list (index.js)112.01KB27.27KB
plugin-map (index.js)18.16KB5.81KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)41.38KB11.09KB
plugin-timeline (index.js)26.68KB7.66KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.09KB20.56KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)27.64KB9.44KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.26KB0.67KB
react (schema-input.js)1.45KB0.83KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)3.05KB1.52KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

The catch in PackageFormDialog mapped 409 to a localized key and passed every
other server message straight to the banner. For a session without the ADR-0066
`manage_metadata` capability that message is the server's own English sentence,
"Managing packages requires the `manage_metadata` capability." — measured
verbatim in a zh console.
Adds a capability arm beside the existing 409 arm, probed the same way (the
status when the transport reports one, the message when it does not), rendering
the new `engine.packages.noCapability` string. The deployment withholds the
capability deliberately (maintainer ruling 2026-08-13), so the copy states the
posture rather than inviting a retry.
The string is added to both tables of the metadata-admin module-local i18n
table (ENGINE_STRINGS_EN / ENGINE_STRINGS_ZH), which is the locale surface this
`engine.*` namespace uses — it is a two-locale table, not the ten-pack
@object-ui/i18n system that carries `home.build.noCapability`.
Tests pin the localized refusal in both locales, the message-probe fallback,
that an unrelated 500 still surfaces the server's reason, and that the 409 arm
still wins ahead of it.
Part of objectstack-ai/objectstack#8270
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RnQd8iMMUwXQEV1crFmQiQ
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)24.7 KB350 KB
Entry fileindex-mclcU2ZD.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)9.56KB3.59KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)8.92KB3.41KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)25.13KB5.40KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)38.46KB10.17KB
auth (createAuthenticatedFetch.js)6.34KB2.43KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.02KB0.88KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)489.91KB108.67KB
core (index.js)3.79KB1.52KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)163.56KB44.83KB
fields (index.js)230.37KB57.17KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)3.35KB1.38KB
i18n (pickLocalized.js)3.69KB1.73KB
i18n (provider.js)23.12KB7.62KB
i18n (useDisplayLocale.js)2.84KB1.45KB
i18n (useObjectLabel.js)27.59KB6.63KB
i18n (useSafeTranslation.js)7.77KB3.13KB
layout (index.js)38.98KB10.85KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.86KB12.91KB
plugin-charts (index.js)62.10KB17.67KB
plugin-chatbot (index.js)181.21KB43.14KB
plugin-dashboard (index.js)121.84KB31.74KB
plugin-designer (index.js)212.58KB42.83KB
plugin-detail (index.js)239.93KB60.01KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)114.72KB27.70KB
plugin-gantt (index.js)164.30KB40.02KB
plugin-grid (index.js)190.02KB50.48KB
plugin-kanban (index.js)52.74KB14.53KB
plugin-list (index.js)112.01KB27.27KB
plugin-map (index.js)18.16KB5.81KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)41.38KB11.09KB
plugin-timeline (index.js)26.68KB7.66KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.09KB20.56KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)27.64KB9.44KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.26KB0.67KB
react (schema-input.js)1.45KB0.83KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)3.05KB1.52KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@yinlianghui
yinlianghui marked this pull request as ready for review August 14, 2026 16:48
@yinlianghui
yinlianghui added this pull request to the merge queueAug 14, 2026
Merged via the queue into main with commit 8871c14Aug 14, 2026
21 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-8270-cta-capability-gate branch August 14, 2026 16:48
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] workspace owner lacks manage_metadata in the EE multi-org deploy, but 构建应用 is a primary home CTA — dead-ends at submit

2 participants

@yinlianghui@claude