Skip to content

feat(app-shell,console,types)!: adopt @objectstack/spec 13 — Permission Model v2 (ADR-0090) UI fallout - #2369

Merged
os-zhuang merged 2 commits into
mainfrom
fix/adr0090-ui-tail
Jul 10, 2026
Merged

feat(app-shell,console,types)!: adopt @objectstack/spec 13 — Permission Model v2 (ADR-0090) UI fallout#2369
os-zhuang merged 2 commits into
mainfrom
fix/adr0090-ui-tail

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

What

Bumps every workspace @objectstack/spec dependency ^12.3.0^13.0.0 (the ADR-0090 Permission Model v2 major, already on npm) and fixes all UI fallout in one sweep. Closes#2365; resolves the objectui follow-ups tracked in objectstack-ai/objectstack#2696.

Why

objectui only passed CI because its dependency tree still resolved spec 12.3.0 (^12.x can't reach the v2 major). Anything vendoring framework HEAD (proaero-erp, the framework console build) hit RoleSchema does not exist at build time. The rename wave is deliberate and alias-free (launch window), so the fix is adoption, not compat.

Changes

  • clientValidation.tsrole loader → positionPositionSchema ([HIGH PRIORITY] fix(metadata-admin): RoleSchema → PositionSchema in clientValidation.ts (ADR-0090 D3) #2365); dead profile loader removed (D2)
  • Studio previewsRolePreview → flat PositionPreview (no hierarchy breadcrumb — positions are deliberately flat; no Profile copy). Legacy role/profile keys stay registered so pre-v2 backends still render
  • OWD control — dead read/read_write/full alias normalization removed (D4: spec rejects at authoring); amber "records are fully public" unset warning replaced — unset now defaults to Private (D1) and the copy (en/zh) says so
  • default-schemas / anchors / preview-samples — hierarchical role fallback schema → flat position; isProfile dropped from the permission create-anchor (would 422 against spec 13 authoring) and samples; permission viewer profile badge removed
  • Studio i18nRole/角色Position/岗位; profile label removed; Access-pillar heading "Permission sets / Profiles" → "Permission sets"; sharing hint/desc rewritten to positions vocabulary
  • console System hubsys_rolesys_position (counts + object def; the routed page was already orphaned)
  • @object-ui/types — export SubmitBehavior (defined but missing from the public surface; broke plugin-form's re-export on any uncached build)
  • Tests — OWD panel tests updated to D1/D4 semantics (alias-normalization test removed); ObjectDefaultInspector ⑤-union feature-detect test flipped (bundled spec now exports ObjectRequiredPermissionsSchema, so the toggle correctly shows)

Intentionally unchanged: flow designer approval assignee role kind — spec 13 keeps it as the sole D3 exception (better-auth sys_member.role org-membership tier, see approval.zod.ts).

Testing

  • turbo build --filter=@object-ui/app-shell... and --filter=@object-ui/console --filter=@object-ui/site green against spec 13.0.0
  • Full app-shell suite: 151 files / 1163 tests pass (the one failure was the obsolete ⑤-union premise, flipped as above); types + components suites green

🤖 Generated with Claude Code

…on Model v2 (ADR-0090) UI fallout
Bump every workspace @objectstack/spec dep to ^13.0.0 and fix the v2
fallout: position replaces role in the draft-validation loader map
(#2365), Studio previews, fallback schemas, i18n labels and the console
System hub; the profile concept (D2) is fully removed from loaders,
anchors, samples and the permission-set viewer badge; the OWD control
drops the dead read/read_write/full alias normalization (D4) and the
fully-public unset warning (unset now defaults to private, D1).
Also exports SubmitBehavior from @object-ui/types — defined but missing
from the public surface, which broke @object-ui/plugin-form's re-export
on any uncached build.
Closes#2365
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercelBot commented Jul 10, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredJul 10, 2026 3:38am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)59.7 KB350 KB
Entry fileindex-CJCkqZpN.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)7.54KB2.74KB
app-shell (runtime-config.js)5.79KB2.08KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)7.57KB2.97KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)19.11KB4.04KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)4.79KB1.88KB
auth (LoginForm.js)9.55KB3.36KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.63KB2.15KB
auth (SocialSignInButtons.js)8.89KB3.61KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)26.07KB6.30KB
auth (createAuthenticatedFetch.js)3.93KB1.55KB
auth (index.js)1.75KB0.76KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.29KB0.82KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)18.38KB4.49KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)3.65KB1.42KB
collaboration (PresenceProvider.js)2.42KB0.96KB
collaboration (index.js)1.25KB0.53KB
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)440.76KB95.04KB
core (index.js)1.65KB0.59KB
create-plugin (index.js)9.28KB2.98KB
data-objectstack (index.js)110.51KB27.26KB
fields (index.js)186.64KB45.58KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.46KB0.96KB
i18n (pickLocalized.js)1.31KB0.67KB
i18n (provider.js)5.37KB1.72KB
i18n (useObjectLabel.js)21.15KB4.68KB
i18n (useSafeTranslation.js)2.68KB0.98KB
layout (index.js)38.41KB10.65KB
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)4.42KB1.27KB
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)1.77KB0.77KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)5.09KB1.84KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.46KB1.03KB
permissions (evaluator.js)4.00KB1.23KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.50KB0.70KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)45.12KB12.34KB
plugin-charts (index.js)46.31KB13.06KB
plugin-chatbot (index.js)173.83KB41.47KB
plugin-dashboard (index.js)108.35KB26.87KB
plugin-designer (index.js)213.95KB43.04KB
plugin-detail (index.js)204.81KB49.36KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)104.12KB25.19KB
plugin-gantt (index.js)136.81KB33.91KB
plugin-grid (index.js)171.02KB45.15KB
plugin-kanban (index.js)48.16KB12.94KB
plugin-list (index.js)98.18KB23.16KB
plugin-map (index.js)16.80KB5.24KB
plugin-markdown (index.js)13.65KB4.67KB
plugin-report (index.js)37.83KB9.97KB
plugin-timeline (index.js)25.37KB7.20KB
plugin-tree (index.js)8.21KB2.76KB
plugin-view (index.js)85.47KB20.80KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.55KB0.67KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)3.19KB1.38KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)18.23KB5.97KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)0.79KB0.43KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)2.16KB0.94KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
tenant (TenantContext.js)0.31KB0.25KB
tenant (TenantGuard.js)1.04KB0.43KB
tenant (TenantProvider.js)2.76KB0.98KB
tenant (TenantScopedQuery.js)0.77KB0.44KB
tenant (index.js)0.75KB0.38KB
tenant (resolver.js)2.64KB0.76KB
tenant (useTenant.js)0.50KB0.32KB
tenant (useTenantBranding.js)0.62KB0.39KB
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 (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)0.77KB0.41KB
types (disclosure.js)0.20KB0.18KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (index.js)1.54KB0.68KB
types (layout.js)0.20KB0.18KB
types (mobile.js)0.20KB0.18KB
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 (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.26KB1.96KB
types (tenant.js)0.20KB0.18KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)0.75KB0.46KB
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

