Uh oh!
There was an error while loading. Please reload this page.
fix(i18n): re-translate the five leaves serving a superseded source revision - #12129
Conversation
…evision `os i18n extract` merges gaps only, so revising a source string leaves the previous revision standing in every translated locale: in sync by key, green under `check:i18n`, counted as translated by `check:i18n-coverage`. The five leaves `check:i18n-stale-fill` froze in its baseline are re-translated here from the CURRENT `en` source, and the baseline is ratcheted to empty in the same change so the repair cannot land half-done. Repaired, translated-locale leaf values only (es-ES / ja-JP / zh-CN): - metadata forms `dataset.fields.measures.helpText` — all three locales promised a "certified" governance flag removed from the declaration in 16.0. - `sys_webhook.fields.method.help` — all three served the pre-revision method enumeration after the source became prose. - `sys_webhook.pluralLabel` — ja-JP was an untranslated Latin fill and is now Japanese; zh-CN keeps `Webhook`, the term this bundle's own Chinese prose uses, which carries no plural inflection. - `sys_http_delivery.fields.attempts.help` — es-ES / ja-JP held an English fill and zh-CN a translation of the same superseded source; all three now carry the PARKED / terminal-row clause. - `sys_notification_subscription.fields.principal.help` — the selector list was missing the `owner_of:object:id` and bare-email forms in all three. No schema, export or runtime behaviour change. Refs #12065 Co-Authored-By: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 3 package(s): 2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 2 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 5 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 14c5dd8c81833e1725f017fe7cca2f5d2b193155 && git checkout 14c5dd8c81833e1725f017fe7cca2f5d2b193155
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 8619f9513221e59f84d4cc61a4d41f018eba4958 890da9ba7b4b4ffa127e227871d94abf29f75267 && git checkout -B drift-repro 8619f9513221e59f84d4cc61a4d41f018eba4958 && git merge --no-ff 890da9ba7b4b4ffa127e227871d94abf29f75267
node scripts/docs-audit/affected-docs.mjs --json 8619f9513221e59f84d4cc61a4d41f018eba4958
|
Uh oh!
There was an error while loading. Please reload this page.
Fixes#12065
os i18n extractmerges gaps only, so revising a source string leaves the previous revision standing in every translated locale — in sync by key, green undercheck:i18n, counted as translated bycheck:i18n-coverage. The five leavescheck:i18n-stale-fillfroze in its baseline are re-translated here from the currentensource, and the baseline is ratcheted to empty in the same change, so the repair cannot land half-done.Translated-locale leaf values only (the designed repair path: the bundle header says "Edit translations in place … a present-but-stale string is not a gap … Re-translate it by hand when its source changes", and AGENTS.md's auto-gen table says the same). No structure, key, schema, export or runtime change.
Premise re-verified on
origin/mainbefore repairingAll five leaves were still stale at the branch point (
2ba4329e4):node scripts/check-i18n-stale-fill.mjsreportedscanned 10 bundle set(s), 5 stale-fill leaf/leaves, 5 baselined, and each leaf was read out of the committed bundles by module evaluation (not regex) across every locale of its set. None had been repaired by someone else; none dropped out.The five leaves
dataset.fields.measures.helpText(metadata forms)"certified"governance flag the declaration dropped in 16.0sys_webhook.fields.method.helpGET / POST / PUT / PATCH / DELETE, after the source became prosesys_webhook.pluralLabelWebhookWebhook(see below)sys_http_delivery.fields.attempts.helperrorpointersys_notification_subscription.fields.principal.helpowner_of:object:idand bare-email selector formsTwo judgement calls, stated rather than buried:
sys_webhook.pluralLabelis deliberately unchanged. There is no Chinese rendering of the term anywhere in this repo (zero hits for 网络钩子 / Web 钩子 / 网页钩子), the zh-CN bundle's own prose usesWebhookthroughout, and Chinese marks no plural — so the value is already correct and inventing a calque to satisfy a value comparison would be a worse translation. The leaf leaves the gate's detection anyway, because the ja-JP arm is no longer identical to it.Each locale's punctuation follows its own file's convention (measured per file, not assumed): full-width
():、in the metadata-forms bundles and the plugin-webhooks zh-CN bundle, ASCII parens/comma/semicolon with full-width。and——in the service-messaging zh-CN and ja-JP bundles.Verification
Everything below was run in a dedicated worktree, and the gate union was re-derived and re-run on the final commit
890da9ba7with a clean working tree. Verdicts are quoted from each gate's own line; exit codes were captured before any pipe.Gate union — derived with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(repo assertion confirmed against this checkout'sorigin; change set taken from git, 11 paths vs merge base2ba4329e4), not hand-picked. All 21 matched families plus both convention-triggered ones ran green:check:i18n-stale-fill— "OK (10 bundle set(s) — no new stale fills, 0 baselined)"check:i18n— "OK (9 package(s) — all bundles in sync, no undeclared authoring keys)"; every package reportedin sync, including all three touched ones. This is the load-bearing one: a merge-mode re-extract reproduces the hand-written values byte-for-byte, which is exactly what makes hand-editing the sanctioned repaircheck:nul-bytes— "OK (scanned 6720 text file(s) … no raw ASCII control bytes)"check:slot-lookup— "ratchet holds: 107 unswept site(s) in 25 file(s), none new"check:published-files— "69 publishable package(s) of 78 workspace member(s) …"check:entry-guard,check:parse-guard,check:agent-test-spelling,check:pnpm-filter-targets,check:cross-package-test-inputs,check:test-source-alias,check:type-source-resolution,check:changeset-gate-self-tests,check:objectui-changeset— all exit 0check-ci-filter-parity,check-cross-package-test-inputs,check-plugin-teardown-shape,docs-audit/check-affected-docs,docs-audit/check-drift-comment,release-rehearsal-clone --self-test— all exit 0check-empty-changeset"No empty-frontmatter changeset introduced by this diff (1 declaring changeset(s) added)",check-adr-0087-registration"this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen)",check-changeset-no-major"This diff introduces nomajorbump"The pairing the card describes was observed, not assumed. With the leaves repaired and the baseline untouched, the gate went red on purpose: exit 1, "5 baselined leaf/leaves are no longer stale (improvement!)", naming all five.
node scripts/check-i18n-stale-fill.mjs --updatethen reported "+0 / -5" and the baseline is now{}.Tests —
pnpm --filter @objectstack/platform-objects exec vitest run --maxWorkers=2 src/apps/translations→ "Test Files 7 passed (7) / Tests 67 passed (67)"; thebundle-ownershipsuites in plugin-webhooks and service-messaging → 2 passed each.Typecheck —
pnpm --workspace-concurrency=2 --filter @objectstack/platform-objects --filter @objectstack/plugin-webhooks --filter @objectstack/service-messaging typecheck→ each echoedtsc --noEmit && tsc --noEmit -p tsconfig.scripts.jsonand reportedDone, exit 0.Lint — the full repo scan, not a narrowed one:
pnpm lint(eslint . --no-inline-config) exit 0 in 92s. The narrowed run over the diff paths is also recorded: 11 entries, 9 TypeScript files linted, 0 errors and 0 warnings, with the changeset.mdand the baseline.jsonreported as "File ignored because no matching configuration was supplied" — ESLint's own config deciding the population.Not measured, declared:
check:i18n-coveragerefused to run in this worktree — "COULD NOT MEASURE — 1 of 12 config(s) failed to lint", because@objectstack/connector-mcphas no build output here. That is an environment verdict, not a finding about this diff; the gate is not in this card's derived union, and its own output states the baseline was left exactly as committed.All heavy commands ran through
scripts/pm/os-verify-lock.sh; the longest wait was 4m26s behind a sibling worktree's build.Changeset
One
patchchangeset for the three published packages (@objectstack/platform-objects,@objectstack/plugin-webhooks,@objectstack/service-messaging, allprivate: false) — the change is user-visible admin/Setup help text in three locales. Not breaking, so no ADR-0087 marker applies.Filed, not fixed here
Filed as #12128: after this repair the ja-JP
sys_webhookobject renders its name two ways in one locale —labelis still the equal-to-enLatin fill whilepluralLabelis now Japanese. Which of the two renderings should win is a decision, andlabelis an equal-to-engap leaf thatcheck:i18n-stale-fillexcludes by construction, so it is out of this card's five-leaf scope. The card also records why zh-CN keepsWebhook, so a later sweep does not "fix" it by inventing a calque.Generated by Claude Code