chore(deps): track the @objectstack family at 17.0.0-rc.5 and restore green - #3568
Merged
Conversation
… 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
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
hotlong
marked this pull request as ready for review
August 7, 2026 14:35
This was referenced Aug 7, 2026
Closed
Closed
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #3560
Fixes #3412
Bumps all 37
@objectstack/*declarations across 30package.jsonfiles from^17.0.0-rc.2to^17.0.0-rc.5and refreshespnpm-lock.yaml.No split brain. The lockfile resolves exactly one copy of each of the six family packages, all at rc.5:
grep '17.0.0-rc.[0-46-9]' pnpm-lock.yamlreturns nothing, andnode_modules/.pnpmholds 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()readresult.deleted.@objectstack/clientdeclared that key, but no schema has ever declared it and no server path has ever returned it onDELETE /data/:object/:id— the wire key issuccess. So against a real server:result.deleted === undefined, the guard never fired, and a successful single delete emitted noMutationEvent— everyonMutationsubscriber's list kept showing the deleted row;Promiseofboolean, actually resolvedundefined, soif (await ds.delete(...))always read as failure.@objectstack/client17.0.0-rc.5 corrects the interface to the schema'ssuccess(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 spellingdeleted: truemust now emit nothing, so a tolerantresult.success ?? result.deletedread 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.
packages/data-objectstack/src/index.ts,onMutation.test.tsDeleteDataResult.deletedno longer exists (TS2339). objectstack#5638 / objectui#3412 — see above.packages/types/src/index.tsexport typere-exports of the five deletedspec/uiinteraction-config modules — every one TS2305 (objectstack#4988, PR objectstack#5321).packages/react/src/hooks/useOffline.tsOfflineStrategy/ConflictResolution/PersistStorage/EvictionPolicyand threetypeof ...Schema— all deleted. Declared locally, verbatim.packages/core/src/protocols/DndProtocol.ts,KeyboardProtocol.ts@object-ui/types. Ten types declared locally, verbatim.packages/types/src/mobile.tsSPEC_GESTURE_TYPESruntime tuple, so@object-ui/mobile's import paths are unchanged.packages/core/src/protocols/SharingProtocol.ts,packages/types/src/index.tsEmbedConfig/NotificationActionretired (objectstack#5015, PR objectstack#5300). Survivors kept.packages/core/src/theme/ThemeEngine.ts,theme/index.ts,packages/types/src/theme.ts,zod/theme.zod.ts,zod/index.zod.tstheme.animation/theme.zIndex/ five typography groups are tombstones typednever(objectstack#5021, PR objectstack#5289) — 20 TS errors inThemeEnginealone.packages/types/src/objectql.ts,zod/objectql.zod.tsHttpMethodType/HttpMethodSchemarenamed toHttpMethodSubset/HttpMethodSubsetSchema(objectstack#5832 — objectui#3499, which predicted exactly this).actionUrl/actionType/actionIcon/aria(objectstack#5010), andconfig.data.pageSizeon the strictobjectarm.Why the retired vocabulary is declared locally rather than dropped
The spec's own retirement ledger prescribes it by name:
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) orConflictResolutionStrategy(/api): different concepts, different members.Premise correction for objectui#3363
That card recorded
DndProtocol.ts/KeyboardProtocol.tsas same-name local declarations that never import the spec — "命名巧合,不是耦合,不动". The measurement was taken against direct@objectstack/specimports 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
mobile/.../gesture-spec-parity.test.tsxGestureTypeSchemagone;SPEC_GESTURE_TYPESis 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.tsreact/.../animation-notification-spec-parity.test.tsxtypes/.../spec-subschema-parity.test.tsHttpMethodSchemare-pointed atHttpMethodSubsetSchema(this pin is what proves following the rename did not widen us to the 7-value enum).Animation/ZIndexpairs removed — no side left on either end.types/.../page-nav-misc-spec-parity.test.tstypes/.../p1-spec-alignment.test.ts,p2-spec-exports.test.ts,phase2-schemas.test.ts,report-chart-query-spec-parity.test.tscore/.../ThemeEngine.test.ts--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@object-ui/types— still absent, so it still passes.The inverted pin (objectui#3363's unlock signal)
page-nav-misc-spec-parity.test.tsasserted "the spec still ownsGestureType/GestureConfig/OfflineConfig, which is why the rename happened", with this comment:It fired. Those three rows now assert the spec has vacated the names, and say so in the failure message. The rename itself (
TouchGestureTypetoGestureType, 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 assertedConflictResolutionmust stay a spec export because this package merely re-exported it. rc.3 deleted it, so that assertion flipstruetofalse. What does not change is the half that made the rename load-bearing —ConflictResolutionStrategyis 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.
./uiexportsHttpMethodSubset(Schema); the old names are TS2305delete()readsresult.deletedDeleteDataResultis{ object, id, success }retiredKey()tombstonesnever, 20 TS errors). All four of the card's items are covered incl. the positive/negative test controls. Recommend PM verify and close.NotificationActionSchema/EmbedConfigSchemaretiredspec-ui-schema-reexports.test.ts) needed none — see table above. Closeable.GestureType/GestureConfig/OfflineConfig. Dispatchable now, re-scoped to that rename. Also carries a premise correction (see above).record:highlightsdeclaresreadonlyRecordHighlightsFieldparses and preservesreadonly: true(was silently stripped)inputschange, feature-class.any-erased symbol clusteranyerasure IS fixed (NavigationItemSchema/FormFieldSchema/NormalizedFilterSchemaare now properly typed). ButJoinNodeis gone from./dataentirely, andJoinedReportBlockSchemais stillz.ZodTypeAny(erases tounknown). Meanwhile the objectui-side pins that actually gate admission are the structural ones objectui#3177 installed (specvisiblerejects boolean, nopinned/defaultOpen, separator has nolabel) — those are still green, i.e. still blocking. The card's stated blocker is resolved; its real blockers are different ones.useObjectLabelviewSuffixesdefault, showcase translation migration), not a spec pin. Likely dispatchable — recommend confirming the cli segment shipped before dispatch.parseAiQuotaErrornested envelopeBlocked-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 issuesGrepped 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#3567 —
FieldOperatorsSchemagained$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-keysreports 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.node scripts/check-changeset-fixed.mjsnode scripts/check-type-check-coverage.mjstype-check, 0 known-brokenpnpm check:spec-symbolspnpm check:i18n-keyspnpm type-check:scriptspnpm type-checkpnpm type-check:vitest-setuppnpm testnode scripts/check-lint-coverage.mjspnpm lintnode scripts/check-control-bytes.mjsminor, nevermajorChangeset 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. Nevermajor— amajorin 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