Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .changeset/i18n-bundle-drift-sweep.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
---
"@objectstack/platform-objects": patch
---

fix(i18n): clear the accumulated drift in the generated translation bundles

The committed bundles had fallen behind the spec on three independent axes.
`os i18n extract` (merge mode — every existing translation is preserved)
reconciles all of them:

**Keys the spec no longer has**, still carrying translations in
`*.metadata-forms.generated.ts`. All three were removed deliberately and are
now *rejected* by the schema, so their entries were dead weight:

- `capabilities.trash` / `capabilities.mru` — `enable.trash`/`enable.mru`
retired in the 16.x line (#2377), with tombstone guidance in
`UNKNOWN_KEY_GUIDANCE`.
- agent `visibility` — removed 2026-07 (#1901).

**Keys the spec gained** but the bundles never learned: the
`summaryOperations.*` sub-fields (`object` / `function` / `field` /
`relationshipField` / `filter`), and `sys_invitation.business_unit_id` /
`positions` from the ADR-0105 D8 placement work.

**Objects stuck on empty strings.** `sys_migration`'s labels and help text were
committed as `""` in the ja-JP and es-ES bundles, which renders as *blank* in
those locales rather than falling back to anything readable. They now carry the
schema text like every other untranslated key.

No API or schema change — this only affects what the UI displays.
Original file line number Diff line number Diff line change
Expand Up @@ -248,12 +248,6 @@ export const enMetadataForms: NonNullable<TranslationData['metadataForms']> = {
"capabilities.activities": {
label: "Activities"
},
"capabilities.trash": {
label: "Trash"
},
"capabilities.mru": {
label: "Mru"
},
"capabilities.clone": {
label: "Clone"
},
Expand Down Expand Up @@ -428,6 +422,26 @@ export const enMetadataForms: NonNullable<TranslationData['metadataForms']> = {
label: "Summary Operations",
helpText: "Roll-up summary configuration (for parent-child relationships)"
},
"summaryOperations.object": {
label: "Object",
helpText: "Child object to aggregate"
},
"summaryOperations.function": {
label: "Function",
helpText: "Aggregation function"
},
"summaryOperations.field": {
label: "Field",
helpText: "Child field to aggregate (ignored for count)"
},
"summaryOperations.relationshipField": {
label: "Relationship Field",
helpText: "Child FK back to this parent (auto-detected when omitted)"
},
"summaryOperations.filter": {
label: "Filter",
helpText: "Only child rows matching this predicate are aggregated (e.g. status == received)"
},
externalId: {
label: "External Id",
helpText: "Mark as external ID for upsert operations"
Expand Down Expand Up @@ -1612,10 +1626,6 @@ export const enMetadataForms: NonNullable<TranslationData['metadataForms']> = {
label: "Knowledge",
helpText: "RAG knowledge access configuration"
},
visibility: {
label: "Visibility",
helpText: "Scope: global, organization, or private"
},
access: {
label: "Access",
helpText: "User IDs or role names who can chat with this agent"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -664,6 +664,14 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
team_id: {
label: "Team",
help: "Optional team to assign upon acceptance"
},
business_unit_id: {
label: "Placement Business Unit",
help: "Business unit the invitee is placed under on acceptance (ADR-0105 D8). Must lie inside the issuer's delegated subtree."
},
positions: {
label: "Placement Positions",
help: "sys_position names assigned on acceptance (ADR-0105 D8). Every position's permission sets must be allowlisted by the issuer's adminScope."
}
},
_views: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,12 +248,6 @@ export const esESMetadataForms: NonNullable<TranslationData['metadataForms']> =
"capabilities.activities": {
label: "Actividades"
},
"capabilities.trash": {
label: "Papelera"
},
"capabilities.mru": {
label: "Uso reciente"
},
"capabilities.clone": {
label: "Clonar"
},
Expand Down Expand Up @@ -428,6 +422,26 @@ export const esESMetadataForms: NonNullable<TranslationData['metadataForms']> =
label: "Operaciones de resumen",
helpText: "Configuración de resumen roll-up (para relaciones padre-hijo)"
},
"summaryOperations.object": {
label: "Object",
helpText: "Child object to aggregate"
},
"summaryOperations.function": {
label: "Function",
helpText: "Aggregation function"
},
"summaryOperations.field": {
label: "Field",
helpText: "Child field to aggregate (ignored for count)"
},
"summaryOperations.relationshipField": {
label: "Relationship Field",
helpText: "Child FK back to this parent (auto-detected when omitted)"
},
"summaryOperations.filter": {
label: "Filter",
helpText: "Only child rows matching this predicate are aggregated (e.g. status == received)"
},
externalId: {
label: "ID externo",
helpText: "Marca como ID externo para operaciones upsert"
Expand Down Expand Up @@ -1612,10 +1626,6 @@ export const esESMetadataForms: NonNullable<TranslationData['metadataForms']> =
label: "Conocimiento",
helpText: "Configuración de acceso a conocimiento RAG"
},
visibility: {
label: "Visibilidad",
helpText: "Ámbito: global, organization o private"
},
access: {
label: "Acceso",
helpText: "IDs de usuario o nombres de rol que pueden chatear con este agente"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -664,6 +664,14 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
team_id: {
label: "Equipo",
help: "Equipo opcional que se asignará al aceptar."
},
business_unit_id: {
label: "Placement Business Unit",
help: "Business unit the invitee is placed under on acceptance (ADR-0105 D8). Must lie inside the issuer's delegated subtree."
},
positions: {
label: "Placement Positions",
help: "sys_position names assigned on acceptance (ADR-0105 D8). Every position's permission sets must be allowlisted by the issuer's adminScope."
}
},
_views: {
Expand Down Expand Up @@ -3072,43 +3080,43 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
}
},
sys_migration: {
label: "",
pluralLabel: "",
description: "",
label: "Data Migration",
pluralLabel: "Data Migrations",
description: "Deployment-level data-migration flags: which gated data migrations ran here and whether their self-check passed.",
fields: {
id: {
label: "",
help: ""
label: "Migration ID",
help: "Well-known migration id (e.g. adr-0104-file-references). One row per migration."
},
last_run_at: {
label: "",
help: ""
label: "Last Run At",
help: "When this migration last completed a gated (apply-mode) run on this deployment."
},
verified_at: {
label: "",
help: ""
label: "Verified At",
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."
},
applied_at: {
label: "",
help: ""
label: "Applied At",
help: "When the backfill last ran in apply mode (writes enabled)."
},
blocking: {
label: "",
help: ""
label: "Blocking Discrepancies",
help: "Blocking discrepancies reported by the last self-check. The gate requires 0."
},
advisory: {
label: "",
help: ""
label: "Advisory Findings",
help: "Advisory findings from the last run (external URLs, stale owners, …) — cost storage or need a modelling decision, never block the gate."
},
details: {
label: "",
help: ""
label: "Details (JSON)",
help: "JSON-encoded counts from the last run, for diagnostics."
},
created_at: {
label: ""
label: "Created At"
},
updated_at: {
label: ""
label: "Updated At"
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,12 +248,6 @@ export const jaJPMetadataForms: NonNullable<TranslationData['metadataForms']> =
"capabilities.activities": {
label: "活動"
},
"capabilities.trash": {
label: "ごみ箱"
},
"capabilities.mru": {
label: "最近使用"
},
"capabilities.clone": {
label: "複製"
},
Expand Down Expand Up @@ -428,6 +422,26 @@ export const jaJPMetadataForms: NonNullable<TranslationData['metadataForms']> =
label: "集計操作",
helpText: "ロールアップ集計設定(親子関係用)"
},
"summaryOperations.object": {
label: "Object",
helpText: "Child object to aggregate"
},
"summaryOperations.function": {
label: "Function",
helpText: "Aggregation function"
},
"summaryOperations.field": {
label: "Field",
helpText: "Child field to aggregate (ignored for count)"
},
"summaryOperations.relationshipField": {
label: "Relationship Field",
helpText: "Child FK back to this parent (auto-detected when omitted)"
},
"summaryOperations.filter": {
label: "Filter",
helpText: "Only child rows matching this predicate are aggregated (e.g. status == received)"
},
externalId: {
label: "外部 ID",
helpText: "upsert 操作用の外部 ID としてマーク"
Expand Down Expand Up @@ -1612,10 +1626,6 @@ export const jaJPMetadataForms: NonNullable<TranslationData['metadataForms']> =
label: "ナレッジ",
helpText: "RAG ナレッジアクセス設定"
},
visibility: {
label: "可視範囲",
helpText: "スコープ: global, organization, または private"
},
access: {
label: "アクセス",
helpText: "このエージェントとチャット可能なユーザー ID またはロール名"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -664,6 +664,14 @@ export const jaJPObjects: NonNullable<TranslationData['objects']> = {
team_id: {
label: "チーム",
help: "承認時に割り当てるオプションのチーム"
},
business_unit_id: {
label: "Placement Business Unit",
help: "Business unit the invitee is placed under on acceptance (ADR-0105 D8). Must lie inside the issuer's delegated subtree."
},
positions: {
label: "Placement Positions",
help: "sys_position names assigned on acceptance (ADR-0105 D8). Every position's permission sets must be allowlisted by the issuer's adminScope."
}
},
_views: {
Expand Down Expand Up @@ -3072,43 +3080,43 @@ export const jaJPObjects: NonNullable<TranslationData['objects']> = {
}
},
sys_migration: {
label: "",
pluralLabel: "",
description: "",
label: "Data Migration",
pluralLabel: "Data Migrations",
description: "Deployment-level data-migration flags: which gated data migrations ran here and whether their self-check passed.",
fields: {
id: {
label: "",
help: ""
label: "Migration ID",
help: "Well-known migration id (e.g. adr-0104-file-references). One row per migration."
},
last_run_at: {
label: "",
help: ""
label: "Last Run At",
help: "When this migration last completed a gated (apply-mode) run on this deployment."
},
verified_at: {
label: "",
help: ""
label: "Verified At",
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."
},
applied_at: {
label: "",
help: ""
label: "Applied At",
help: "When the backfill last ran in apply mode (writes enabled)."
},
blocking: {
label: "",
help: ""
label: "Blocking Discrepancies",
help: "Blocking discrepancies reported by the last self-check. The gate requires 0."
},
advisory: {
label: "",
help: ""
label: "Advisory Findings",
help: "Advisory findings from the last run (external URLs, stale owners, …) — cost storage or need a modelling decision, never block the gate."
},
details: {
label: "",
help: ""
label: "Details (JSON)",
help: "JSON-encoded counts from the last run, for diagnostics."
},
created_at: {
label: ""
label: "Created At"
},
updated_at: {
label: ""
label: "Updated At"
}
}
}
Expand Down
Loading
Loading