Skip to content

feat(console)!: an administrator's first-run checklist on Home replaces the currency and time zone dialog - #30868

Merged
os-zhuang merged 9 commits into
mainfrom
claude/project-thread-03bt30
Nov 6, 2026
Merged

os-zhuang merged 9 commits into
mainfrom
claude/project-thread-03bt30

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Tesla · project thread

Fixes #30206

Clause-②: yes (narrowing) — the published @object-ui/i18n packs (all ten) drop the 14 console.workspaceTimezonePrompt.* keys, which had no reader outside the removed dialog. The widening half: new console i18n keys console.firstRunChecklist.* and console.settingsView.invalidFormat / .invalidFormatHelp / .invalidFormatPick (all ten packs)
Metadata-protocol: none

Supersedes #30552 (same change, taken over from a branch whose account is out of tokens: cut from claude/project-thread-5murn7 @ 2dc81e70, then origin/main merged).

维护者速读

  • 改了什么:管理员打开首页(/home)时,顶部出现一张「完成初始设置」清单(组织名称、默认语言和国家、系统时区、默认货币、邮件发送、邀请同事),原来一进系统就弹出的时区/货币对话框删掉了;在默认国家里输入「中国」现在能保存为 CN,格式错误的提示改成读者语言。
  • 为什么改:维护者原话「加一个首次配置清单:目前启动时就弹出选择货币很奇怪,一起处理」;新部署的管理员不知道先设什么,默认语言、国家和货币还互相矛盾。
  • 风险与回滚:只动控制台、语言包和两处 e2e 准备脚本,不动服务端;清单只读设置,只有点「确认」才写,写的就是设置页同一个 PUT。语言包删掉对话框的 14 个键,属 TypeScript 层面的收窄,changeset 写明了迁移。首屏英文语言包 57,233 / 60,000 gz,上限未动。回滚即 revert 本 PR,弹窗回来。
  • 先看:ui/apps/console/src/pages/settings/FirstRunChecklist.tsx(读取与只在确认时写入)、firstRunChecklistLogic.ts(每行何时算完成)、SettingsField.tsx 的 optionByName(输入名称匹配代码)。
  • 两分钟验证:os dev --fresh 后用管理员登录,打开 /home,顶部应有清单;中文浏览器下点「默认语言和国家/地区」的「设置」,在国家框输入「中国」后点「确认」,应提示已保存、该行打勾,Setup 页不再弹任何对话框。
  • 需要你做的:改动 4,694 行(42 个文件,+2,671 / −2,023),超过 3,000 行人工合并线,请在席位复核通过后批准合并。

What changes

The dialog is gone; Home carries an administrator's first-run checklist. WorkspaceTimezonePrompt.tsx and its mount in AppContent.tsx are removed. FirstRunChecklist is drawn at the top of Home by the console's Home route (App.tsx), above the page's own sections, inside the ConsolePermissionsScope that route already sits under. Its logic, firstRunChecklistLogic.ts, is the dialog's logic widened to every row (git shows it as a delete and an add; it keeps browserTimeZone, browserLanguage, browserCurrency, isAdmissibleValue and mayWrite).

Row list (the card leaves it to the PR; the seat kept Home as the only placement). Each row's state is read from the real setting every time it is drawn, never from a click:

# Row Done when Action
1 Organization name the active organization's name is no longer Default Organization, the name plugin-auth gives it (#30125 row 1) link to Setup → Organization record
2 Default language and country localization.locale and .default_country both resolve from a rung other than the manifest default edit in place, pre-filled from the browser
3 System timezone localization.timezone resolves from a rung other than the default edit in place, pre-filled with the browser zone
4 Default currency localization.currency holds any value (it has no platform default) edit in place, pre-filled with the browser region's currency
5 Email delivery mail.provider is not log, from_email is set, and SMTP has smtp_host; shown only to a session that may write mail link to Setup → Mail Delivery
6 Invite colleagues a second member or a pending invitation link to Setup → Users (Invite User)

A done row shows its value; a row whose state cannot be read (mail unreadable, members unreadable) is left out rather than shown as not done. Once every row shown is done the checklist draws nothing, and it comes back on its own if a setting is unset again.

