Skip to content

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

Merged
objectstack-fleet[bot] merged 6 commits into
mainfrom
claude/project-thread-bmf2vu
Nov 7, 2026
Merged

objectstack-fleet[bot] merged 6 commits into
mainfrom
claude/project-thread-bmf2vu

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by 田騏 · project thread

Part of #30512
Clause-②: no
Metadata-protocol: none

维护者速读

  • 业务影响:阿拉伯语(ar)用户打开平台对象、Setup、Studio 和 Account 时,界面不再是英文。
  • 范围:只动 @objectstack/platform-objects,按 i18n(platform-objects): ship the platform objects, Setup, Studio and Account in zh-Hant #30951 加 zh-Hant 的同一套路加 ar;spec、ui、邮件模板都不碰。
  • 翻译:从 main 的 en 源重新翻译 3078 个叶子,术语对齐 ui/packages/i18n 的 ar;只有 17 个标识符(JWKS、cron、JSON 示例等)保留英文。
  • 跨包对齐:审批、分配规则、各设置页的导航名与对应包的 ar 标题逐字一致,并由现有测试守住。
  • 风险:只新增语言与测试里的语言列表,不改任何既有语言的文本;新文本同样走 source-hash 回退。
  • 合并:生成文件让 PR 超过 3000 行,需要座位契约复审后由人工合并。

What changes

  • New ar bundles in packages/platform-objects/src/apps/translations: ar.objects.generated.ts (1676 leaves), ar.metadata-forms.generated.ts (1263 leaves), their provenance table ar.source-hashes.generated.ts (16 deliberate echoes), the hand-authored ar.ts (139 leaves) and ar.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: 35 in sys-user.page.ts, 6 in sys-organization.page.ts, and the System Overview null label in system.datasets.ts.
  • Wording pins: nav_account_approvals reads as plugin-approvals' my_pending label, nav_assignment_rules as sys_assignment_rule's plural label, each nav_settings_* as its service-settings hub title, and the four feat(console): put Connect an AI Assistant where each person looks, and call it that #30935 keys (grp_account_ai_assistant, both nav_connect_agent entries, pages.connect_agent.label).
  • Changeset .changeset/30512-platform-objects-ar.md (patch).

Tests

  • ar added to the locale lists of the platform-objects tests that i18n(platform-objects): ship the platform objects, Setup, Studio and Account in zh-Hant #30951 widened for zh-Hant (vocabulary, nav parity, dead-key tombstone, source-hash, copy tests, record-page tabs, plugin translation loads), plus plugin-approvals approval-status-vocabulary, plugin-security people-org-assignment-nav-contribution and service-settings setup-nav-hub-parity. The cli platform-page-i18n-parity LOCALE_KEY shape already accepts ar.

Acceptance notes

  • Every leaf is translated; the only byte copies of en are identifiers and code examples, and the extract records them in the provenance table.
  • Lists of Latin identifiers use the Arabic comma, and no proclitic و is glued to a Latin token.
  • Position on the add-record button is الموضع and the job position is المنصب; a hook's Body is المتن.

Verification

  • os i18n extract ... --locales=zh-CN,ja-JP,es-ES,zh-Hant,ar --fill=default --source-hashes: regenerates the ar files byte-identical and leaves the other locales unchanged.
  • vitest run in platform-objects: 117 files, 1683 tests passed. The plugin-approvals, plugin-security, service-settings and cli parity tests passed.
  • dispatch-gates --ran: 64 derived families, 64 run, 0 NOT-MEASURED, all exit 0 (including check:i18n).
  • pnpm lint, platform-objects typecheck, and all 57 commands of the "Lint · docs & code guards" lane (including check:cli-command-ids): exit 0.

🤖 Generated with Claude Code

…Account in Arabic

Adds the `ar` locale to @objectstack/platform-objects the way zh-Hant was
added: generated object and metadata-form bundles with their provenance
table, the hand-authored Setup/Studio/Account bundle with recorded source
hashes, registration in the Setup and MetadataForms assemblers and the
extract config, the inline maps on the user and organization record pages,
the System Overview null label, and `ar` in every locale-list test.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ihL2c6VJSYt3p57JSNBqP
@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 7, 2026
@github-actions

github-actions Bot commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/platform-objects, touching 291 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.

65 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 56baf78e0c422b6555238043cc7d4c1a22db3568.

⛔ 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 63 of 226 client-bound route-ledger rows — the other 163 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 163: 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; 104 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 56baf78e0c422b6555238043cc7d4c1a22db3568 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from cce71dd23ac2fa71048440ac9951d0cdcd653202 — the merge of head 502274d643a4a49b2636cb0135eef933d1eb4fda into base 56baf78e0c422b6555238043cc7d4c1a22db3568, 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 cce71dd23ac2fa71048440ac9951d0cdcd653202 && git checkout cce71dd23ac2fa71048440ac9951d0cdcd653202
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 56baf78e0c422b6555238043cc7d4c1a22db3568 502274d643a4a49b2636cb0135eef933d1eb4fda && git checkout -B drift-repro 56baf78e0c422b6555238043cc7d4c1a22db3568 && git merge --no-ff 502274d643a4a49b2636cb0135eef933d1eb4fda

node scripts/docs-audit/affected-docs.mjs --json 56baf78e0c422b6555238043cc7d4c1a22db3568

⚠️ 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 56baf78e0c422b6555238043cc7d4c1a22db3568 → 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#2 · marchtian · session_017ihL2fBJ6xsLWJsnNJGMMx

席位判读 — Test Core (3/8) 判为 flake,重跑一次 · 2026-11-07T13:34Z

  • 红的是 run 42375309941 的 Test Core (3/8)(job 128412039985),只有 packages/runtime/src/domains/mcp-object-schema-mask.test.ts 一个用例([ADR-0106 D1] a standalone or object-less action entry …,usr_author item st_ping)。
  • 席位逐字比对了日志里的 Expected / Received:两串各 532 字符,只差 1 个字符,即 Last-Modified 头 13:09:41 对 13:09:40。ETag 相同("27870be0"),body 相同。两次部署跨了秒边界,Last-Modified 按秒取整。
  • 本 PR 只改 i18n bundle 与注册,不碰 packages/runtime/**;dev 报告同 head 本地 45/45 绿。
  • 判为 flake。席位按 platform-readings 规则用 rerun-failed.mjs 重跑一次失败作业;第二次红即按真红处理。

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#2 · marchtian · session_017ihL2fBJ6xsLWJsnNJGMMx

席位核对 — CHANGES · domain:server#2 · Head-sha: 4281e7faafd9540fea3f11d2e22704de9d69ef8d · 2026-11-07T13:40Z

契约复审第一轮,退回两处,改后复读。

  • Blocking — packages/platform-objects/src/apps/translations/ar.ts:46: group_approvals 译成 'بانتظار موافقتي'(「待我审批」),这是账户应用 nav_account_approvals 的钉子措辞,被带进了 Setup 的分组名。Setup 的这个分组装的是收件箱、请求、历史、委托四项,en 为 Approvals,zh-Hant 为 核准、zh-CN 为 审批。应为 'الموافقات'(与 ui/packages/i18n ar 的 approvals: "الموافقات" 一致)。
  • Should-fix — ar.ts:90: nav_settings_hub 为 'كل الإعدادات';Console 返回设置首页的链接(ui/packages/i18n/src/locales/ar.ts backToHub)写的是 "جميع الإعدادات"。zh-Hant / zh-CN 两个已落地语言的 nav_settings_hub 都与各自 backToHub 逐字相同(全部設定 / 全部设置),ar 应同样取 'جميع الإعدادات'。
  • Nit(可随手改,不阻塞): lease(工作者租约)译为 عقد الإيجار(房屋租约)、Audiences 译为 الجماهير(大众),共 4 处;建议 مهلة الحجز / الجمهور المستهدف 一类说法。

已核且无异议: 35 个文件与 #30951 的文件形状一一对应(packages/cli/test/platform-page-i18n-parity.test.ts 不需改:它从 SetupAppTranslations 取语言表,#30951 改它只为 zh-Hant 的书写体子标签);无阿拉伯文的值只有标识符与代码示例(objects 12、forms 11、nav 1 Studio,与 zh-Hant 一致);无黏连 و 接拉丁标识符;nav_account_approvals = plugin-approvals ar 的 my_pending「بانتظار موافقتي」;nav_assignment_rules = plugin-sharing ar 的 pluralLabel「قواعد الإسناد」;nav_settings_localization / ai / lifecycle 与 service-settings ar 的 hub 标题逐字相同;#30935 三键按派单。随机抽 56 条 en/ar 对照,措辞准确。

CI: Test Core (3/8) 红判为 flake(见本 PR 上席位的判读评论,Last-Modified 跨秒),已按规则重跑一次。

改完两处后推新 head,席位复读增量并给 ACCEPT;本 PR 超过 3000 行,ACCEPT 后请 os-zhuang / hotlong 人工合并。

… lease and audience wording

The Setup approvals group reads الموافقات rather than the Account entry's
"pending my approval" wording, the settings hub entry matches the console's
back-to-hub link (جميع الإعدادات), a worker lease is a حجز rather than a
property lease, the single-tenancy posture names tenants, and share-link
audiences read as target audiences.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ihL2c6VJSYt3p57JSNBqP
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#2 · marchtian · session_017ihL2fBJ6xsLWJsnNJGMMx

席位核对 — ACCEPT · domain:server#2 · Head-sha: 8fa92e09664121af683c354ae30966bde70a16d1 · 2026-11-07T13:45Z

维护者速读

席位核对(增量 4281e7faaf..8fa92e0966)

  • 3 files, +12 −12, all ar bundles; nothing outside them.
  • Blocking fixed: ar.ts group_approvals = 'الموافقات' (Setup group; en Approvals, zh-Hant 核准). Dev confirms no other key shared the pinned my_pending wording.
  • Should-fix fixed: nav_settings_hub = 'جميع الإعدادات', word for word ui/packages/i18n ar backToHub.
  • Nits taken: worker/queue lease now حجز / مهلة الحجز (5 strings, including decommission_lease label, help and expiry label); share-link audiences now فئات الجمهور المستهدف (3 strings); one more mistranslation found by the dev and fixed: sys_user.role help, tenancy posture وضع الإيجار → وضعية المستأجرين. Read as a word diff.
  • Dev's re-reading: extract re-run changes only these three files; provenance table unchanged; platform-objects 117 files / 1,683 tests pass; hub-parity, approvals and security cross-package tests pass; check:i18n, i18n-stale-fill, nul-bytes, check-cli-command-ids exit 0.
  • First-round record stands for everything else (file shape vs i18n(platform-objects): ship the platform objects, Setup, Studio and Account in zh-Hant #30951, identifier-only leftovers, pins, 56-string sample).
  • Clause-②: no holds. Part of #30512, card stays open (fr follows after this lands).
  • Landing: waits for every check green or expected-skip on 8fa92e0966; then the seat flips ready and asks os-zhuang / hotlong for the human approval the size gate requires.

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

Copy link
Copy Markdown
Contributor Author

domain:server#2 · marchtian · session_017ihL2fBJ6xsLWJsnNJGMMx

出队判读 — 真红,本 PR 补一行 · 2026-11-07T14:41Z

  • 合并队列 run 42381287247(Lint & Type Check)红在 pnpm check:app-nav-i18n:apps.setup.navigation — locale ar has no label for … nav_settings_access_policy(author's literal "Access policy")。
  • 原因:feat(plugin-auth, service-settings)!: the access policy is set per organization, with three MFA levels #31013(b5696b4967,本 PR 基点之后合入 main)新增了 Setup 导航项 nav_settings_access_policy,并给当时已注册的 5 种语言补了标签;本 PR 注册 ar 后,ar 缺这一条。两者各自绿,合在一起红,属语义冲突,不是 flake,不重投。
  • 修法:卡线程合入 origin/main,在 packages/platform-objects/src/apps/translations/ar.ts 补 nav_settings_access_policy: { label: 'سياسة الوصول' },与 service-settings ar 的 hub 标题 access_policy.title 逐字相同(hub-parity 规则)。新 head CI 绿后席位复读增量,再请人工批准入队。

@github-actions

github-actions Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

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

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

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

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

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

    @objectstack/platform-objects:test:  FAIL  src/pages/sys-user-ai-assistants-tab.test.ts > sys_user_detail — the AI Assistants tab > carries the label in every locale the sibling tabs spell
      ↳ 失败原因: @objectstack/platform-objects:test: AssertionError: Details: expected [ 'ar', 'en', 'es-ES', 'ja-JP', …(2) ] to deeply equal [ 'en', 'es-ES', 'ja-JP', …(2) ]
    
  • Test Core (8/8) — 失败步骤: Run this shard's tests

    @objectstack/service-settings:test:  FAIL  src/setup-nav-hub-parity.test.ts > Setup sidebar and settings hub list the same pages under the same names (#27854) > ar: each sidebar entry reads as its hub
      ↳ 失败原因: @objectstack/service-settings:test: AssertionError: expected [ { ns: 'access_policy', …(2) } ] to deeply equal []
    @objectstack/plugin-auth:test:  FAIL  src/organization-access-policy.test.ts > a switch of the active organization is judged against the target's limits > the absolute limit is judged too, and a targe
      ↳ 失败原因: @objectstack/plugin-auth:test: AssertionError: expected 'ended' to be 'admitted' // Object.is equality
    
  • Test Core (1/8) — 失败步骤: Run this shard's tests

    @objectstack/cli:test:  FAIL   unit  test/platform-page-i18n-parity.test.ts > shipped platform record pages -- i18n ownership (#14817) > holds every inline locale map on those pages complete in every 
      ↳ 失败原因: @objectstack/cli:test: AssertionError: expected [ { …(2) } ] to deeply equal []
    

↳ 失败原因 是判读的关键:超时(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/pages/sys-user-ai-assistants-tab.test.ts — 24h 窗口内只有本 PR 撞到过,暂不汇总(再有一个不同 PR 撞到就会自动开汇总 issue)。
  • src/setup-nav-hub-parity.test.ts — 24h 窗口内只有本 PR 撞到过,暂不汇总(再有一个不同 PR 撞到就会自动开汇总 issue)。
  • src/organization-access-policy.test.ts — 24h 窗口内只有本 PR 撞到过,暂不汇总(再有一个不同 PR 撞到就会自动开汇总 issue)。
  • test/platform-page-i18n-parity.test.ts — 24h 窗口内只有本 PR 撞到过,暂不汇总(再有一个不同 PR 撞到就会自动开汇总 issue)。
  • ⚠️ 24h 评论账本没读完(超过 5 页仍未读到窗口尽头),所以上面的「不同 PR 数」是下界,不是全量。

历史信号:

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

分诊清单:

  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 7, 2026
@os-zhuang
os-zhuang removed this pull request from the merge queue due to a manual request Nov 7, 2026
@github-actions

github-actions Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

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

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

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

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

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

    @objectstack/platform-objects:test:  FAIL  src/pages/sys-user-ai-assistants-tab.test.ts > sys_user_detail — the AI Assistants tab > carries the label in every locale the sibling tabs spell
      ↳ 失败原因: @objectstack/platform-objects:test: AssertionError: Details: expected [ 'ar', 'en', 'es-ES', 'ja-JP', …(2) ] to deeply equal [ 'en', 'es-ES', 'ja-JP', …(2) ]
    
  • Test Core (1/8) — 失败步骤: Run this shard's tests

    @objectstack/cli:test:  FAIL   unit  test/platform-page-i18n-parity.test.ts > shipped platform record pages -- i18n ownership (#14817) > holds every inline locale map on those pages complete in every 
      ↳ 失败原因: @objectstack/cli:test: AssertionError: expected [ { …(2) } ] to deeply equal []
    
  • Test Core (8/8) — 失败步骤: Run this shard's tests

    @objectstack/service-settings:test:  FAIL  src/setup-nav-hub-parity.test.ts > Setup sidebar and settings hub list the same pages under the same names (#27854) > ar: each sidebar entry reads as its hub
      ↳ 失败原因: @objectstack/service-settings:test: AssertionError: expected [ { ns: 'access_policy', …(2) } ] to deeply equal []
    

↳ 失败原因 是判读的关键:超时(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,按失败测试文件聚合):

历史信号:

  • ⚠️ 本 PR 过去 24h 已在队列失败 1 次(不含本次)。 内容未变而反复失败 ⇒ 高度怀疑 flaky 测试或与同组 PR 的语义冲突,重排不解决。
  • 过去 24h 队列共有 19 个失败构建(不含本次)。

分诊清单:

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

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

…istants tab and SCIM credential actions

Brings the ar bundle level with what main gained since the branch point:
the Setup access-policy entry reads as service-settings' ar hub title, the
user page's AI Assistants tab carries ar, the SCIM connection credential's
mint and revoke actions are translated, and the retired organization MFA
toggle's label and help follow their revised source.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ihL2c6VJSYt3p57JSNBqP
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#2 · marchtian · session_017ihL2fBJ6xsLWJsnNJGMMx

席位核对 — 增量 ACCEPT

Head-sha: 502274d643a4a49b2636cb0135eef933d1eb4fda

  • 上次 ACCEPT 在 8fa92e0966。增量两个提交:3cbe672bcb 合入 origin/main(无冲突解决,git show --cc 为空);502274d643 只补 ar。
  • 502274d643 的内容:ar.ts 加 nav_settings_access_policy: 'سياسة الوصول',与 service-settings ar 的 hub 标题一致(补上出队那条红);sys-user.page.ts 的 AI Assistants 页签加 ar 标签,测试同步加一项;ar.objects.generated.ts 加 SCIM 凭据的 mint/revoke 两个动作,以及 require_mfa 已停用后的新标签和帮助文字,跟随 main 的英文原文。没有逻辑改动。
  • 新 head 上 CI 全绿,没有失败或仍在跑的 check。
  • os-zhuang 在 8fa92e0966 的 APPROVED 仍有效(规模闸门的批准不随推送失效)。席位重新开启 auto-merge 入队。
  • 合入后,席位会在 Queue-flake anchor Queue-flake anchor: test/platform-page-i18n-parity.test.ts #31153 和 Queue-flake anchor: src/pages/sys-user-ai-assistants-tab.test.ts #31163 下注明:那两次是本 PR 与 main 的语义冲突,已在 502274d643 修好。

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.

3 participants