Skip to content

feat(app-shell,types,i18n,cli)!: retire cloud:onboarding-next and cloud:plan-status (objectui#12954) - #12969

Draft
objectstack-fleet[bot] wants to merge 4 commits into
mainfrom
claude/issue-12954-retire-cloud-widgets
Draft

objectstack-fleet[bot] wants to merge 4 commits into
mainfrom
claude/issue-12954-retire-cloud-widgets

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #12954
Clause-②: no (narrowing)

Retires the two Cloud SDUI widgets cloud:onboarding-next and cloud:plan-status, everything that existed only for them, and the readers that named them. This follows the card's ruling: retire at once, with no deprecation alias and no staged window. The Cloud control plane stopped drawing both (objectstack-ai/cloud#3010 composes those pages from generic blocks), and objectui's product-neutral rule (ADR-0060) removes a product surface once its page has moved off it. useEnvironmentEntitlements stays, because the environment list and cloud:workspace-timezone-notice still read it.

Written by the dispatched os-dev agent of domain:ui seat 1, session https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks.

The consumer reading this rests on

repository ref reading read by
objectstack-ai/cloud PR #3010, merged as 94704206 replaced both widgets the card body, filed from cloud's dev report
objectstack-ai/cloud main not read: this session cannot read cloud. This is the seat's landing gate, and ACCEPT waits for it. none yet
objectstack-ai/hotcrm main 3b05ae7 0 hits for the four type strings the seat, card comment 6249167259
objectstack-ai/objectstack main 0b44840dfd CHANGELOG lines and one doc comment in packages/spec/src/ui/app.zod.ts that cites CloudOnboardingNext.tsx as an example. No registration and no console-pin use. same
objectstack-ai/objectui main 7f9cc37d every hit is listed in the reader table below this PR

Each removal, against a published surface and its consumer reading

removed where it was published consumers after this PR
cloud:onboarding-next and its twin app-shell:cloud:onboarding-next (registry keys) @object-ui/app-shell registers it at load, through a side-effect import in the entry none: cloud replaced it, and hotcrm and objectstack read 0
cloud:plan-status (registry key) same none, same reading
CloudPlanStatusSchema (TypeScript interface) the @object-ui/types entry, and a member of AnySchema none in this tree (grep 0 outside the deleted files). hotcrm and objectstack read 0 for the type string.
CloudPlanStatusSchema (zod arm) @object-ui/types/zod, and an arm of AnyComponentSchema same. objectui validate now refuses a cloud:plan-status node at type, pinned by a new case in registered-types-validate-ratchet-10859.test.ts
locale keys cloudOnboarding.* (5) and cloudPlanStatus.current all ten packs of @object-ui/i18n (./locales/* is in its exports) none: the only reads were t() calls in the two deleted widgets
four sideEffects entries, dist and src for each widget module the @object-ui/app-shell manifest not applicable: the modules are gone
navRunActionHref not published: a helper in hooks/useNavRunAction.ts, absent from the package entry, whose exports map has only . and ./styles.css its one caller was CloudOnboardingNext. Kept, it would have been dead code that this PR created.

The dispatch said app-shell "drops two exports". Measured: the @object-ui/app-shell entry never exported CloudOnboardingNext or CloudPlanStatus by name. It imported their modules for their side effects, so what this package loses is three registry keys and four sideEffects entries, not named exports. The named-export removals are in @object-ui/types: CloudPlanStatusSchema from the entry and from ./zod.

What changed

  • Deleted. console/home/CloudOnboardingNext.tsx and CloudPlanStatus.tsx, their two test files, and packages/types/src/__tests__/cloud-plan-status-arm-10919.test.ts. Outside the deleted files, the only reader of the arm test was a comment in cloud.zod.ts, which goes with the arm.
  • app-shell. Removed the two side-effect imports in src/index.ts and the four sideEffects entries.
  • types. Removed the interface from cloud.ts, the arm and its refusal string from zod/cloud.zod.ts, the export, import and union membership in index.ts and zod/index.zod.ts, and the README row (the heading now says "Cloud Widgets (1)").
  • i18n. Removed the cloudOnboarding and cloudPlanStatus blocks from all ten packs: 6 leaf keys per pack.
  • cli. Regenerated known-schema-types.ts with node scripts/regenerate-known-schema-types.mjs, not by hand. The generator dropped exactly three keys.
  • Allowlist. In product-specific.allowlist.json, removed 3 registrations, 2 files and 2 i18n namespaces (6 leaf keys), 15 lines in all. The dispatch said "down by exactly two". Measured, the live list has to equal what the ratchet measures, and that is the number of entries above. ADR-0060's frozen baseline is the ceiling and stays as it is: it is a governed surface, and the ratchet accepts a live list smaller than the ceiling.
  • Pins that moved. NAMESPACED_REFUSED_AT_TYPE went from 304 to 302. The two unarmed onboarding-next keys were refused at type. The armed cloud:plan-status left together with its arm, so it moved nothing. EXPECTED_MIRROR_PAIRS went from 206 to 205, one pair fewer.
  • Gate inputs. RULED_CONTROLS in check-sdui-registration-pins.mjs keeps two of the three keys the 2026-08-29 ruling named, and the header says why. check-side-effects-array.test.ts no longer expects CloudOnboardingNext.tsx among the registrars. In check-side-effects-array.mjs and vite-declared-lazy-views.ts, the historical measurements keep the key and note that it has retired.
  • Changeset. .changeset/12954-retire-cloud-onboarding-plan-status.md declares minor for app-shell, types, i18n and cli, never major, per AGENTS.md's version policy. It lists FROM and TO for each retired name, the consumer reading and the fix.
  • Two pending changesets, prose only. Their front matter is untouched. 11659-console-record-ux.md described the cloud:onboarding-next button and cloudOnboarding.openWorkspace as live, and now says the same release retires them. 11930-workspace-timezone-notice.md said the hook is the one that "the environment list and cloud:plan-status already use", and now names only the environment list. pnpm check:changeset-claims asks a change to correct a body that it falsifies.

Every non-CHANGELOG hit at 7f9cc37d: removed, edited or left

The dispatch pattern finds 45 files, CHANGELOGs included. The cloudOnboarding. pattern only matched en's comment, so a wider pattern that also catches the nested cloudOnboarding: { blocks adds the other nine locale packs.

file action why
the two widgets, their two tests, the arm test deleted the ruling
app-shell/src/index.ts, app-shell/package.json edited registrations and sideEffects
product-specific.allowlist.json edited the live list must equal the measurement
product-neutral-renderer.ratchet.test.ts left its hits are synthetic classifier examples ('cloudOnboarding', 'CloudPlanStatus.tsx'), not references to the code
navRunAction.privateConventionRetired.test.ts edited it read the deleted file. The file left the list, the "welcome CTA" case went with it, and the comment says why.
productBlocks-12197.test.tsx edited its control "keeps cloud:onboarding-next registered" was the rule that a surface stays until its page migrates. The page has migrated.
useEnvironmentEntitlements.oneRequest-12808.test.tsx edited the same pin, one GET per organisation, now over the readers that remain: two real cloud:workspace-timezone-notice nodes and two bare hook readers. The org-change control now reads a seed and a plan for each organisation.
useNavRunAction.ts and its test edited navRunActionHref removed (see the table above)
HomePage.approvalsTarget.test.tsx, CloudAiModelStatus.tsx, CloudWorkspaceTimezoneNotice.tsx, EnvironmentListToolbar.tsx, useEnvironmentEntitlements.ts, marketplaceApi.ts edited, comments only each named a retired widget or file as live, and this PR makes that false
cli/.../registered-types-validate-ratchet-10859.test.ts edited the armed case is gone, a refusal case is added, and the pin is lowered
known-schema-types.ts regenerated above
i18n/.../console-copy-system-noun-12956.test.ts edited, comment only its exclusion note named the family as present
the ten locale packs edited above
types: cloud.ts, zod/cloud.zod.ts, index.ts, zod/index.zod.ts, zod/README.md, zod-mirror-parity.test.ts, any-component-emit-headroom-11573.test.ts edited the arm
types/.../node-recursion-point-8344.test.ts left its hits are dated historical readings that the file says are kept as such
layout/.../resolveHref.runAction.test.ts left a past-tense history of the retired ?runAction= convention, still true
docs/adr/0060-product-neutral-renderer.md left the frozen-baseline ceiling: a governed surface, and narrowing it would be an ADR amendment
the three gate-input scripts and their two tests edited above
.changeset/11659…, .changeset/11930… edited, prose only above

HomePage.tsx, which PR #12959 touched, mounts neither widget: 0 hits.

Verification

All runs used --maxWorkers=2 or less. The head is 4f180c41. Test set B ran at d1167136, and the only difference between the two is the two pending-changeset prose lines, which no file in the set reads.

  • pnpm exec vitest run over packages/types/, packages/i18n/, app-shell console/home/, environment/, hooks/, console/blocks/, the ratchet, the runAction scan, the cli ratchet and the five gate-script suites: 585 files passed, 13,106 tests passed, 13 skipped. Lock verdict command-exit 0.
  • turbo run build --filter=@object-ui/app-shell^...: 28 of 28 tasks succeeded. Then type-check for types, i18n, cli and app-shell all exited 0. tsc -p tsconfig.test.json --listFilesOnly confirms the edited app-shell and types test files are in the compiled set.
  • node scripts/check-changeset-presence.mjs ✅, pnpm changeset:check ✅, and pnpm check:changeset-claims (report-only) ✅. Its self-contradiction reading covers 3 changesets.
  • pnpm check:side-effects-array ✅. pnpm check:sdui-registration-pins needs a built console: see the line below.
  • These also exit 0: check:new-line-citations, check:control-bytes, check:i18n-keys, check:i18n-drift, check:i18n-dead-keys, check:doc-types, check:registry-bare-names, check:prompt-keys, check:unreferenced-sources and check:pending-changeset-literals.
  • node scripts/check-governed-queue-guard.mjs --test on the 45-file list: NOT GOVERNED.
  • turbo run build --filter=@object-ui/console succeeded: 35 of 35 tasks. The declared-lazy-views plugin in that build, which is where the lazy-views check runs, printed "10/11 modules AppContent declares lazy are genuinely lazy; 1 eager, all pinned". After the build, pnpm check:sdui-registration-pins ✅: "All 18 registration(s) a sideEffects array promises are present in the built console … the 2 ruled control(s) are in the derived set". Lock verdict command-exit 0.
  • pnpm check:readme-exports ✅. It reads types/src/zod/README.md, and it ran after cli and plugin-ai were built.

Ablation (it re-adds a removed key family). At 4f180c41, ablation-replace.mjs put cloudPlanStatus: { current: 'Current plan' } back into en.ts. The anchor went 1 to 0 and the blob changed. The run was red: product-neutral-renderer.ratchet.test.ts failed "en: no key is added under a frozen namespace unless the live list carries it", and all-locales-key-parity.test.ts failed for each of the nine other packs ("missing 1 key(s): cloudPlanStatus.current"). That is 2 files and 10 tests red. The tool then restored the file, with blob equal to HEAD and an empty git diff HEAD. The rerun of the same two files: 77 passed.

Acceptance notes

  • Out of scope, release text, left as is here. In .changeset/11930-workspace-timezone-notice.md, the English example ("The workspace timezone was set to …") no longer matches en.ts ("The environment timezone was set to …"). The copy changed in PR fix(i18n): the organisation is "Organization" and the running instance is "Environment" — retire "workspace" from the console (objectui#12851) #12865 (objectui#12851), not here, and the example will publish verbatim. It is reported to the seat.
  • Update in dc7e75a4, on the seat's instruction: the 11930 example above now matches en.ts cloudWorkspaceTimezoneNotice.seeded, rendered with Asia/Shanghai.
  • Out of scope, objectstack. The doc comment in packages/spec/src/ui/app.zod.ts that cites CloudOnboardingNext.tsx becomes a stale citation once this lands. objectstack is not edited here. Its sdui.manifest.json is regenerated from objectui's registry at its next .objectui-sha bump.
  • objectui validate refuses a stale cloud:plan-status node with the union's generic type refusal, not a named tombstone. The ruling retires the type without a replacement spelling, and the objectui#12733 retirement precedent added no tombstone either.
  • Superseded in 47da571a, after contract review 6251061657: the note above no longer holds. AnyComponentSchema keeps RetiredCloudPlanStatusNodeSchema, a retiredNodeType() refusal arm (the objectui#8802 shape), so a stale cloud:plan-status node is refused by name at type with the visibleWhen remedy. It is pinned in cloud-plan-status-retired-12954.test.ts.

Generated by Claude Code

…ud:plan-status (objectui#12954)

The Cloud control plane stopped drawing both widgets (objectstack-ai/cloud#3010
composes those pages from generic blocks), so the product-specific surfaces
retire at once under the product-neutral renderer rule:

- app-shell: CloudOnboardingNext and CloudPlanStatus, their tests, their
  side-effect imports and their four sideEffects entries; the internal
  navRunActionHref helper whose only caller was CloudOnboardingNext.
- types: CloudPlanStatusSchema (TS interface, zod arm, both index exports,
  the AnyComponentSchema/AnySchema membership) and its arm test.
- i18n: cloudOnboarding.* and cloudPlanStatus.* in all ten packs.
- cli: known-schema-types regenerated (three keys dropped).
- the product-neutral allowlist, the registration-pin controls and the
  readers that named the retired files follow.

useEnvironmentEntitlements stays: the environment list and
cloud:workspace-timezone-notice still read it.

Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks
Co-authored-by: Claude <noreply@anthropic.com>
…s live

The cloud:onboarding-next and cloud:plan-status retirement lands in the
same release as these two pending changesets, which described the widgets
in the present tense. Prose only; front matter untouched.

Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 2 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/11573-any-component-emit-headroom.md

  • names packages/types/src/__tests__/any-component-emit-headroom-11573.test.ts → packages/types/src/__tests__/any-component-emit-headroom-11573.test.ts — edited by this change

    packages/types/src/__tests__/any-component-emit-headroom-11573.test.ts reads the declaration's size with the compiler's own counter, fails when it crosses a tenth of the ceiling below it, and lists every member as named or inline.

.changeset/12288-marketplace-install-mode.md

  • names marketplaceApi.ts → packages/app-shell/src/console/marketplace/marketplaceApi.ts — edited by this change

    Clause-②: yes (widening): @object-ui/i18n's ten locale packs gain nine keys under marketplace.install (mode.label, mode.managed, mode.managedHint, mode.unmanaged, mode.unmanagedHint, mode.required, unmanagedSuccess, unmanagedStrippedLocks, unmanagedIgnored). Nothing else on either package entry changes. installLocal's new optional installMode input, getDeclaredInstallModes and the LocalInstallMode / LocalInstallResult types live in marketplaceApi.ts, which ships inside dist/ but is not exported from the @object-ui/app-shell entry. MarketplacePackagePage, which is exported, keeps its props.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with 43efd078a (merge-base with origin/main): 46 file(s) changed outside .changeset/, read against 760 pending declaration(s) that publish a body (784 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 75 chunks) 3161.0 KB 3744.1 KB
Main entry chunk (gzip) 80.5 KB 350 KB
Entry file index-lCYgtM9q.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.17KB 7.81KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
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) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 612.39KB 149.02KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.83KB 69.44KB
fields (index.js) 291.72KB 74.47KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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.75KB
mobile (index.js) 1.99KB 0.87KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 55.04KB 16.10KB
plugin-charts (index.js) 85.06KB 23.39KB
plugin-chatbot (index.js) 230.81KB 54.29KB
plugin-dashboard (index.js) 147.53KB 39.95KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 266.04KB 70.50KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 181.16KB 46.84KB
plugin-gantt (index.js) 178.46KB 45.13KB
plugin-grid (index.js) 272.87KB 75.68KB
plugin-kanban (index.js) 63.37KB 19.51KB
plugin-list (index.js) 139.82KB 36.04KB
plugin-map (index.js) 27.17KB 9.00KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.31KB 11.88KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 125.37KB 41.04KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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 (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

…o en.ts

The retirement changeset gains a line-start `Clause-②: no (narrowing)`:
the change only narrows published accept sets. The pending 11930 body's
English example is now the current `cloudWorkspaceTimezoneNotice.seeded`
text from en.ts, rendered with its Asia/Shanghai zone; no other line moves.

Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 75 chunks) 3161.0 KB 3744.1 KB
Main entry chunk (gzip) 80.5 KB 350 KB
Entry file index-lCYgtM9q.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.17KB 7.81KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
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) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 612.39KB 149.02KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.83KB 69.44KB
fields (index.js) 291.72KB 74.47KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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.75KB
mobile (index.js) 1.99KB 0.87KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 55.04KB 16.10KB
plugin-charts (index.js) 85.06KB 23.39KB
plugin-chatbot (index.js) 230.81KB 54.29KB
plugin-dashboard (index.js) 147.53KB 39.95KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 266.04KB 70.50KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 181.16KB 46.84KB
plugin-gantt (index.js) 178.46KB 45.13KB
plugin-grid (index.js) 272.87KB 75.68KB
plugin-kanban (index.js) 63.37KB 19.51KB
plugin-list (index.js) 139.82KB 36.04KB
plugin-map (index.js) 27.17KB 9.00KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.31KB 11.88KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 125.37KB 41.04KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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 (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: dc7e75a4359e88efdeb4fb25d0c7fd63559ef672
Local-runs: none
Scope: packages/app-shell/package.json, packages/app-shell/src/tests/navRunAction.privateConventionRetired.test.ts, packages/app-shell/src/tests/product-specific.allowlist.json, packages/app-shell/src/console/blocks/tests/productBlocks-12197.test.tsx, packages/app-shell/src/console/diagnostics/CloudAiModelStatus.tsx, packages/app-shell/src/console/home/CloudOnboardingNext.tsx, packages/app-shell/src/console/home/CloudPlanStatus.tsx, packages/app-shell/src/console/home/CloudWorkspaceTimezoneNotice.tsx, packages/app-shell/src/console/home/tests/CloudOnboardingNext.test.tsx, packages/app-shell/src/console/home/tests/CloudPlanStatus.test.tsx, packages/app-shell/src/console/home/tests/HomePage.approvalsTarget.test.tsx, packages/app-shell/src/console/marketplace/marketplaceApi.ts, packages/app-shell/src/environment/EnvironmentListToolbar.tsx, packages/app-shell/src/environment/tests/useEnvironmentEntitlements.oneRequest-12808.test.tsx, packages/app-shell/src/environment/useEnvironmentEntitlements.ts, packages/app-shell/src/hooks/tests/useNavRunAction.test.tsx, packages/app-shell/src/hooks/useNavRunAction.ts, packages/app-shell/src/index.ts, packages/cli/src/tests/registered-types-validate-ratchet-10859.test.ts, packages/cli/src/utils/known-schema-types.ts, packages/i18n/src/tests/console-copy-system-noun-12956.test.ts, packages/i18n/src/locales/ar.ts, packages/i18n/src/locales/de.ts, packages/i18n/src/locales/en.ts, packages/i18n/src/locales/es.ts, packages/i18n/src/locales/fr.ts, packages/i18n/src/locales/ja.ts, packages/i18n/src/locales/ko.ts, packages/i18n/src/locales/pt.ts, packages/i18n/src/locales/ru.ts, packages/i18n/src/locales/zh.ts, packages/types/src/tests/any-component-emit-headroom-11573.test.ts, packages/types/src/tests/cloud-plan-status-arm-10919.test.ts, packages/types/src/tests/zod-mirror-parity.test.ts, packages/types/src/cloud.ts, packages/types/src/index.ts, packages/types/src/zod/README.md, packages/types/src/zod/cloud.zod.ts, packages/types/src/zod/index.zod.ts, scripts/tests/check-sdui-registration-pins.test.ts, scripts/tests/check-side-effects-array.test.ts, scripts/check-sdui-registration-pins.mjs, scripts/check-side-effects-array.mjs, scripts/vite-declared-lazy-views.ts + packages/types/src/zod/tombstone.zod.ts, packages/types/src/zod/complex.zod.ts, packages/types/src/tests/bare-kanban-node-key-retired-8802.test.ts, packages/types/src/tests/node-recursion-point-8344.test.ts, packages/app-shell/src/tests/product-neutral-renderer.ratchet.test.ts, packages/app-shell/src/views/ObjectView.tsx, packages/types/package.json, packages/i18n/package.json, .changeset/config.json, .changeset/12733-retire-installed-apps-view.md, scripts/check-doc-component-types.mjs (prose faces read for ② and ③: .changeset/11659-console-record-ux.md, .changeset/11930-workspace-timezone-notice.md, .changeset/12954-retire-cloud-onboarding-plan-status.md)

Inputs: card #12954 (body and all six comments), PR #12969 (body, 47-file list, net diff against main at this head; base 43efd078, merge-base 7f9cc37d), and the head's check-runs. Reads of the cited code were git show / git grep at the head and base shas in the local objectui checkout. Nothing was built, run or re-run.

Check-runs on the head: 36 total, all completed; 33 success, 3 skipped (the two coverage matrices and dependabot), 0 failure, 0 pending. The five required contexts for objectui (Repo Gates, Type Check, Test, Build & E2E, Governed Surface Queue Guard) are among the successes, as are Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check, Changeset Claim Re-read and Line Citation Gate.

① Derived judgments

Each accept-set or public-surface change the diff implies, with the verdict on it.

  1. @object-ui/app-shell registry loses cloud:onboarding-next, its twin app-shell:cloud:onboarding-next, and cloud:plan-status. The entry's two side-effect imports are gone and the modules are deleted. RIGHT. CloudOnboardingNext registered with namespace: 'app-shell' and no skipFallback, so two keys; CloudPlanStatus registered plan-status under namespace: 'cloud' with skipFallback: true, so one key. Three keys, which is what the regenerated KNOWN_SCHEMA_TYPES dropped.
  2. @object-ui/app-shell sideEffects array loses four entries (dist and src for each widget). RIGHT: the modules no longer exist, and check:side-effects-array is green inside Repo Gates. The published exports map is unchanged (. and ./styles.css).
  3. @object-ui/app-shell named exports: none removed. RIGHT, and the dispatch text was wrong. Read at base 43efd078: src/index.ts only ever imported the two modules for their side effects; neither component nor navRunActionHref was re-exported from the entry, and exports has no deep path. So the dev's correction stands: the only named-export removals are in @object-ui/types.
  4. navRunActionHref deleted from hooks/useNavRunAction.ts. RIGHT, and not a public-surface change: at base its only callers were CloudOnboardingNext.tsx and the two tests this PR edits; it was never reachable from the package entry.
  5. @object-ui/types entry loses the CloudPlanStatusSchema interface and AnySchema loses that member. RIGHT: a published TypeScript type narrows, delivered by the compiler; FROM/TO is in the changeset.
  6. @object-ui/types/zod loses the CloudPlanStatusSchema export, and AnyComponentSchema (hence StrictAnyComponentSchema and objectui validate) no longer claims the literal cloud:plan-status. Direction RIGHT, form WRONG. The literal was declared on a face (an arm of the discriminated union), so this is the case retiredNodeType() in zod/tombstone.zod.ts exists for: its docblock says it is for "the fourth case, where a face DID declare the literal", that "deleting the arm would already refuse" but "what it would NOT do is say why, or what to write instead: the union answers a missed discriminator with its own Invalid input, naming no remedy", under the maintainer ruling of 2026-09-09 on objectui#8802 (RetiredKanbanNodeSchema in zod/complex.zod.ts, pinned by bare-kanban-node-key-retired-8802.test.ts). This PR ships the remedy-free form and pins it as intended behaviour: the new cli ratchet case asserts refusedAtType('cloud:plan-status') is true, and that helper reads exactly the generic invalid_union at type. The dev's acceptance note rests on objectui#12733 having "added no tombstone either", but 12733 retired marketplace:installed-list, which no @object-ui/types face ever declared (grep of packages/types/src at the head finds no installed-apps arm), so it is the registration-only sibling case the same docblock separates from this one. The guidance the arm needs is already written in this PR's changeset ("a visibleWhen on the same summary in place of cloud:plan-status"). This is the one FAIL reason; see ③ item 6 for what moves with it.
  7. cloud:onboarding-next and its twin need no tombstone. RIGHT: neither was ever an arm on any face (registration-only), so unregistering is the whole retirement, exactly as the docblock says of gantt / kanban-ui / kanban-enhanced.
  8. @object-ui/i18n ./locales/* lose cloudOnboarding.* (5 keys) and cloudPlanStatus.current in all ten packs. RIGHT: 6 leaf keys per pack, all ten packs in the diff, and the parity suites are green in Test. The only readers were t() calls in the deleted widgets.
  9. @object-ui/cli KNOWN_SCHEMA_TYPES drops the same three keys (regenerated, not hand-edited). RIGHT; objectui check stops counting them, which the changeset states.
  10. Ratchet pins. NAMESPACED_REFUSED_AT_TYPE 304 to 302 (the two unarmed onboarding-next keys were refused at type; cloud:plan-status was armed, so it moved nothing) and EXPECTED_MIRROR_PAIRS 206 to 205: RIGHT, consistent with items 1 and 6 and green in CI.
  11. product-specific.allowlist.json loses 3 registrations, 2 files, 2 namespaces (6 keys). RIGHT: the ratchet's header says the live list "must equal the measurement exactly", so the card's "down by two" (two widgets) is 15 entries. Leaving docs/adr/0060-product-neutral-renderer.md untouched is RIGHT: the ceiling is a governed surface and by design "keeps the entry until an ADR amendment drops it".
  12. Gate inputs. RULED_CONTROLS 3 to 2 in check-sdui-registration-pins.mjs: RIGHT, the floor is anti-vacuity, still names two live controls, and the header says why one left; check-side-effects-array.test.ts no longer expects CloudOnboardingNext.tsx among registrars: RIGHT; check-side-effects-array.mjs and vite-declared-lazy-views.ts are comment-only: RIGHT.
  13. Tests that read the deleted modules. productBlocks-12197's "keeps cloud:onboarding-next registered (control)" removed (its premise, "a surface stays until its page migrates", is now satisfied by the migration); navRunAction.privateConventionRetired drops the file from its list and the "welcome CTA" case; useEnvironmentEntitlements.oneRequest-12808 re-mounts the readers that remain (two real cloud:workspace-timezone-notice nodes and two bare hook readers) and still pins one GET per organisation plus the org-change and unmount controls. All RIGHT.
  14. useEnvironmentEntitlements kept. RIGHT: at the head it is still read by CloudWorkspaceTimezoneNotice.tsx and views/ObjectView.tsx (the environment list path).
  15. Comment-only edits in seven files (CloudAiModelStatus, CloudWorkspaceTimezoneNotice, HomePage.approvalsTarget test, marketplaceApi, EnvironmentListToolbar, useEnvironmentEntitlements, console-copy-system-noun-12956 test). RIGHT: each named a retired thing as live. The residue left at the head (node-recursion-point-8344, resolveHref.runAction test, useNavRunAction header, the ratchet's classifier examples, the ADR ceiling) is dated history or synthetic input, each with its reason in the PR body; none claims the widgets are live.

② Semver level

  • Changeset .changeset/12954-retire-cloud-onboarding-plan-status.md: minor for @object-ui/app-shell, @object-ui/types, @object-ui/i18n, @object-ui/cli. That is every released package whose published source or contract field the diff touches (scripts/** publishes nothing; apps/console is untouched), all four are in the one fixed group, and major is refused by check-changeset-no-major under the version-alignment rule. The body states FROM/TO per retired name, the consumer reading, and the fix (compose from generic blocks, as cloud#3010 did). Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check and Changeset Claim Re-read are green on this head. Level and declaration match the diff.
  • Clause-②: line: Clause-②: no (narrowing) at line start on the PR body (line 2) and as the changeset's last line. Correct for a diff that widens nothing and narrows three published accept sets (the registry, the zod union, the locale packs) plus a published type; it is why this review is at CONTRACT_REVIEW_TIER on the narrowing face. The recogniser's --paths reading of the file list confirms no path decides a face and the changeset's line does.
  • Two pending changesets edited prose-only, front matter untouched: 11659 now says the same release retires the button and keys (both changesets are pending at this head, so one release consumes both: true); 11930's English example now equals en.ts cloudWorkspaceTimezoneNotice.seeded rendered with Asia/Shanghai (read at the head: it does) and no longer names cloud:plan-status as a reader.
  • No check-run on the head is pending.

③ Boundary flags

  1. open_questions 1, Clause-② yes vs no (narrowing). Answered by the seat as B (Claim 6250754815) and carried into the head: body and changeset both read no (narrowing). Right per execution-duties ("a card narrowing a published accept set is Clause-②: no") and contract-review (the narrowing face). Closed.
  2. Landing gate: the objectstack-ai/cloud main reading for the four type strings. Still absent from the card at the time of this review; neither the seat (6249167259) nor this session can read cloud (HTTP 403 on repos/objectstack-ai/cloud here too). ESCALATED, unchanged: it is the seat's declared gate before ACCEPT, the card names repo:cloud seat 2 as the reader, and this record does not clear it. A cloud hit stops the removal, as the card rules.
  3. The 11930 English example (release text). Closed in dc7e75a4 and verified against en.ts at the head.
  4. objectstack packages/spec/src/ui/app.zod.ts doc comment citing CloudOnboardingNext.tsx. Agreed: comment drift in another repository, not a defect, contract violation or authoring trap, so not a filing. ESCALATED as a one-line note for the objectstack lane to fold into the next .objectui-sha bump, where sdui.manifest.json is regenerated anyway.
  5. Widened file surface (ZONE 2) and the two dispatch corrections ("drops two exports", "allowlist down by two"). Both measured correctly (① items 3 and 11) and the seat amended the claim to the widened surface. Closed.
  6. "objectui validate refuses a stale cloud:plan-status node with the union's generic type refusal, not a named tombstone." Answered WRONG, the FAIL reason (① item 6). Owed on this head: a retiredNodeType('cloud:plan-status', guidance) arm kept in AnyComponentSchema (the RetiredKanbanNodeSchema shape in zod/complex.zod.ts), with the guidance the changeset already states, and its pin in the 8802 shape (the named custom issue at type with the remedy, beside a control that an unknown cloud: literal still gets the generic path). What moves with it, for the dev to measure rather than this record to prescribe: the new cli ratchet case (its refusedAtType reads invalid_union, which a tombstone arm does not emit, so that pin becomes a named-refusal pin), any-component-emit-headroom-11573's member list if the arm is listed there, and the zod/README.md row the way check-doc-component-types.mjs already exempts the kanban one (a retired key spelled inside a warning). zod-mirror-parity needs no TypeScript twin: its own comment says a retiredNodeType() arm "is not a mirror of anything and cannot drift". The card's "retire at once, no alias, no staged window" is unaffected: a tombstone refuses, it does not accept.
  7. Local gate claims in the report (check:readme-exports, check:sdui-registration-pins after a console build, the ablation). Not re-run here; the head's check-runs are the verdicts and are green. Noted, no action.

FAIL reason, one: the retirement of the face-declared literal cloud:plan-status lands without its retiredNodeType() arm, so objectui validate answers a remedy-free Invalid input where this repository's ruled mechanism for exactly this case answers by name with the fix (① item 6, ③ item 6). Everything else in ①, ②, ③ is right as landed; the cloud main reading (③ item 2) stays the seat's landing gate either way, and a re-review of the next head is owed on the narrowing face as before.

Implemented-by: claude/issue-12954-retire-cloud-widgets
Reviewed-by: session_0188TsgPV8kQXfuRuKmkj2ks

VERDICT: FAIL


Generated by Claude Code

…jectui#12954)

The literal was declared on a face (an AnyComponentSchema arm), so its
retirement keeps a retiredNodeType() refusal arm in the shape of
RetiredKanbanNodeSchema (objectui#8802, maintainer ruling 2026-09-09):
objectui validate now answers a stale node with a custom issue at `type`
naming the remedy (a visibleWhen on the page's summary) instead of the
union's remedy-free Invalid input.

- cloud.zod.ts: RetiredCloudPlanStatusNodeSchema, not exported from the
  barrel; index.zod.ts lists it where the arm stood.
- Pinned in cloud-plan-status-retired-12954.test.ts (the 8802 shape, with
  an unknown-cloud-literal control); the cli ratchet case becomes a
  named-refusal pin; ledger rows in arm-named-export-8784 and the
  zod-mirror-parity exclusions; the emit-headroom member list; a README
  note; the changeset states the named refusal.

Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 75 chunks) 3161.0 KB 3744.1 KB
Main entry chunk (gzip) 80.5 KB 350 KB
Entry file index-lCYgtM9q.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.17KB 7.81KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
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) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 612.39KB 149.02KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.83KB 69.44KB
fields (index.js) 291.72KB 74.47KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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.75KB
mobile (index.js) 1.99KB 0.87KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 55.04KB 16.10KB
plugin-charts (index.js) 85.06KB 23.39KB
plugin-chatbot (index.js) 230.81KB 54.29KB
plugin-dashboard (index.js) 147.53KB 39.95KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 266.04KB 70.50KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 181.16KB 46.84KB
plugin-gantt (index.js) 178.46KB 45.13KB
plugin-grid (index.js) 272.87KB 75.68KB
plugin-kanban (index.js) 63.37KB 19.51KB
plugin-list (index.js) 139.82KB 36.04KB
plugin-map (index.js) 27.17KB 9.00KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.31KB 11.88KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 125.37KB 41.04KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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 (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 47da571ac3c3f91be05feab6164426382539ac72
Local-runs: none
Scope: packages/app-shell/package.json, packages/app-shell/src/tests/navRunAction.privateConventionRetired.test.ts, packages/app-shell/src/tests/product-specific.allowlist.json, packages/app-shell/src/console/blocks/tests/productBlocks-12197.test.tsx, packages/app-shell/src/console/diagnostics/CloudAiModelStatus.tsx, packages/app-shell/src/console/home/CloudOnboardingNext.tsx, packages/app-shell/src/console/home/CloudPlanStatus.tsx, packages/app-shell/src/console/home/CloudWorkspaceTimezoneNotice.tsx, packages/app-shell/src/console/home/tests/CloudOnboardingNext.test.tsx, packages/app-shell/src/console/home/tests/CloudPlanStatus.test.tsx, packages/app-shell/src/console/home/tests/HomePage.approvalsTarget.test.tsx, packages/app-shell/src/console/marketplace/marketplaceApi.ts, packages/app-shell/src/environment/EnvironmentListToolbar.tsx, packages/app-shell/src/environment/tests/useEnvironmentEntitlements.oneRequest-12808.test.tsx, packages/app-shell/src/environment/useEnvironmentEntitlements.ts, packages/app-shell/src/hooks/tests/useNavRunAction.test.tsx, packages/app-shell/src/hooks/useNavRunAction.ts, packages/app-shell/src/index.ts, packages/cli/src/tests/registered-types-validate-ratchet-10859.test.ts, packages/cli/src/utils/known-schema-types.ts, packages/i18n/src/tests/console-copy-system-noun-12956.test.ts, packages/i18n/src/locales/ar.ts, packages/i18n/src/locales/de.ts, packages/i18n/src/locales/en.ts, packages/i18n/src/locales/es.ts, packages/i18n/src/locales/fr.ts, packages/i18n/src/locales/ja.ts, packages/i18n/src/locales/ko.ts, packages/i18n/src/locales/pt.ts, packages/i18n/src/locales/ru.ts, packages/i18n/src/locales/zh.ts, packages/types/src/tests/any-component-emit-headroom-11573.test.ts, packages/types/src/tests/arm-named-export-8784.test.ts, packages/types/src/tests/cloud-plan-status-arm-10919.test.ts, packages/types/src/tests/cloud-plan-status-retired-12954.test.ts, packages/types/src/tests/zod-mirror-parity.test.ts, packages/types/src/cloud.ts, packages/types/src/index.ts, packages/types/src/zod/README.md, packages/types/src/zod/cloud.zod.ts, packages/types/src/zod/index.zod.ts, scripts/tests/check-sdui-registration-pins.test.ts, scripts/tests/check-side-effects-array.test.ts, scripts/check-sdui-registration-pins.mjs, scripts/check-side-effects-array.mjs, scripts/vite-declared-lazy-views.ts + packages/types/src/zod/tombstone.zod.ts, packages/types/src/zod/complex.zod.ts, packages/types/src/strict-authoring-face.ts, packages/types/src/tests/bare-kanban-node-key-retired-8802.test.ts, packages/types/src/tests/node-recursion-point-8344.test.ts, packages/app-shell/src/tests/product-neutral-renderer.ratchet.test.ts, packages/app-shell/src/views/ObjectView.tsx, packages/layout/src/tests/resolveHref.runAction.test.ts, packages/types/package.json, packages/i18n/package.json, packages/cli/package.json, .changeset/config.json, .changeset/12733-retire-installed-apps-view.md, docs/adr/0060-product-neutral-renderer.md, scripts/check-doc-component-types.mjs, scripts/check-readme-exports.mjs, scripts/check-changeset-no-major.mjs, scripts/regenerate-known-schema-types.mjs (prose faces read for ② and ③: .changeset/11659-console-record-ux.md, .changeset/11930-workspace-timezone-notice.md, .changeset/12954-retire-cloud-onboarding-plan-status.md)

Inputs: card #12954 (body and all seven comments, the earlier record 6251061657 among them as an input and not a conclusion), PR #12969 (body, 49-file list, net diff against main at this head; base 43efd078, merge-base 7f9cc37d; the two main commits since the merge-base touch none of the 49 paths, mergeable_state clean), and the head's check-runs. Reads of the cited code were git show / git grep at the head and base shas in the local objectui checkout. Nothing was built, run or re-run. This is a re-review on a new head: the delta from dc7e75a4 is the one commit 47da571a (the named refusal arm, its pin, the two ledger rows, the cli case, the README note, the changeset sentence).

Check-runs on the head: 36 total, all completed; 33 success, 3 skipped (the two coverage matrices and dependabot), 0 failure, 0 pending. Repo Gates, Type Check, Lint, Test with its 16 shards and Test (dist pins), Build & E2E, Governed Surface Queue Guard, Line Citation Gate, Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check, Changeset Claim Re-read, Changeset Overwrite Report, Build Docs, Bundle Analysis and Live E2E (informational) are all among the successes.

① Derived judgments

Each accept-set or public-surface change the diff implies, with the verdict on it.

  1. @object-ui/app-shell registry loses cloud:onboarding-next, its twin app-shell:cloud:onboarding-next, and cloud:plan-status. The entry's two side-effect imports are gone and both modules are deleted. RIGHT: CloudOnboardingNext registered under namespace: 'app-shell' with no skipFallback (two keys), CloudPlanStatus registered plan-status under namespace: 'cloud' with skipFallback: true (one key). Three keys, which is exactly what the regenerated KNOWN_SCHEMA_TYPES dropped.
  2. @object-ui/app-shell sideEffects array loses four entries (dist and src for each widget), 41 to 37. RIGHT: the modules no longer exist; check:side-effects-array is green inside Repo Gates; the published exports map is unchanged (. and ./styles.css).
  3. @object-ui/app-shell named exports: none removed. RIGHT, and the dispatch text was wrong. At base 43efd078 the entry only ever imported the two modules for their side effects; neither component nor navRunActionHref was re-exported, and exports has no deep path. The only named-export removals are in @object-ui/types.
  4. navRunActionHref deleted from hooks/useNavRunAction.ts. RIGHT and not a public-surface change: at base its callers were CloudOnboardingNext.tsx and the two tests this PR edits; it was never reachable from the package entry.
  5. @object-ui/types entry loses the CloudPlanStatusSchema interface and AnySchema loses that member. RIGHT: a published TypeScript type narrows, delivered by the compiler. Pinned at compile time in the new test by Extract yielding never for the literal, with the non-vacuity twin that the surviving cloud:workspace-timezone-notice member is still selectable. FROM/TO is in the changeset.
  6. @object-ui/types/zod loses the CloudPlanStatusSchema export, and AnyComponentSchema keeps RetiredCloudPlanStatusNodeSchema, a retiredNodeType('cloud:plan-status', guidance) arm that is deliberately NOT exported from the barrel. RIGHT, and this is what closes the one FAIL reason of record 6251061657. Read in tombstone.zod.ts: retiredNodeType builds an object claiming the literal, catchall(z.unknown()), and a check that pushes one custom issue at path: ['type'] whose text is the ADR-0049 prefix plus the guidance — here the retirement and the remedy (compose from generic blocks as objectstack-ai/cloud#3010 did; a visibleWhen on the summary at GET /api/v1/cloud/home). The strict face is derived from the same union (StrictAnyComponentSchema is z.lazy over the shared walker applied to AnyComponentSchema), so objectui validate answers the same named refusal; the walker turns the catchall into z.never(), so a stale node's leftover keys become unrecognized_keys at the node and never a second custom at type, which is why both the new pin and the cli case can assert exactly one. The accept set does not move between dc7e75a4 and this head: the literal was already refused there as an unclaimed discriminator and is still refused here; only the message gained its remedy. Form matches the precedent RetiredKanbanNodeSchema in complex.zod.ts point for point: same helper, same non-export with the same barrel sentence ("it is deliberately NOT exported — nothing outside this package parses against a refusal arm"), a row in ABSENT_BY_DECISION of arm-named-export-8784 quoting that sentence, a row in EXCLUSIONS of zod-mirror-parity (that census reads every export const under src/zod/, so the row is required), and a pin in the 8802 shape. The zod output type of the union still admits the literal through the refusal arm while AnySchema does not — the same property the kanban precedent has, and the arm's docblock states that the TypeScript half of the retirement is the absence.
  7. cloud:onboarding-next and its twin need no tombstone. RIGHT: neither was ever an arm on any face (registration-only), so unregistering is the whole retirement, exactly the case retiredNodeType's docblock separates from the face-declared one.
  8. @object-ui/i18n ./locales/* lose cloudOnboarding.* (5 keys) and cloudPlanStatus.current in all ten packs. RIGHT: 6 leaf keys per pack, all ten packs in the diff, all-locales-key-parity and en-zh-key-parity green in Test. The only readers were t() calls in the deleted widgets.
  9. @object-ui/cli KNOWN_SCHEMA_TYPES drops the same three keys, regenerated by scripts/regenerate-known-schema-types.mjs from the registration calls, not hand-edited. RIGHT; objectui check stops counting them, which the changeset states.
  10. Ratchet pins. NAMESPACED_REFUSED_AT_TYPE 304 to 302: RIGHT — the two unarmed onboarding-next keys were refused at type and leave the population; cloud:plan-status was armed and leaves the population together with its arm, so it moves nothing. The rewritten cli case is now a named-refusal pin: one custom issue at type containing visibleWhen, refusedAtType('cloud:plan-status') false (no generic invalid_union at type), and the control refusedAtType('cloud:no-such-widget-12954') true. RIGHT. EXPECTED_MIRROR_PAIRS 206 to 205: RIGHT. The emit-headroom member list swaps CloudPlanStatusSchema for RetiredCloudPlanStatusNodeSchema, inline: RIGHT, and Type Check is green on the printed declaration.
  11. product-specific.allowlist.json loses 3 registrations, 2 files, 2 namespaces (6 keys). RIGHT: the ratchet's header says the live list "must equal the measurement exactly", so the card's "down by two" (two widgets) is 15 entries. Leaving docs/adr/0060-product-neutral-renderer.md untouched is RIGHT: the ceiling is a governed surface and by design "keeps the entry until an ADR amendment drops it".
  12. Gate inputs. RULED_CONTROLS 3 to 2 in check-sdui-registration-pins.mjs: RIGHT — an anti-vacuity floor, still two live controls, header says why one left. check-side-effects-array.test.ts no longer expects CloudOnboardingNext.tsx among registrars: RIGHT. check-side-effects-array.mjs and vite-declared-lazy-views.ts are comment-only: RIGHT.
  13. Tests that read the deleted modules. productBlocks-12197's control "keeps cloud:onboarding-next registered" removed (its premise, "a surface stays until its page migrates", is satisfied by the migration); navRunAction.privateConventionRetired drops the file from its list and the "welcome CTA" case; useEnvironmentEntitlements.oneRequest-12808 re-mounts the readers that remain (two real cloud:workspace-timezone-notice nodes, two bare hook readers) and still pins one GET per organisation plus the org-change control (a second seed and plan per organisation) and the unmount control. All RIGHT.
  14. useEnvironmentEntitlements kept. RIGHT: at the head it is still read by CloudWorkspaceTimezoneNotice.tsx and views/ObjectView.tsx (the environment list path), which is the card's ⛔ Keep.
  15. Comment-only edits in seven files (CloudAiModelStatus, CloudWorkspaceTimezoneNotice, HomePage.approvalsTarget test, marketplaceApi, EnvironmentListToolbar, useEnvironmentEntitlements, console-copy-system-noun-12956 test). RIGHT: each named a retired thing as live. The residue at the head (node-recursion-point-8344, resolveHref.runAction test, the useNavRunAction header, the ratchet's classifier examples, the ADR ceiling, the gate-script histories) is dated history or synthetic input; none claims the widgets are live.
  16. zod/README.md: the CloudPlanStatusSchema row removed, the heading count 2 to 1, one prose note on the refusal. RIGHT. check-doc-component-types.mjs walks packages/NAME/README.md only, so src/zod/README.md is outside its scan and no exemption is owed; check-readme-exports.mjs attributes that README to @object-ui/types and judges only its imports, which name no retired symbol. Repo Gates is green.
  17. No stale generated artifact. A loose grep at the head for plan-status / onboarding-next outside CHANGELOGs finds only the files above; packages/vscode-extension/schemas/objectui-schema.json never carried the old arm's literal, so nothing committed is generated from the union.

② Semver level

  • Changeset .changeset/12954-retire-cloud-onboarding-plan-status.md: minor for @object-ui/app-shell, @object-ui/types, @object-ui/i18n, @object-ui/cli — every released package whose published bytes the diff changes (app-shell's registry and sideEffects; types' entry and ./zod; i18n's ./locales/*; cli's dist KNOWN_SCHEMA_TYPES); scripts/** publishes nothing. All four are in the one fixed group, and major is refused by check-changeset-no-major under the version-alignment rule (objectui's own breaking changes ship as minor with the break spelled out in the body; the objectui#12733 retirement changeset is the same shape). The body states FROM/TO per retired name, the consumer reading, the fix, and at this head that the literal is refused by name with the visibleWhen remedy. Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check, Changeset Claim Re-read and Changeset Overwrite Report are green on this head. Level and declaration match the diff.
  • Clause-②: line: Clause-②: no (narrowing) at line start on the PR body (line 2) and as the changeset's last line. Correct for a diff that widens nothing and narrows five published accept sets: the app-shell registry (3 keys), the ./zod union (the literal cloud:plan-status goes from claimed to refused; CloudPlanStatusSchema no longer exported), the types entry (CloudPlanStatusSchema interface and the AnySchema member), the ten locale packs (6 keys), and KNOWN_SCHEMA_TYPES (3 keys). record-recognisers --paths over the 49-file list decides no face and defers to the changeset's Clause-②: line, which carries the (narrowing) arm, so the narrowing face and CONTRACT_REVIEW_TIER are the tier owed; this record is on that face.
  • Two pending changesets edited prose-only, front matter untouched: 11659 (patch) now says the same release retires the button and the keys — both changesets are pending at this head, so one release consumes both; 11930 (minor) names only the environment list as the hook's reader, and its English example is byte-equal to cloudWorkspaceTimezoneNotice.seeded in en.ts at the head rendered with Asia/Shanghai.
  • No check-run on the head is pending.

③ Boundary flags

  1. open_questions 1, Clause-② yes vs no (narrowing). Answered by the seat as B (Claim 6250754815) and carried into the head: body and changeset both read no (narrowing). Right per execution-duties (a card narrowing a published accept set is Clause-②: no) and contract-review (the narrowing face). Closed.
  2. Landing gate: the objectstack-ai/cloud main reading for the four type strings. Still absent from the card: seven comments, none a cloud reading. Not read here either — this record's inputs are the card, the PR and the check-runs, and the seat's own reading (6249167259) reports a 403. ESCALATED, unchanged: it is the seat's declared gate before ACCEPT, the card names repo:cloud seat 2 as the reader, and this record does not clear it. A cloud hit stops the removal, as the card rules. The premise the diff rests on (cloud PR test: fix five load-sensitive flaky tests by moving module loads out of timed windows #3010, merged as 94704206, replaced both widgets) is the card body's own reading, filed from cloud's dev report.
  3. The 11930 English example (release text). Closed in dc7e75a4, re-verified against en.ts at this head.
  4. objectstack packages/spec/src/ui/app.zod.ts doc comment citing CloudOnboardingNext.tsx. Agreed: comment drift in another repository, not a defect, contract violation or authoring trap, so not a filing. ESCALATED as a one-line note for the objectstack lane to fold into the next .objectui-sha bump, where sdui.manifest.json is regenerated anyway.
  5. Widened file surface (ZONE 2) and the two dispatch corrections ("drops two exports", "allowlist down by two"). Both measured correctly (① items 3 and 11) and the seat amended the claim to the widened surface. Closed.
  6. The named-tombstone finding of record 6251061657 (its one FAIL reason). Answered at 47da571a: RetiredCloudPlanStatusNodeSchema sits in AnyComponentSchema, is pinned in cloud-plan-status-retired-12954.test.ts (suite 1 refusal and remedy, suite 2 firing control on the surviving cloud: arm, suite 3 generic-path control on an unknown cloud: literal, plus the compile-time pins), the cli case is a named-refusal pin, both ledgers carry a row, the README and the changeset say so, and the PR body marks the earlier acceptance note as superseded. Judged RIGHT in ① items 6 and 10. Closed. The card's "retire at once, no alias, no staged window" is unaffected: the arm refuses, it does not accept.
  7. Local gate claims in the two delta reports (6250783179, 6251245259: vitest runs, type-checks, the console-build pins, the ablation) and the PR body's verification section still naming 4f180c41. Not re-run here; the head's check-runs are the verdicts and are green. Noted, no action.
  8. Residual, no action owed: the refusal guidance carries tracker references (objectui#12954, objectstack-ai/cloud#3010). This repository's refusal strings already do (handlerKeyRefusal, the former CLOUD_PLAN_STATUS_NEITHER_CHANNEL), and objectui's AGENTS.md states no rule against it; said so that objectstack's runtime-string rule is not read across the repository boundary.

Everything in ①, ②, ③ is right as landed on this head. The cloud main reading (③ item 2) stays the seat's landing gate and is not cleared by this record.

Implemented-by: claude/issue-12954-retire-cloud-widgets
Reviewed-by: session_0188TsgPV8kQXfuRuKmkj2ks

VERDICT: PASS


Generated by Claude Code

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment