Skip to content

Commit 553f1bf

Browse files
committed
fix(i18n): clear the accumulated drift in the generated translation bundles
Finishes what #3659 deliberately left alone. That PR regenerated only the `*.objects.generated.ts` bundles and explicitly EXCLUDED the metadata-forms ones, because the same run deleted keys and I had not yet checked whether it was discarding curated translations. It was not — I checked: capabilities.trash / capabilities.mru enable.trash/mru retired in 16.x (#2377); the schema now REJECTS them, with tombstone guidance in UNKNOWN_KEY_GUIDANCE. agent `visibility` removed 2026-07 (#1901). Those are the only deletions in the whole diff, and all three are translations for keys no author can write any more. Nothing live is lost. The same sweep also picks up what the bundles never learned: summaryOperations.{object,function,field,relationshipField,filter} sys_invitation.{business_unit_id,positions} (ADR-0105 D8) and fixes a third, separate problem: `sys_migration`'s labels and help text sat committed as EMPTY STRINGS in the ja-JP and es-ES bundles. An empty string is not an untranslated key — it renders blank, so that object had no readable labels at all in those locales. They now carry the schema text like every other untranslated key. Run in merge mode, so every existing translation is preserved; the only removals are the three dead keys above. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UYLC8TfjzHGwatNxZKdX7H
1 parent 43754d7 commit 553f1bf

9 files changed

Lines changed: 180 additions & 78 deletions
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
"@objectstack/platform-objects": patch
3+
---
4+
5+
fix(i18n): clear the accumulated drift in the generated translation bundles
6+
7+
The committed bundles had fallen behind the spec on three independent axes.
8+
`os i18n extract` (merge mode — every existing translation is preserved)
9+
reconciles all of them:
10+
11+
**Keys the spec no longer has**, still carrying translations in
12+
`*.metadata-forms.generated.ts`. All three were removed deliberately and are
13+
now *rejected* by the schema, so their entries were dead weight:
14+
15+
- `capabilities.trash` / `capabilities.mru``enable.trash`/`enable.mru`
16+
retired in the 16.x line (#2377), with tombstone guidance in
17+
`UNKNOWN_KEY_GUIDANCE`.
18+
- agent `visibility` — removed 2026-07 (#1901).
19+
20+
**Keys the spec gained** but the bundles never learned: the
21+
`summaryOperations.*` sub-fields (`object` / `function` / `field` /
22+
`relationshipField` / `filter`), and `sys_invitation.business_unit_id` /
23+
`positions` from the ADR-0105 D8 placement work.
24+
25+
**Objects stuck on empty strings.** `sys_migration`'s labels and help text were
26+
committed as `""` in the ja-JP and es-ES bundles, which renders as *blank* in
27+
those locales rather than falling back to anything readable. They now carry the
28+
schema text like every other untranslated key.
29+
30+
No API or schema change — this only affects what the UI displays.

packages/platform-objects/src/apps/translations/en.metadata-forms.generated.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -248,12 +248,6 @@ export const enMetadataForms: NonNullable<TranslationData['metadataForms']> = {
248248
"capabilities.activities": {
249249
label: "Activities"
250250
},
251-
"capabilities.trash": {
252-
label: "Trash"
253-
},
254-
"capabilities.mru": {
255-
label: "Mru"
256-
},
257251
"capabilities.clone": {
258252
label: "Clone"
259253
},
@@ -428,6 +422,26 @@ export const enMetadataForms: NonNullable<TranslationData['metadataForms']> = {
428422
label: "Summary Operations",
429423
helpText: "Roll-up summary configuration (for parent-child relationships)"
430424
},
425+
"summaryOperations.object": {
426+
label: "Object",
427+
helpText: "Child object to aggregate"
428+
},
429+
"summaryOperations.function": {
430+
label: "Function",
431+
helpText: "Aggregation function"
432+
},
433+
"summaryOperations.field": {
434+
label: "Field",
435+
helpText: "Child field to aggregate (ignored for count)"
436+
},
437+
"summaryOperations.relationshipField": {
438+
label: "Relationship Field",
439+
helpText: "Child FK back to this parent (auto-detected when omitted)"
440+
},
441+
"summaryOperations.filter": {
442+
label: "Filter",
443+
helpText: "Only child rows matching this predicate are aggregated (e.g. status == received)"
444+
},
431445
externalId: {
432446
label: "External Id",
433447
helpText: "Mark as external ID for upsert operations"
@@ -1612,10 +1626,6 @@ export const enMetadataForms: NonNullable<TranslationData['metadataForms']> = {
16121626
label: "Knowledge",
16131627
helpText: "RAG knowledge access configuration"
16141628
},
1615-
visibility: {
1616-
label: "Visibility",
1617-
helpText: "Scope: global, organization, or private"
1618-
},
16191629
access: {
16201630
label: "Access",
16211631
helpText: "User IDs or role names who can chat with this agent"

packages/platform-objects/src/apps/translations/en.objects.generated.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,14 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
664664
team_id: {
665665
label: "Team",
666666
help: "Optional team to assign upon acceptance"
667+
},
668+
business_unit_id: {
669+
label: "Placement Business Unit",
670+
help: "Business unit the invitee is placed under on acceptance (ADR-0105 D8). Must lie inside the issuer's delegated subtree."
671+
},
672+
positions: {
673+
label: "Placement Positions",
674+
help: "sys_position names assigned on acceptance (ADR-0105 D8). Every position's permission sets must be allowlisted by the issuer's adminScope."
667675
}
668676
},
669677
_views: {

packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -248,12 +248,6 @@ export const esESMetadataForms: NonNullable<TranslationData['metadataForms']> =
248248
"capabilities.activities": {
249249
label: "Actividades"
250250
},
251-
"capabilities.trash": {
252-
label: "Papelera"
253-
},
254-
"capabilities.mru": {
255-
label: "Uso reciente"
256-
},
257251
"capabilities.clone": {
258252
label: "Clonar"
259253
},
@@ -428,6 +422,26 @@ export const esESMetadataForms: NonNullable<TranslationData['metadataForms']> =
428422
label: "Operaciones de resumen",
429423
helpText: "Configuración de resumen roll-up (para relaciones padre-hijo)"
430424
},
425+
"summaryOperations.object": {
426+
label: "Object",
427+
helpText: "Child object to aggregate"
428+
},
429+
"summaryOperations.function": {
430+
label: "Function",
431+
helpText: "Aggregation function"
432+
},
433+
"summaryOperations.field": {
434+
label: "Field",
435+
helpText: "Child field to aggregate (ignored for count)"
436+
},
437+
"summaryOperations.relationshipField": {
438+
label: "Relationship Field",
439+
helpText: "Child FK back to this parent (auto-detected when omitted)"
440+
},
441+
"summaryOperations.filter": {
442+
label: "Filter",
443+
helpText: "Only child rows matching this predicate are aggregated (e.g. status == received)"
444+
},
431445
externalId: {
432446
label: "ID externo",
433447
helpText: "Marca como ID externo para operaciones upsert"
@@ -1612,10 +1626,6 @@ export const esESMetadataForms: NonNullable<TranslationData['metadataForms']> =
16121626
label: "Conocimiento",
16131627
helpText: "Configuración de acceso a conocimiento RAG"
16141628
},
1615-
visibility: {
1616-
label: "Visibilidad",
1617-
helpText: "Ámbito: global, organization o private"
1618-
},
16191629
access: {
16201630
label: "Acceso",
16211631
helpText: "IDs de usuario o nombres de rol que pueden chatear con este agente"

packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,14 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
664664
team_id: {
665665
label: "Equipo",
666666
help: "Equipo opcional que se asignará al aceptar."
667+
},
668+
business_unit_id: {
669+
label: "Placement Business Unit",
670+
help: "Business unit the invitee is placed under on acceptance (ADR-0105 D8). Must lie inside the issuer's delegated subtree."
671+
},
672+
positions: {
673+
label: "Placement Positions",
674+
help: "sys_position names assigned on acceptance (ADR-0105 D8). Every position's permission sets must be allowlisted by the issuer's adminScope."
667675
}
668676
},
669677
_views: {
@@ -3072,43 +3080,43 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
30723080
}
30733081
},
30743082
sys_migration: {
3075-
label: "",
3076-
pluralLabel: "",
3077-
description: "",
3083+
label: "Data Migration",
3084+
pluralLabel: "Data Migrations",
3085+
description: "Deployment-level data-migration flags: which gated data migrations ran here and whether their self-check passed.",
30783086
fields: {
30793087
id: {
3080-
label: "",
3081-
help: ""
3088+
label: "Migration ID",
3089+
help: "Well-known migration id (e.g. adr-0104-file-references). One row per migration."
30823090
},
30833091
last_run_at: {
3084-
label: "",
3085-
help: ""
3092+
label: "Last Run At",
3093+
help: "When this migration last completed a gated (apply-mode) run on this deployment."
30863094
},
30873095
verified_at: {
3088-
label: "",
3089-
help: ""
3096+
label: "Verified At",
3097+
help: "When the self-check last PASSED. Null until it does, and cleared again by a later failing run — a regression closes the gate. Consumers require this to be set AND blocking = 0."
30903098
},
30913099
applied_at: {
3092-
label: "",
3093-
help: ""
3100+
label: "Applied At",
3101+
help: "When the backfill last ran in apply mode (writes enabled)."
30943102
},
30953103
blocking: {
3096-
label: "",
3097-
help: ""
3104+
label: "Blocking Discrepancies",
3105+
help: "Blocking discrepancies reported by the last self-check. The gate requires 0."
30983106
},
30993107
advisory: {
3100-
label: "",
3101-
help: ""
3108+
label: "Advisory Findings",
3109+
help: "Advisory findings from the last run (external URLs, stale owners, …) — cost storage or need a modelling decision, never block the gate."
31023110
},
31033111
details: {
3104-
label: "",
3105-
help: ""
3112+
label: "Details (JSON)",
3113+
help: "JSON-encoded counts from the last run, for diagnostics."
31063114
},
31073115
created_at: {
3108-
label: ""
3116+
label: "Created At"
31093117
},
31103118
updated_at: {
3111-
label: ""
3119+
label: "Updated At"
31123120
}
31133121
}
31143122
}

packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -248,12 +248,6 @@ export const jaJPMetadataForms: NonNullable<TranslationData['metadataForms']> =
248248
"capabilities.activities": {
249249
label: "活動"
250250
},
251-
"capabilities.trash": {
252-
label: "ごみ箱"
253-
},
254-
"capabilities.mru": {
255-
label: "最近使用"
256-
},
257251
"capabilities.clone": {
258252
label: "複製"
259253
},
@@ -428,6 +422,26 @@ export const jaJPMetadataForms: NonNullable<TranslationData['metadataForms']> =
428422
label: "集計操作",
429423
helpText: "ロールアップ集計設定(親子関係用)"
430424
},
425+
"summaryOperations.object": {
426+
label: "Object",
427+
helpText: "Child object to aggregate"
428+
},
429+
"summaryOperations.function": {
430+
label: "Function",
431+
helpText: "Aggregation function"
432+
},
433+
"summaryOperations.field": {
434+
label: "Field",
435+
helpText: "Child field to aggregate (ignored for count)"
436+
},
437+
"summaryOperations.relationshipField": {
438+
label: "Relationship Field",
439+
helpText: "Child FK back to this parent (auto-detected when omitted)"
440+
},
441+
"summaryOperations.filter": {
442+
label: "Filter",
443+
helpText: "Only child rows matching this predicate are aggregated (e.g. status == received)"
444+
},
431445
externalId: {
432446
label: "外部 ID",
433447
helpText: "upsert 操作用の外部 ID としてマーク"
@@ -1612,10 +1626,6 @@ export const jaJPMetadataForms: NonNullable<TranslationData['metadataForms']> =
16121626
label: "ナレッジ",
16131627
helpText: "RAG ナレッジアクセス設定"
16141628
},
1615-
visibility: {
1616-
label: "可視範囲",
1617-
helpText: "スコープ: global, organization, または private"
1618-
},
16191629
access: {
16201630
label: "アクセス",
16211631
helpText: "このエージェントとチャット可能なユーザー ID またはロール名"

packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,14 @@ export const jaJPObjects: NonNullable<TranslationData['objects']> = {
664664
team_id: {
665665
label: "チーム",
666666
help: "承認時に割り当てるオプションのチーム"
667+
},
668+
business_unit_id: {
669+
label: "Placement Business Unit",
670+
help: "Business unit the invitee is placed under on acceptance (ADR-0105 D8). Must lie inside the issuer's delegated subtree."
671+
},
672+
positions: {
673+
label: "Placement Positions",
674+
help: "sys_position names assigned on acceptance (ADR-0105 D8). Every position's permission sets must be allowlisted by the issuer's adminScope."
667675
}
668676
},
669677
_views: {
@@ -3072,43 +3080,43 @@ export const jaJPObjects: NonNullable<TranslationData['objects']> = {
30723080
}
30733081
},
30743082
sys_migration: {
3075-
label: "",
3076-
pluralLabel: "",
3077-
description: "",
3083+
label: "Data Migration",
3084+
pluralLabel: "Data Migrations",
3085+
description: "Deployment-level data-migration flags: which gated data migrations ran here and whether their self-check passed.",
30783086
fields: {
30793087
id: {
3080-
label: "",
3081-
help: ""
3088+
label: "Migration ID",
3089+
help: "Well-known migration id (e.g. adr-0104-file-references). One row per migration."
30823090
},
30833091
last_run_at: {
3084-
label: "",
3085-
help: ""
3092+
label: "Last Run At",
3093+
help: "When this migration last completed a gated (apply-mode) run on this deployment."
30863094
},
30873095
verified_at: {
3088-
label: "",
3089-
help: ""
3096+
label: "Verified At",
3097+
help: "When the self-check last PASSED. Null until it does, and cleared again by a later failing run — a regression closes the gate. Consumers require this to be set AND blocking = 0."
30903098
},
30913099
applied_at: {
3092-
label: "",
3093-
help: ""
3100+
label: "Applied At",
3101+
help: "When the backfill last ran in apply mode (writes enabled)."
30943102
},
30953103
blocking: {
3096-
label: "",
3097-
help: ""
3104+
label: "Blocking Discrepancies",
3105+
help: "Blocking discrepancies reported by the last self-check. The gate requires 0."
30983106
},
30993107
advisory: {
3100-
label: "",
3101-
help: ""
3108+
label: "Advisory Findings",
3109+
help: "Advisory findings from the last run (external URLs, stale owners, …) — cost storage or need a modelling decision, never block the gate."
31023110
},
31033111
details: {
3104-
label: "",
3105-
help: ""
3112+
label: "Details (JSON)",
3113+
help: "JSON-encoded counts from the last run, for diagnostics."
31063114
},
31073115
created_at: {
3108-
label: ""
3116+
label: "Created At"
31093117
},
31103118
updated_at: {
3111-
label: ""
3119+
label: "Updated At"
31123120
}
31133121
}
31143122
}

0 commit comments

Comments
 (0)