Repository navigation
Description
epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff
Filed on the maintainer's word, verbatim: 「加一个首次配置清单:目前启动时就弹出选择货币很奇怪,一起处理」 (2026-11-05).
From the real-user walkthrough of Setup, on main b7075d9908 unless a line says otherwise.
What a customer sees
- A new administrator lands on Setup's statistics dashboard, with nothing about what to do first.
- A dialog asks for the time zone and currency on the first screens, before they have done anything that needs a currency. On the published 18.3.0 it opened right after an invitation and covered the toast saying how to share the link.
- Defaults disagree. On the test deployment 默认语言 was 英语(美国) and 默认国家 was 美国, beside CNY and Asia/Taipei, while the console itself showed Chinese.
- Typing 中国 into 默认国家 is refused with an English message,
Default country does not match the expected format…. Only the exact list value 中国 (CN) saves. - Every invitee reads the default organization name unless someone knows to rename it (First-run flow: small frictions a new deployment's first people meet #30125 row 1).
What exists
ui/apps/console/src/pages/settings/WorkspaceTimezonePrompt.tsx and workspaceTimezonePromptLogic.ts: an administrator is asked once, from objectui#11693's ruling B2 and #28872. Those rulings have reasons this card keeps: the browser's zone is never written silently, and an unset currency must not go unnoticed. What the maintainer's word changes is the form, a dialog at startup.
Expected
- A checklist for administrators, on the home page or at the top of Setup: company name, language, time zone and currency, email, invite colleagues, and whichever further steps fit. Each row links to its page and shows done from the real setting, not from a click.
- The time zone and currency dialog goes away. Those two become checklist rows, prefilled from the browser as today, and nothing is written until the administrator confirms.
- A deployment that never completes the rows still works. The checklist can be dismissed, and it is not shown to members.
- Language and country defaults follow the same offer, so they do not contradict the currency.
- 中国 is accepted in the country field, and its refusal text is localized.
The list of rows is for the dev to propose in the PR. #30125 rows 1 and 3 are covered here and should be closed against this card when it lands.
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p3 ·
domain:ui·pm:queue· 2026-11-05T03:04Z⛔ Not a claim.
WorkspaceTimezonePrompt.tsx). It overlaps First-run flow: small frictions a new deployment's first people meet #30125 item 3. p3.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Claim: PM loop round 8 · 2026-11-05T14:16Z
Session:
session_01L6bhgVwQZbHRRM9CaXeKifAccount:
os-salesBranch:
claude/project-thread-5murn7(card thread of this project; a thread can push only its designated branch — measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-30206Domain:
domain:uiSeat:
domain:ui#5File surface:
ui/apps/console/src/pages/settings/WorkspaceTimezonePrompt.tsx+workspaceTimezonePromptLogic.ts(the dialog goes; its logic is reused by the checklist rows) + a new administrator checklist component underui/apps/console/src/orui/packages/app-shell/src/(home page or the top of Setup) + its mount point + newui/packages/i18nkeys (console namespace, the locales that namespace ships) + their tests + one root.changeset/. ⛔packages/**: if 「中国」's English refusal in 默认国家 comes from the server's settings validation, the dev reports it and the seat files adomain:servercard.Container & model:
L,mode:thread,model: default,effort: xhighClause-②: yes (expected: new i18n keys; the dev declares the final arm)
Metadata-protocol: none
Responsibility: Console's first-run experience for administrators | a time zone / currency dialog opens on the first screens before anything needs a currency, and nothing says what to set up first | every administrator of a new deployment
Thread-read: 6648546780
Premise: holds (on
origin/mainfa9c0aa2WorkspaceTimezonePrompt.tsxstill opens the dialog; the #30125 os-dev-report measured it opening 0.2–0.3 s after the first/apps)Serial constraints: PR #30490 (#30125 item 4, in the merge queue) touches
ui/packages/authandProtectedRoute.tsxonly — no file in common. #30125 rows 1 and 3 close against this card when it lands, as the card says.Seat handover: seat 6 (
domain:ui#6) passed this card to seat 5 at 14:12Z.Ruling kept: the browser's zone is never written silently, and an unset currency must not go unnoticed (objectui#11693 ruling B2, #28872).
Dispatch order lives in the card thread's opening message.
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Claim amendment 1 on #30206 · 2026-11-05T14:18Z
The dev's check of 「中国」 in 默认国家 found the refusal starts in the console.
SettingsField.tsx'sDomainComboboxswaps typed text for the option's code only when the text equals the option label (「中国 (CN)」 in the zh pack) or the code, so 「中国」 is submitted as typed. The server then refuses it withinvalid_format(packages/services/service-settings/src/settings-service.ts, pattern^[A-Za-z]{2}$), whose message is not localized.File surface grows by the console half:
ui/apps/console/src/pages/settings/SettingsField.tsx(a typed country name resolves to its code) and the settings view that renders field errors (a refusal with codeinvalid_formatis drawn from the console's own localized text), with their tests. ⛔packages/**stays out: the server's pattern check is correct as it is, and the console reading the error by code is what localizes it, so no server card is filed for this item.feat(console): an administrator's first-run checklist on Home replace…
fix(i18n): the zh checklist row names the country as the field does, …
test(console): the checklist test inherits the real app-shell surface…
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
os-dev-report
{ "issue": 30206, "status": "done", "branch": "claude/project-thread-5murn7", "pr": "https://github.com/objectstack-ai/objectstack/pull/30552", "session": "session_01L6bhgVwQZbHRRM9CaXeKif", "premise_still_valid": true, "summary": "The startup dialog that asked administrators for the system timezone and default currency (WorkspaceTimezonePrompt) is removed. Home now draws an administrator-only first-run checklist with six rows read from real state: organization name, default language and country, system timezone, default currency, email delivery, invite colleagues. The localization rows edit in place with the Settings page's own fields, pre-filled from the browser's first language and zone, and write only on the row's Confirm through the Settings page's PUT; dismissal is a per-device localStorage record. The console half of the 中国 refusal is fixed: a typed option name that exactly one option carries commits that option's code, and an invalid_format refusal is drawn in the console's words and the reader's language on the Settings page and the checklist. Surface beyond the claim, each a reader of what was removed: SetupPage.tsx import, loadLocales.ts comment, four console test mocks, ui/e2e/live/global-setup.ts (its dialog-answering step removed), docs/qa/platform-checklist/RUNNER.md, and three i18n pins (machineLocaleCensus-9909 path, console-copy-system-noun-12956 family, de-quote-pairing-3876 104 to 106).", "tests": "On head 9914c31f: pnpm exec vitest run apps/console/src/pages/settings/ apps/console/src/__tests__/ apps/console/src/components/FormPage.routePermissions-29187.test.tsx apps/console/src/pages/auth/ -> Test Files 133 passed (133), Tests 1504 passed (1504). Full console on the 3bcfe085 tree: Test Files 299 passed (299), Tests 2931 passed (2931). pnpm exec vitest run packages/i18n/ -> Test Files 95 passed (95), Tests 1443 passed, 13 skipped. Type-check: @object-ui/console exit 0 (after @object-ui/i18n build), @object-ui/i18n exit 0, type-check:e2e exit 0. New: FirstRunChecklist.test.tsx (10), firstRunChecklistLogic.test.ts (11), SettingsField.domainOptionTypedName-30206.test.tsx (5), settingsFieldRefusals-30206.test.ts (5); updated SettingsView.field-errors, .crypto-unavailable, .refusalToast-13146; removed the three WorkspaceTimezonePrompt test files. Ablations via scripts/ablation-replace.mjs, each restored to the HEAD blob with git diff HEAD empty (console tests import src, no dist leg): name match removed -> 3 failed/2 passed; invalid_format re-wording disabled -> 7 failed; mayWrite ignores writePermission -> member test fails 1/10; isKeySet ignores source -> 7 failed. Live on showcase os dev --fresh + console dev server, 1440, zh-CN and en-US: zh /home shows 2/6 done; typing 中国 in the country box and Confirm sent one PUT {locale: zh-CN, default_country: CN} answered 200 and the row turned done; en Set currency pre-fills USD and writes nothing; /apps/setup 0 dialogs in both; main fa9c0aa2 showed the dialog in both (screenshots in project files issue-30206/).", "gates": "node scripts/pm/dispatch-gates.mjs --commands: 42 commands, each run with its exit code recorded before any pipe: 41 exit 0 on df45b9d1; pnpm --dir ui exec vitest run scripts/ first exit 1 (check-vi-mock-inherit: the new test's app-shell mock did not inherit; also a SIGKILL from memory pressure while the dev rig ran), fixed in 9914c31f and re-run on that head exit 0 (Test Files 170 passed, 2 skipped). The list derived on 9914c31f is identical. --ran: 42 derived, 42 run, 0 NOT-MEASURED, 0 UNRUN. CI check-runs on #30552: in_progress at report time, not re-run locally.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "reads only — mcp__github__issue_read on #30206 (get, get_comments) and #30125; objectui#11693 is outside this session's scope and was not read; no write tool", "api_writes": "2 — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, no assignees, no labels) and this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/30206/comments); git push is not a REST write", "open_questions": [ { "question": "Placement: the checklist is on Home. A deployment whose app declares isDefault lands its administrator in that app, so the checklist is seen on the next visit to Home, not at sign-in. Also draw it at the top of Setup?", "options": [ "A keep Home only (this PR); a follow-up card if isDefault deployments matter", "B also mount it at the top of Setup's dashboard (an app-shell change, new claim surface)" ], "recommendation": "A, because Home is the environment's own home (ADR-0075) and every example deployment lands there; B can follow without changing anything here" }, { "question": "Clause-② arm: the changeset declares yes (widening) for the new console i18n keys, with the retired console.workspaceTimezonePrompt.* keys (read only by the removed dialog) named in the same line. Keep, or is the removal judged separately?", "options": [ "A keep yes (widening)", "B another arm the seat prefers" ], "recommendation": "A, matching the 30070 precedent; no reader outside the removed dialog existed" } ], "security_findings": "none", "out_of_scope_findings": [ "carrier: none · noted, not filed — packages/plugins/plugin-auth/src/dev-admin-seed-workspace-timezone.test.ts doc comment still names WorkspaceTimezonePrompt (packages/** out of this card)", "carrier: none · noted, not filed — DEFAULT_ORGANIZATION_NAME in firstRunChecklistLogic.ts copies plugin-auth's literal with no pin (a ui test reading packages/** would be an undeclared cross-package input)", "carrier: none · noted, not filed — refusal codes other than invalid_format still carry the server's English FieldError.message" ] }Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Claim amendment 2 on #30206 · 2026-11-05T15:30Z
PR #30552 (head
9914c31f) touches files outside the claimed surface. Each one reads the removed dialog, so the seat takes them into the surface:ui/apps/console/src/App.tsx,AppContent.tsx,loadLocales.ts(comment),pages/auth/SetupPage.tsx(import) and four console test mocks that namedWorkspaceTimezonePrompt.ui/e2e/live/global-setup.ts(the step that answered the dialog is removed).docs/qa/platform-checklist/RUNNER.md(the checklist run no longer meets the dialog). Not a governed path.machineLocaleCensus-9909,console-copy-system-noun-12956,de-quote-pairing-3876) that count keys this PR adds or retires.Seat calls on the dev's two questions:
console.workspaceTimezonePrompt.*keys from the ten published packs of@object-ui/i18n. By the lane's precedent for retired keys (PR refactor(i18n)!: retire the dead Packaged automation flows and Manage Objects keys #29359yes (narrowing), PR refactor(i18n, plugin-designer)!: retire the unread designer.versionHistory key #29616no (narrowing), both with!), the arm is(narrowing):Clause-②: yes (narrowing),!in the title and the changeset summary, and the full dogfood battery on the final head.Metadata-protocol: nonestands. The review face becomes CONTRACT_REVIEW_TIER.Size: +2659 / −1923 = 4582 changed lines, over 3,000, so the PR lands by the end-state set with ③ (approver review), not the ordinary queue.
test(example-showcase): the smoke setup stops waiting for the retired…
chore(changeset)!: the #30206 changeset declares the retired prompt k…
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
os-dev-report
{ "issue": 30206, "status": "done", "branch": "claude/project-thread-5murn7", "pr": "https://github.com/objectstack-ai/objectstack/pull/30552", "session": "session_01L6bhgVwQZbHRRM9CaXeKif", "premise_still_valid": true, "summary": "Patch round on claim revision 2 (seat 5). Head d0d217ae. The changeset now declares Clause-②: yes (narrowing), naming the ten published @object-ui/i18n packs dropping the 14 console.workspaceTimezonePrompt.* keys and keeping the new keys as the widening half; Metadata-protocol stays none. Its summary is feat(console)!, and its body gains the BREAKING note (TypeScript only: TranslationKeys loses the keys), the removed-key table and the ADR-0087 disposition not-required (runtime-interface-only ui/packages/i18n/src/locales/en.ts#TranslationKeys), as on PR #29359. One more reader of the removed dialog was found and fixed: examples/app-showcase/e2e/global-setup.ts waited up to 60 s for the dialog's testid when the currency was unset, then warned; its decline step is removed (commit 1ad19db8). This file is outside claim revision 2. Per os-dev the dev writes the PR body once, so the new title and body are ready for the seat's relay write: project files issue-30206/pr-30552-title-v2.txt and issue-30206/pr-30552-body-v2.md.", "tests": "pnpm --filter @objectstack/example-showcase typecheck exit 0, on the change and on the tree before it; the program includes e2e/global-setup.ts. Reverse check on the built types: a probe outside the repo importing TranslationKeys from ui/packages/i18n/dist got TS2339 on console.workspaceTimezonePrompt; console.firstRunChecklist.title compiled; the probe was deleted. No console source changed in this round; the earlier test readings (9914c31f) stand.", "gates": "node scripts/pm/dispatch-gates.mjs --commands on d0d217ae: 57 families (the earlier 42 plus 15 that examples/** brings in). All 57 exit 0, including pnpm --dir ui exec vitest run scripts/ (Test Files 170 passed, 2 skipped; Tests 4985 passed, 2 skipped), pnpm check:dual-build-cjs-loads and pnpm check:examples-live-imports. --ran: 57 derived, 57 run, 0 NOT-MEASURED, 0 UNRUN. node scripts/check-adr-0087-registration.mjs: 1 declared-breaking changeset, disposition verified (BREAKING+bang+clause-②-narrowing). PR check-runs on d0d217ae: all completed success or skipped, including Check Changeset, PR-body guards, Governed Surface Queue Guard, Check PR Size, Type Check UI, Test UI 16/16, Test Core, Lint & Repo Gates, Live E2E UI, Build & E2E UI and Dogfood Regression Gate.", "dogfood_battery": "d0d217ae · os-verify-lock: VERDICT command-exit 0 (held 19m52s) · pnpm --filter @objectstack/dogfood test, unsharded, after turbo run build --filter='@objectstack/dogfood^...' exit 0 · Test Files 420 passed | 3 skipped (423) · Tests 3496 passed | 36 skipped (3532) · no failures", "mcp_calls": "reads only — mcp__github__pull_request_read on #29359 (get_files, get) for the narrowing precedent and on #30552 (get_check_runs, twice answered 500); one gh api read of the head's check-runs after those 500s; no write tool", "api_writes": "1 — this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/30206/comments); the PR title and body are not written by the dev (os-dev: the body is written once), they are left for the seat's relay; git push is not a REST write", "open_questions": [ { "question": "examples/app-showcase/e2e/global-setup.ts is outside claim revision 2. Cover it in the claim, or drop commit 1ad19db8?", "options": [ "A cover it in a claim revision: it is a reader of the removed dialog, like ui/e2e/live/global-setup.ts", "B drop the commit and leave the 60 s wait for a follow-up card" ], "recommendation": "A, because without it the showcase smoke waits 60 s for a dialog that no longer exists whenever the currency is unset" } ], "security_findings": "none", "out_of_scope_findings": [ "unchanged from the first report: the three noted, not filed findings stand, as the seat agreed" ] }Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Claim amendment 3 on #30206 · 2026-11-05T16:14Z
One more reader of the removed dialog joins the surface:
examples/app-showcase/e2e/global-setup.ts, which waited 60 s for the dialog's testid when no currency was set and then only warned. The dev removes that step (commit1ad19db8).Merge origin/main into claude/project-thread-5murn7 (#30206)
chore(console): the eager en catalogue's ceiling moves by the checkli…
Revert "chore(console): the eager en catalogue's ceiling moves by the…