Skip to content

retire(studio): drop the global_nav designer surfaces with the rc.6 spec bump (objectstack#7100) - #4169

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-7100-global-nav-studio-retire
Aug 11, 2026
Merged

retire(studio): drop the global_nav designer surfaces with the rc.6 spec bump (objectstack#7100)#4169
yinlianghui merged 2 commits into
mainfrom
claude/issue-7100-global-nav-studio-retire

Conversation

@yinlianghui

@yinlianghui yinlianghui commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Part of objectstack-ai/objectstack#7100 (cross-repo, so no auto-close — the PM closes the card).

Draft, and the reason is a decision, not a missing edit. The card's own work is complete and green. The @objectstack/spec 17.0.0-rc.6 bump it is coupled to is a far larger release than a lockfile move, and one consequence is a producer/consumer contract conflict whose deciding half belongs to the spec owner: #4165.

Three separable reviewable units, in the order they are easiest to read:

# Unit State
1 The global_nav retirement — the card complete, green, reverse-verified
2 The rc.6 bump + its forced repairs complete for everything mechanically forced; each move pinned
3 The blocker #4165 — gates ready, nothing else

1. The retirement (the card)

global_nav was an ACTION_LOCATIONS member no running-app surface ever rendered. The console's ⌘K palette — app-shell/src/chrome/CommandPalette.tsx — builds its groups from nav items, objects, dashboards, pages, reports, recent items, record search and theme; it holds no reference to global_nav, to actionRendersAt, or to any action-metadata source at all. So an action declaring locations: ['global_nav'] never reached a user.

The Studio designer previewed it anyway — a mock frame reading ⌘K · Command palette with the author's own button inside it. That is the sharp edge the ruling names: an authoring tool promising a surface the product does not have teaches authors, and every AI copying this corpus, to declare dead metadata.

Ruling of record, maintainer 2026-08-09 on objectstack-ai/objectstack#6888, direction 2:

Maintainer ruling (2026-08-09): direction 2 — retire global_nav.
Retire global_nav from ACTION_LOCATIONS under ADR-0087, remove the Studio designer's mock command-palette preview frame (ActionPreview.tsx) and its inspector/palette entries, update the two showcase actions that declare it, and fix the unrunnable records-forms.action-location-matrix global_nav variant in the QA checklist.

The spec half landed in objectstack-ai/objectstack#7322; ACTION_LOCATIONS is 6 members in rc.6. This is the objectui half.

Site Change
metadata-admin/previews/ActionPreview.tsx the mock ⌘K placement frame removed
metadata-admin/inspectors/ActionDefaultInspector.tsx the LOCATION_LABELS entry removed
metadata-admin/previews/block-config.ts the record:quick_actions location option removed
metadata-admin/i18n.ts the orphaned …option.location.global_nav key, in BOTH locale tables
components/renderers/action/action-bar.tsx doc comment aligned

Three judgement calls, each pinned in the source:

  • The metadata strip still echoes the declared token. Above the placement preview, ActionPreview lists whatever locations the draft carries as chips. Deliberately untouched: reporting what a possibly-stale draft says is honest, whereas the frame claimed the platform renders it. That distinction is the whole retirement, so the new tests scope their queries to the placement section — an unscoped query matches the echo and cannot tell the two apart.
  • ActionDefaultInspector's map needed no new guard. LOCATION_LABELS is typed Record< ActionLocation, string >, so the retirement arrived as a TS2353 excess-property error the moment the resolved vocabulary dropped to six. That is objectui#3017's mechanism firing as designed, and a stronger pin than any runtime test — a re-added member is a compile error too.
  • ActionEngine.getActionsForLocation is UNCHANGED. It still answers a literal string match, so asking it for 'global_nav' still returns a stale action. Narrowing it would put a second rejection point beside the schema's — the tolerant-consumer shape AGENTS.md #0.1 forbids, inverted. Enforcement stays where it belongs and both halves are pinned: the parameter type is six-membered so no type-correct caller can spell the value, and ActionLocationSchema rejects it by name with the retirement message.

Not touched: ROADMAP.md:1369 lists global_nav among the locations action:bar filtered by. That line sits under a dated, completed milestone (P2.10 … ✅) — a historical record, not a live contract statement. Called out so it reads as a decision, not an oversight.

Tests

New previews/__tests__/ActionPreview.locations.test.tsx and a new block in previews/__tests__/block-config.test.ts, converting the coverage the deleted entries carried into negative pins — each beside a positive one over the same render, so a vacuous pass needs both halves to fail at once: a live location still draws its frame / the option list still equals ACTION_LOCATIONS, and global_nav draws no frame, no Command palette mock survives, the option list omits it, and t() returns the key unchanged in both locales.

useActionEngine.test.ts keeps its stale global_nav fixture — the posture the file already takes for retired bulkEnabled / shortcut — and pins that the action leaks into none of the six live locations.

Reverse verification

Restored both removals (git checkout origin/main -- block-config.ts ActionPreview.tsx):

× does NOT draw a frame for the retired global_nav location
× renders no command-palette mock for a global_nav-only action
× offers exactly the locations the spec declares
× does NOT offer the retired global_nav location
   AssertionError: expected [ 'global_nav', 'list_item', …(5) ] to deeply equal [ 'list_item', 'list_toolbar', …(4) ]
   AssertionError: expected [ Array(7) ] to not include 'global_nav'
Test Files  2 failed (2)
     Tests  4 failed | 19 passed (23)

Direction as predicted; the 19 that stayed green are what shows the pins are not vacuous. Restored to HEAD, 54/54 green.

One measurement went the other way and is reported rather than forced: I expected getActionsForLocation('global_nav') to return []; it returns the stale action. That is correct for a vocabulary-agnostic registry, so the test pins what is true and says why, instead of the symmetric assertion that looked tidier.


2. The rc.6 bump and its forced repairs

All 37 @objectstack/* declarations across 30 package.json files move ^17.0.0-rc.5^17.0.0-rc.6; pnpm-lock.yaml resolves one copy of each family package at rc.6 (pnpm why @objectstack/spec → a single 17.0.0-rc.6). Count and shape follow this repo's last family bump, objectui#3560 / PR #3568; siblings move with spec for its stated reason — client / formula / lint pin spec exactly, so leaving them behind keeps two copies in the tree.

The bump and the removals cannot be split: at rc.5 the total Record< ActionLocation, string > is missing a key, at rc.6 it has an excess one.

What the bump actually is: diffing the resolved dist/ui/index.d.ts, 40 exports removed, 29 added — an …Input-alias retirement across ~14 vocabularies, the standalone i18n vocabulary retired with I18nLabel widened, the widget-manifest vocabulary retired, and refinements added to schemas this repo derives from. The dispatch premise was that the ranges already admitting rc.6 made this lockfile-only; falsified, and written up in #4167.

2a. Compile fallout

  • types/theme.tsThemeInput as ThemeTheme. rc.6 moved the bare name onto the input side (X = z.input, XParsed = z.infer), so the rename preserves this binding's meaning exactly. ThemeParsed would have been the silent swap: mode is required in the parsed shape because .default('auto') has run, and everything here is authoring-side.
  • types/spec-report.ts — four aliases re-pointed by SIDE: SpecReport/SpecReportChartReportParsed/ReportChartParsed, SpecReportInput/SpecReportChartInputReport/ReportChart. By name alone both pairs would have swapped.
  • types/index.ts — five retired i18n re-exports dropped. Measured dead: nothing imported them from @object-ui/types; every apparent consumer is an Intl.NumberFormat call site or @object-ui/i18n's own locally declared vocabulary. I18nLabel survives and stays bound.
  • core/ActionRunner.tsActionInput as SpecActionInputAction as SpecActionInput; all 18 SpecActionInput[…] derivations unchanged in meaning.
  • I18nLabel widened stringstring | Record< string, string >. Eight sites where such a label reaches a text slot now go through the spec's resolveI18nLabel, so the map form renders its locale instead of [object Object] — two sidebars' NavigationArea.label, six DashboardWidget.title reads. Imported as resolveInlineI18nLabel, because this repo has its OWN resolveI18nLabel over a different vocabulary (a translation-key ref { key, defaultValue, params }); neither accepts the other's shape.
  • types/zod/complex.zod.tsGlobalFilterSchema composes by spreading the spec's .shape. See unit 3: this is the forced spelling, not a resolution.

2b. Runtime fallout (found by a full vitest run, 14,615 tests)

  • Both flow-schema access paths. FlowNodeSchema became pipe-wrapped in rc.6, so .shape read undefined and two suites died on Cannot read properties of undefined. The blocks (waitEventConfig / connectorConfig / boundaryConfig) are unchanged upstream, verified by walking the wrapper — so this restores the access path, not the expectation, and a non-vacuity guard now asserts the walk resolves.
  • clientValidation.optOuts — INVERTED, and it is upstream convergence. The pin read expect(create.ok).toBe(false) on the premise that SharingRuleSchema "declares NONE of the seven ADR-0010 envelope keys". rc.6 makes it declare all seven, as ActionSchema has since rc.2, so a stamped _packageId is legal input and the create door accepts it. Pinned as accept, with a bogus-key case proving the door is still a door.
  • clientValidation.viewDiagnostics. The fixture now supplies a label: rc.6's widened I18nLabel made every label a LEAF union, which objectui#3606's ROOT-union expansion does not reach. The resulting bare Invalid input is recorded as its own pin naming I18nLabel now admits an inline per-locale map — audit every read the compiler cannot see, and give Studio a way to author one #4163 rather than papered over — teaching the mapper about leaf unions is a diagnostics design change, not a bump repair.
  • components record-picker parity. Fixture drops displayField — an ADR-0087 D2 tombstone (objectstack#5775) refused by name, which was failing all three filter assertions on the wrong key.
  • console registry parity. SPEC_SHAPE_EMPTY_ON_THE_PIN deleted exactly as its own self-clearing test instructed (rc.6 lands PageContainerProps, so children appears), with a tombstone assertion so the deletion cannot be silently undone.
  • SPEC_ACTION_KEYS gains description (rc.6 added it to ActionSchema). Inventory only — ActionDef is untouched, because whether anything should READ it is a separate question.
  • i18n residue ratchet matches const { t, … } = useObjectTranslation( by pattern; both sidebars legitimately also take language now.
  • Two spec-parity lists re-pointed. spec-ui-schema-reexports drops five deny-list rows whose names no longer exist (its own guard prescribes this). page-nav-misc-spec-parity's tripwire fired for the second time — rc.6 vacated WidgetManifest/WidgetSource, so those rows move to "the spec no longer owns", keeping the vacancy pinned. The reclaim they unlock is recorded, not taken: spec rc.6 vacated WidgetManifest / WidgetSource — the Runtime… prefixes may be reclaimed #4164.

2c. One judgement call, flagged

DashboardWidgetInspector's title editor is the single authoring read of a widened I18nLabel, and the only place where following the widening mechanically would have destroyed data: resolving a map into a single-line input and writing e.target.value back collapses every other locale on the first keystroke. The conservative branch is taken — a map-valued title renders resolved and read-only — and nothing can reach that path yet, since I18nLabel was plain string through rc.5. A placeholder, not an answer; the design is #4163 part 2.


3. The blocker — #4165

rc.6 added a refinement to GlobalFilterSchema that refuses defaultValue: { preset: 'last_7_days' } on a type: 'date' filter — the exact object form @object-ui/core's normalizeDateDefault produces and stored dashboards carry (framework#4475), and the stated reason for one of this repo's three pinned divergences.

rc.6 closed both extension doors: .extend() throws at module load ("Cannot overwrite keys on object schemas containing refinements"), and .safeExtend() types all three overridden keys (options, optionsFrom, defaultValue) as never. So a spelling change was forced. The spread used here carries the spec's fields by reference, replaces the three, and does not carry the refinement — byte-for-byte the rc.5 behaviour, so neither answer is encoded. A tripwire pins the standstill and reds from either side.

Measuring it correctly is subtle and #4165 spells it out: parsing { preset } against the bare spec schema fails on the OLD field type and the refinement never runs. It has to be isolated by widening defaultValue first — which is what the new pin does.

The two candidate resolutions and their costs are in #4165; the short form is that they differ only in who moves, and the answer is a fact about the spec owner's intent.


Still red, filed, deliberately not fixed here

Local verification

  • pnpm exec turbo run build44/44 successful (including apps/site, which is where the .safeExtend TS2322 surfaced — the earlier --filter='!@object-ui/site' pass missed it)
  • pnpm exec vitest run (whole repo) — 14,609 passed / 14,615, the 6 remaining being the two console-parity assertions above and their filed siblings
  • turbo run lint over the touched packages — 0 errors (warnings pre-existing)
  • check-changeset-presence ✅ · check-changeset-no-major ✅ · check-changeset-fixed ✅ · check-control-bytes ✅ · check-i18n-call-site-keys ✅ · check-i18n-en-drift
  • check-spec-symbols ❌ — 13 findings, all rc.6-introduced → Track the @objectstack family at 17.0.0-rc.6 — the adaptation surface beyond what objectstack#7100 could carry #4167

Generated by Claude Code

…pec bump (objectstack#7100)

`global_nav` was an `ACTION_LOCATIONS` member no running-app surface ever
rendered — the console's ⌘K palette reads no action metadata at all — and the
Studio designer previewed a mock command-palette frame for it anyway.
@objectstack/spec 17.0.0-rc.6 retired the member (objectstack#6888, maintainer
ruling 2026-08-09 direction 2); this removes the designer surfaces that outlived
it, plus the bump that makes them stop compiling.

- ActionPreview.tsx: the mock ⌘K placement frame is gone. The metadata strip
  still echoes the declared token, deliberately — reporting what a draft says is
  honest; the frame CLAIMED the platform renders it.
- ActionDefaultInspector.tsx: the `LOCATION_LABELS` entry is gone. The map is
  `Record<ActionLocation, string>`, so the retirement arrived as a compile error
  (objectui#3017's mechanism firing as designed).
- block-config.ts + both locale tables: the palette option and its now-orphaned
  i18n key.
- components' action:bar doc comment aligned (its enum is `[...ACTION_LOCATIONS]`
  and followed on its own).
- ActionEngine.getActionsForLocation is UNCHANGED: narrowing it would be a second
  rejection point beside the schema's. The type and `ActionLocationSchema` are the
  enforcement, both pinned.

The bump (all 37 `@objectstack/*` declarations, rc.5 -> rc.6) rides along because
the two cannot compile apart, and its fallout is repaired here: the `…Input` alias
retirement (types/theme, types/spec-report, core/ActionRunner), the five dead i18n
re-exports, the `I18nLabel` widening at 8 render sites, `.extend` -> `.safeExtend`
on a now-refined `GlobalFilterSchema`, and two parity lists re-pointed.

NOT green: the bump's remaining surface is out of this card's scope and filed —
objectui#4165 (contract conflict, blocks), #4167 (adaptation remainder),
#4163 (I18nLabel consumer story), #4164 (name reclaim available).

Part of objectstack-ai/objectstack#7100

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3
@vercel

vercel Bot commented Aug 10, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Aug 10, 2026 5:15pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

ℹ️ Console Performance Budget — not measured

This run did not produce a console bundle to measure, so there is no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing was measured — the numbers a real violation would carry are simply absent.

Step Outcome
Build packages failure
Check console performance budget skipped

See the workflow run for details.

No package size report: it is only generated from a complete package build, so a partial one is never shown.

… one conflict

Second pass over the @objectstack/spec 17.0.0-rc.6 bump. The first commit fixed
every COMPILE error; a full `vitest run` (14615 tests) then surfaced the runtime
half. All mechanical, each pinned; the one non-mechanical case is left as a
tripwire rather than decided.

- types/zod/complex.zod.ts: `GlobalFilterSchema` composes by spreading the spec's
  `.shape`. rc.6 closed BOTH extension doors on a now-refined schema — `.extend()`
  throws at module load, `.safeExtend()` types the three overridden keys as
  `never` (TS2322, which only `apps/site`'s build caught). The spread preserves
  rc.5 behaviour exactly and decides nothing: the refinement-vs-stored-`{preset}`
  conflict is objectui#4165, pinned by a new tripwire that reds from either side.
  The pin isolates the refinement by widening `defaultValue` first — the bare spec
  schema rejects `{preset}` on the OLD field type and the refinement never runs,
  so the obvious shorter assertion would have pinned the wrong thing.
- core/actionKeys.ts: `description` joins SPEC_ACTION_KEYS (rc.6 added it to
  `ActionSchema`). Inventory only — `ActionDef` is untouched.
- metadata-admin flow tests x2: `FlowNodeSchema` became pipe-wrapped, so `.shape`
  read `undefined`. Access-path repair (walk the wrapper); the blocks themselves
  are unchanged upstream, and a non-vacuity guard now says so.
- clientValidation.optOuts: INVERTED — rc.6 makes `SharingRuleSchema` declare the
  seven ADR-0010 envelope keys, so the create door now ACCEPTS a stamped
  `_packageId`. Upstream convergence, pinned as accept, with a bogus-key case
  proving the door is still a door.
- clientValidation.viewDiagnostics: fixture supplies a `label`; rc.6's widened
  `I18nLabel` made every label a LEAF union, which #3606's root-union expansion
  does not reach. The resulting bare `Invalid input` is recorded as its own pin
  (objectui#4163), not papered over.
- components/record-picker parity: fixture drops `displayField` — an ADR-0087 D2
  tombstone refused by name, which was failing all three `filter` assertions.
- console registry parity: `SPEC_SHAPE_EMPTY_ON_THE_PIN` deleted exactly as its
  own self-clearing test instructed (rc.6 lands `PageContainerProps`), with a
  tombstone assertion so the deletion cannot be silently undone.
- i18n residue ratchet: matches `const { t, … } = useObjectTranslation(` by
  pattern. Both sidebars legitimately also take `language` now, to resolve the
  spec's inline per-locale labels.

Still red, filed, NOT fixed here: 2 console-parity exemption-list entries and
`check:spec-symbols`' 13 name collisions (objectui#4167) — each is per-symbol
triage, not a mechanical edit — and objectui#4165, which blocks ready.

Part of objectstack-ai/objectstack#7100

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 27.9 KB 350 KB
Entry file index-CC_n1WBM.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.66KB 3.13KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
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) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.65KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 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) 485.06KB 107.21KB
core (index.js) 3.04KB 1.15KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 140.66KB 36.25KB
fields (index.js) 229.40KB 56.93KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.65KB 1.06KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 9.48KB 3.27KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 4.52KB 1.96KB
layout (index.js) 38.87KB 10.80KB
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.74KB
mobile (index.js) 1.50KB 0.62KB
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) 2.53KB 0.85KB
mobile (useResponsive.js) 0.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 45.23KB 12.45KB
plugin-charts (index.js) 61.52KB 17.49KB
plugin-chatbot (index.js) 180.33KB 42.79KB
plugin-dashboard (index.js) 118.52KB 30.68KB
plugin-designer (index.js) 210.51KB 42.51KB
plugin-detail (index.js) 237.80KB 59.48KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 114.58KB 27.68KB
plugin-gantt (index.js) 162.81KB 39.67KB
plugin-grid (index.js) 188.04KB 49.91KB
plugin-kanban (index.js) 48.60KB 13.41KB
plugin-list (index.js) 110.04KB 26.67KB
plugin-map (index.js) 17.00KB 5.32KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.58KB 10.58KB
plugin-timeline (index.js) 26.21KB 7.52KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.03KB 20.55KB
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.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 23.71KB 7.95KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.23KB 0.66KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 2.71KB 1.34KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
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 (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
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

@yinlianghui
yinlianghui marked this pull request as ready for review August 11, 2026 03:30
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 11, 2026
Merged via the queue into main with commit 38ab505 Aug 11, 2026
18 of 21 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-7100-global-nav-studio-retire branch August 11, 2026 03:30
yinlianghui pushed a commit that referenced this pull request Aug 11, 2026
Picks up the rc.6 spec bump (#4169) and the vite alias completion (#4218) so this
branch is verified against the same @objectstack/spec CI resolves.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3
yinlianghui pushed a commit that referenced this pull request Aug 11, 2026
Three residual reds on main after the rc.5→rc.6 spec bump (#4169), none of
which the train cars themselves covered.

QUICK_REFERENCE.md's "Current Release" block still quoted `^17.0.0-rc.5` for
both `@objectstack/spec` and `@objectstack/client` while every manifest it
names as its anchor declares `rc.6`. The pin test for that block
(quick-reference-current-release-4143) landed on main AFTER the train was
built, so no car ever ran against it.

recordDetailsInputs.spec-parity carried `layout: 'custom'` in both fixtures of
its object-sections case. `layout` was removed in @objectstack/spec 17.0.0
(objectstack#6946, ADR-0087 D2) and rc.6 gave it a named `never` rejection, so
the object-form fixture failed on `layout` while its `sections` were valid —
and the id-list fixture above it kept PASSING on `layout`'s own `invalid_type`
without ever reaching `sections`. Dropping the key puts both verdicts back on
`sections`; the id-list case now also pins the issue PATH, since a bare code
could not tell the two rejections apart.

AddressField re-exports `AddressValue` through its declaring module rather than
bare. main's #4222 moved the declaration into the pure `address-format` module
while this train re-sourced the type from `@objectstack/spec/data`; the merge
keeps both by importing the spec type in `address-format` (where the definition
now lives) and letting the widget re-export from there, which is the form
check:spec-symbols resolves to a declaration site instead of reading as a
second local declaration of a name the spec owns.
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