fix(k1): use neutral process copy

This commit is contained in:
DCCONSTRUCTIONS
2026-08-14 20:03:13 +03:00
parent 4a24275ddc
commit 72a2f37c03
8 changed files with 48 additions and 48 deletions
@@ -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,
@@ -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);
@@ -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>Сеть<\/h3>/);
assert.match(markup, /Проверяем подключение без изменения сети…/);
assert.match(markup, /Проверка подключения без изменения сети…/);
assert.match(markup, /<span>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, /<span>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(
@@ -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,
@@ -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,
@@ -372,7 +372,7 @@ export function K1AcquisitionPipeline({
<header className="panel-heading">
<div>
<span className="section-eyebrow">{terminalPhysicalStopPending ? "ВОССТАНОВЛЕНИЕ · КОМАНДА ОТПРАВЛЕНА" : recoveredPhysicalStop ? "ВОССТАНОВЛЕНИЕ · ОСТАНОВКА" : terminalLocalRecovery ? "ВОССТАНОВЛЕНИЕ · ЛОКАЛЬНЫЙ КОНТУР" : terminalReadOnlyRecovery ? "ВОССТАНОВЛЕНИЕ · ТОЛЬКО ЧТЕНИЕ" : recoveredActiveSession ? "СВЯЗЬ ВОССТАНОВЛЕНА · АКТИВНЫЙ ПРИЁМ" : effectiveSessionIntent === "live" ? "ШАГИ 04–05 · ПРОЕКТ И ПРИЁМ" : "СЛУЖЕБНЫЙ РЕЖИМ"}</span>
<h2>{terminalPhysicalStopPending ? "Ожидаем подтверждение устройства" : recoveredPhysicalStop ? "Сканирование продолжается" : terminalLocalRecovery ? "Завершите локальный приём" : terminalReadOnlyRecovery ? "Ожидайте подтверждённое состояние" : recoveredActiveSession ? "Связь восстановлена · приём продолжается" : effectiveSessionIntent === "live" ? "Назовите проект и запустите приём" : "Повторите запись"}</h2>
<h2>{terminalPhysicalStopPending ? "Ожидание подтверждения устройства" : recoveredPhysicalStop ? "Сканирование продолжается" : terminalLocalRecovery ? "Завершите локальный приём" : terminalReadOnlyRecovery ? "Ожидайте подтверждённое состояние" : recoveredActiveSession ? "Связь восстановлена · приём продолжается" : effectiveSessionIntent === "live" ? "Назовите проект и запустите приём" : "Повторите запись"}</h2>
</div>
<StatusBadge tone={sourceTone}>{sourceLabel}</StatusBadge>
</header>
@@ -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({
<Checker checked={replayLoop} label="Повторять по кругу" onChange={setReplayLoop} />
</div>
<Button variant="primary" icon={<Icon name="video" />} disabled={isBusy || sessionLocked || replayPath.trim().length === 0} onClick={() => void submitReplay()}>
{pendingAction === "replay" ? "Запускаем повтор…" : "Запустить повтор записи"}
{pendingAction === "replay" ? "Запуск повтора…" : "Запустить повтор записи"}
</Button>
</div>
)}
@@ -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 ? "Завершить подготовленный приём" : "Завершить локальный приём"}
</Button>
) : null}
@@ -2953,8 +2953,8 @@ export function K1ProvisioningPipeline({
});
};
const attemptButtonLabel = connectionAttemptPresentation?.localPhase === "submitting"
? "Применяем настройки…"
: "Подтверждаем подключение…";
? "Применение настроек…"
: "Подтверждение подключения…";
const applyAction = connectionAttemptSettling ? (
<Button
width="full"
@@ -2996,7 +2996,7 @@ export function K1ProvisioningPipeline({
<span>{modeCopy.stepTitle}</span>
<strong>
{connectionAttemptSettling
? "Ожидаем подтверждение подключения"
? "Ожидание подтверждения подключения"
: connectionAttemptFailed
? "Подключение не подтверждено"
: "Готово к продолжению"}
@@ -3099,7 +3099,7 @@ export function K1ProvisioningPipeline({
onClick={() => void verifyConnectionRecoveryTarget()}
>
{connectionReconnectPending
? "Переподключаемся…"
? "Переподключение…"
: "Переподключиться"}
</Button>
) : null}
@@ -3139,7 +3139,7 @@ export function K1ProvisioningPipeline({
/>
{modeResetInFlight ? (
<p className="safety-note" role="status">
Завершаем прежнюю локальную границу. Новый поиск не начнётся автоматически.
Завершение прежней локальной границы. Новый поиск не начнётся автоматически.
</p>
) : 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
? "Переподключаемся…"
? "Переподключение…"
: "Переподключиться"}
</Button>
) : 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"
>
<ActivityIndicator />
<strong>Проверяем подключение без изменения сети</strong>
<strong>Проверка подключения без изменения сети</strong>
</div>
) : networkRecoveryRequired && appliedControlSettlementPending ? (
<div
@@ -3485,7 +3485,7 @@ export function K1ProvisioningPipeline({
>
<ActivityIndicator />
<div>
<strong>Подтверждаем управляющее подключение</strong>
<strong>Подтверждение управляющего подключения</strong>
<p className="safety-note">
BLE-команда не повторяется. Дождитесь результата одной
сервисной проверки состояния без изменений.
@@ -71,7 +71,7 @@ export function k1SpatialPhasePresentation(
const presentations: Record<AcquisitionState, PhasePresentation> = {
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({
>
<span className="xgrids-k1-spatial-controls__action-label">
{physicalStopInFlight
? "Останавливаем устройство…"
? "Остановка устройства…"
: pendingAction === "stop"
? terminalPhysicalStopRequired ? "Останавливаем K1…" : softwareCommanded ? "Останавливаем устройство…" : "Останавливаем приём…"
? terminalPhysicalStopRequired ? "Остановка K1…" : softwareCommanded ? "Остановка устройства…" : "Остановка приёма…"
: stopping
? acquisition.state === "finalizing" ? "Сохраняем запись…" : "Остановка выполняется…"
? acquisition.state === "finalizing" ? "Сохранение записи…" : "Остановка выполняется…"
: terminalPhysicalStopRequired ? "Остановить K1" : "Остановить устройство и запись"}
</span>
</Button>
@@ -336,7 +336,7 @@ export function K1SpatialControlsView({
>
<span className="xgrids-k1-spatial-controls__action-label xgrids-k1-spatial-controls__action-label--local">
{pendingAction === "stop"
? "Завершаем локальный приём…"
? "Завершение локального приёма…"
: "Завершить локальный приём"}
</span>
</Button>