Skip to content

i18n(plugin-webhooks): ship the webhook object in all eleven platform languages - #30586

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 — package 2 of 11 (@objectstack/plugin-webhooks). The card stays open: the last PR of the series flips the bundle check to the platform locale table.

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么: Webhook 对象(sys_webhook)的名称、字段、选项、帮助文字和视图名补上 7 种语言:繁体中文、阿拉伯语、法语、巴西葡萄牙语、俄语、德语、韩语,共 11 种,与平台语言表一致。
  • 为什么改: 平台语言表(Platform locale table (ruling F of #29349): one list of 11 languages in spec, complete on every surface #29428 裁决 F)要求每个界面带齐 11 种语言;这是第 3 期按包补齐的第 2 个包(47 条)。
  • 风险与回滚: 只加翻译数据和注册行,不动逻辑、schema、接口;原有 4 种语言一字未改。另在 check-i18n-stale-fill 的基线里登记 1 条良性巧合(中文无复数,简繁两种都把复数名写作「Webhook」),附理由。回滚即撤 PR。
  • 先看: src/translations/index.ts(按表标签注册,zh-CN 在 zh-Hant 前)、scripts/i18n-stale-fill-baseline.json(那 1 条巧合),再抽看 ar.objects.generated.ts。
  • 两分钟验证: node scripts/check-i18n-bundles.mjs --filter=webhooks 输出 in sync (21 bundle(s)),node scripts/check-i18n-stale-fill.mjs 退出 0。
  • 需要你做的: 无,席位落地。

What changes

  • Seven new locales for sys_webhook under the platform locale table's tags (zh-Hant, ar, fr, pt-BR, ru, de, ko): each a TAG.objects.generated.ts with all 47 leaves plus its TAG.source-hashes.generated.ts, written by the repo's own os i18n extract --fill=default --source-hashes and served through withSourceFallback like the existing three. zh-CN stays ahead of zh-Hant in index.ts.
  • The extract command in scripts/i18n-extract.config.ts lists the seven tags and its merge baseline imports the seven bundles, so check:i18n covers them from this PR on.
  • scripts/i18n-stale-fill-baseline.json: one entry, sys_webhook.pluralLabel, classified as a benign coincidence with its reason. zh-CN already said 「Webhook」 for the plural (Chinese does not inflect), and the natural zh-Hant is the same bytes; the gate's cross-locale rule reads two CJK locales agreeing on a Latin-only value that differs from the source (Webhooks) as a stale fill. Re-translating either leaf away from the product term would be worse copy, so the gate's documented path (ratchet in, record why) is taken.
  • bundle-ownership.test.ts: one message sentence, "the four locale bundles" → "every locale bundle".

Acceptance notes

  • Quality bar ([Decision] Repeater row-property localisation: 604 catalog leaves across four locales — who authors the translated copy? #17508 / PR feat(spec): a repeater property panel names its columns in every locale, not only English #19345): every leaf written for the reader; placeholders, code spans (signing_secret, headers_secret), JSON examples ({"Authorization": "Bearer …"}), header names (X-Objectstack-Signature) and identifiers (snake_case, bulk_*, HMAC-SHA256, sys_secret, @objectstack/spec/automation/webhook) byte-identical, checked mechanically per leaf against en. Arabic is RTL prose with identifiers left in Latin script.
  • Leaves equal to English, on purpose: the HTTP method options GET POST PUT PATCH DELETE in every locale; beyond those, the product term and native cognates only — zh-Hant Webhook (label) and Webhook ID; fr Webhook, Webhooks, Description, package; pt-BR Webhook, Webhooks; de Webhook, Webhooks, Name, Definition. The extractor records each as a source copy (ar/ru/ko 5 entries = the methods only; zh-Hant/pt-BR 7; fr/de 9).
  • Option labels of managed_by / triggers are translated (they were already translated in zh-CN); the help texts keep the option codes (admin, package, platform, create/update/delete) as codes, as zh-CN does.

Verification

Package suite, typecheck, build (verify lock)
pnpm --filter @objectstack/plugin-webhooks build && test && typecheck
 Test Files  25 passed (25)
      Tests  258 passed (258)
os-verify-lock: VERDICT command-exit 0
i18n gates
node scripts/check-i18n-bundles.mjs --filter=webhooks
  plugins/plugin-webhooks        in sync (21 bundle(s))                                        EXIT 0
node scripts/check-i18n-stale-fill.mjs   (before the baseline entry)
  1 NEW stale-fill leaf: plugin-webhooks … #sys_webhook.pluralLabel · locales zh-CN, zh-Hant · source "Webhooks" · serving "Webhook"   EXIT 1
node scripts/check-i18n-stale-fill.mjs   (after, entry classified)                            EXIT 0
Derived gate families at head c6c3038 (dispatch-gates --commands, reconciled with --ran)
dispatch-gates --ran: 68 derived famil(ies) accounted for — 68 run, 0 NOT-MEASURED (a DERIVED zero — all 68 recorded an exit code and none of them is 3).
every family exit 0, including pnpm check:i18n (all 10 bundle sets) and pnpm check:i18n-stale-fill
eslint --no-inline-config on the changed .ts files: exit 0 · check-nul-bytes: exit 0
changed lines 1066 (+1063 / -3), 19 files: under the 3000-line human-merge threshold

Full record: the seat's project folder, server-seat2/30512/gates-webhooks-ran.txt.

Dogfood: not run — content-only package PR, no ! in the title and no (narrowing) arm (dispatch order: package suite + check:i18n + typecheck suffice).


Generated by Claude Code

@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/plugin-webhooks, touching 16 documentable anchor(s).

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

  • content/docs/automation/webhooks.mdx (via sys_webhook (symbol, a field of const object arObjects; a field of const object deObjects; a field of const object frObjects; a field of const object koObjects; a field of const object ptBRObjects; a field of const object ruObjects; a field of const object zhHantObjects))
  • content/docs/permissions/system-context.mdx (via sys_webhook (symbol, a field of const object arObjects; a field of const object deObjects; a field of const object frObjects; a field of const object koObjects; a field of const object ptBRObjects; a field of const object ruObjects; a field of const object zhHantObjects))
  • content/docs/ui/apps.mdx (via sys_webhook (symbol, a field of const object arObjects; a field of const object deObjects; a field of const object frObjects; a field of const object koObjects; a field of const object ptBRObjects; a field of const object ruObjects; a field of const object zhHantObjects))

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

  • content/docs/releases/v16.mdx (via sys_webhook (symbol, a field of const object arObjects; a field of const object deObjects; a field of const object frObjects; a field of const object koObjects; a field of const object ptBRObjects; a field of const object ruObjects; a field of const object zhHantObjects))
  • content/docs/releases/v17/17-5.mdx (via sys_webhook (symbol, a field of const object arObjects; a field of const object deObjects; a field of const object frObjects; a field of const object koObjects; a field of const object ptBRObjects; a field of const object ruObjects; a field of const object zhHantObjects))
  • content/docs/releases/v18/18-0.mdx (via sys_webhook (symbol, a field of const object arObjects; a field of const object deObjects; a field of const object frObjects; a field of const object koObjects; a field of const object ptBRObjects; a field of const object ruObjects; a field of const object zhHantObjects))

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 61 of 219 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 — 5 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 2ffdb649775d20313707d88a8388275f280a0a7f → packageMentionDocs.

Which tree this was computed on

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

node scripts/docs-audit/affected-docs.mjs --json 2ffdb649775d20313707d88a8388275f280a0a7f

⚠️ 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 2ffdb649775d20313707d88a8388275f280a0a7f → 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

维护者速读

  • 改了什么: Webhook 对象(sys_webhook)补齐 7 种语言:繁體中文、阿拉伯语、法语、巴西葡语、俄语、德语、韩语,按平台语言表的标签注册,原有 4 种不动。
  • 为什么改: 平台语言表定了 11 种语言(Platform locale table (ruling F of #29349): one list of 11 languages in spec, complete on every surface #29428 裁定 F),i18n phase 3 (platform metadata and built-in emails): extraction and bundle checks read PLATFORM_LOCALES; backfill the seven missing locales #30512 按包补齐,这是 11 个包中的第 2 个。
  • 风险与回滚: 只加翻译内容和注册行,不改行为;另在陈旧填充检查的基线里登记 1 条良性巧合(中文无复数,简繁复数名都写「Webhook」)。回滚即撤本 PR。
  • 先看: packages/plugins/plugin-webhooks/src/translations/index.ts 的注册行和 scripts/i18n-stale-fill-baseline.json 那一条。
  • 两分钟验证: pnpm --filter @objectstack/plugin-webhooks test;node scripts/check-i18n-stale-fill.mjs 退出 0。
  • 需要您做的: 无,席位经合并队列落地(非受管面,1066 行,非 BREAKING)。
  • 席位意见: ACCEPT。席位抽查了繁中、阿语译文,术语与已有三种一致;基线那一条走的是检查自带的登记路径,理由成立,不必为了过检查把产品术语改成更差的译法。

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

  • 形态: draft, author objectstack-fleet[bot] (relay pr_create), no assignee, no review request; 19 files, +1063 −3; check-governed-merges --pr 30586: NOT governed, 1066 lines ≤ 3000. Title has no !. Refs #30512 (package 2 of 11; the card stays open).
  • Review face: TIER_DEFAULT (Clause-②: no: translated content for locales the platform table already declares, registration lines, one stale-fill baseline entry; no spec, governed or narrowing path), written here by the seat.
  • Seat rulings held: new files under the table tags; existing zh-CN / ja-JP / es-ES untouched; zh-CN registered ahead of zh-Hant, as in package 1.
  • Seat read: index.ts and scripts/i18n-extract.config.ts register the seven bundles and their source hashes, so the existing check:i18n covers this package for them (no new gate). Spot check: zh-Hant (組織 / 稽核 / 批次更新 / 傳送佇列), ar (خطاف ويب / خطافات الويب, RTL text; Latin left only for code identifiers snake_case, create/update/delete, bulk_*, HTTP, API). scripts/i18n-stale-fill-baseline.json: one entry, sys_webhook.pluralLabel, reason recorded: Chinese does not inflect, and zh-CN already carried 「Webhook」 for the plural before this PR; the gate's documented ratchet path, not a suppression of a real stale value. bundle-ownership.test.ts: one message wording.
  • Dev readings (c6c30383): package tests 258/258, typecheck, check:i18n green; derived gates 68, all exit 0, 0 NOT MEASURED. Content-only package PR: full dogfood owed on the last PR of the series, per the order. os-dev-report 6663746488.
  • 门禁 check-runs: in progress at ACCEPT; the seat queues once every check is green or an expected skip.
  • 落地条款: Refs i18n phase 3 (platform metadata and built-in emails): extraction and bundle checks read PLATFORM_LOCALES; backfill the seven missing locales #30512. Ordinary queue landing by this seat: pr_ready + automerge_enable on this head; the card ticks plugin-webhooks when it merges.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 5, 2026 17:13
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge November 5, 2026 17:13
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 5, 2026
Any commits made after this event will not be merged.
Merged via the queue into main with commit 08e0247 Nov 5, 2026
49 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-o3y7uf branch November 5, 2026 17:44
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