Skip to content

i18n(service-settings): ship the built-in settings pages in ru, de and ko - #30931

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

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

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

domain:server#1 · os-elon-musk · session_016WV4cya5ej5GQV86RPbRPK

Part of #30512 — package 6 of 11, second half (@objectstack/service-settings in ru, de, ko; the first half, zh-Hant, ar, fr, pt-BR, landed in #30870). With it every built-in settings page carries all eleven platform languages. The card stays open: platform-objects follows, and the last PR of the series makes the bundle check read the platform locale table.

Clause-②: no
Metadata-protocol: none

维护者速读

What changes

Tests

  • settings-translation-coverage.test.ts holds the three new locales to the same full coverage of every built-in manifest. No assertion changed.

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, URLs and identifiers byte-identical, checked mechanically per leaf against en and against zh-CN (which carries the inline-manifest keys en.ts does not): key set, {{holes}}, {holes}, backtick spans, angle tokens, all three locales zero diffs. Russian and Korean keep identifiers, hosts and URLs in Latin script.
  • Leaves equal to English, on purpose: provider, product and protocol names (SMTP, S3, OpenAI, Anthropic, Vercel AI Gateway, Turso / libSQL, RAGFlow, …) and the terms the existing zh-CN / ja-JP / es-ES also leave in English (Base URL, Embedder), in all three; in de also words German uses as they are (Host, Port, Branding, Website, Region, Backend, Adapter, Bucket, Global) and the country names Intl.DisplayNames spells the same in German (Andorra, Afghanistan, …).
  • No cross-locale coincidence: check:i18n-stale-fill passes with the baseline untouched.
  • No string opens with os followed by a lowercase word (check-cli-command-ids passes), and the whole "Lint · docs & code guards" lane was run locally before opening.

Verification

Package suite, typecheck, build (verify lock)
turbo run build --filter=!@objectstack/docs: 118/118 tasks successful, exit 0   (at head 6e64d7fe, on main 0e882086)
pnpm --filter @objectstack/service-settings test && typecheck   (at head 6e64d7fe)
 Test Files  71 passed (71)
      Tests  1349 passed (1349)
os-verify-lock: VERDICT batch-last-exit 0   (a frozen-lockfile install ran first, joined with ';';
  build, test and typecheck are one '&&' chain, so this exit covers all three)
