# v0.0.66 — Блокировки UI: предсказуемое поведение во всех состояниях (2026-08-24) _ux-frontend. По замечанию: во время обработки «Выбрать файлы» оставалась активной — юзер мог менять список и ломать состояние/индексы. Требование: ВСЁ предсказуемо, учтены ВСЕ действия юзера._ ## Состояния и доступные действия | Состояние | Выбрать файлы | ✕ удалить | Обфусцировать | Прервать | Скачать | Новая сессия | |---|---|---|---|---|---|---| | Простой | ✅ | ✅ | ✅ | — | — | — | | Загрузка (1/2) | 🔒 | 🔒 | 🔒 | — | — | — | | Обработка (2/2) | 🔒 | 🔒 | 🔒 | ✅ | — | — | | Результат готов | 🔒 | 🔒 | 🔒 | — | ✅ | ✅ | | Ошибка | ✅ | ✅ | ✅ | — | — | — | ## Реализация - Глобальный флаг `busy` + `setBusy(b)`: блокирует `fileInput` и скрывает кнопки «✕» (CSS `body.busy .remove-btn { display:none }`). - Двойная защита: обработчики `change` (выбор файлов) и `rm` (удаление) игнорируют вызовы при `busy`. - `uploadFiles()`: guard `if (busy) return` + `setBusy(true)`; ранние выходы (ошибки фазы 1, test-режим) — `setBusy(false)`. - **Заморозка сессии после результата**: `complete`/`cancelled` → `sessionDone=true`, `fi`/`uploadBtn` выключены, показаны «Скачать» и новая кнопка **«🔄 Новая сессия»** (`resetAll`). Ошибки — снимают блокировку (можно повторить). - При закрытии вкладки (beforeunload) — `resetAll` сбрасывает всё. ## Найденный и исправленный баг при правке - При добавлении заморозки случайно затёрлась строка `activeES.addEventListener('complete', ...)` — JS-синтаксис сломался («Missing catch»). Восстановлено ДО пуша; `node --check` — OK. ## Проверка - `node --check` (извлечённый