The rulings the dialog was built on still hold (objectui#11693 B2, #28872). The browser only pre-fills rows 2 to 4. Nothing is written until the row's Confirm, which is saveSettingsNamespace('localization', changes), the Settings page's own PUT /api/settings/localization. Cancel writes nothing. An unset currency stays on the list until it is set. Language, country and currency are one offer read from the browser's first language (zh-CN → 中文, CN, CNY), so they cannot contradict each other.

Who sees it. A session that may write localization (its manifest's writePermission, failing closed on an unreported answer). A member sees nothing and sends one GET /api/settings (the list, which never refuses) and no namespace read. The close button hides it for that administrator, in that workspace, on that device (localStorage os:first-run-checklist:ORG:USER); nothing is written to the server and no row changes. Its reads wait for the console's first paint (whenBootPainted, objectui#12980), as the dialog's did.

「中国」 in 默认国家. The refusal started in the console: DomainCombobox swapped typed text for a code only when it equalled the option label (「中国 (CN)」) or the code, so 「中国」 went to the server as typed, and the server's two-letter pattern refused it with invalid_format in English. Now a typed name that exactly one option carries (the label without its own code beside it, trimmed, case-insensitive) is committed as that option's code; any other text is still committed verbatim and the server stays the judge. A refusal with code: 'invalid_format' is now drawn in the console's words and the reader's language, naming the setting by the label its row draws (settingsFieldRefusals.ts): "Choose a value for Default country from the list." for a picker, and "Gateway model is not in a valid format. Use provider/model." for a typed field, repeating the field's own help line because the refusal takes its place. Every other refusal code keeps the server's sentence. The server's pattern check is unchanged (⛔ packages/**).

The narrowing. @object-ui/i18n's exported TranslationKeys (typeof en) loses the 14 console.workspaceTimezonePrompt.* keys in all ten packs. The changeset is feat(console)!, carries the BREAKING note, 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.

Eager language pack. The checklist's strings sit in the console group of the eager packs. After PR #30640 moved the marketplace pages' strings into the lazy marketplace namespace, i18n-locale-en measures 57,233 gz against its unchanged 60,000 ceiling on this branch. This PR adds no marketplace-page strings, so nothing moves into that namespace.

Files beyond the claim's first surface, each a reader of what was removed (claim amendments 2 and 3): ui/apps/console/src/pages/auth/SetupPage.tsx (imports browserTimeZone from the renamed module), ui/apps/console/src/loadLocales.ts (comment), the four console tests that mocked the dialog's module, ui/e2e/live/global-setup.ts and examples/app-showcase/e2e/global-setup.ts (each waited up to 60 s for the dialog's testid before a run; the checklist is not modal, so that step is removed), docs/qa/platform-checklist/RUNNER.md (told QA runners to dismiss the dialog), and three i18n pins that named the dialog's keys or file (machineLocaleCensus-9909, console-copy-system-noun-12956) or count the de pack's quotes (de-quote-pairing-3876, 105 → 107 for two new „…“ pairs).

Tests

  • ui/apps/console/src/pages/settings/__tests__/FirstRunChecklist.test.tsx (10), on the real api.ts against a stubbed fetch and the real MePermissionsProvider: a member reads the list only and sees nothing; no capability answer or an empty one sends no request; a fresh workspace shows all six rows not done with their links and writes nothing; rows the server reports as set are done and a fully set workspace draws nothing; Set pre-fills the currency from the browser, nothing is written until Confirm, and Confirm sends exactly one PUT with { currency: 'CNY' }; language and country are one offer ({ locale: 'zh-CN', default_country: 'CN' }); Cancel and the close button write nothing and the hide survives a remount with no request; an invalid_format refusal is shown in the console's words and the row stays not done; zh copy; no read while the boot splash is up.
  • firstRunChecklistLogic.test.ts (11): localeOffer, browserRegion, the admissible pre-fill, isKeySet, row done, isMailConfigured, isOrganizationNamed, hasInvitedColleagues, the dismissal record and unreadable storage.
  • SettingsField.domainOptionTypedName-30206.test.tsx (5): 「中国」 commits CN; trimmed and case-insensitive with full-width brackets; a name two options carry and part of a name stay verbatim; a currency name commits its code.
  • settingsFieldRefusals-30206.test.ts (5), against the shipped en templates.
  • Updated: SettingsView.field-errors, SettingsView.crypto-unavailable and SettingsView.refusalToast-13146 asserted the server's English sentence for invalid_format; they now assert the console's sentence (and that the server's is gone).
  • Removed with the dialog: WorkspaceTimezonePrompt.test.tsx, .currency-28872.test.tsx, .afterBootPaint-12980.test.tsx; their pins (only Confirm writes, the browser zone pre-fill, the currency arm, the boot-paint wait, members never asked) are carried by the new files above.

Acceptance notes

  • Placement. Home only, by the seat's call (claim amendment 2 on the card). Home is the environment's own home (ObjectUI ADR-0075) and every deployment that declares no landing app opens there after sign-in. A deployment whose app declares isDefault lands its administrator in that app, and the checklist is then seen on the next visit to Home, not at sign-in.
  • DEFAULT_ORGANIZATION_NAME is a copy of plugin-auth's literal (ensure-default-organization.ts). No test holds the two equal: a ui/ test reading packages/** source would be a cross-package input outside both CI rosters. A rename on the server side would make row 1 read "named" for an organization nobody named.
  • Refusal codes other than invalid_format (for example value_domain) still carry the server's English sentence; localizing FieldError.message is a server concern and out of this card.
  • The dialog's old "asked once" record (os:workspace-timezone-prompt:*) is no longer read; it stays in browsers that have it, harmlessly.
  • packages/plugins/plugin-auth/src/dev-admin-seed-workspace-timezone.test.ts still describes the dialog in its doc comment (the condition it pins is still the one row 3 reads). Left alone: ⛔ packages/** on this card.
  • objectui#11693 is outside this session's repository scope; its ruling B2 is quoted from the code comments that carried it.
  • The branch is the card thread's platform-assigned claude/project-thread-03bt30, not claude/issue-30206-…. The eight commits carried over from feat(console): an administrator's first-run checklist on Home replaces the currency and time zone dialog #30552 name the card in their subjects; landed-branch history is not rewritten.
  • First-run flow: small frictions a new deployment's first people meet #30125 rows 1 and 3 are covered here, as the card says.

Verification

All readings on head e823d8fd9d unless a line names another.

Eager closure (Console vite build, VITE_BASE_PATH=/console/)
  • pnpm --dir ui run check:eager-closure exit 0: eager closure 2157.8 KB gz across 103 of 2412 chunks (budget 2431.6 KB). i18n-locale-en 57,233 gz (from ui/apps/console/dist/eager-closure.json) against the unchanged 60,000 ceiling, headroom 2,767. The checker's ceilings are byte-identical to main (no diff to check-eager-closure-budget.mjs).
Tests and type-check
  • pnpm --dir ui exec vitest run --maxWorkers=2 apps/console/ packages/i18n/ (lock VERDICT command-exit 0): Test Files 402 passed (402), Tests 4540 passed, 13 skipped (4553).
  • pnpm --filter @object-ui/i18n type-check, pnpm --filter @object-ui/console type-check, pnpm --dir ui run type-check:e2e, pnpm --filter @objectstack/example-showcase typecheck: all four exit 0 (one locked run, VERDICT command-exit 0).
  • pnpm --dir ui run check:new-line-citations: 0 new citations.
Full dogfood battery (Clause-② narrowing arm)
  • pnpm --filter @objectstack/dogfood test, unsharded, after a full turbo run build --filter='!@objectstack/docs' (118 of 118 tasks): lock VERDICT command-exit 0, Test Files 424 passed, 3 skipped (427), Tests 3538 passed, 41 skipped (3579), no failures.
Derived gates: node scripts/pm/dispatch-gates.mjs --commands (58) and --ran
  • 58 of 58 exit 0, each run with stdin closed and its exit code recorded before any pipe. pnpm --dir ui exec vitest run scripts/ first answered 99 (lock not reached while the console tests held it) and was re-run under the same slot: Test Files 170 passed, 2 skipped; Tests 4979 passed, 2 skipped.
  • --ran: ✓ dispatch-gates --ran: 58 derived famil(ies) accounted for — 58 run, 0 NOT-MEASURED.
  • Changed lines per the derivation: 4,694 (+2,671 / −2,023, 42 files), over the 3,000 human-merge threshold.
Live: before on main, after on the branch (taken on #30552 head 9914c31; no console source changed since)
  • Before, on main fa9c0aa2: entering Setup opened the currency dialog over the page, zh and en.
  • After, zh browser (zh-CN, Asia/Shanghai): /home shows the checklist, progress 已完成 2/6 (the rig's dev seed sets the zone and seeds members). Opening 默认语言和国家/地区 pre-fills 简体中文 and 中国 (CN). Clearing the country box and typing 「中国」 leaves 中国 (CN) in the box; Confirm sent exactly one write, PUT /api/settings/localization {"locale":"zh-CN","default_country":"CN"}, answered 200, and the row turned done, progress 已完成 3/6. /apps/setup afterwards: 0 dialogs.
  • After, en browser (en-US, America/New_York): 3 of 6 done; opening Default currency pre-fills USD — US Dollar and sends no write; /apps/setup: 0 dialogs.
Ablations (taken on #30552, each through scripts/ablation-replace.mjs, restored to the HEAD blob with git diff HEAD empty)
  • SettingsField.tsx name match removed: SettingsField.domainOptionTypedName-30206 3 failed, 2 passed (the two verbatim cases stay green, as they should).
  • settingsFieldRefusals.ts re-wording disabled: 7 failed across settingsFieldRefusals-30206, FirstRunChecklist and SettingsView.field-errors.
  • mayWrite no longer reads the manifest's writePermission: FirstRunChecklist "a member … nothing is drawn" fails, 1 of 10.
  • isKeySet no longer reads source: 7 failed across FirstRunChecklist and firstRunChecklistLogic.

🤖 Generated with Claude Code

https://claude.ai/code/session_01L9qibynkEvahBBwY1bFkmH

…s the currency and time zone dialog (#30206)

The dialog that asked for the system timezone and default currency on the
first page an administrator opened is gone. Its questions, and the other
things a new workspace needs, are rows of a checklist at the top of Home:
organization name, default language and country, system timezone, default
currency, email delivery, and invite colleagues. Each row's state is read
from the real setting; the localization rows edit in place with the
Settings page's own fields, pre-filled from the browser and written only
on the row's Confirm. Members see nothing; the close button hides it for
that administrator in that workspace on that device.

A country typed by name into a domain-bearing picker now commits the
option's code (「中国」 → CN), and an invalid_format refusal reads in the
console's words and the reader's language on the Settings page and the
checklist.

Claude-Session: https://claude.ai/code/session_01L6bhgVwQZbHRRM9CaXeKif
Co-authored-by: Claude <noreply@anthropic.com>
… workspace prompt (#30206)

The console no longer opens the timezone and currency dialog, so the
showcase smoke's global setup no longer looks for it. Before, with the
currency unset, it waited 60 seconds for a dialog that never opens and
then warned. Sign-in and the storageState it writes are unchanged.

Claude-Session: https://claude.ai/code/session_01L6bhgVwQZbHRRM9CaXeKif
Co-authored-by: Claude <noreply@anthropic.com>
…eys as a narrowing (#30206)

The ten published @object-ui/i18n packs drop the
console.workspaceTimezonePrompt.* keys, so the declaration's arm is
narrowing (the new keys stay named as its widening half), the summary
carries the bang, and the body gains the BREAKING note, the removed-key
table and the ADR-0087 runtime-interface-only disposition.

Claude-Session: https://claude.ai/code/session_01L6bhgVwQZbHRRM9CaXeKif
Co-authored-by: Claude <noreply@anthropic.com>
Conflicts, each two neighbouring additions, both kept: the ten locale
packs (main's console.settingsView.clientAddress* beside this branch's
invalidFormat*), and de-quote-pairing-3876, whose counts now add main's
one pair (#30323) and this branch's two: 107 matched spans, 107/107/0.

Claude-Session: https://claude.ai/code/session_01L6bhgVwQZbHRRM9CaXeKif
Co-authored-by: Claude <noreply@anthropic.com>
…st's measured 203 bytes (#30206)

Build & E2E UI went red on cda63e7: i18n-locale-en measured 60,138
gzipped bytes against a 60,000 ceiling. A control build of the PR base
(main 48b3ae6, with ui/apps/console, ui/packages/i18n and ui/e2e
restored to it) measures 59,935, so this branch adds 203 bytes: the
first-run checklist copy and the invalid_format sentences, net of the
retired prompt keys. Trimming the new copy saves at most 122 bytes, less
than the 138 over, so the ceiling and PER_CHUNK_BASELINE both move by
exactly 203. Headroom stays at the 65 bytes main had. The aggregate
ceiling and every other key are unchanged.

Claude-Session: https://claude.ai/code/session_01L6bhgVwQZbHRRM9CaXeKif
Co-authored-by: Claude <noreply@anthropic.com>
… checklist's measured 203 bytes (#30206)"

This reverts commit 10e7823. The lane is
not raising the i18n-locale-en ceiling: #30588 moves the marketplace.*
copy into a lazily loaded namespace, which brings the eager en catalogue
back under 60,000 once it lands and this branch merges main.

Claude-Session: https://claude.ai/code/session_01L6bhgVwQZbHRRM9CaXeKif
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/xl documentation Improvements or additions to documentation tests tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Nov 6, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#3 · os-tesla · session_01L9qibxW6qraU2Z3mwupUGp

Contract-review-claim: session_01L9qibxW6qraU2Z3mwupUGp · head e823d8f · 2026-11-06T07:28Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#3 · os-tesla · session_01L9qibxW6qraU2Z3mwupUGp

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: e823d8fd9d8ff2d24f4984bd381d81767035f990
Local-runs: none
Scope: PR files read on head: .changeset/30206-first-run-checklist.md, ui/apps/console/src/pages/settings/FirstRunChecklist.tsx (whole), firstRunChecklistLogic.ts (whole), settingsFieldRefusals.ts (whole), diffs of SettingsField.tsx, SettingsView.tsx, App.tsx, AppContent.tsx, pages/auth/SetupPage.tsx, loadLocales.ts, ui/packages/i18n/src/locales/en.ts, ui/e2e/live/global-setup.ts, examples/app-showcase/e2e/global-setup.ts, docs/qa/platform-checklist/RUNNER.md, the four console mock tests, the three i18n pin tests, and the it( rosters of the three new test files. Cited: origin/main WorkspaceTimezonePrompt.tsx (testids) and en.ts (removed block), ui/packages/i18n/package.json, ui/packages/i18n/src/index.ts, ui/packages/react/src/index.ts, console settings api.ts and types.ts, ui/packages/app-shell/src/console/home/HomeLayout.tsx, plugin-auth ensure-default-organization.ts and default-organization-invariant.ts, scripts/check-changeset-no-major.mjs, scripts/pm/clause2-line.mjs, scripts/check-adr-0087-registration.mjs (runtime-interface-only), .changeset/config.json, PR #29359's .changeset/28789-i18n-retire-packaged-flows-keys.md at 794e71cc, docs/qa/platform-checklist/areas/studio-authoring.json, ui/e2e/live/phone-nav-drawer-back-29131.spec.ts, AGENTS.md, ui/AGENTS.md; hotcrm checkout.

① Derived judgments

  • The 14 removed keys are exactly the origin/main en.ts block (title, description, laterHint, decline, confirm, saved, currencyTitle, currencyDescription, currencyConfirm, currencySaved, bothTitle, bothConfirm, bothSaved, notNow); all ten packs on head carry 0 workspaceTimezonePrompt and carry firstRunChecklist plus the three invalidFormat* keys.
  • git grep -n -i 'workspaceTimezonePrompt|WorkspaceTimezonePrompt|workspace-timezone-prompt' e823d8fd hits only the changeset, CHANGELOG history and a doc comment in packages/plugins/plugin-auth/src/dev-admin-seed-workspace-timezone.test.ts:10 (prose; packages/** out of card scope, acknowledged). hotcrm: 0 hits. No import of WorkspaceTimezonePrompt or workspaceTimezonePromptLogic survives (SetupPage.tsx now imports browserTimeZone from firstRunChecklistLogic). The dialog's testids appear nowhere in ui/e2e, examples, docs, skills, content.
  • Writes without Confirm: none. The only server write is saveSettingsNamespace(LOCALIZATION_NAMESPACE, changes) in SettingsRowEditor.onConfirm (button disabled={saving || !hasChanges}); onSaved re-reads. Close writes localStorage only; Cancel is setEditing(null); the mount effect chains reads only.
  • Member path: readChecklistSettings returns null with no request when systemPermissions is absent or empty; otherwise one GET /api/settings, then null before any namespace read when mayWrite is false (fails closed on a missing writePermission). Members/invitations are read only after settings load. Pinned at FirstRunChecklist.test.tsx:244 and :253.
  • DomainCombobox: committedValue order is exact value → exact label → optionByName → verbatim. optionByName strips only the option's own code from its label, compares trimmed and case-insensitive, and matches only when exactly one option carries the name; ambiguous or partial text stays verbatim and the server stays the judge. No packages/** file in the diff. settingsFieldRefusals re-words only invalid_format from details.fields.
  • Entry exports: ui/packages/i18n exports and src/index.ts untouched; TranslationKeys = typeof en loses members only. @object-ui/react re-exports type TranslationKeys (see ③). ui/apps/console is an app.
  • Mount: App.tsx HomeRoute renders FirstRunChecklist inside DefaultHomeLayout on /home, under ConsolePermissionsScope; AppContent.tsx drops the dialog's mount and import.

② Semver level

patch on @object-ui/console and @object-ui/i18n (both in the Changesets fixed group), with feat(console)!: and **BREAKING** as carriers, as PR #29359. check-changeset-no-major.mjs level axis: Metadata-protocol: none, every entry patch, no authorable baseline moves → clean. Clause-②: yes (narrowing) — … matches clause2-line.mjs. ADR-0087 marker not-required (runtime-interface-only ui/packages/i18n/src/locales/en.ts#TranslationKeys) resolves to an exported type in a non-zod, non-contracts file, not a z.infer projection; git grep '\bTranslationKeys\b' -- '*.zod.ts' 'packages/spec/src/contracts/**' is empty.

③ Boundary flags

  • docs/qa/platform-checklist/areas/studio-authoring.json:3687: a live QA step still tells runners to dismiss the retired currency prompt with "Not now" (RUNNER.md was corrected, this area file was not). Docs-only follow-up.
  • DEFAULT_ORGANIZATION_NAME duplicates plugin-auth's literal with no test holding them equal; a server-side rename would make row 1 read "named". Acknowledged in the PR and code.
  • The TranslationKeys narrowing also transits @object-ui/react's type re-export; lockstep versioning makes the bump identical; same as refactor(i18n)!: retire the dead Packaged automation flows and Manage Objects keys #29359. Cosmetic.
  • An isDefault landing app sends the administrator past Home at sign-in. Acknowledged.
  • Dismissal is per-device localStorage; dismissing also silences the mail and invite rows.
  • Every undismissed administrator Home mount issues up to five reads, since "draws nothing when done" is decided after the reads.
  • Both e2e global-setups lose the decline step; the only live spec visiting /home asserts drawer visibility and URLs, unaffected.
  • PR body's de-quote-pairing-3876 count read 104 → 106; the diff moves 105 → 107 (body corrected by the seat). Live before/after readings were taken on feat(console): an administrator's first-run checklist on Home replaces the currency and time zone dialog #30552's head 9914c31f.

④ Design judgment

The narrowing removes only keys the retired dialog read: the head tree and hotcrm hold no reader of console.workspaceTimezonePrompt.*, no import of the removed modules and no use of its testids. The one published surface narrowed is the TranslationKeys type; t() keys are string, so a stale caller still compiles and echoes its key. No declared capability leaves a consumer; the new keys, the Home checklist and the invalid_format wording are widenings. Consistent with #29359.

Implemented-by: claude/project-thread-03bt30
Reviewed-by: session_01L9qibxW6qraU2Z3mwupUGp

VERDICT: PASS

@objectstack-fleet objectstack-fleet Bot added the pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue label Nov 6, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review November 6, 2026 07:59
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 6, 2026
Merged via the queue into main with commit 18870c9 Nov 6, 2026
66 of 67 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-03bt30 branch November 6, 2026 08:16
@objectstack-fleet objectstack-fleet Bot removed the pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue label Nov 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xl tests tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Projects

None yet

Development

Successfully merging this pull request may close these issues.

First-run setup checklist for administrators, replacing the currency and time zone dialog

2 participants