Skip to content

chore(deps): track the @objectstack family at 17.0.0-rc.5 and restore green - #3568

Merged
hotlong merged 1 commit into
mainfrom
claude/issue-3560-upgrade-rc5
Aug 7, 2026
Merged

chore(deps): track the @objectstack family at 17.0.0-rc.5 and restore green#3568
hotlong merged 1 commit into
mainfrom
claude/issue-3560-upgrade-rc5

Conversation

@hotlong

@hotlong hotlong commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Fixes #3560
Fixes #3412

Bumps all 37 @objectstack/* declarations across 30 package.json files from ^17.0.0-rc.2 to ^17.0.0-rc.5 and refreshes pnpm-lock.yaml.

Note: the issue counted 36 entries (spec x31). The measured count on origin/main is 37spec x32, formula x2, client x2, lint x1. packages/plugin-grid/package.json declares spec twice (deps + devDeps), which the original count appears to have collapsed.

No split brain. The lockfile resolves exactly one copy of each of the six family packages, all at rc.5:

@objectstack/client@17.0.0-rc.5     @objectstack/formula@17.0.0-rc.5
@objectstack/core@17.0.0-rc.5       @objectstack/lint@17.0.0-rc.5
@objectstack/spec@17.0.0-rc.5       @objectstack/sdui-parser@17.0.0-rc.5

grep '17.0.0-rc.[0-46-9]' pnpm-lock.yaml returns nothing, and node_modules/.pnpm holds one directory per family package.

Bumping the pin and repairing the fallout cannot be split: the pin alone reddens CI, the code alone targets a shape that is not yet in effect.


A live bug this upgrade fixes (objectui#3412)

ObjectStackDataSource.delete() read result.deleted. @objectstack/client declared that key, but no schema has ever declared it and no server path has ever returned it on DELETE /data/:object/:id — the wire key is success. So against a real server:

  • result.deleted === undefined, the guard never fired, and a successful single delete emitted no MutationEvent — every onMutation subscriber's list kept showing the deleted row;
  • the method, declared Promise of boolean, actually resolved undefined, so if (await ds.delete(...)) always read as failure.

@objectstack/client 17.0.0-rc.5 corrects the interface to the schema's success (objectstack#5638), which is what unblocked objectui#3412 — that card was explicitly waiting on the type, not the behaviour.

The test was green because its fixture invented the same key (mockResolvedValueOnce({ deleted: true })). Replaced with the wire shape, plus the reverse pin #3412 asks for: a response spelling deleted: true must now emit nothing, so a tolerant result.success ?? result.deleted read cannot creep back.


Riders — each one repairs a break the bump lands

Rider discipline: every entry below is a compile or runtime failure caused by the upgrade. No feature-class adaptation is carried.

# Files Break it repairs
1 packages/data-objectstack/src/index.ts, onMutation.test.ts DeleteDataResult.deleted no longer exists (TS2339). objectstack#5638 / objectui#3412 — see above.
2 packages/types/src/index.ts 32 export type re-exports of the five deleted spec/ui interaction-config modules — every one TS2305 (objectstack#4988, PR objectstack#5321).
3 packages/react/src/hooks/useOffline.ts Type-imports OfflineStrategy / ConflictResolution / PersistStorage / EvictionPolicy and three typeof ...Schema — all deleted. Declared locally, verbatim.
4 packages/core/src/protocols/DndProtocol.ts, KeyboardProtocol.ts Same retirement, reached indirectly through @object-ui/types. Ten types declared locally, verbatim.
5 packages/types/src/mobile.ts Same retirement, touch half. Six types plus a SPEC_GESTURE_TYPES runtime tuple, so @object-ui/mobile's import paths are unchanged.
6 packages/core/src/protocols/SharingProtocol.ts, packages/types/src/index.ts EmbedConfig / NotificationAction retired (objectstack#5015, PR objectstack#5300). Survivors kept.
7 packages/core/src/theme/ThemeEngine.ts, theme/index.ts, packages/types/src/theme.ts, zod/theme.zod.ts, zod/index.zod.ts theme.animation / theme.zIndex / five typography groups are tombstones typed never (objectstack#5021, PR objectstack#5289) — 20 TS errors in ThemeEngine alone.
8 packages/types/src/objectql.ts, zod/objectql.zod.ts HttpMethodType / HttpMethodSchema renamed to HttpMethodSubset / HttpMethodSubsetSchema (objectstack#5832 — objectui#3499, which predicted exactly this).
9 8 parity/pin test files Their spec-side anchors vanished; see the disposition table below.
10 4 fixtures Keys that were silently stripped before are now refused: dashboard widget actionUrl/actionType/actionIcon/aria (objectstack#5010), and config.data.pageSize on the strict object arm.

Why the retired vocabulary is declared locally rather than dropped

The spec's own retirement ledger prescribes it by name:

If you consumed the bare ConflictResolution from @objectstack/spec/ui as a TYPE for your own offline code, declare that union locally — it is your client's policy, not the platform's.

None of the five deleted modules had an authoring door: no metadata document could ever carry one of these blocks, so a stack that parsed before the retirement parses byte-for-byte the same after. Every shape is moved verbatim (same keys, same members, same optionality), so no hook or bridge changes behaviour — only the provenance of its types. Deliberately not re-pointed at the spec's surviving ConnectorConflictResolution (/integration) or ConflictResolutionStrategy (/api): different concepts, different members.

Premise correction for objectui#3363

That card recorded DndProtocol.ts / KeyboardProtocol.ts as same-name local declarations that never import the spec — "命名巧合,不是耦合,不动". The measurement was taken against direct @objectstack/spec imports only. Both files reach the very same spec types indirectly, via @object-ui/types' re-export block, and both went red on this upgrade. Corrected here (rider 4) and noted in the source.


Test dispositions — each pin triaged individually

File Disposition
mobile/.../gesture-spec-parity.test.tsx Re-pointed. GestureTypeSchema gone; SPEC_GESTURE_TYPES is the same vocabulary under its new owner, so both directions still assert. Deleting it would have dropped live coverage of the #2942 bug.
react/.../offline-nav-performance-spec-parity.test.ts Mixed, and one pin INVERTED — see below.
react/.../animation-notification-spec-parity.test.tsx Two-way parity removed for the three retired anchors (comparing a set against itself is a tautology); vocabulary pinned by content instead, and the render loops — the half that actually caught #2942 — re-pointed at the local sets. The two surviving notification enums keep full two-way parity.
types/.../spec-subschema-parity.test.ts HttpMethodSchema re-pointed at HttpMethodSubsetSchema (this pin is what proves following the rename did not widen us to the 7-value enum). Animation/ZIndex pairs removed — no side left on either end.
types/.../page-nav-misc-spec-parity.test.ts Inverted, as the test designed. See below.
types/.../p1-spec-alignment.test.ts, p2-spec-exports.test.ts, phase2-schemas.test.ts, report-chart-query-spec-parity.test.ts Fixtures re-judged: retired keys removed, plus a new negative control asserting the four objectstack#5010 keys are refused by name, not stripped.
core/.../ThemeEngine.test.ts Retired-emission tests removed; negative controls added (a stale theme contributes no --duration-* / --timing-* / --z-* / --font-size-*), each paired with a positive control in the same run so it cannot pass merely because nothing was generated.
types/.../spec-ui-schema-reexports.test.ts No change needed. objectui#3362 listed it, but it is a deny-list of names asserted absent from @object-ui/types — still absent, so it still passes.

The inverted pin (objectui#3363's unlock signal)

page-nav-misc-spec-parity.test.ts asserted "the spec still owns GestureType / GestureConfig / OfflineConfig, which is why the rename happened", with this comment:

The other direction of the tripwire: if the spec RETIRES one of these, the local dialect can take the natural name back.

It fired. Those three rows now assert the spec has vacated the names, and say so in the failure message. The rename itself (TouchGestureType to GestureType, etc.) is objectui#3363's unlock item and is deliberately not done here — it is a public-surface rename across three packages and deserves its own PR and changeset.

Same shape in offline-nav-performance-spec-parity.test.ts: it asserted ConflictResolution must stay a spec export because this package merely re-exported it. rc.3 deleted it, so that assertion flips true to false. What does not change is the half that made the rename load-bearing — ConflictResolutionStrategy is still a different spec export, so the old name is still not free to take back.


Unlock survey

Verdicts are measured against the installed rc.5 package, not inferred from issue state.

Card Waits on In rc.5? Verdict
#3499 HttpMethod subset rename objectstack#5832 Yes./ui exports HttpMethodSubset(Schema); the old names are TS2305 Done in this PR. It was a required green-restoring rider, exactly as the card predicted. Closeable.
#3412 delete() reads result.deleted objectstack#5638 YesDeleteDataResult is { object, id, success } Done in this PR (forced: TS2339). Includes the reverse pin the card asked for. Closeable.
#3361 ThemeEngine stops emitting 9 retired groups objectstack#5021 Yes — all nine keys are retiredKey() tombstones Substantially done in this PR (forced: the tombstones type as never, 20 TS errors). All four of the card's items are covered incl. the positive/negative test controls. Recommend PM verify and close.
#3362 NotificationActionSchema / EmbedConfigSchema retired objectstack#5015 / PR #5300 Yes — both TS2305 Done in this PR. Two of the three named files needed changes; the third (spec-ui-schema-reexports.test.ts) needed none — see table above. Closeable.
#3363 five interaction modules retired objectstack#4988 / PR #5321 Yes — all 64 exports gone Damage half done here (all 5 couplings were forced). Unlock half still open: reclaiming the natural names GestureType/GestureConfig/OfflineConfig. Dispatchable now, re-scoped to that rename. Also carries a premise correction (see above).
#3407 record:highlights declares readonly objectstack#5176 / PR #5607 YesRecordHighlightsField parses and preserves readonly: true (was silently stripped) Unblocked, dispatchable. Nothing in this PR; it is a registry inputs change, feature-class.
#3162 any-erased symbol cluster objectstack#4171 Partly — and the premise has shifted Not simply dispatchable; needs re-triage. #4171 is closed and the any erasure IS fixed (NavigationItemSchema/FormFieldSchema/NormalizedFilterSchema are now properly typed). But JoinNode is gone from ./data entirely, and JoinedReportBlockSchema is still z.ZodTypeAny (erases to unknown). Meanwhile the objectui-side pins that actually gate admission are the structural ones objectui#3177 installed (spec visible rejects boolean, no pinned/defaultOpen, separator has no label) — those are still green, i.e. still blocking. The card's stated blocker is resolved; its real blockers are different ones.
#3502 useObjectLabel viewSuffixes objectstack#5164 N/A to the spec version Parent objectstack#5164 closed completed 2026-08-07. The card's real gate is the cli segment landing (extractor to default, showcase translation migration), not a spec pin. Likely dispatchable — recommend confirming the cli segment shipped before dispatch.
#3491 parseAiQuotaError nested envelope cloud#944 N/A It was never version-locked. It has no Blocked-by: line — it is the blocker: cloud#1168 waits on it (consumer-first). Dispatchable now, independent of rc.5.

Other Blocked-by: lines found in open objectui issues

Grepped all 26 open issues carrying the marker. Naming a framework version/PR: only the cards above, plus #3412 (found this way, and fixed here). The rest are intra-repo and unaffected by this bump: #3566 (waits on objectui#3565), #3543 (objectui#3544, #3539), #3537 (objectui#3538), #3514 (objectui#3513), #2231 (objectui#2890).


Out of scope, filed

objectui#3567FieldOperatorsSchema gained $icontains (case-insensitive contains) between rc.2 and rc.5. The server accepts the token and no builder operator can author it, so the capability is unreachable from the filter UI. Closing it needs a new builder operator with a user-visible label, i.e. a key in all ten locale packs — feature work, correctly excluded from a dependency bump. Recorded as an explicit, ratcheted exclusion rather than silently dropped: a new assertion checks every excluded token is still a real spec operator, so the exclusion cannot outlive its reason.

Locale packs: zero new keys. No rider introduced a user-visible string; pnpm check:i18n-keys reports every in-scope call-site key resolving against the en pack (2641 keys), unchanged.


Verification

Gates enumerated from this repo's .github/workflows/*.yml (not from memory). All run locally, serialized under the shared heavy-verify lock with a 4 GB heap cap.

Gate (workflow / job) Command Result
CI / Changeset Fixed Group Check node scripts/check-changeset-fixed.mjs All workspace packages in the fixed group
CI / Type Check (coverage) node scripts/check-type-check-coverage.mjs 43/45 via type-check, 0 known-broken
CI / Type Check pnpm check:spec-symbols 1207 files vs 4862 spec export names — OK
CI / Type Check pnpm check:i18n-keys Every in-scope call-site key resolves
CI / Type Check pnpm type-check:scripts clean
CI / Type Check pnpm type-check 78 successful, 78 total
CI / Type Check pnpm type-check:vitest-setup clean
CI / Test (shard 1-4) pnpm test 995 files passed, 11632 passed / 1 skipped, exit 0
Lint / Lint node scripts/check-lint-coverage.mjs 45/45 packages linted, 0 errors
Lint / Lint pnpm lint 45 successful, 45 total — 0 errors (warnings pre-existing)
Control Bytes / Control Byte Scan node scripts/check-control-bytes.mjs 3629 files scanned, OK
Changeset Guard / Bump Policy changeset declares minor, never major conforms to the fixed-group policy

Changeset shape mirrors the precedent framework-refresh PRs (#3315 rc.2, #3189 rc.1): the consuming published packages at minor, breaking semantics written FROM to TO. Never major — a major in the fixed group would push all 39 packages off objectstack's cadence.


Draft. CI must converge fully green before this is marked ready — objectui#3523 (P0) means the merge queue's required set is empty and validates nothing, so this PR's own run is the only gate.

Generated by Claude Code


Generated by Claude Code

… green

Bumps all 37 `@objectstack/*` declarations across 30 package.json from
`^17.0.0-rc.2` to `^17.0.0-rc.5` and refreshes pnpm-lock.yaml. The lockfile now
resolves exactly one copy of each of the six family packages (spec / client /
core / formula / lint / sdui-parser), all at rc.5 — no split brain.

Bumping the pin and repairing the fallout cannot be split: the pin alone reddens
CI, the code alone targets a shape that is not yet in effect.

Green-restoring riders only; every one repairs a compile or runtime break the
bump lands. No feature-class adaptation is carried.

- data-objectstack: `result.deleted` -> `result.success` (objectstack#5638,
  objectui#3412). The client declared a key no schema declares and no server
  path returns, so the guard read `undefined`: a successful single delete
  emitted NO MutationEvent and `delete()` resolved `undefined` from a
  `Promise<boolean>`. Its fixture had invented the same key, which is why the
  test was green. Fixture replaced with the wire shape, plus the reverse pin
  #3412 asks for (a `deleted: true` response must emit nothing).
- types/react/core/mobile: the five `spec/ui` interaction-config modules were
  deleted whole (objectstack#4988, PR #5321). The 32 re-exports go; each
  vocabulary is declared verbatim by its only real consumer, as the spec's own
  retirement ledger prescribes. Note DndProtocol/KeyboardProtocol DID couple to
  the spec (indirectly, via @object-ui/types) — objectui#3363 recorded them as
  uncoupled, corrected here.
- types/core: `NotificationAction` / `EmbedConfig` retired (objectstack#5015,
  PR #5300). Survivors (the three notification enums, SharingConfig) kept.
- core/types: theme `animation` / `zIndex` and five typography groups are
  tombstones (objectstack#5021, PR #5289), so ThemeEngine's emission for nine
  CSS variable groups was structurally dead; removed. Live emission untouched.
- types: `HttpMethodSchema` -> spec's `HttpMethodSubsetSchema`, `HttpMethod` ->
  `HttpMethodSubset` (objectstack#5832, objectui#3499). Runtime domain and this
  repo's exported names unchanged; deliberately NOT the 7-value `HttpMethod`.
- Fixtures re-judged individually: dashboard widget `actionUrl`/`actionType`/
  `actionIcon`/`aria` are now refused not stripped (objectstack#5010), and
  `config.data.pageSize` is refused by the strict `object` arm.

Parity tests whose spec anchor vanished are re-pointed at the vocabulary's new
owner where that still asserts something, and removed where it would only
compare a set against itself. The `page-nav-misc` tripwire INVERTED as designed:
the spec has vacated GestureType/GestureConfig/OfflineConfig, so those rows now
assert absence and name objectui#3363's reclaim as the follow-up.

Out of scope, filed: objectui#3567 (`$icontains` is new in FieldOperatorsSchema
and no builder operator can author it — needs a locale key in ten packs, so it
is feature work). Recorded as a ratcheted exclusion, not silently dropped.

Fixes #3560
Fixes #3412

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

vercel Bot commented Aug 7, 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 7, 2026 1:42pm

Request Review

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.1 KB 350 KB
Entry file index-BvL3qeMr.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) 480.72KB 105.64KB
core (index.js) 2.96KB 1.13KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 137.51KB 35.11KB
fields (index.js) 230.87KB 56.83KB
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) 26.14KB 6.07KB
i18n (useSafeTranslation.js) 4.52KB 1.96KB
layout (index.js) 38.53KB 10.71KB
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.05KB 1.53KB
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) 44.98KB 12.37KB
plugin-charts (index.js) 61.04KB 17.31KB
plugin-chatbot (index.js) 180.09KB 42.72KB
plugin-dashboard (index.js) 112.03KB 28.88KB
plugin-designer (index.js) 210.51KB 42.51KB
plugin-detail (index.js) 232.79KB 57.42KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 112.10KB 27.10KB
plugin-gantt (index.js) 162.55KB 39.57KB
plugin-grid (index.js) 186.61KB 49.34KB
plugin-kanban (index.js) 48.30KB 13.28KB
plugin-list (index.js) 105.12KB 25.48KB
plugin-map (index.js) 16.81KB 5.24KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.58KB 10.58KB
plugin-timeline (index.js) 25.76KB 7.33KB
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) 19.28KB 6.38KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.02KB 0.55KB
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.54KB 1.30KB
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

@hotlong
hotlong marked this pull request as ready for review August 7, 2026 14:35
@hotlong
hotlong added this pull request to the merge queue Aug 7, 2026
Merged via the queue into main with commit 48132f7 Aug 7, 2026
19 checks passed
@hotlong
hotlong deleted the claude/issue-3560-upgrade-rc5 branch August 7, 2026 14:36
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Aug 10, 2026
…bjectstack-ai#3363) (objectstack-ai#3600)

`@objectstack/spec` 17.0.0-rc.3 deleted the whole `ui/touch` module
(objectstack#4988, PR objectstack#5321), vacating three names objectui had
renamed away from in objectstack#4115 purely to avoid a collision. The
inverted tripwire PR objectstack-ai#3568 left in `page-nav-misc-spec-parity.test.ts` fired
and named this card as the follow-up.

Two of the three workarounds have outlived their reason and are undone:

  TouchGestureType   -> GestureType
  TouchGestureConfig -> GestureConfig

Old names are gone, not deprecated, following the precedent of the
objectstack#4115 batch that introduced them: "an alias would preserve exactly
the ambiguity being removed". The retired spec vocabulary keeps its `Spec…`
prefix, which is now the only thing distinguishing the two contracts.

`PWAOfflineConfig` is deliberately NOT reclaimed. The spec vacated
`OfflineConfig` too, but the spec was never its only claimant: that rename
was a cross-package arbitration between two objectui packages and
`@object-ui/react` won it. Since objectstack-ai#3568 declared it locally, the spec's
vacancy no longer says anything about whether the name is free -- it is not.
The tripwire now pins the `@object-ui/react` owner directly, so that reason
cannot expire unnoticed either.

Also removes two inert `DROPPED_SCHEMA_EXPORTS` entries whose spec-side names
objectstack#5015 retired (objectstack-ai#3362 residue).


Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt

Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Aug 10, 2026
…veness ratchet (objectstack-ai#3601) (objectstack-ai#3623)

The deny-list guards objectstack-ai#2561 decision (a): spec/ui zod validators are not part
of @object-ui/types' public surface. A row only asserts something while the
spec still publishes the name — once upstream retires it, nothing can
re-export it and the row passes as a tautology.

37 of 82 rows had rotted that way: objectstack#4988 / PR #5321 (32, the five
interaction-config modules), objectstack-ai#4610 (2), objectstack-ai#3494 / PR objectstack-ai#3516 (2), objectstack-ai#3896 (1).
They are deleted; the 45 rows that still guard a live spec export are
untouched.

The new ratchet asserts every remaining row resolves to a real
`@objectstack/spec/ui` export (with the Spec-prefix alias fallback the list's
own doc comment describes, load-bearing for 16 of the 45), so the next
upstream retirement fails here by name instead of waiting for an audit. Same
technique as PR objectstack-ai#3568's `$icontains` exclusion ratchet.


Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment