Skip to content

i18n(service-messaging): ship the notification objects and digest heading in ru, de and ko (第 5 包的 B 半) - #30673

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-o3y7uf
Nov 5, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-o3y7uf

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Bill · project thread

domain:server#2 · os-bill · session_01Utp6Cai5CRdAs4u9gTipWU

Refs #30512 — 第 5 包的 B 半 (package 5 of 11, @objectstack/service-messaging, second half: ru, de, ko). The A half (zh-Hant, ar, fr, pt-BR) merged as #30638; with this half the package carries all eleven platform languages. The card stays open until the last PR of the series flips the bundle check to the platform locale table.

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么: 消息/通知七个对象的名称、字段、选项、帮助和视图名,以及摘要标题「您有 {{count}} 条通知」,补上俄、德、韩 3 种。这是第 5 包的 B 半;A 半(繁中、阿、法、巴葡)已由 i18n(service-messaging): ship the notification objects and digest heading in zh-Hant, ar, fr and pt-BR (第 5 包的 A 半) #30638 合入,本包至此 11 种齐全。
  • 为什么改: 平台语言表(Platform locale table (ruling F of #29349): one list of 11 languages in spec, complete on every surface #29428 裁决 F)要求 11 种语言;本包整包超过 3000 行,按席位裁决拆成 A/B 两半,本半单独可绿。
  • 风险与回滚: 只加翻译数据和注册行,messages.ts 的语言类型加宽到 11 种;不动逻辑、schema、接口,已有 8 种一字未改。两处测试只是把新语言加进它们检查的语言表,规则覆盖变宽,不是放宽。回滚即撤 PR。
  • 先看: src/translations/messages.ts(俄语 2 以上也变格:2–4 与 5+,所以俄语标题和阿语一样写成计数式「Уведомлений: {{count}}」,说明注释已点名俄语),再抽看 ru.objects.generated.ts。
  • 两分钟验证: node scripts/check-i18n-bundles.mjs --filter=messaging 输出 in sync;pnpm --filter @objectstack/service-messaging test 全绿。
  • 需要你做的: 无,席位落地。

What changes

  • Three new locales for the messaging objects under the platform locale table's tags: each a TAG.objects.generated.ts with all 203 object leaves plus its TAG.source-hashes.generated.ts, written by the repo's own os i18n extract --fill=default --source-hashes, served through withSourceFallback after the A half's four.
  • messages.ts: the digest heading in the three locales; MessagingLocale widens to all eleven tags. The plural note now names Russian beside Arabic: t() selects no plural form and Russian varies above two (2–4 vs 5+), so its heading is a tally (Уведомлений: {{count}}), correct for every count. German takes the plural for every count from two up; Korean does not inflect.
  • The extract command lists the three tags and its merge baseline imports the three bundles, so check:i18n covers them from this PR on.

Test changes — coverage widened, nothing loosened

  • admin-copy-vocabulary.test.ts and setup-list-empty-states.test.ts list the bundles they hold to their wording rules; the three new bundles join that list, so the rules now also cover them. No assertion changed.

Acceptance notes

Verification

Package suite, typecheck, build (verify lock, at the rebased head)
turbo build --filter=@objectstack/service-messaging...: 16 tasks successful, exit 0
pnpm --filter @objectstack/service-messaging test && typecheck
 Test Files  66 passed (66)
      Tests  851 passed (851)
os-verify-lock: VERDICT command-exit 0
i18n gates and size
node scripts/check-i18n-bundles.mjs --filter=messaging     in sync                                  EXIT 0
node scripts/check-i18n-stale-fill.mjs                     OK (no new stale fills, 1 baselined)     EXIT 0
eslint --no-inline-config on the changed .ts files: exit 0
changed lines 1619 (+1610 / -9), 12 files: under the 3000-line threshold

Derived gate families (dispatch-gates --commands, reconciled with --ran): 62 run, 0 not measured, all exit 0; recorded in the os-dev-report on #30512.

Dogfood: not run — content-only package PR, no ! in the title and no (narrowing) arm.


🤖 Generated with Claude Code

https://claude.ai/code/session_01Utp6Cai5CRdAs4u9gTipWU

…ding in ru, de and ko

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

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/service-messaging, touching 20 documentable anchor(s).

8 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/api/client-sdk.mdx (via sys_inbox_message (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects), sys_notification_receipt (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects))
  • content/docs/automation/email-templates.mdx (via sys_notification_template (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects))
  • content/docs/automation/flows.mdx (via sys_http_delivery (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects), sys_notification_delivery (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects))
  • content/docs/automation/webhooks.mdx (via sys_http_delivery (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects))
  • content/docs/kernel/runtime-services/push-service.mdx (via sys_user_device (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects))
  • content/docs/kernel/runtime-services/sms-service.mdx (via sys_notification_template (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects))
  • content/docs/permissions/authentication.mdx (via sys_notification_template (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects))
  • content/docs/plugins/packages.mdx (via sys_user_device (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects))

⛔ 5 release-owned page(s) also name something this change touched. These are read-only:

  • content/docs/releases/v17/17-1.mdx (via sys_inbox_message (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects))
  • content/docs/releases/v17/17-5.mdx (via sys_notification_delivery (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects))
  • content/docs/releases/v17/17-7.mdx (via sys_notification_template (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects))
  • content/docs/releases/v18/18-1.mdx (via sys_notification_preference (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects), sys_notification_template (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects))
  • content/docs/releases/v18/18-3.mdx (via sys_user_device (symbol, a field of const object deObjects; a field of const object koObjects; a field of const object ruObjects))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • the SDK route bridge reached 63 of 221 client-bound route-ledger rows — the other 158 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 158: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 103 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 — 6 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 b77c160a02c2bb69ad6c986461b2633fa8d28c18 → packageMentionDocs.

Which tree this was computed on

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

node scripts/docs-audit/affected-docs.mjs --json b77c160a02c2bb69ad6c986461b2633fa8d28c18

⚠️ 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 b77c160a02c2bb69ad6c986461b2633fa8d28c18 → 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 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL

维护者速读

席位核对 — ACCEPT · domain:server#2 · head 2ef9d0883afa997d1e34f26bc471de77840a8ce8

  • Shape: draft, author objectstack-fleet[bot] (relay pr_create), no assignee, no review request. 12 files, +1610 −9. check-governed-merges --pr 30673: NOT governed, 1619 lines ≤ 3000. The title has no !. Refs #30512 (package 5 of 11, half B; the card stays open).
  • Review face: TIER_DEFAULT (Clause-②: no). This is translated content for locales the platform table already declares, plus registration lines, so the seat writes the review here.
  • Seat rulings held:
    • Half B is ru / de / ko, per the split ruled on half A.
    • The new files use the table tags.
    • The existing seven locales are untouched.
    • There is no stale-fill baseline entry.
  • Seat read:
    • index.ts registers the three bundles through withSourceFallback, each with its source hashes and messages. scripts/i18n-extract.config.ts lists the tags.
    • messages.ts: the MessagingLocale union widens with the three tags, and each heading keeps {{count}}. The Russian heading is a count-neutral tally, as the half A ACCEPT required, and the docblock names ru (2–4 vs 5+) beside ar. German takes the plural and Korean has no plural inflection; the docblock lists both.
    • The two vocabulary and empty-state pins now also read the three bundles. That widens coverage and loosens nothing.
    • Spot check (Posteingangsnachricht / Сообщение во входящих / 받은편지함 메시지, and the actor and timestamp labels): consistent.
  • Dev readings (2ef9d088): package tests 851/851 pass. Derived gates 62/62 exit 0. os-dev-report 6670636834. This is a content-only package PR; the full dogfood is owed on the last PR of the series, per the order.
  • 门禁 check-runs: in progress at ACCEPT. Auto-merge waits for every required check.
  • 落地条款: Refs #30512. This seat lands it through the ordinary queue (pr_ready + automerge_enable on this head). Once it merges, the card ticks service-messaging.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 5, 2026 22:02
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge November 5, 2026 22:02
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 5, 2026
Merged via the queue into main with commit cabdfe8 Nov 5, 2026
49 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-o3y7uf branch November 5, 2026 22:58
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.

1 participant