…es (ADR-0090)
Object Settings sharing card gains the externalSharingModel select
(portal/partner baseline) with an inline wider-than-internal warning
mirroring the D7 publish lint's ordering (private < public_read <
public_read_write). The permission matrix shows each object's OWD pair
as row badges — authored values or the D1 fail-closed 'Private
(default)' — so grant edits carry their record-reach context.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@os-zhuang

Copy link
Copy Markdown
ContributorAuthor

Pushed a second commit extending the PR with the two remaining pure-UI items from framework#2696's ObjectUI follow-ups:

  • External OWD dial (D11)externalSharingModel select in the object Settings sharing card, with an inline amber warning when the external baseline is wider than the internal one (same ordering the D7 publish lint enforces)
  • Permission matrix OWD badges — every object row shows its record-level baseline (OWD Public read / Ext Private / OWD Private (default) for the D1 unset case) next to the existing ADR-0066 posture badge

Tests: 1168/1168 app-shell tests green (new coverage: dial render/patch/clear, wider-warning on/off, per-row badge presence incl. the no-Ext case); console build green.

Not included (blocked on framework surfaces, flagged on the tracking issue): the isDefault install-suggestion confirm UI (no pending-suggestion/confirm API exists yet — isDefault is only read at bootstrap as the fallback set) and the explain panel (D6 explain engine is an in-process service with no REST route).

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)59.7 KB350 KB
Entry fileindex-Db0v_EnD.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)7.54KB2.74KB
app-shell (runtime-config.js)5.79KB2.08KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)7.57KB2.97KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)19.11KB4.04KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)4.79KB1.88KB
auth (LoginForm.js)9.55KB3.36KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.63KB2.15KB
auth (SocialSignInButtons.js)8.89KB3.61KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)26.07KB6.30KB
auth (createAuthenticatedFetch.js)3.93KB1.55KB
auth (index.js)1.75KB0.76KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.29KB0.82KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)18.38KB4.49KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)3.65KB1.42KB
collaboration (PresenceProvider.js)2.42KB0.96KB
collaboration (index.js)1.25KB0.53KB
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)440.76KB95.04KB
core (index.js)1.65KB0.59KB
create-plugin (index.js)9.28KB2.98KB
data-objectstack (index.js)110.51KB27.26KB
fields (index.js)186.64KB45.58KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.46KB0.96KB
i18n (pickLocalized.js)1.31KB0.67KB
i18n (provider.js)5.37KB1.72KB
i18n (useObjectLabel.js)21.15KB4.68KB
i18n (useSafeTranslation.js)2.68KB0.98KB
layout (index.js)38.41KB10.65KB
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)4.42KB1.27KB
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)1.77KB0.77KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)5.09KB1.84KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.46KB1.03KB
permissions (evaluator.js)4.00KB1.23KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.50KB0.70KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)45.12KB12.34KB
plugin-charts (index.js)46.31KB13.06KB
plugin-chatbot (index.js)173.83KB41.47KB
plugin-dashboard (index.js)108.35KB26.87KB
plugin-designer (index.js)213.95KB43.04KB
plugin-detail (index.js)204.81KB49.36KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)104.12KB25.19KB
plugin-gantt (index.js)136.81KB33.91KB
plugin-grid (index.js)171.02KB45.15KB
plugin-kanban (index.js)48.16KB12.94KB
plugin-list (index.js)98.18KB23.16KB
plugin-map (index.js)16.80KB5.24KB
plugin-markdown (index.js)13.65KB4.67KB
plugin-report (index.js)37.83KB9.97KB
plugin-timeline (index.js)25.37KB7.20KB
plugin-tree (index.js)8.21KB2.76KB
plugin-view (index.js)85.47KB20.80KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.55KB0.67KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)3.19KB1.38KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)18.23KB5.97KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)0.79KB0.43KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)2.16KB0.94KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
tenant (TenantContext.js)0.31KB0.25KB
tenant (TenantGuard.js)1.04KB0.43KB
tenant (TenantProvider.js)2.76KB0.98KB
tenant (TenantScopedQuery.js)0.77KB0.44KB
tenant (index.js)0.75KB0.38KB
tenant (resolver.js)2.64KB0.76KB
tenant (useTenant.js)0.50KB0.32KB
tenant (useTenantBranding.js)0.62KB0.39KB
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 (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)0.77KB0.41KB
types (disclosure.js)0.20KB0.18KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (index.js)1.54KB0.68KB
types (layout.js)0.20KB0.18KB
types (mobile.js)0.20KB0.18KB
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 (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.26KB1.96KB
types (tenant.js)0.20KB0.18KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)0.75KB0.46KB
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

@os-zhuang
os-zhuang merged commit 619097e into mainJul 10, 2026
10 checks passed
@os-zhuang
os-zhuang deleted the fix/adr0090-ui-tail branch July 10, 2026 04:46
Sign up for freeto 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.

[HIGH PRIORITY] fix(metadata-admin): RoleSchema → PositionSchema in clientValidation.ts (ADR-0090 D3)

1 participant

@os-zhuang