Repository navigation
feat(app-shell,types,i18n,cli)!: retire cloud:onboarding-next and cloud:plan-status (objectui#12954) - #12969
feat(app-shell,types,i18n,cli)!: retire cloud:onboarding-next and cloud:plan-status (objectui#12954)#12969objectstack-fleet[bot] wants to merge 4 commits into
Conversation
…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>
|
changeset-claim-re-read
|
✅ Console Performance Budget
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
Size Limits
|
…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>
✅ Console Performance Budget
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
Size Limits
|
Contract reviewServed-tier: Inputs: card #12954 (body and all six comments), PR #12969 (body, 47-file list, net diff against Check-runs on the head: 36 total, all ① Derived judgmentsEach accept-set or public-surface change the diff implies, with the verdict on it.
② Semver level
③ Boundary flags
FAIL reason, one: the retirement of the face-declared literal Implemented-by: 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>
✅ Console Performance Budget
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
Size Limits
|
Contract reviewServed-tier: Inputs: card #12954 (body and all seven comments, the earlier record Check-runs on the head: 36 total, all ① Derived judgmentsEach accept-set or public-surface change the diff implies, with the verdict on it.
② Semver level
③ Boundary flags
Everything in ①, ②, ③ is right as landed on this head. The cloud Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #12954
Clause-②: no (narrowing)
Retires the two Cloud SDUI widgets
cloud:onboarding-nextandcloud: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.useEnvironmentEntitlementsstays, because the environment list andcloud:workspace-timezone-noticestill read it.Written by the dispatched
os-devagent ofdomain:uiseat 1, sessionhttps://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks.The consumer reading this rests on
94704206mainmain3b05ae76249167259main0b44840dfdpackages/spec/src/ui/app.zod.tsthat citesCloudOnboardingNext.tsxas an example. No registration and no console-pin use.main7f9cc37dEach removal, against a published surface and its consumer reading
cloud:onboarding-nextand its twinapp-shell:cloud:onboarding-next(registry keys)@object-ui/app-shellregisters it at load, through a side-effect import in the entrycloud:plan-status(registry key)CloudPlanStatusSchema(TypeScript interface)@object-ui/typesentry, and a member ofAnySchemaCloudPlanStatusSchema(zod arm)@object-ui/types/zod, and an arm ofAnyComponentSchemaobjectui validatenow refuses acloud:plan-statusnode attype, pinned by a new case inregistered-types-validate-ratchet-10859.test.tscloudOnboarding.*(5) andcloudPlanStatus.current@object-ui/i18n(./locales/*is in itsexports)t()calls in the two deleted widgetssideEffectsentries,distandsrcfor each widget module@object-ui/app-shellmanifestnavRunActionHrefhooks/useNavRunAction.ts, absent from the package entry, whoseexportsmap has only.and./styles.cssCloudOnboardingNext. Kept, it would have been dead code that this PR created.The dispatch said app-shell "drops two exports". Measured: the
@object-ui/app-shellentry never exportedCloudOnboardingNextorCloudPlanStatusby name. It imported their modules for their side effects, so what this package loses is three registry keys and foursideEffectsentries, not named exports. The named-export removals are in@object-ui/types:CloudPlanStatusSchemafrom the entry and from./zod.What changed
console/home/CloudOnboardingNext.tsxandCloudPlanStatus.tsx, their two test files, andpackages/types/src/__tests__/cloud-plan-status-arm-10919.test.ts. Outside the deleted files, the only reader of the arm test was a comment incloud.zod.ts, which goes with the arm.src/index.tsand the foursideEffectsentries.cloud.ts, the arm and its refusal string fromzod/cloud.zod.ts, the export, import and union membership inindex.tsandzod/index.zod.ts, and the README row (the heading now says "Cloud Widgets (1)").cloudOnboardingandcloudPlanStatusblocks from all ten packs: 6 leaf keys per pack.known-schema-types.tswithnode scripts/regenerate-known-schema-types.mjs, not by hand. The generator dropped exactly three keys.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.NAMESPACED_REFUSED_AT_TYPEwent from 304 to 302. The two unarmedonboarding-nextkeys were refused attype. The armedcloud:plan-statusleft together with its arm, so it moved nothing.EXPECTED_MIRROR_PAIRSwent from 206 to 205, one pair fewer.RULED_CONTROLSincheck-sdui-registration-pins.mjskeeps two of the three keys the 2026-08-29 ruling named, and the header says why.check-side-effects-array.test.tsno longer expectsCloudOnboardingNext.tsxamong the registrars. Incheck-side-effects-array.mjsandvite-declared-lazy-views.ts, the historical measurements keep the key and note that it has retired..changeset/12954-retire-cloud-onboarding-plan-status.mddeclaresminorfor app-shell, types, i18n and cli, nevermajor, per AGENTS.md's version policy. It lists FROM and TO for each retired name, the consumer reading and the fix.11659-console-record-ux.mddescribed thecloud:onboarding-nextbutton andcloudOnboarding.openWorkspaceas live, and now says the same release retires them.11930-workspace-timezone-notice.mdsaid the hook is the one that "the environment list andcloud:plan-statusalready use", and now names only the environment list.pnpm check:changeset-claimsasks a change to correct a body that it falsifies.Every non-CHANGELOG hit at
7f9cc37d: removed, edited or leftThe dispatch pattern finds 45 files, CHANGELOGs included. The
cloudOnboarding.pattern only matched en's comment, so a wider pattern that also catches the nestedcloudOnboarding: {blocks adds the other nine locale packs.app-shell/src/index.ts,app-shell/package.jsonsideEffectsproduct-specific.allowlist.jsonproduct-neutral-renderer.ratchet.test.ts'cloudOnboarding','CloudPlanStatus.tsx'), not references to the codenavRunAction.privateConventionRetired.test.tsproductBlocks-12197.test.tsxcloud:onboarding-nextregistered" was the rule that a surface stays until its page migrates. The page has migrated.useEnvironmentEntitlements.oneRequest-12808.test.tsxcloud:workspace-timezone-noticenodes and two bare hook readers. The org-change control now reads a seed and a plan for each organisation.useNavRunAction.tsand its testnavRunActionHrefremoved (see the table above)HomePage.approvalsTarget.test.tsx,CloudAiModelStatus.tsx,CloudWorkspaceTimezoneNotice.tsx,EnvironmentListToolbar.tsx,useEnvironmentEntitlements.ts,marketplaceApi.tscli/.../registered-types-validate-ratchet-10859.test.tsknown-schema-types.tsi18n/.../console-copy-system-noun-12956.test.tstypes: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.tstypes/.../node-recursion-point-8344.test.tslayout/.../resolveHref.runAction.test.ts?runAction=convention, still truedocs/adr/0060-product-neutral-renderer.md.changeset/11659…,.changeset/11930…HomePage.tsx, which PR #12959 touched, mounts neither widget: 0 hits.Verification
All runs used
--maxWorkers=2or less. The head is4f180c41. Test set B ran atd1167136, and the only difference between the two is the two pending-changeset prose lines, which no file in the set reads.pnpm exec vitest runoverpackages/types/,packages/i18n/,app-shellconsole/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 verdictcommand-exit 0.turbo run build --filter=@object-ui/app-shell^...: 28 of 28 tasks succeeded. Thentype-checkfor types, i18n, cli and app-shell all exited 0.tsc -p tsconfig.test.json --listFilesOnlyconfirms the edited app-shell and types test files are in the compiled set.node scripts/check-changeset-presence.mjs✅,pnpm changeset:check✅, andpnpm check:changeset-claims(report-only) ✅. Its self-contradiction reading covers 3 changesets.pnpm check:side-effects-array✅.pnpm check:sdui-registration-pinsneeds a built console: see the line below.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-sourcesandcheck:pending-changeset-literals.node scripts/check-governed-queue-guard.mjs --teston the 45-file list: NOT GOVERNED.turbo run build --filter=@object-ui/consolesucceeded: 35 of 35 tasks. Thedeclared-lazy-viewsplugin 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) asideEffectsarray promises are present in the built console … the 2 ruled control(s) are in the derived set". Lock verdictcommand-exit 0.pnpm check:readme-exports✅. It readstypes/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.mjsputcloudPlanStatus: { current: 'Current plan' }back intoen.ts. The anchor went 1 to 0 and the blob changed. The run was red:product-neutral-renderer.ratchet.test.tsfailed "en: no key is added under a frozen namespace unless the live list carries it", andall-locales-key-parity.test.tsfailed 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 emptygit diff HEAD. The rerun of the same two files: 77 passed.Acceptance notes
.changeset/11930-workspace-timezone-notice.md, the English example ("The workspace timezone was set to …") no longer matchesen.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.dc7e75a4, on the seat's instruction: the 11930 example above now matchesen.tscloudWorkspaceTimezoneNotice.seeded, rendered withAsia/Shanghai.packages/spec/src/ui/app.zod.tsthat citesCloudOnboardingNext.tsxbecomes a stale citation once this lands. objectstack is not edited here. Itssdui.manifest.jsonis regenerated from objectui's registry at its next.objectui-shabump.objectui validaterefuses a stalecloud:plan-statusnode with the union's generictyperefusal, not a named tombstone. The ruling retires the type without a replacement spelling, and the objectui#12733 retirement precedent added no tombstone either.47da571a, after contract review6251061657: the note above no longer holds.AnyComponentSchemakeepsRetiredCloudPlanStatusNodeSchema, aretiredNodeType()refusal arm (the objectui#8802 shape), so a stalecloud:plan-statusnode is refused by name attypewith thevisibleWhenremedy. It is pinned incloud-plan-status-retired-12954.test.ts.Generated by Claude Code