From 72a2f37c038e3f4304150c9014449293904a438d Mon Sep 17 00:00:00 2001 From: DCCONSTRUCTIONS Date: Fri, 14 Aug 2026 20:03:13 +0300 Subject: [PATCH] fix(k1): use neutral process copy --- .../test/devicePluginContracts.test.mjs | 2 +- .../test/k1ActiveStreamRecovery.test.mjs | 4 +-- .../test/k1SupervisorPresentation.test.mjs | 24 ++++++++-------- .../frontend/src/activeStreamRecovery.ts | 2 +- .../ActiveStreamRecoverySurface.tsx | 4 +-- .../src/components/K1AcquisitionPipeline.tsx | 16 +++++------ .../src/components/K1ProvisioningPipeline.tsx | 28 +++++++++---------- .../src/components/K1SpatialControls.tsx | 16 +++++------ 8 files changed, 48 insertions(+), 48 deletions(-) diff --git a/apps/control-station/test/devicePluginContracts.test.mjs b/apps/control-station/test/devicePluginContracts.test.mjs index 62f1e0e..9bc283f 100644 --- a/apps/control-station/test/devicePluginContracts.test.mjs +++ b/apps/control-station/test/devicePluginContracts.test.mjs @@ -1877,7 +1877,7 @@ test("observed SCANNING recovery is a successful STOP-only connection outcome", ); assert.match( acquisitionSource, - /physicalStopInFlight\s*\? "Останавливаем устройство…"/, + /physicalStopInFlight\s*\? "Остановка устройства…"/, ); assert.match( acquisitionSource, diff --git a/apps/control-station/test/k1ActiveStreamRecovery.test.mjs b/apps/control-station/test/k1ActiveStreamRecovery.test.mjs index 2a08c54..5901ffb 100644 --- a/apps/control-station/test/k1ActiveStreamRecovery.test.mjs +++ b/apps/control-station/test/k1ActiveStreamRecovery.test.mjs @@ -700,7 +700,7 @@ test("spatial force-finish pending owns the surface without a second action", () }), { pendingAction: "force-finish" }, ); - assert.match(markup, /Завершаем локальный приём/); + assert.match(markup, /Завершение локального приёма/); assert.match(markup, /data-recovery-state="force-finishing"/); assert.match(markup, /Команда STOP устройству не отправляется/); assert.equal(buttonsWithText(markup, "Прервать соединение").length, 0); @@ -836,7 +836,7 @@ test("force-finishing shows one local-only pending owner and no second action", camera_recovery: "inactive", }); const markup = renderPipeline(state, { pendingAction: "force-finish" }); - assert.match(markup, /Завершаем локальный приём/); + assert.match(markup, /Завершение локального приёма/); assert.match(markup, /Команда STOP устройству не отправляется/); assert.match(markup, /class="nodedc-activity-indicator/); assert.equal(buttonsWithText(markup, "Прервать соединение").length, 0); diff --git a/apps/control-station/test/k1SupervisorPresentation.test.mjs b/apps/control-station/test/k1SupervisorPresentation.test.mjs index ece5d88..959e705 100644 --- a/apps/control-station/test/k1SupervisorPresentation.test.mjs +++ b/apps/control-station/test/k1SupervisorPresentation.test.mjs @@ -3433,8 +3433,8 @@ test("physical STOP is fail-closed and both acquisition surfaces fall back to lo activateAutomaticSpatialSource() {}, }, )); - assert.match(localCleanupPendingMarkup, /Завершаем локальный приём…/); - assert.doesNotMatch(localCleanupPendingMarkup, /Останавливаем устройство…/); + assert.match(localCleanupPendingMarkup, /Завершение локального приёма…/); + assert.doesNotMatch(localCleanupPendingMarkup, /Остановка устройства…/); const physicalStopPendingMarkup = renderToStaticMarkup(createElement( K1AcquisitionPipeline, @@ -3450,8 +3450,8 @@ test("physical STOP is fail-closed and both acquisition surfaces fall back to lo activateAutomaticSpatialSource() {}, }, )); - assert.match(physicalStopPendingMarkup, /Останавливаем устройство…/); - assert.doesNotMatch(physicalStopPendingMarkup, /Завершаем локальный приём…/); + assert.match(physicalStopPendingMarkup, /Остановка устройства…/); + assert.doesNotMatch(physicalStopPendingMarkup, /Завершение локального приёма…/); const terminalDeniedState = structuredClone(state); terminalDeniedState.phase = "error"; @@ -3534,7 +3534,7 @@ test("physical STOP is fail-closed and both acquisition surfaces fall back to lo )); assert.match(terminalInFlightMarkup, /ВОССТАНОВЛЕНИЕ · КОМАНДА ОТПРАВЛЕНА/); assert.match(terminalInFlightMarkup, /Команда остановки устройства уже отправлена/); - assert.match(terminalInFlightMarkup, /Останавливаем устройство…/); + assert.match(terminalInFlightMarkup, /Остановка устройства…/); assert.doesNotMatch( terminalInFlightMarkup, /требуется явный STOP|Нажмите «Остановить сканирование»/, @@ -3848,7 +3848,7 @@ for (const pendingAction of ["connect", "verify"]) { assert.match(markup, /Настройка сети…/); } else { assert.match(markup, /

Сеть<\/h3>/); - assert.match(markup, /Проверяем подключение без изменения сети…/); + assert.match(markup, /Проверка подключения без изменения сети…/); assert.match(markup, /02<\/span>/); } assertCanonicalConnectionCopy(markup); @@ -5232,7 +5232,7 @@ test("an unresolved physical command has one explicit server-bound read-only rec }, { publicSearch: false }); const pendingReconnect = buttonMarkupWithText( pendingMarkup, - "Переподключаемся…", + "Переподключение…", ); assert.equal(pendingReconnect.length, 1); assert.match(pendingReconnect[0], /disabled/); @@ -5457,7 +5457,7 @@ test("unavailable physical replacement stays CAS-protected behind the simple new }, { publicSearch: false }); const bothPendingReconnect = buttonMarkupWithText( bothPendingMarkup, - "Переподключаемся…", + "Переподключение…", ); assert.equal(bothPendingReconnect.length, 1); assert.match(bothPendingReconnect[0], /disabled/); @@ -5676,7 +5676,7 @@ test("an explicit network action keeps one disabled Step-2 form with an in-place assert.match(markup, /Устройство выбрано/); assert.match(markup, /XGR-A46BE7/); assert.match(markup, /02<\/span>/); - assert.match(markup, /Применяем настройки…/); + assert.match(markup, /Применение настроек…/); assert.match(markup, /FIELD-NET/); assert.match(markup, /Пароль передан/); assert.doesNotMatch(markup, /secret/); @@ -6204,7 +6204,7 @@ test("read-only reconnect keeps its card and loader across a transient projectio const pendingMarkup = renderToStaticMarkup(tree); const pendingReconnect = buttonMarkupWithText( pendingMarkup, - "Переподключаемся…", + "Переподключение…", ); assert.equal(pendingReconnect.length, 1); assert.match(pendingReconnect[0], /disabled/); @@ -6845,7 +6845,7 @@ test("applied-network recovery spends the old intent and admits only explicit se /onClick=\{\(\) => void repeatDeviceScan\(\{\s*appliedRecoveryEscape: true/, ); assert.match(source, /Начать новый поиск Bluetooth/); - assert.match(source, /Подтверждаем управляющее подключение/); + assert.match(source, /Подтверждение управляющего подключения/); assert.match(source, /BLE-команда не повторяется/); assert.match( source, @@ -6886,7 +6886,7 @@ test("applied-network recovery spends the old intent and admits only explicit se controller: provisioningController(settlingState), desiredMode: "bridge", }); - assert.match(settlingMarkup, /Подтверждаем управляющее подключение/); + assert.match(settlingMarkup, /Подтверждение управляющего подключения/); assert.match(settlingMarkup, /BLE-команда не повторяется/); assert.doesNotMatch(settlingMarkup, /Сеть (?:готова|настроена)|Сетевые настройки уже применены/); assert.equal( diff --git a/plugins/xgrids-k1/frontend/src/activeStreamRecovery.ts b/plugins/xgrids-k1/frontend/src/activeStreamRecovery.ts index e56c7a3..a0e86f0 100644 --- a/plugins/xgrids-k1/frontend/src/activeStreamRecovery.ts +++ b/plugins/xgrids-k1/frontend/src/activeStreamRecovery.ts @@ -212,7 +212,7 @@ export function activeStreamRecoveryPresentation( title: "Восстанавливаем соединение", statusLabel: "Восстановление связи", tone: "neutral", - detail: "Проверяем прежний активный контур только для чтения. START, STOP и настройки сети не отправляются.", + detail: "Проверка прежнего активного контура только для чтения. START, STOP и настройки сети не отправляются.", progressLabel: recoveryProgressLabel(recovery), showSpinner: true, forceFinishAvailable: activeStreamForceFinishAuthority(state) !== null, diff --git a/plugins/xgrids-k1/frontend/src/components/ActiveStreamRecoverySurface.tsx b/plugins/xgrids-k1/frontend/src/components/ActiveStreamRecoverySurface.tsx index 846a39c..16f1d95 100644 --- a/plugins/xgrids-k1/frontend/src/components/ActiveStreamRecoverySurface.tsx +++ b/plugins/xgrids-k1/frontend/src/components/ActiveStreamRecoverySurface.tsx @@ -38,14 +38,14 @@ function surfaceCopy({ ? "СВЯЗЬ · ЛОКАЛЬНОЕ ЗАВЕРШЕНИЕ" : presentation?.eyebrow ?? "СВЯЗЬ · АКТИВНЫЙ ПРИЁМ", title: forceFinishing - ? "Завершаем локальный приём" + ? "Завершение локального приёма" : presentation?.title ?? "Восстанавливаем соединение", statusLabel: forceFinishing ? "Локальное завершение" : presentation?.statusLabel ?? "Восстановление связи", detail: forceFinishing ? "Закрываем только локальный приём и сохранение. Команда STOP устройству не отправляется." - : presentation?.detail ?? "Проверяем состояние активного приёма.", + : presentation?.detail ?? "Проверка состояния активного приёма.", showSpinner: forceFinishing || presentation?.showSpinner === true, forceFinishAvailable: !forceFinishing && presentation?.forceFinishAvailable === true, diff --git a/plugins/xgrids-k1/frontend/src/components/K1AcquisitionPipeline.tsx b/plugins/xgrids-k1/frontend/src/components/K1AcquisitionPipeline.tsx index a6469dc..3a8ee86 100644 --- a/plugins/xgrids-k1/frontend/src/components/K1AcquisitionPipeline.tsx +++ b/plugins/xgrids-k1/frontend/src/components/K1AcquisitionPipeline.tsx @@ -372,7 +372,7 @@ export function K1AcquisitionPipeline({
{terminalPhysicalStopPending ? "ВОССТАНОВЛЕНИЕ · КОМАНДА ОТПРАВЛЕНА" : recoveredPhysicalStop ? "ВОССТАНОВЛЕНИЕ · ОСТАНОВКА" : terminalLocalRecovery ? "ВОССТАНОВЛЕНИЕ · ЛОКАЛЬНЫЙ КОНТУР" : terminalReadOnlyRecovery ? "ВОССТАНОВЛЕНИЕ · ТОЛЬКО ЧТЕНИЕ" : recoveredActiveSession ? "СВЯЗЬ ВОССТАНОВЛЕНА · АКТИВНЫЙ ПРИЁМ" : effectiveSessionIntent === "live" ? "ШАГИ 04–05 · ПРОЕКТ И ПРИЁМ" : "СЛУЖЕБНЫЙ РЕЖИМ"} -

{terminalPhysicalStopPending ? "Ожидаем подтверждение устройства" : recoveredPhysicalStop ? "Сканирование продолжается" : terminalLocalRecovery ? "Завершите локальный приём" : terminalReadOnlyRecovery ? "Ожидайте подтверждённое состояние" : recoveredActiveSession ? "Связь восстановлена · приём продолжается" : effectiveSessionIntent === "live" ? "Назовите проект и запустите приём" : "Повторите запись"}

+

{terminalPhysicalStopPending ? "Ожидание подтверждения устройства" : recoveredPhysicalStop ? "Сканирование продолжается" : terminalLocalRecovery ? "Завершите локальный приём" : terminalReadOnlyRecovery ? "Ожидайте подтверждённое состояние" : recoveredActiveSession ? "Связь восстановлена · приём продолжается" : effectiveSessionIntent === "live" ? "Назовите проект и запустите приём" : "Повторите запись"}

{sourceLabel}
@@ -495,12 +495,12 @@ export function K1AcquisitionPipeline({ ? controlPhase === "connecting" ? "Синхронизация…" : controlPhase === "workspace-requested" - ? "Входим в рабочее пространство…" + ? "Переход в рабочее пространство…" : controlPhase === "project-requested" - ? "Готовим проект и локальный приём…" + ? "Подготовка проекта и локального приёма…" : controlPhase === "start-requested" || controlPhase === "initializing" - ? "Запускаем приём…" - : "Подготавливаем проект и локальный приём…" + ? "Запуск приёма…" + : "Подготовка проекта и локального приёма…" : finalStartTarget ? "Запустить приём" : preparedCanonicalLaunch @@ -550,7 +550,7 @@ export function K1AcquisitionPipeline({ )} @@ -591,9 +591,9 @@ export function K1AcquisitionPipeline({ }} > {physicalStopInFlight - ? "Останавливаем устройство…" + ? "Остановка устройства…" : pendingAction === "stop" - ? physicalStopPresented ? "Останавливаем устройство…" : state?.source_mode === "replay" ? "Останавливаем повтор…" : "Завершаем локальный приём…" + ? physicalStopPresented ? "Остановка устройства…" : state?.source_mode === "replay" ? "Остановка повтора…" : "Завершение локального приёма…" : physicalStopPresented ? recoveredPhysicalStop ? "Остановить сканирование" : "Остановить устройство и запись" : state?.source_mode === "replay" ? "Остановить повтор" : preparedAcquisition ? "Завершить подготовленный приём" : "Завершить локальный приём"} ) : null} diff --git a/plugins/xgrids-k1/frontend/src/components/K1ProvisioningPipeline.tsx b/plugins/xgrids-k1/frontend/src/components/K1ProvisioningPipeline.tsx index 98a4ffd..7d2eb22 100644 --- a/plugins/xgrids-k1/frontend/src/components/K1ProvisioningPipeline.tsx +++ b/plugins/xgrids-k1/frontend/src/components/K1ProvisioningPipeline.tsx @@ -2953,8 +2953,8 @@ export function K1ProvisioningPipeline({ }); }; const attemptButtonLabel = connectionAttemptPresentation?.localPhase === "submitting" - ? "Применяем настройки…" - : "Подтверждаем подключение…"; + ? "Применение настроек…" + : "Подтверждение подключения…"; const applyAction = connectionAttemptSettling ? ( ) : null} @@ -3139,7 +3139,7 @@ export function K1ProvisioningPipeline({ /> {modeResetInFlight ? (

- Завершаем прежнюю локальную границу. Новый поиск не начнётся автоматически. + Завершение прежней локальной границы. Новый поиск не начнётся автоматически.

) : null} {activeScenarioReset ? ( @@ -3163,15 +3163,15 @@ export function K1ProvisioningPipeline({ ? "Устройство выбрано" : presentedPhysicalRecoveryRequired ? verificationActionPending - ? "Переподключаемся…" + ? "Переподключение…" : "Нужно выбрать действие" : networkRecoveryRequired ? appliedControlSettlementPending - ? "Подтверждаем управление" + ? "Подтверждение управления" : "Управление не подтверждено · выбор заблокирован" : presentedConnectionRecoveryRequired ? connectionReconnectPending - ? "Переподключаемся…" + ? "Переподключение…" : connectionRecoveryTarget ? "Нужна проверка" : "Нужен новый поиск" @@ -3261,7 +3261,7 @@ export function K1ProvisioningPipeline({ onClick={() => void verifyPhysicalRecovery()} > {physicalReconnectPending - ? "Переподключаемся…" + ? "Переподключение…" : "Переподключиться"} ) : null} @@ -3430,15 +3430,15 @@ export function K1ProvisioningPipeline({ status={ connectionAttemptSettling ? connectionAttemptPresentation?.localPhase === "submitting" - ? "Применяем настройки…" - : "Подтверждаем подключение…" + ? "Применение настроек…" + : "Подтверждение подключения…" : connectionAttemptFailed && !networkRecoveryRequired ? "Подключение не подтверждено" : verificationActionPending ? "Проверка…" : networkRecoveryRequired ? appliedControlSettlementPending - ? "Подтверждаем управление" + ? "Подтверждение управления" : "Управление не подтверждено" : networkActionPending ? "Настройка…" @@ -3474,7 +3474,7 @@ export function K1ProvisioningPipeline({ aria-busy="true" > - Проверяем подключение без изменения сети… + Проверка подключения без изменения сети… ) : networkRecoveryRequired && appliedControlSettlementPending ? (
- Подтверждаем управляющее подключение + Подтверждение управляющего подключения

BLE-команда не повторяется. Дождитесь результата одной сервисной проверки состояния без изменений. diff --git a/plugins/xgrids-k1/frontend/src/components/K1SpatialControls.tsx b/plugins/xgrids-k1/frontend/src/components/K1SpatialControls.tsx index 1816580..9edaffe 100644 --- a/plugins/xgrids-k1/frontend/src/components/K1SpatialControls.tsx +++ b/plugins/xgrids-k1/frontend/src/components/K1SpatialControls.tsx @@ -71,7 +71,7 @@ export function k1SpatialPhasePresentation( const presentations: Record = { preparing: { label: "Подготовка локального приёма", - detail: "Проверяем контур и создаём сессию записи.", + detail: "Проверка контура и создание сессии записи.", busy: true, }, prepared: { @@ -114,14 +114,14 @@ export function k1SpatialPhasePresentation( busy: true, }, stopping: { - label: softwareCommanded ? "Останавливаем K1 и запись" : "Останавливаем локальный приём", + label: softwareCommanded ? "Остановка K1 и записи" : "Остановка локального приёма", detail: softwareCommanded ? "Команда отправлена; ожидаем подтверждённое состояние устройства." : "Физическое состояние K1 остаётся неизвестным.", busy: true, }, finalizing: { - label: "Сохраняем локальную запись", + label: "Сохранение локальной записи", detail: "Не закрывайте Mission Core до завершения финализации.", busy: true, }, @@ -247,7 +247,7 @@ export function K1SpatialControlsView({ ? "Связь с потоком K1 потеряна" : dataPlaneState === "stalled" ? "Поток K1 нестабилен" - : "Ожидаем подтверждённый поток K1", + : "Ожидание подтверждённого потока K1", detail: !controlAuthoritative ? "Состояние acquisition сохранено как последнее известное; команды устройству не отправляются." : "Управляющая сессия подтверждена, но живые данные пока не получили авторитетный статус.", @@ -318,11 +318,11 @@ export function K1SpatialControlsView({ > {physicalStopInFlight - ? "Останавливаем устройство…" + ? "Остановка устройства…" : pendingAction === "stop" - ? terminalPhysicalStopRequired ? "Останавливаем K1…" : softwareCommanded ? "Останавливаем устройство…" : "Останавливаем приём…" + ? terminalPhysicalStopRequired ? "Остановка K1…" : softwareCommanded ? "Остановка устройства…" : "Остановка приёма…" : stopping - ? acquisition.state === "finalizing" ? "Сохраняем запись…" : "Остановка выполняется…" + ? acquisition.state === "finalizing" ? "Сохранение записи…" : "Остановка выполняется…" : terminalPhysicalStopRequired ? "Остановить K1" : "Остановить устройство и запись"} @@ -336,7 +336,7 @@ export function K1SpatialControlsView({ > {pendingAction === "stop" - ? "Завершаем локальный приём…" + ? "Завершение локального приёма…" : "Завершить локальный приём"}