parent_workload_id on a workload to build a chain. Image-source children can promote the parent's currently-running tag with one click.",
"previews": {
"title": "Preview environments",
diff --git a/web/src/lib/i18n/ru.json b/web/src/lib/i18n/ru.json
index ed7906f..24da233 100644
--- a/web/src/lib/i18n/ru.json
+++ b/web/src/lib/i18n/ru.json
@@ -1929,7 +1929,13 @@
"chainSelfLabel": "Эта",
"chainChildrenLabel": "Дочерние",
"chainPromoteButton": "Продвинуть от родителя",
+ "chainPromoteToChild": "Продвинуть сюда",
"chainPromoting": "Продвижение…",
+ "chainPromoteConfirmTitle": "Продвинуть версию?",
+ "chainPromoteConfirmMessage": "Продвинуть запущенную версию {source} в {target} и развернуть её?",
+ "chainPromoteConfirmYes": "Продвинуть и развернуть",
+ "chainPromoteOk": "Версия {tag} продвинута в {target}",
+ "chainPromoteFailed": "Не удалось продвинуть",
"chainHint": "Задайте parent_workload_id у нагрузки, чтобы построить цепочку. Дочерние image-источники могут одним кликом продвинуть текущий запущенный тег родителя.",
"previews": {
"title": "Превью-окружения",
diff --git a/web/src/routes/apps/[id]/+page.svelte b/web/src/routes/apps/[id]/+page.svelte
index cf829e0..a1a9c9b 100644
--- a/web/src/routes/apps/[id]/+page.svelte
+++ b/web/src/routes/apps/[id]/+page.svelte
@@ -28,6 +28,7 @@
} from '$lib/components/icons';
import ForgeHero from '$lib/components/ForgeHero.svelte';
import ConfirmDialog from '$lib/components/ConfirmDialog.svelte';
+ import { toasts } from '$lib/stores/toast';
import EventLogEntryComponent from '$lib/components/EventLogEntry.svelte';
import ContainerLogs from '$lib/components/ContainerLogs.svelte';
import ContainerStats from '$lib/components/ContainerStats.svelte';
@@ -405,7 +406,15 @@
// ── Chain (parent / self / children) ──────────────────────
let chain = $state