From f47465082dbf6a1e1c60afe0f5c9554c716cf590 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 8 Sep 2026 07:19:23 +0000 Subject: [PATCH 1/2] fix(platform-objects): nine es-ES and ja-JP metadata-form leaves say what their source says The English source for these nine leaves moved after es-ES and ja-JP were translated from it. Bundle merge fills gaps only, so a present-but-stale translation is never refreshed, and the recorded-source-hash table drops a leaf's entry as soon as a translator writes real text -- which makes every one of these nine LEGACY-TRUSTED and invisible to the staleness instrument. Each leaf is rewritten from what the source says now, not from the zh-CN repair: the two have different causes and their correct target text differs. `action.fields.body.helpText` adopts the rendering the sibling leaf `hook.fields.body.helpText` already carries for the same source sentence. Key sets are unchanged (773 leaves, identical across all four bundles). Claude-Session: https://claude.ai/code/session_01ADLdAs2pVcH17h9tZKWMBg Co-authored-by: Claude --- .../es-ES.metadata-forms.generated.ts | 18 +++++++++--------- .../ja-JP.metadata-forms.generated.ts | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts b/packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts index e9ac951ae8..3f60bb9d65 100644 --- a/packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts +++ b/packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts @@ -58,7 +58,7 @@ export const esESMetadataForms: NonNullable = }, isSystem: { label: "Integrado del sistema", - helpText: "Objeto de sistema (protegido contra eliminación)" + helpText: "Objeto de sistema (protegido contra eliminación; el uso compartido predeterminado es público)" }, fields: { label: "Campos", @@ -210,7 +210,7 @@ export const esESMetadataForms: NonNullable = }, "fields.trackHistory": { label: "Seguimiento de historial", - helpText: "Conservar historial de cambios" + helpText: "Resume este campo en la cronología de actividad del registro" }, "fields.visibleWhen": { label: "Visible When", @@ -666,7 +666,7 @@ export const esESMetadataForms: NonNullable = }, filter: { label: "Filtro", - helpText: "Condiciones de filtro" + helpText: "Condiciones de filtro — el mismo constructor visual que la barra de herramientas de la lista, con operadores y entradas de valor según el tipo de campo" }, sort: { label: "Orden", @@ -786,7 +786,7 @@ export const esESMetadataForms: NonNullable = }, type: { label: "Tipo", - helpText: "Tipo de página: list / record / home / app / utility. Cómo se ve una página de lista (grid / kanban / calendar) es una visualización configurada en Interface, no un tipo de página." + helpText: "Tipo de página. \"List / Interface\" vincula una vista de origen a una superficie curada — cómo se ve (grid / kanban / calendar / …) es una visualización configurada en Interface, no un tipo de página." }, template: { label: "Plantilla", @@ -1049,7 +1049,7 @@ export const esESMetadataForms: NonNullable = }, advanced: { label: "Avanzado", - description: "Operaciones masivas, exposición a IA y forma de solicitud API." + description: "Exposición a IA y forma de la solicitud API." } }, fields: { @@ -1087,7 +1087,7 @@ export const esESMetadataForms: NonNullable = }, body: { label: "Cuerpo", - helpText: "Código JavaScript que ejecutar" + helpText: "Una expresión L1 o un body JS L2 en sandbox" }, "body.language": { label: "Language", @@ -1164,7 +1164,7 @@ export const esESMetadataForms: NonNullable = sections: { basics: { label: "Aspectos básicos", - description: "Identidad y fuente de datos." + description: "Identidad y tipo de informe." }, dataset_binding: { label: "Dataset binding", @@ -1208,7 +1208,7 @@ export const esESMetadataForms: NonNullable = }, columns: { label: "Columnas", - helpText: "Columnas que mostrar en el informe" + helpText: "Nombres de dimensión en horizontal (solo matrix)" }, order: { label: "Orden", @@ -1427,7 +1427,7 @@ export const esESMetadataForms: NonNullable = }, variables: { label: "Variables de plantilla", - helpText: "Lista de nombres de variable referenciados en subject/body" + helpText: "[{ \"name\": \"user.name\", \"type\": \"string\", \"required\": true, \"description\": \"...\" }]" }, fromOverride: { label: "Sobrescritura de remitente", diff --git a/packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts b/packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts index 37347c4b74..f19c612bce 100644 --- a/packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts +++ b/packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts @@ -58,7 +58,7 @@ export const jaJPMetadataForms: NonNullable = }, isSystem: { label: "システム組み込み", - helpText: "システムオブジェクト(削除から保護)" + helpText: "システムオブジェクト(削除から保護。共有の既定は公開)" }, fields: { label: "フィールド", @@ -210,7 +210,7 @@ export const jaJPMetadataForms: NonNullable = }, "fields.trackHistory": { label: "履歴追跡", - helpText: "変更履歴を保持" + helpText: "レコードのアクティビティタイムラインでこのフィールドを要約する" }, "fields.visibleWhen": { label: "Visible When", @@ -666,7 +666,7 @@ export const jaJPMetadataForms: NonNullable = }, filter: { label: "フィルター", - helpText: "フィルター条件" + helpText: "フィルター条件 — リストツールバーと同じビジュアルビルダー。演算子と値入力はフィールドタイプに応じて変わります" }, sort: { label: "並び替え", @@ -786,7 +786,7 @@ export const jaJPMetadataForms: NonNullable = }, type: { label: "型", - helpText: "ページの種類 — list / record / home / app / utility。リストページの見せ方(grid / kanban / calendar)はページタイプではなく、Interface で設定するビジュアライゼーションです。" + helpText: "ページの種類。\"List / Interface\" はソースビューをキュレーションされたサーフェスにバインドします。見せ方(grid / kanban / calendar / …)はページタイプではなく、Interface で設定するビジュアライゼーションです。" }, template: { label: "テンプレート", @@ -1049,7 +1049,7 @@ export const jaJPMetadataForms: NonNullable = }, advanced: { label: "詳細", - description: "一括操作、AI 公開、API リクエスト形状。" + description: "AI 公開と API リクエスト形状。" } }, fields: { @@ -1087,7 +1087,7 @@ export const jaJPMetadataForms: NonNullable = }, body: { label: "本文", - helpText: "実行する JavaScript コード" + helpText: "L1 式または L2 サンドボックス JS body" }, "body.language": { label: "Language", @@ -1164,7 +1164,7 @@ export const jaJPMetadataForms: NonNullable = sections: { basics: { label: "基本", - description: "ID とデータソース。" + description: "ID とレポートタイプ。" }, dataset_binding: { label: "Dataset binding", @@ -1208,7 +1208,7 @@ export const jaJPMetadataForms: NonNullable = }, columns: { label: "列", - helpText: "レポートに表示する列" + helpText: "横方向のディメンション名(matrix のみ)" }, order: { label: "並び順", @@ -1427,7 +1427,7 @@ export const jaJPMetadataForms: NonNullable = }, variables: { label: "変数", - helpText: "subject/body で参照する変数名リスト" + helpText: "[{ \"name\": \"user.name\", \"type\": \"string\", \"required\": true, \"description\": \"...\" }]" }, fromOverride: { label: "送信者オーバーライド", From 2af79e7a7b9bffa32330cb360d860d833d2416fb Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 8 Sep 2026 07:56:51 +0000 Subject: [PATCH 2/2] chore(platform-objects): record the digest the extractor now writes, and the changeset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `email_template.fields.variables.helpText` is a JSON shape example — language-neutral, so the faithful es-ES and ja-JP rendering is the source verbatim. That makes each leaf a byte copy of its source, which is exactly the condition under which `os i18n extract` records a source digest, so both tables gain one entry. Generator output, not a hand-edit: the entry records a TRUE fact (the leaf is a copy of the CURRENT source), which is the opposite of the false claim the file header warns against. Its effect is to move this one leaf OUT of LEGACY-TRUSTED and INTO the staleness instrument's coverage — if the JSON example is ever revised, this leaf now reports stale instead of silently serving the superseded revision. Claude-Session: https://claude.ai/code/session_01ADLdAs2pVcH17h9tZKWMBg Co-authored-by: Claude --- ...es-ja-metadata-forms-source-parity-nine.md | 38 +++++++++++++++++++ .../es-ES.source-hashes.generated.ts | 1 + .../ja-JP.source-hashes.generated.ts | 1 + 3 files changed, 40 insertions(+) create mode 100644 .changeset/es-ja-metadata-forms-source-parity-nine.md diff --git a/.changeset/es-ja-metadata-forms-source-parity-nine.md b/.changeset/es-ja-metadata-forms-source-parity-nine.md new file mode 100644 index 0000000000..ab04f9b8e2 --- /dev/null +++ b/.changeset/es-ja-metadata-forms-source-parity-nine.md @@ -0,0 +1,38 @@ +--- +"@objectstack/platform-objects": patch +--- + +fix(platform-objects): nine es-ES and ja-JP metadata-form leaves say what their source says + +Nine leaves of `metadataForms` served a superseded English source revision in both es-ES +and ja-JP. Each was a faithful translation of the sentence the source carried when it was +extracted; the English moved afterwards and bundle merge fills gaps only, so a +present-but-stale leaf is never refreshed by re-extraction. + +The nine, by the test the census applies — does the string assert something the source +does not, or drop a distinct concept the source names: + +- `object.fields.fields.trackHistory.helpText` said "keep change history" in both. The + source says `Summarize this field on the record activity timeline` — a different + feature, not a loose translation. +- `object.fields.isSystem.helpText` dropped `defaults sharing to public`. +- `view.fields.filter.helpText` dropped the whole clause after the dash — the shared + visual builder and its field-type-aware operators and value inputs. +- `action.fields.body.helpText` said "JavaScript code to run", losing the L1-expression / + L2-sandboxed-body distinction. It now reads as the sibling leaf + `hook.fields.body.helpText` already renders that same source sentence in both locales. +- `action.sections.advanced.description` asserted bulk operations, which the source does + not name. +- `page.fields.type.helpText` asserted the page-kind enum the source stopped listing and + dropped the "List / Interface binds a source view into a curated surface" sentence. +- `report.sections.basics.description` said "data source" where the source says report + type. +- `report.fields.columns.helpText` said "columns to show in the report", losing both + `Dimension names across` and `matrix only`. +- `email_template.fields.variables.helpText` described a list of variable names; the + source is a JSON shape example, which is language-neutral and is now carried verbatim. + +Values only — the key set is unchanged at 773 leaves, identical across all four bundles. +The recorded-source-hash table is untouched and needs no entry: it records a digest only +while a leaf is still a byte copy of its source, so all nine, being real translations, +carry no entry and are LEGACY-TRUSTED by construction. diff --git a/packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts b/packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts index 99590e8ecf..e1249389a4 100644 --- a/packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts +++ b/packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts @@ -63,6 +63,7 @@ export const esESGeneratedSourceHashes: Readonly> = { "metadataForms.dataset.sections.source.label": "8fe786e8e29c8cec", "metadataForms.doc.description": "f233af60238b0879", "metadataForms.doc.label": "3f35cf5088b999ad", + "metadataForms.email_template.fields.variables.helpText": "27197774c2cda633", "metadataForms.field.fields.placeholder.helpText": "07cecac0844860be", "metadataForms.field.fields.placeholder.label": "44d62b55b63fe718", "metadataForms.field.fields.rows.helpText": "66755b9447e67a15", diff --git a/packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts b/packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts index 85c28b700f..ceb4abfe58 100644 --- a/packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts +++ b/packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts @@ -63,6 +63,7 @@ export const jaJPGeneratedSourceHashes: Readonly> = { "metadataForms.dataset.sections.source.label": "8fe786e8e29c8cec", "metadataForms.doc.description": "f233af60238b0879", "metadataForms.doc.label": "3f35cf5088b999ad", + "metadataForms.email_template.fields.variables.helpText": "27197774c2cda633", "metadataForms.field.fields.placeholder.helpText": "07cecac0844860be", "metadataForms.field.fields.placeholder.label": "44d62b55b63fe718", "metadataForms.field.fields.rows.helpText": "66755b9447e67a15",