Repository navigation
feat(app-shell,types,i18n,cli): cloud:workspace-timezone-notice names the seeded workspace timezone on the welcome page (objectui#11930) - #11960
Conversation
… the seeded workspace timezone on the welcome page (objectui#11930) The widget reads the additive `workspaceTimezoneSeed` from the org-scoped entitlements summary through `useEnvironmentEntitlements` and renders one muted line naming it, or nothing when the summary carries no seed. Registered as `cloud:workspace-timezone-notice` with its `@object-ui/types` arm, its `sideEffects` entries, a known-schema-types row and one copy key in every locale pack. Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 Co-authored-by: Claude <noreply@anthropic.com>
…, its empty states, its arm and its known-type row (objectui#11930) Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 Co-authored-by: Claude <noreply@anthropic.com>
…er's not-a-container warning, as every family-D refusal does (objectui#11930) Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 Co-authored-by: Claude <noreply@anthropic.com>
…ned surfaces (objectui#11930) Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 Co-authored-by: Claude <noreply@anthropic.com>
…-notice Brings in the eager-budget rollback (3c888c6), the 5,120-byte allowance (1c51e97), objectui#11895, #11898, #11925, #6152 round 7, #11168, #11389 and #11923. No conflict; zod-mirror-parity.test.ts auto-merged. Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 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
|
Contract reviewServed-tier: Inputs: card #11930 (body and all four comments: claim ① Derived judgmentsEvery accept-set and public-surface change the diff implies, each judged:
File surface: all 27 files in the net diff are named by the claim ② Semver level
One divergence from the precedent, judged in this PR's favour: ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #11930
Clause-②: yes
The objectui half of objectstack-ai/cloud#2676 step 3. A registered SDUI widget,
cloud:workspace-timezone-notice, prints one line on the Cloud welcome page naming the timezone a workspace was seeded with at creation. It reads the additiveworkspaceTimezoneSeedfrom the org-scopedGET /api/v1/cloud/environment-entitlementssummary, the onecloud:plan-statusand the environment list already read. It renders nothing when that field is absent.File surface. The claim (
6057491447) was amended by the seat in6058827980(option A), after the dev's stop report6058785780. The amendment addspackages/app-shell/package.json(sideEffectsonly),packages/app-shell/src/environment/entitlements.ts, the@object-ui/typesarm files and their tests, and one row of the CLI ratchet. It also adds@object-ui/types(minor) to theClause-②widening. Precedent:24d3e656(objectui#10990,cloud:plan-status) touched the same file set.Every widening, checkable from this body
Spelling note: the platform sanitizer eats angle-bracket fragments, so generics are written in words below ("
Recordofstringtonever").1. Language-pack key —
@object-ui/i18n(minor)One new key,
cloudWorkspaceTimezoneNotice.seeded, in all ten packs (ar de en es fr ja ko pt ru zh). Each pack has one interpolation, the i18next placeholder namedzone, which is written as ZONE below. No other key was added, changed or removed.zone)The zone is printed verbatim: it is an IANA id, and no
Intlcall formats it. Each pack reuses its own existing vocabulary for "workspace timezone", taken from itsworkspaceTimezonePromptblock, and its own word for "Settings". "Settings → Localization" is the Setup nav entrynav_settings_localization(objectstackplatform-objects).2. Newly accepted type —
@object-ui/cli(minor) and the validatorKNOWN_SCHEMA_TYPES(packages/cli/src/utils/known-schema-types.ts, GENERATED) gains exactly one row,'cloud:workspace-timezone-notice', soobjectui checkaccepts it. It was regenerated withnode scripts/regenerate-known-schema-types.mjs, and--checkreports OK. There is no bareworkspace-timezone-noticerow and noapp-shell:-prefixed twin, because the registration is{ namespace: 'cloud', skipFallback: true }, the same ascloud:plan-status.objectui validate/safeValidateSchema:AnyComponentSchemanow claims the literal (section 4). The CLI ratchetregistered-types-validate-ratchet-10859keepsNAMESPACED_REFUSED_AT_TYPEat 360 and gains the row "countscloud:workspace-timezone-noticearmed — it registered WITH its arm (objectui#11930)".3. New
@object-ui/typesexports (minor), with their shapes@object-ui/types/zod(zod/index.zod.tsre-exports fromzod/cloud.zod.ts):CloudWorkspaceTimezoneNoticeSchemaThe members are the keys the widget reads, and no others.
@objectstack/spechas noComponentPropsMaprow for acloud:widget, so nothing is read by reference. The closed empty bag is the spellingelement:divideruses for a node with no prop. Both content channels are refused by name, and the refusal text carries the family-D parser-tier clause thatcontent-channel-parser-tier-clause-10928pins.@object-ui/types(root, re-exported fromcloud.ts): the TS twin, interfaceCloudWorkspaceTimezoneNoticeSchema extends BaseSchemawith memberstype: 'cloud:workspace-timezone-notice',properties?typedRecordofstringtonever,body?: neverandchildren?: never. Its parity paircloud.zod.ts#CloudWorkspaceTimezoneNoticeSchemais registered inzod-mirror-parity.test.ts, whereEXPECTED_MIRROR_PAIRSgoes from 194 to 195.4. Union members
AnyComponentSchema(zod) gains one member,CloudWorkspaceTimezoneNoticeSchema, afterCloudPlanStatusSchema. Its accept set widens by exactly that literal.StrictAnyComponentSchemais derived from it, so it follows with no edit.any-component-emit-headroom-11573.test.tslists the member as an inline arm, and the declaration-size headroom test stays green.AnySchema(TS) gains one member,CloudWorkspaceTimezoneNoticeSchema, afterCloudPlanStatusSchema.5. The changeset —
.changeset/11930-workspace-timezone-notice.mdFour
minorentries and nothing else:@object-ui/app-shell,@object-ui/types,@object-ui/i18nand@object-ui/cli. There is nomajor(check-changeset-no-majorOK).6.
@object-ui/app-shell(minor)CloudWorkspaceTimezoneNotice, fromconsole/home/CloudWorkspaceTimezoneNotice.tsx. The entrysrc/index.tsgains one side-effect import beside theCloudPlanStatus.jsimport.sideEffects(a published contract field) gains./dist/console/home/CloudWorkspaceTimezoneNotice.jsand./src/console/home/CloudWorkspaceTimezoneNotice.tsx. Nothing else inpackage.jsonmoved.check:side-effects-arrayreports that the array "names exactly the 16 module(s) that register at load time".dist/index.d.tskeeps the new side-effect import, so the widget's.d.ts(CloudWorkspaceTimezoneNoticePropswithclassName?: string, and the component function) is in the declaration closure.exportshas only., so no new name is importable. A walk of the.d.tsimport graph fromdist/index.d.tsreaches 175 files and notenvironment/entitlements.d.ts. So the hook's widened result type is package-internal.EnvironmentEntitlementsSummaryandEnvironmentEntitlementsState(environment/entitlements.ts) each gainworkspaceTimezoneSeed?: string. The hook reads it verbatim, as it readsupgradeUrl. The row-derived and unknown fallback states never carry it.Behaviour
pelement,text-sm text-muted-foreground, withdata-workspace-timezone-notice="seeded". The node'sclassName/responsiveStylesscope class reaches it. It is text only: no link (cloud#2676 Q2) and no dismissal state.{ success, data }envelope (cloud#1046). It never throws: the hook swallows the failure and falls back to the rows, which carry no seed.Verification
All of these ran from the worktree root. Heavy runs went through the shared
os-verify-lock.main70e3d77 (merge commit 113443d, no conflict;zod-mirror-parity.test.tsauto-merged):zod-mirror-parity,any-component-emit-headroom-11573and the CLI ratchet: 5 files, 94 tests passed;regenerate-known-schema-types --check: OK;check:side-effects-array: OK;type-checkfor@object-ui/types,@object-ui/app-shell,@object-ui/i18nand@object-ui/cli: all exit 0, after building their dependency closures.packages/types/: 360 files, 9615 tests;packages/i18n/: 82 files, 1316 passed and 13 skipped;packages/cli/: 25 files, 370 tests;packages/app-shell/, NARROWED: 27 files, 209 tests. The full package is 1166 files and belongs to CI. The 27 areconsole/home/__tests__/,environment/__tests__/and every test that reads the hook, the summary endpoint,cloud:,sideEffectsor the barrel;scripts/__tests__files that read the touched files: 811 tests.check:control-bytes,check:test-path-roots,check:i18n-keys,check:i18n-drift,check:i18n-dead-keys,check:i18n-designer-parity,check:pending-changeset-literals,check:changeset-claims(report-only),check:readme-exports,check:eager-locale-catalogues,check:sdui-registration-pins(workspace-timezone-noticeis present in 1 chunk) andcheck-changeset-presence. eslint on the 24 touched.ts/.tsxfiles gave 0 errors. The config is not type-aware, and repo-wide lint is CI's.ablation-replacein wrap mode, with a trap and absolute paths. Every subject resolves tosrc, through relative imports and the vitest alias for@object-ui/types/zod, so nodistis involved. Each mutation was restored to the HEAD blob, and the tool proved the restore.objectui validaterefuses 361 registered namespaced key(s) attype; the pin is 360".eagerGzipBytesis +195 B (+752 raw):i18n-locale-en+63 gz andsrc+153 gz, and every other chunk is raw-identical. That put 4929b50 at 3307.6 KB against the then-ceiling of 3307.0 KB, with base f3a0488 at 3307.4 KB.mainnow carries the rollback (3c888c6) and the 5,120 B allowance (1c51e97). The authoritative reading is this PR'sBundle Analysisrun, and the report on the card quotes it.Acceptance notes
platform-objectstranslates the Setup nav labelnav_settings_localizationonly for en, zh-CN, es-ES and ja-JP. A de, fr, pt, ko, ru or ar user therefore sees the English "Localization" in the Setup nav, while this notice names the translated word (Lokalisierung, Localisation, Localização, 현지화, Локализация, التوطين). This is an observation, not filed: no public door gives a wrong answer, and nobody has picked it up.classNameonly. The dispatch's suggested props were{ properties, className }, but the widget reads no prop, and the arm declares the bag empty.Generated by Claude Code