Skip to content

i18n(platform-objects): ship the platform objects, Setup, Studio and Account in Korean - #31588

Merged
os-zhuang merged 5 commits into
mainfrom
claude/project-thread-k6o0gu
Nov 8, 2026
Merged

os-zhuang merged 5 commits into
mainfrom
claude/project-thread-k6o0gu

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Leehom · project thread

Fixes #30512
Thread-read: 6723260365
Clause-②: no
Metadata-protocol: none

维护者速读

What changes

  • New ko bundles in packages/platform-objects/src/apps/translations: ko.objects.generated.ts (1704 leaves), ko.metadata-forms.generated.ts (1263 leaves), their provenance table ko.source-hashes.generated.ts (45 deliberate byte copies of en, listed under Acceptance notes), the hand-authored ko.ts (141 leaves) and ko.source-hashes.ts recording the en digest of every hand leaf.
  • Registration: the extract config's --locales docstring and translations: baseline, setup.translation.ts, the apps barrel, and metadata-translations/index.ts.
  • Inline maps: 36 in sys-user.page.ts, 6 in sys-organization.page.ts, and the System Overview null label in system.datasets.ts (시스템).
  • Wording pins, as i18n(platform-objects): ship the platform objects, Setup, Studio and Account in French #31233 lists them: nav_account_approvals reads as plugin-approvals' my_pending label (내 승인 대기), nav_assignment_rules as sys_assignment_rule's plural label (배정 규칙), each nav_settings_* (including nav_settings_access_policy, 액세스 정책) as its service-settings hub title, nav_settings_hub as the console's backToHub (전체 설정), and the four feat(console): put Connect an AI Assistant where each person looks, and call it that #30935 keys: grp_account_ai_assistant = AI 어시스턴트; both nav_connect_agent entries and pages.connect_agent.label = AI 어시스턴트 연결.
  • Changeset .changeset/30512-platform-objects-ko.md (patch).

Tests

Acceptance notes

  • Every leaf is translated. The 45 byte copies of en the extract records fall into three groups:
    • Identifiers and protocol names (34): ID ×24, API ×2, UI ×2 (the source option of the two settings audit objects), JWKS, JWKS URI, Message-ID, IdP SSO URL, snake_case, and the SAML urn:…:emailAddress NameID format.
    • Lowercase option values and placeholder defaults that are identifiers (6): cron, dlq, api, and the openid email profile / email / name defaults.
    • The five JSON examples (5), kept verbatim as every locale keeps them.
  • repeater-row-properties refused three ID echoes in repeater rows, so each now names its parent: 영역 ID (app areas), 노드 ID (flow nodes) and 에지 ID (flow edges), matching how de and ja-JP name them.
  • Vocabulary follows the existing ko plugin bundles: formal 합니다 style, confirm prompts ending ~하시겠습니까?, 사용자, 조직, 사업부, 직위, 권한 세트, 대기열, 공유, 레코드, 승인, 에이전트, 스킬, 도구, 시스템 권한 (capability), and 상사 for a person's manager so it never collides with 관리자 (admin). Hub titles are exactly as service-settings spells them (메일 전송, SMS 전송, 파일 저장소, AI 및 Embedder, 데이터 수명 주기, …).
  • Business units are 사업부; 부서 appears only where the source says department (the department type option and the object description), which bu-rename-consistency allows.
  • Deviation, as in i18n(platform-objects): ship the platform objects, Setup, Studio and Account in Russian; refresh the stale fr connect-agent subtitle #31466 and i18n(platform-objects): ship the platform objects, Setup, Studio and Account in German #31511: no plugin-audit ko twin of the i18n: French is not a platform locale, so a user whose locale is fr reads English sys_user labels (Home feed field labels) #28107 activity-summary test, because plugin-audit is not in the claim's file surface.

Verification

  • os i18n extract packages/platform-objects/scripts/i18n-extract.config.ts --locales=zh-CN,ja-JP,es-ES,zh-Hant,ar,fr,pt-BR,ru,de,ko --fill=default --source-hashes --out=packages/platform-objects/src/apps/translations: a rerun regenerates the ko bundles byte-identical (md5sum -c) and leaves the 29 other generated files unchanged (none of them is in the diff). check-i18n-bundles --filter=platform-objects: in sync (32 bundles).
  • vitest run in platform-objects: 120 files, 1931 tests passed. plugin-approvals approval-status-vocabulary (6), plugin-security people-org-assignment-nav-contribution (5), service-settings setup-nav-hub-parity plus translations (158) and cli platform-page-i18n-parity (27) passed.
  • platform-objects typecheck: exit 0. check:app-nav-i18n: OK (13 contributors, 11 locales, 2 apps).
  • dispatch-gates --ran at e56cfa3 (on origin/main 8c75f83): 68 derived families, 68 run, 0 NOT-MEASURED, all exit 0 (including check:i18n, check:i18n-stale-fill, check:dts-closure, check:dual-build-cjs-loads, check:nul-bytes).
  • origin/main moved 2 commits past the base (2c6b936, neither touches platform-objects, plugin-approvals or service-settings).
  • eslint over the changed .ts paths (scoped, --no-inline-config): exit 0.

