Witness synchronous warm confirmation refusal
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (blend) (push) Failing after 1m40s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (interaction) (push) Failing after 1m54s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (large-house) (push) Failing after 2m2s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (isometric) (push) Failing after 2m6s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (overlay) (push) Failing after 1m44s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (plan-snap) (push) Failing after 1m34s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (space-default) (push) Failing after 1m55s
Проверка (CI) / Классификация изменённых файлов (push) Successful in 39s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (space-glow) (push) Failing after 2m0s
Проверка (CI) / HACS: валидация репозитория (push) Skipped
Проверка (CI) / Hassfest: манифест интеграции (push) Skipped
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Skipped
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Successful in 56s
Проверка (CI) / Смоки в браузере (шард 1 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 2 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 3 из 3) (push) Skipped
Проверка (CI) / Смоки: все шарды зелёные (push) Skipped
Проверка (CI) / Golden-кадры против принятых эталонов (push) Skipped
Проверка (CI) / Перф-смок: бюджет времени кадра (push) Skipped
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Skipped
Проверка (CI) / Предполётные проверки: документация, провенанс, процесс (push) Failing after 8m55s

Issue: #470
User-Visible: no
This commit is contained in:
Matysh
2026-09-05 22:59:28 +03:00
parent 5ff97858f8
commit ce07db748e
2 changed files with 16 additions and 10 deletions
+14 -8
View File
@@ -65,15 +65,20 @@ const warmGate = await page.evaluate(async () => {
new Promise((resolve) => setTimeout(() => resolve('timeout'), 100)),
]);
await settle();
const warmDecision = card._confirmDanger({
key: 'warm-language-gate',
kind: 'destructive',
title: 'Delete?',
message: 'The plan and all its rooms will be deleted.',
confirmLabel: 'Delete',
cancelLabel: 'Cancel',
});
// Refusal is a synchronous registration barrier, not eventual cleanup by
// the next warm render. A briefly pending request has no decision surface.
const warmRequestWasNeverRegistered = card._dangerConfirm === null
&& card._dangerConfirmController.state === null;
const decision = await Promise.race([
card._confirmDanger({
key: 'warm-language-gate',
kind: 'destructive',
title: 'Delete?',
message: 'The plan and all its rooms will be deleted.',
confirmLabel: 'Delete',
cancelLabel: 'Cancel',
}),
warmDecision,
new Promise((resolve) => setTimeout(() => resolve('timeout'), 100)),
]);
const result = {
@@ -81,6 +86,7 @@ const warmGate = await page.evaluate(async () => {
readyConfirmationOpenedBeforeWarm: openedWhileReady,
readyToWarmCancelsOpenConfirmation: cancelledOnTransition === false,
readyToWarmKeepsCommittedBody: root().querySelector('ha-card')?.outerHTML === committedBody,
warmLanguageGateNeverRegisters: warmRequestWasNeverRegistered,
warmLanguageGateRefusesImmediately: decision === false,
warmLanguageGateKeepsControllerEmpty: card._dangerConfirm === null
&& card._dangerConfirmController.state === null,
+2 -2
View File
@@ -1623,8 +1623,8 @@ const MUTANT_DEFINITIONS = [
{
id: 'danger-confirm-warm-language-guard-removed',
guard: 'node demo/smoke_danger_confirm_branches.mjs',
because: 'the warm language branch returns Lit noChange, so a newly registered '
+ 'confirmation has no rendered decision source and hangs (#417 AC2)',
because: 'a request made while the language gate is already warm must be rejected '
+ 'synchronously without ever entering the confirmation controller (#417 AC2/AC3)',
patches: [{
file: 'src/houseplan-card.ts',
find: " if (this._syncDangerConfirmLocaleGate() === 'warm') return Promise.resolve(false);",