same patch at 02754089 (stacked on settings A's head 9c22c667, main a2f523aa): 71 files, 1349 passed, VERDICT command-exit 0
i18n gates, the derived families and the docs & code guards lane
node scripts/check-i18n-bundles.mjs (all packages; service-settings has no extract config)   (at 6e64d7fe)
check-i18n-bundles: OK (10 package(s) — all bundles in sync, no undeclared authoring keys).   EXIT 0
node scripts/check-i18n-stale-fill.mjs                          (at 6e64d7fe)
check-i18n-stale-fill: OK (11 bundle set(s) — no new stale fills, 1 baselined).   EXIT 0
node scripts/check-cli-command-ids.mjs                          (at 6e64d7fe)   EXIT 0
dispatch-gates --commands (at 02754089): 60 families, each run and recorded with its exit code: 60 x exit 0
dispatch-gates --ran: 60 derived, 60 run, 0 NOT-MEASURED (a derived zero)
re-derived at 6e64d7fe: the identical 60-command list
pnpm lint (repo-wide, at 02754089): exit 0
CI lane "Lint · docs & code guards", every command run locally   (at 02754089)
  56 commands (lane-verdict excepted), 56 x exit 0, check-cli-command-ids included
changed lines 2070 (+2068 / -2), 6 files: under the 3000-line human-merge threshold

The branch is one commit on main 0e882086 (after #30870 landed). Its diff has the same patch id (6eede7e4) as 02754089, where the derived families, pnpm lint and the docs & code guards lane ran with settings A's head beneath it. The whole-tree build, the package suite and the three i18n / command-id checks were re-run on this head, after main's #30836 / #30838 / #30867 / #30874 changed @objectstack/objectql and @objectstack/spec; none of them touches service-settings.

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


Generated by Claude Code

…d ko

The second half of the settings package: ru, de and ko for the
built-in Setup settings pages, registered in settingsBuiltinTranslations
under the platform-table tags after the first half's four. With it every
built-in settings page carries all eleven platform locales. The settings
coverage test holds each new locale to the same full coverage.

Carried from the released handover commit bc85264 (written by
session_01Utp6Cai5CRdAs4u9gTipWU) without its localization-currency-lock
and localization-locale-options hunks: #30630 (landed as #30734) owns
those copy tables and already carries all eleven languages there.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4cya5ej5GQV86RPbRPK
@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

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

  • content/docs/data-modeling/objects.mdx (via expireAfter (literal, a string literal in settings), maxAge (literal, a string literal in settings))
  • content/docs/deployment/production-readiness.mdx (via maxAge (literal, a string literal in settings))
  • content/docs/protocol/kernel/i18n-standard.mdx (via settingsCommon (symbol, a field of const object de; a field of const object ko; a field of const object ru))
  • content/docs/ui/translations.mdx (via settingsCommon (symbol, a field of const object de; a field of const object ko; a field of const object ru))

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

  • content/docs/releases/v17/17-5.mdx (via expireAfter (literal, a string literal in settings))

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
  • 1 anchor(s) matched too much of the corpus to be a work list: /api/v1 (route, 118 pages)
  • 1 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 63 of 222 client-bound route-ledger rows — the other 159 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 159: 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; 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 — 9 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 26c965cb8f61ca59804d55e27e737bf7ff91b383 → packageMentionDocs.

Which tree this was computed on

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

node scripts/docs-audit/affected-docs.mjs --json 26c965cb8f61ca59804d55e27e737bf7ff91b383

⚠️ 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 26c965cb8f61ca59804d55e27e737bf7ff91b383 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@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 6, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#1 · os-elon-musk · session_016WV4cytLmJxfAmgPVjUbbW

席位核对 · ACCEPT · 2026-11-06T12:36Z · #30512 (package 6 of 11, service-settings, second half)

Head-sha: 6e64d7f

  • Shape: 6 files, +2068/−2, one commit on main 0e882086 (settings A, i18n(service-settings): ship the built-in settings pages in zh-Hant, ar, fr and pt-BR #30870, beneath it). Inside claim 6672078792; not governed.
    • Three new locale files: ru, de and ko.
    • translations/index.ts registers them in settingsBuiltinTranslations and the named exports.
    • The coverage test holds the three locales to full coverage.
    • One patch changeset.
  • Seat ruling (a) applied, as in A: the localization-* hunks of the handover bc852648 are dropped, because fix(settings): settings copy is written in all eleven platform languages, zh-TW reads Traditional, and sms/test answers in the caller's language (#30630) #30734 owns those tables.
  • Spot check (read in the diff):
    • No new shape: the map gains three locale keys and the barrel three named exports, beside the eight already shipped.
    • ${content} in the SMS template help stays literal in a single-quoted string in all three files (no template literal anywhere).
    • Country pickers keep countryOptionLabels (Intl.DisplayNames), as the other locales do.
    • ko.ts is shorter only because it writes short groups on one line; the coverage test is the measure of completeness.
    • No assertion is relaxed.
  • Gates: every check-run on this head has concluded: 48 distinct checks, the latest run of each 35 success, 13 skipped, 0 failure. Locally (dev report 6684637729): service-settings 71 files / 1349 tests and typecheck pass; the full check-i18n-bundles, stale-fill and check-cli-command-ids exit 0; the 60 derived families, pnpm lint and the docs & code guards lane (56) exit 0 at 02754089, the same patch id.
  • Contract: Clause-②: no, Metadata-protocol: none, confirmed from the diff.
  • Landing: ready, then auto-merge, through the relay. With it, service-settings carries all eleven platform locales; platform-objects is next.

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.

2 participants