🤖 Generated with Claude Code


Generated by Claude Code

…Account in Korean

Adds the ko bundles (objects, metadata forms, hand bundle, source hashes),
registers ko everywhere de is registered, and widens every locale-listing
test de joined to include ko.

Co-Authored-By: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/xl documentation Improvements or additions to documentation tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Nov 8, 2026
@github-actions

github-actions Bot commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/platform-objects, touching 292 documentable anchor(s). ⚠️ 1 changed file(s) yielded no anchor (packages/platform-objects/src/apps/translations/index.ts), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

67 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: node scripts/docs-audit/affected-docs.mjs --json 5d1382a54c04968d7a1c39c1bb51a75c95cf7ea5.

⛔ 19 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails.

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/platform-objects/src/apps/translations/index.ts) — pages documenting those are invisible to this run
  • 2 anchor(s) matched too much of the corpus to be a work list: sys_user (symbol, 49 pages), snake_case (literal, 52 pages)
  • 33 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 65 of 231 client-bound route-ledger rows — the other 166 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 166: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 59 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 107 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 3 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 5d1382a54c04968d7a1c39c1bb51a75c95cf7ea5 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 9172eb4a9c2b7a7573fa59368fb0186fc617d2b0 — the merge of head bd80abcbece511306dd98e1951c09df411e487d1 into base 5d1382a54c04968d7a1c39c1bb51a75c95cf7ea5, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 9172eb4a9c2b7a7573fa59368fb0186fc617d2b0 && git checkout 9172eb4a9c2b7a7573fa59368fb0186fc617d2b0
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 5d1382a54c04968d7a1c39c1bb51a75c95cf7ea5 bd80abcbece511306dd98e1951c09df411e487d1 && git checkout -B drift-repro 5d1382a54c04968d7a1c39c1bb51a75c95cf7ea5 && git merge --no-ff bd80abcbece511306dd98e1951c09df411e487d1

node scripts/docs-audit/affected-docs.mjs --json 5d1382a54c04968d7a1c39c1bb51a75c95cf7ea5

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs 5d1382a54c04968d7a1c39c1bb51a75c95cf7ea5 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#3 · os-project-manager · session_01FEkQ5pXkgNXVpCn2GZDjyy

Contract review — ACCEPT

Head-sha: e56cfa3291f9b0e6394b0f4f91b6cc7213f90884

席位意见:ACCEPT · 默认档,席位自审 · 2026-11-08T17:04Z。本 PR 不碰任何契约面:Clause-②: no、Metadata-protocol: none,没有 packages/spec/src,也没有 governed 文本。按 pt-BR(#31440)、ru(#31466)、de(#31511,ACCEPT 6722209377)的先例,由席位在默认档自审。PR 有 7331 行(其中生成包占大头),超过 3000 行门槛,按 Tier H 走人工合并。

席位核对

  • 形态: draft,目标 main。首行 Fixes #30512,ko 是 i18n phase 3 (platform metadata and built-in emails): extraction and bundle checks read PLATFORM_LOCALES; backfill the seven missing locales #30512 剩下的最后一个语言,合并后关闭这张卡。正文带 Thread-read: 6723260365。

  • 覆盖: 36 个文件,与 i18n(platform-objects): ship the platform objects, Setup, Studio and Account in German #31511 逐文件对齐,包括:

    • ko 的两份生成包(objects 1704 个叶子、metadata-forms 1263 个叶子)和出处表,手写 ko.ts(141 个叶子)与它的摘要表;
    • 抽取配置、注册行;
    • 三处内嵌映射:sys-user.page.ts、sys-organization.page.ts、system.datasets.ts 的空值标签;
    • de 加过的各测试语言列表。

    席位读了三处内嵌映射的 diff:每行只是在 de 后面追加一个 ko,已有语言一个字节都没变。

  • 抽读译文: 구성원、초대、팀、세부 정보、계정 상태、감사、직위、권한 세트、사업부、이메일 미인증、인증 이메일 다시 보내기、클라우드 연결、대기열 구성원、액세스 정책、사용자 경험、로그인 이벤트。卡上要求钉住的导航项都在:내 승인 대기、배정 규칙、AI 어시스턴트。用语与已有 ko 插件包一致(합니다 体,상사 与 관리자 分开,사업부/부서 按 bu-rename-consistency 区分)。

  • 与 en 字节相同的叶子: 45 处,与 ru 相同,正文分三类逐条列出:标识符和协议名(ID ×24、API、JWKS 等 34 处)、作为标识符的小写选项和默认值(6 处)、5 个 JSON 示例。

  • repeater-row-properties: 3 处与 ID 重复的叶子被拒绝后,dev 改成带父级的名称(영역 ID、노드 ID、에지 ID),与 de、ja-JP 的做法一致,没有绕开这个检查。

  • 门禁(check-runs @ e56cfa32): 36 个 success,17 个 skipped,0 个失败。dev 在 e56cfa32 跑了本地 68 个门,全部退出码 0;platform-objects 1931/1931;check:app-nav-i18n 在 11 个语言上通过;重新抽取后生成包逐字节相同,check-i18n-bundles 32 个包同步。

  • changeset: 30512-platform-objects-ko.md,给 @objectstack/platform-objects 记一个 patch。

  • 接受的偏差: plugin-audit 的 ko 标签仍是英文回退。它不在认领的文件面里,和 ru、de 一样。

  • 落地条款: check-governed-merges --pr 31588:36 个路径中 0 个命中 governed,+7283/−48,超过 3000 行,属于 Tier H。需要 GOVERNED_APPROVERS(os-zhuang 或 hotlong)批准后才能进队。批准后,席位让卡线程再合一次 origin/main 并重跑 i18n 同步门,然后由席位落地。

@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 8, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review November 8, 2026 17:10
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 8, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 8, 2026
…base

sys_idp_group_mapping (from #31443) and the sys_api_key revoked_reason
`administrator_suspended` option and its updated help (from #31622).

Co-Authored-By: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#3 · os-project-manager · session_01FEkQ5pXkgNXVpCn2GZDjyy

席位意见:ACCEPT · Head-sha e855b1444c835356aa51c46efd1d8b60d63ae722 · 2026-11-08T19:59Z(接续 6724426186,那次在 e56cfa32 上)。

席位核对(delta e56cfa32..e855b144)

  • 起因: 维护者 17:10Z 把本 PR 放进合并队列,17:26Z 队列构建(run 42503676561,"Type Check · consumer gates")在 main dced781f 上红了。check-i18n-bundles 报 platform-objects 有 2 个包漂移,check-i18n-coverage 报未翻译的声明字符串从 0 增加到 20。原因是 main 在本 PR 的基点之后新增了平台对象标签(sys_idp_group_mapping 等),ko 包没有跟上。
  • 改动: 一次 origin/main 合并(69328c04,没有变基),加一个提交 e855b144:ko.objects.generated.ts +51/−2,补译 main 新增的叶子;ko.source-hashes.generated.ts +1,记录 sys_idp_group_mapping.fields.id.label 与 en 字节相同(ID,和已有的 45 处同属标识符一类)。席位抽读了新增译文:IdP 그룹 매핑、출처 유형、그룹 외부 ID、그룹 표시 이름、조직 멤버십 종료、관리자에 의해 정지됨,用语与已有 ko 包一致。
  • 门禁(check-runs @ e855b144): 35 个 success,13 个 skipped,0 个失败。check-governed-merges:0 个 governed,+7333/−48,仍是 Tier H。
  • 落地: Tier H 需要 GOVERNED_APPROVERS 批准后,席位才能入队。本 PR 上还没有批准的 review(维护者上次是直接入队)。请维护者批准或直接重新入队。

@os-zhuang
os-zhuang added this pull request to the merge queue Nov 8, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 8, 2026
… main added

sys_idp_group_mapping source_kind gained an `sso` option, and the
source_kind, source_id and organization_id helps now name the SSO provider.

Co-Authored-By: Claude <noreply@anthropic.com>
@os-zhuang
os-zhuang enabled auto-merge November 8, 2026 21:38
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#3 · os-project-manager · session_01FEkQ5pXkgNXVpCn2GZDjyy

席位意见:ACCEPT · Head-sha bd80abcbece511306dd98e1951c09df411e487d1 · 2026-11-08T21:40Z(接续 6726382491,那次在 e855b144 上)。

席位核对(delta e855b144..bd80abcb)

  • 起因: 维护者 21:06Z 重新入队,队列构建(run 42523523366,基于 main 5d1382a5)又红了:platform-objects 有 2 个包漂移,未翻译字符串从 0 增加到 1。main 又新增了一个 sys_idp_group_mapping 标签,还改写了该对象的 3 条英文帮助文字。
  • 改动: 合并了一次 origin/main(没有变基);ko.objects.generated.ts +5/−4:新增 source_kind.options.sso = SSO 공급자,并按新英文重译了 source_kind、source_id、organization_id 三条帮助文字(都改为提到 SSO 提供方)。席位读过这个 diff。
  • 门禁: dev 本地 check:i18n 10 个包同步、check:i18n-coverage 没有新增、check:app-nav-i18n 通过,platform-objects 1931/1931。bd80abcb 上的 CI 在本评论发出时还剩 1 个 check 在跑,此前完成的都是 success 或 skipped。维护者已开启 auto-merge,队列构建会在合并后的树上再验一遍。
  • 落地: 维护者已开启 auto-merge(os-zhuang,21:38Z)。席位按收班清单把本 PR 作为留守项记在座位帖上。

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#3 · os-project-manager · session_01FEkQ5pXkgNXVpCn2GZDjyy

席位核对 — ACCEPT · domain:server#3 · head bd80abcb · 2026-11-08T21:41Z

记录行:席位核对见 6727501497(e855b144..bd80abcb 只是合并 main 并补译 main 新增的 ko 叶子)。上一条核对的标题写法让 seat-record.mjs 读不出结论,这里按它能识别的格式重记一次。

@github-actions

github-actions Bot commented Nov 8, 2026

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 42523523412 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

分类:failure —— 按下面的日志分诊。

失败的 job(日志抽取,best effort):

  • Test Core (7/8) — 失败步骤: Run this shard's tests

    @objectstack/plugin-security:test:  FAIL  src/org-admin-assignment-boundary.posture.test.ts > [ADR-0090 D12; ruling of record 5985885287] a delegated administrator's assignment write to a row it canno
      ↳ 失败原因: @objectstack/plugin-security:test: Error: Test timed out in 5000ms.
    

↳ 失败原因 是判读的关键:超时(Test timed out in … / Hook timed out in …)多半是负载/时序,不是本 PR 的回归;
断言(AssertionError: …)才指向真实的行为改变。两者的 FAIL 行长得一模一样,只有这一行能区分。

⚠️ 断言这一侧有一类例外,判据是断言在测什么,不是它是不是 AssertionError。 断言的对象是产品行为(一个值、一个形状、一次拒收)⇒ 照上面读:真实的行为改变,去查,⛔ 不要重排掉;
断言的对象是这次实验自身的有效性前提(跑完的耗时、负载下的先后、任何只在时间预算内才成立的条件)⇒ 它跟超时是同一类,同样对负载敏感,重排一次是合法的判别手段。
识别是机械的:断言的消息或它比较的值本身点名了一段时长、一个时间戳、一个耗时计数。实测过的一对 —— AssertionError: SecurityPlugin.init() ran: expected false to be true 测的是产品行为(真回归);
AssertionError: this run took over a second, so second-precision stamps could have differed too: expected 1006 to be less than 1000 测的是实验前提:它守护的那条不变式当时是绿的,同一个 head 原样重排一次即成功。
穿着 AssertionError 外衣的时间测量,仍然是时间测量。(⛔ 这只改「怎么读一次红」,不改「哪些测试可以重排」——后者由别处管。)

跨 PR 相同签名(24h,按失败测试文件聚合):

  • src/org-admin-assignment-boundary.posture.test.ts — 24h 窗口内只有本 PR 撞到过,暂不汇总(再有一个不同 PR 撞到就会自动开汇总 issue)。
  • ⚠️ 24h 评论账本没读完(超过 5 页仍未读到窗口尽头),所以上面的「不同 PR 数」是下界,不是全量。

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 7 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 看上面的「跨 PR 相同签名」;已有汇总 issue ⇒ flaky/环境问题实锤,去那张 issue 上谈,修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

@os-zhuang
os-zhuang added this pull request to the merge queue Nov 8, 2026
Merged via the queue into main with commit b126c13 Nov 8, 2026
48 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-k6o0gu branch November 8, 2026 22:37
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 pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue 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.

i18n phase 3 (platform metadata and built-in emails): extraction and bundle checks read PLATFORM_LOCALES; backfill the seven missing locales

2 participants