Files
MikrotikManager/docs/ux-ui-stage-9.md
T

49 KiB
Raw Blame History

Этап 9: VPN и сетевые операции

Статус: начат 2026-09-28, выполнены блоки 9.1–9.25. Основа — существующие ReUI PRO/base-nova, Frame, ServerTileRail, DataGrid и формы. Правила применения сетевой конфигурации не меняем.

Схема и референсы принятого плана

Область Референс Схема доработки
Устройство и объект List 9 Устройство → список → точный объект
Формы Sheet 8 Контекст → ввод → ожидание → результат / ошибка с сохранением ввода
Таблицы Data Grid Filtering 2 Фильтры → таблица устройства → действие

Референсы сохранены из общего плана; новые registry-компоненты не устанавливались.

[Устройство / URL] → [Объект и состояние данных]
                              ↓
                     [Форма / подтверждение]
                              ↓
                 [Один запрос · ожидание ответа]
                       ↙                ↘
            [Ошибка + повтор]     [Подтверждение API]
            контекст сохранён       ↓ обновить список

Карта работ

Раздел Точки интеграции Следующая проверка
WireGuard app/(main)/wireguard/page.tsx, components/wireguard, shared/api/wireguard.ts; URL server/interface Создание, импорт, пиры, переключение и экспорт: ввод, повтор, ответ и права
IPsec app/(main)/ipsec/page.tsx, components/ipsec, shared/api/ipsec.ts Выбор устройства, инициализация, сертификаты/пользователи и ошибки
GRE app/(main)/gre/page.tsx; /api/gre/tunnels, revisions; URL-контекст Запись/удаление и восстановление, повторные нажатия
VXLAN app/(main)/vxlan/page.tsx; /api/vxlan; URL server/tunnel Загрузка/сбой/повтор, контекст и существующие действия
Firewall app/(main)/firewall/page.tsx; правила, адреса, перемещение и история Достоверность записи, права и контекст устройства
Filters app/(main)/filters/page.tsx; /api/filters/rules, revisions, gre-tunnels, recursive-routes Сохранение/применение, ошибки зависимостей и устройство

Инвентаризация определяет точки следующего аудита; перечисление не означает проверки всех обработчиков.

Блок 9.1 — удаление WireGuard

  • Диалог удаления интерфейса/пира блокирует повтор и закрытие до ответа. Ожидание — role=status, ошибка — role=alert; при ошибке сохраняются объект и диалог для повтора.
  • Успех требует ok=true по контракту backend. HTTP 200 с ok=false не закрывает диалог и не показывает успех.
  • При различии ID строки и RouterOS ID для пира используется rosId. Прежний ID остаётся запасным вариантом при отсутствии rosId.
  • Прошли 13 E2E WireGuard: таблицы, URL/устройство, ошибки загрузки и оба удаления с задержкой, 403, неподтверждённым ответом и успешным повтором. Проверяются сервер и ID в DELETE. Lint, TypeScript и diff-check прошли.
  • Сохранён установленный AlertDialog/Base UI, без изменения темы/registry. Получен ReUI audit checklist; изменены поведение и доступные состояния.

Далее: создание/импорт/добавление пира WireGuard — сохранение формы, повторные операции, различие dry-run и применения. Затем остальные разделы по карте. Реальные RouterOS/JWT и сетевые последствия требуют отдельного окружения. Этап 9 не завершён.

Блок 9.2 — достоверность ответа импорта

Ответ проверяется схемой contracts: режим dryRun соответствует запросу, применение подтверждается applied. Ошибка сохраняет текст и сервер. Один E2E с пятью последовательными ответами (403, dry-run, отсутствие applied, повреждённый ответ, успех), lint и TypeScript прошли. Серверный dry-run не добавлен в UI; предпросмотр остаётся локальным. Далее — создание/пиры, защита повторов и закрытия формы импорта во время запроса. Реальные сетевые операции не проверены.

Блок 9.3 — ожидание импорта (2026-09-29)

Повторная отправка, закрытие и редактирование формы блокируются до ответа. Ошибка остаётся в форме, ожидание объявляется; добавлены доступные имена полей. Все 15 профильных E2E прошли, включая двойное нажатие, Escape/внешний клик, сохранение данных после 500 и повтор. Далее — создание интерфейса/пира и подтверждение их операций. Полный аудит сетевых разделов ещё не выполнен.

Блок 9.4 — создание интерфейса и пира (2026-09-29)

Формы блокируют повтор/закрытие/изменение до ответа и сохраняют ввод при ошибке. Проверяются оба backend-ответа создания интерфейса (DTO либо ok/name) и ok=true создания пира. Поля и переключатели получили доступные имена; повторное открытие пира сбрасывает ввод. Все 18 E2E прошли, три новых повторены после уточнения переключателей; lint и TypeScript прошли. Итог сборки — в журнале. Следующие проверки: переключение интерфейса и экспорт с защитой контекста. Реальный RouterOS/JWT и транзакционность составной операции не подтверждены локальными моками.

Блок 9.5 — переключение интерфейса (2026-09-29)

Повторы блокируются до PATCH и обновления списка; успех требует ok=true. Ожидание и ошибка с именами интерфейса/сервера объявляются через status/alert. Все 19 E2E, lint, TypeScript и diff-check прошли. Следующий блок — экспорт, включая поздние ответы и смену контекста. Реальное изменение RouterOS не проверено.

Блок 9.6 — контекст экспорта (2026-09-29)

Результат, ошибка и завершение запроса привязаны к открытию панели; закрытие/новое открытие/размонтирование инвалидируют прежний ответ. Повтор защищён замком. Схема ответа и запрошенный формат проверяются. Три новых E2E, lint и TypeScript прошли; итог общего набора — в журнале. Далее: точный выбор пира, затем история/восстановление. Реальный экспорт ключей не проверен; сетевой запрос после закрытия не отменяется.

Блок 9.7 — точный пир (2026-09-29)

Явный неизвестный ID не заменяется первым пиром; локальный и серверный экспорт используют общую функцию выбора по id/rosId. В API передаётся RouterOS ID выбранного пира. Прошли 4 E2E экспорта, 2 unit-теста, lint и TypeScript; неизвестный ID проверен на уровне функции. Далее — история и восстановление WireGuard. Реальное устройство не проверено.

Блок 9.8 — подтверждение восстановления (2026-09-29)

Один POST до завершения операции; успех требует ok=true. Новый E2E проверил повторное нажатие, ok=false и успешный повтор. Далее — ConfigHistorySheet: исправить вложение div в p и сохранение подтверждения при ошибке, проверить всех потребителей. Предупреждение HTML воспроизведено; реальная операция RouterOS не проверена.

Блок 9.9 — общий диалог восстановления (2026-09-29)

Исправлена HTML-разметка предупреждения; ошибка сохраняет выбранную ревизию и подтверждение для повтора. Общий замок блокирует повтор и закрытие до завершения Promise. Ошибки всех шести потребителей передаются в диалог; IPsec возвращает Promise. Все 40 профильных E2E прошли, включая 6 новых сценариев истории. Общий компонент и тесты lint-чистые; 7 исходных ошибок и 31 предупреждение в страницах подтверждены сравнением с HEAD и не изменились. Сборка — в журнале. Далее — ошибки/гонки загрузки истории, затем подтверждение восстановления остальных разделов. Реальные устройства не проверены.

Блок 9.10 — загрузка истории WireGuard (2026-09-29)

Ошибка отделена от пустого списка и имеет повтор; ревизии проверяются по схеме и выбранному серверу. Закрытие/размонтирование и новое поколение запроса исключают поздние результат/ошибку/finally. Три новых E2E, lint и TypeScript прошли; итог регрессии в журнале. Остальные страницы пока не подключены к новым loadError/onRetry. Далее — подтверждение восстановления остальных разделов и их состояния истории.

Блок 9.11 — подтверждение восстановления остальных разделов (2026-09-29)

IPsec/GRE/Firewall/Filters/рекурсивные маршруты требуют ok=true до применения ответа в UI; WireGuard уже проверял подтверждение. 6 расширенных сценариев истории прошли (403, ok=false, пустой ответ, успех), как и TypeScript/lint теста/diff-check. Исходные ошибки lint страниц не изменились. Далее — ошибка/повтор/поздние ответы загрузки истории этих пяти разделов. Полная валидация rules/routes и реальная операция RouterOS остаются вне этого блока.

Блок 9.12 — загрузка истории IPsec (2026-09-29)

Ошибка и повтор подключены к общей панели; поздние ответы закрытого/сменившего контекст запроса игнорируются. Проверяется наличие массива revisions, без полной валидации записей. Все 7 E2E истории прошли. Далее — GRE/Firewall/Filters/рекурсивные маршруты и общая схема ревизий. Реальные устройства не проверены.

Блок 9.13 — история всех разделов (2026-09-29)

Ошибка/повтор и защита поздних ответов подключены к GRE/Firewall/Filters/рекурсивным маршрутам. Общая схема проверяет записи, сервер и раздел во всех шести потребителях, включая IPsec. Все 36 E2E истории/WireGuard и TypeScript прошли; исходный lint страниц не изменился, новые общие файлы и тест чистые. Результат build — в журнале. Далее — форма инициализации IPsec (handleInit): подтверждение, сохранение ввода и повторные нажатия. Реальные устройства и payload восстановления rules/routes остаются вне проверки этого блока.

Блок 9.14 — инициализация IPsec (2026-09-29)

Проверяются схема сводки, serverId и initialized=true. Ошибка остаётся в форме с введёнными значениями; замок блокирует повтор, редактирование и закрытие во время запроса. Исправлен ввод IPv4, добавлены доступные имена. Новый E2E и 3 теста таблиц прошли, lint/TypeScript чистые. Далее — создание/редактирование пользователей IPsec. Реальные устройства и транзакционность сетевой операции не проверены; последний build — 9.13.

Блок 9.15 — пользователи IPsec (2026-09-29)

Создание проверяет схему клиента, сервер, имя и метод; редактирование требует ok=true. Форма сохраняет ввод и ошибку, блокирует повторы/закрытие/поля до ответа; добавлены доступные имена, сброс peer при смене сервера и проверка нового PSK. Все 7 E2E, lint и TypeScript прошли. Далее — загрузка/повторный экспорт сертификатов и контекст запросов. Реальные устройства и выпуск сертификатов не проверены; последний build — 9.13.

Блок 9.16 — сертификаты IPsec (2026-09-29)

Экспорт по identity/имени проверяет бандл, пароль и Base64; закрытая панель не принимает поздние ответы. Ошибка сохраняет панель для повтора; прежний архив сохраняет свой пароль при ошибке нового экспорта. Пароль только для чтения, скачивание заблокировано при запросе. Все 6 E2E, lint и TypeScript прошли; build — в журнале. Далее — удаление объектов IPsec. Реальный PKCS#12/RouterOS не проверен, сетевой запрос после закрытия не отменяется.

Блок 9.17 — удаление IPsec (2026-09-29)

Удаление клиента/сервера/peer/сертификата требует ok=true; диалог сохраняется при ошибке, блокирует повтор и закрытие до ответа. Принудительное удаление после 409 перенесено из toast в тот же диалог с общей защитой. Все 4 E2E прошли; lint/TypeScript — в журнале. Далее — редактирование peer IPsec. Реальные сетевые последствия не проверены, последний build — 9.16.

Блок 9.18 — peer IPsec (2026-09-29)

Сохранение требует ok=true; ошибка остаётся в форме вместе с вводом. Поля/переключатели, повторы и закрытие блокируются до ответа. Новый E2E, lint и TypeScript прошли. Далее — создание/изменение/удаление GRE. Загрузка данных IPsec и реальная сетевая приёмка остаются открытыми; последний build — 9.16.

Блок 9.19 — удаление GRE (2026-09-30)

Удаление требует ok=true; диалог сохраняет объект/ошибку, блокирует повторы и закрытие во время запроса. Проверки — в журнале. Далее — создание/изменение и переключение GRE. Реальное устройство не проверено, последний build — 9.16.

Блок 9.20 — переключение GRE (2026-09-30)

PATCH требует ok=true; замок блокирует повтор, ожидание и ошибка содержат имя туннеля. Все 3 E2E прошли, новых замечаний lint нет; TypeScript — в журнале. Далее — создание/редактирование GRE. Реальное устройство не проверено, последний build — 9.16.

Блок 9.21 — формы GRE (2026-09-30)

Создание проверяет ok/name либо поля подтверждённого объекта, PATCH требует ok=true. Ошибка сохраняет ввод, поля/повторы/закрытие заблокированы до ответа. Все 6 E2E прошли, остальные проверки — в журнале. Далее — VXLAN: загрузка, ошибка, повтор и URL-контекст. Полная схема GreTunnel, доступность остальных полей и реальные сетевые операции ещё требуют проверки.

Блок 9.22 — загрузка VXLAN (2026-09-30)

Повреждённый контейнер не превращается в пустой список; KPI до успеха неизвестны, ошибка обновления сохраняет данные. Добавлена защита поколением запроса. Прошли 11 E2E в двух прогонах, lint/TypeScript чистые. Далее — частичные сбои опроса VXLAN на backend и сохранение данных по устройству. Полная схема туннеля, отдельные тесты гонок и реальный RouterOS ещё не проверены; последний build — 9.21.

Блок 9.23 — частичный сбой VXLAN (2026-09-30)

API возвращает failures, одиночный endpoint — 502 при сбое; VTEP не маскируется пустым списком. UI сохраняет последние туннели устройства, показывает неизвестное состояние и повтор. Проверены серверная агрегация и 13 E2E, frontend/backend TypeScript и frontend lint прошли. Далее — схема payload и гонки загрузки VXLAN. Счётчик countVxlanTunnels всё ещё возвращает ноль при ошибке, timestamp и запись VXLAN не реализованы; реальные устройства не проверены.

Блок 9.24 — проверка данных VXLAN (2026-09-30)

Схемы отклоняют повреждённые записи/серверы/failures и дубли пары serverId/id. Все 16 E2E, lint и TypeScript прошли, включая поздний успех/ошибку при смене устройства. Далее — операции Firewall, затем Filters. Счётчик ошибок, timestamp и запись VXLAN остаются открытыми, последний build — 9.21; реальные устройства не проверены.

Блок 9.25 — переключение Firewall (2026-09-30)

PATCH правила требует ok=true, замок предотвращает повтор до обновления таблицы; статус/ошибка содержат контекст правила. Все 7 E2E и TypeScript прошли. Grid/тест lint-чистые, исходные замечания страницы сохранены. Далее — address-list и остальные мутации Firewall, общий замок ещё не распространён на них. Реальные устройства не проверены; последний build — 9.21.

Блок 9.26 — переключение address-list Firewall (2026-09-30)

PATCH требует ok=true, общий замок переключений предотвращает повтор до обновления. Ошибка сохраняет состояние записи и содержит адрес/список. Все 9 E2E и TypeScript прошли, новых замечаний lint нет. Далее — сохранение/удаление и перемещение Firewall; единая блокировка всех мутаций пока не внедрена. Реальные устройства не проверены; последний build — 9.21.

Блок 9.27 — удаление Firewall (2026-09-30)

Правила/address-list удаляются через общий диалог с контекстом устройства. DELETE требует ok=true; ошибка сохраняет диалог, повтор и закрытие блокируются до ответа. Все 13 E2E и TypeScript прошли, новых замечаний lint нет. Далее — формы и перемещение Firewall; остальные мутации и гонки загрузки ещё открыты. Реальные устройства не проверены; последний build — 9.21.

Блок 9.28 — формы Firewall (2026-09-30)

POST/PUT правил и address-list требуют ok=true. Ошибка сохраняет форму/ввод, повтор и закрытие блокируются во время запроса. Все 21 E2E и TypeScript прошли, новых замечаний lint нет. Далее — перемещение Firewall; восстановление истории, перемещение и гонки загрузки ещё требуют общей защиты. Реальные устройства не проверены; последний build — 9.21.

Блок 9.29 — перемещение Firewall (2026-09-30)

POST требует ok=true, ошибка возвращает исходный порядок. Общий mutationLock предотвращает конфликтующие операции до обновления списка. Все 23 E2E и TypeScript прошли, новых замечаний lint нет. Далее — общий замок восстановления истории и схема/гонки загрузки Firewall, затем Filters. Реальные устройства не проверены; последний build — 9.21.

Блок 9.30 — общий замок истории Firewall (2026-09-30)

Восстановление удерживает mutationLock до чтения правил и истории, ошибка освобождает замок. История/ручное обновление недоступны во время записи. Прошли 26 разных E2E в двух прогонах, TypeScript и lint тестов; исходные замечания страницы сохранены. Далее — схема/гонки загрузки Firewall, затем Filters. Реальные устройства не проверены; последний build — 9.21.

Блок 9.31 — данные Firewall (2026-09-30)

Схемы отклоняют повреждённые ответы и дубли. Ошибка сохраняет последний список, первоначальные KPI неизвестны. Поколение запросов отменяет старое чтение при начале записи. Все 32 E2E, TypeScript и build (34 страницы) прошли; новых замечаний lint нет. Далее — частичные сбои опроса backend: safeGet/listFirewallAll всё ещё маскируют ошибку пустым списком. Свежесть, дополнительные гонки backend/режима/мутации и реальные устройства ещё не проверены.

Блок 9.32 — частичные сбои Firewall (2026-09-30)

Backend сообщает failures по срезу, неполный snapshot отклоняется и не записывается как observed. UI сохраняет недоступные срезы, показывает неизвестную сводку и блокирует изменения до повторного успеха. Серверный тест, 35 разных E2E в двух прогонах, TypeScript frontend/backend и backend build прошли; новых frontend lint замечаний нет. Далее — свежесть/гонки контекста Firewall, затем Filters. Реальные RouterOS/БД и последствия ошибки снимка после записи ещё требуют приёмки; последний frontend build — 9.31.

Блок 9.33 — смена источника Firewall (2026-09-30)

Состояние пересоздаётся по backend/режиму, старое завершение записи не уведомляет новый экран и не запускает чтение. Прошли 39 E2E в двух прогонах, TypeScript и lint новых файлов; исходные замечания страницы сохранены. Контекстные тесты запускаются отдельно через playwright.firewall-context.config.ts. Далее — свежесть данных Firewall, затем Filters. Реальные устройства не проверены; frontend build — 9.31, backend — 9.32.

Блок 9.34 — свежесть Firewall (2026-09-30)

Время получения сохраняется по срезам: успешные получают новое время, недоступные сохраняют прежнее или остаются неизвестными. Экран показывает диапазон, неизвестные срезы и время данных в предупреждении. Это время браузерного получения, не измерения RouterOS. Все 37 E2E и TypeScript прошли, два профильных теста диапазона повторены; новых замечаний lint нет. Далее — операции Filters. Реальные устройства не проверены; frontend build — 9.31, backend — 9.32.

Блок 9.35 — сохранение Filters (2026-09-30)

Создание и редактирование ожидают ok=true, ошибки сохраняют форму и прежние строки. Блокируются повторы/закрытие, есть inline-ошибка и статус ожидания. Повторное открытие начинает новую форму. Пять профильных E2E, TypeScript и lint новых файлов прошли; исходные замечания страницы сохранены. Далее — CopyRulesSheet: убрать преждевременный done, дождаться применения и сохранить выбор при ошибке. Загрузка/схемы/гонки Filters и реальные устройства ещё не проверены; frontend build — 9.31, backend — 9.32.

Блок 9.36 — копирование Filters (2026-09-30)

Копирование append/replace ожидает подтверждения API; ошибка сохраняет правила, цель и режим. Повторы и закрытие заблокированы до ответа, преждевременный done/таймер удалены. Пять E2E, TypeScript и lint нового теста прошли; исходные замечания страницы сохранены. Далее — подтверждение удаления Filters, затем перемещение и общий замок. Гонки/схемы/загрузка целевого ruleset и реальный маппинг шлюзов остаются открытыми; frontend build — 9.31, backend — 9.32.

Блок 9.37 — удаление Filters (2026-09-30)

Удаление перенесено в AlertDialog с Community/устройством. Ошибка сохраняет подтверждение и строку, повторы/отмена/закрытие заблокированы до ответа, удаление применяется только после ok=true. Семь E2E и TypeScript прошли; новых lint замечаний нет. Далее — перемещение, затем общий замок восстановления/обновления и достоверность загрузки. Реальные устройства не проверены; frontend build — 9.31, backend — 9.32.

Блок 9.38 — перемещение Filters (2026-09-30)

Перемещение по ID ждёт подтверждения и сохраняет порядок/ошибку при отказе. Приоритет и границы поиска берутся из полного списка. Действия таблицы блокируются при операции, повторы защищены синхронным замком. Девять E2E и TypeScript прошли; новых lint замечаний нет. Далее — общий замок восстановления/обновления, затем схемы/гонки/достоверность загрузки. Реальные устройства не проверены; frontend build — 9.31, backend — 9.32.

Блок 9.39 — общий замок Filters (2026-09-30)

Обновление/восстановление используют applyLock, восстановление держит его до чтения правил/истории. Ошибка чтения сохраняет подтверждение и последние строки; чужой ruleset и stale отклоняются. 15 разных E2E в нескольких прогонах и TypeScript прошли; новых lint замечаний нет. Далее — схемы/первоначальная загрузка без моковой подмены, затем гонки и свежесть. Реальные устройства не проверены; frontend build — 9.31, backend — 9.32.

Блок 9.40 — загрузка Filters (2026-09-30)

Схемы валидируют правила/наборы/подтверждения, live-ошибка больше не подставляет моки, есть первоначальная ошибка/повтор и сохранение последних правил. 18 E2E, TypeScript и frontend build (34 страницы) прошли; новых lint замечаний нет. Далее — поколения чтения/изоляция контекста и блокировка записи до свежего чтения выбранного устройства. Начальный GET отдаёт backend-кэш; GRE/recursive payload и ошибки ещё не приняты. Реальные устройства не проверены; backend build — 9.32.

Блок 9.41 — гонки чтения выбранного устройства Filters (2026-09-30)

Запись выбранного устройства требует успешного чтения live=true; кэш остаётся readonly до ответа. Поколение запросов отменяет старый успех/ошибку при переключении, применении и cleanup. 20 E2E и TypeScript прошли, шесть профильных сценариев повторены после уточнения live; новых lint замечаний нет. Далее — изоляция состояния backend/режима и старых мутаций, затем актуальное чтение цели копирования. GRE/recursive и свежесть ещё открыты. Остаток пятичасовой квоты 25%; новый блок не начат. Frontend build — 9.40, backend — 9.32.

Блок 9.42 — источник Filters (2026-09-30)

Состояние пересоздаётся по backend/режиму, старые записи не уведомляют новый экран и не запускают чтение. 26 E2E в двух финальных прогонах и TypeScript прошли; новых lint замечаний нет. Контекстные тесты — playwright.filters-context.config.ts. Далее — актуальный целевой ruleset копирования, затем шлюзы/свежесть. Пользователь разрешил продолжение за резерв 25%. Frontend build — 9.40, backend — 9.32.

Блок 9.43 — цель копирования Filters (2026-09-30)

Live-копирование читает актуальный целевой ruleset под общим замком до PUT. Ошибка/чужой/stale/повреждённый ответ сохраняют форму и не отправляют запись. Десять E2E и TypeScript прошли; новых lint замечаний нет. Далее — схемы/ошибки каталогов шлюзов, затем свежесть. Frontend build — 9.40, backend — 9.32.

Блок 9.44 — каталоги шлюзов Filters (2026-09-30)

Схемы и readiness GRE/recursive сохраняют данные при отказе и блокируют route-сохранение/несопоставленное копирование до повтора. Выборный GRE backend GET возвращает 503 вместо пустого успеха. 12 E2E, повтор двух профильных, TypeScript frontend/backend и оба build прошли. Frontend lint: 0 ошибок/13 прежних предупреждений. Общий GRE GET/реальная БД/RouterOS не приняты. Далее — свежесть и профильная приёмка Filters.

Блок 9.45 — свежесть Filters (2026-09-30)

По устройству показано клиентское время получения правил/GRE/recursive и отдельное подтверждение записи. Ошибка сохраняет время; неизвестный первоначальный срез не получает ложную дату. Десять E2E и TypeScript прошли; новых lint замечаний нет. Далее — клавиатура/телефон и проверенные экраны Filters. Build frontend/backend — 9.44.

Блок 9.46 — клавиатура и экраны Filters (2026-09-30)

  • Community использует установленный Base UI Combobox: фильтрация по коду/названию, выбор стрелками/Enter и свободный ввод. Поле связано с подписью, действие отмечено aria-pressed, ошибка объявляется alert; ввод блокируется при сохранении. Tab закрывает подсказки и возвращает доступ к остальным полям формы. При открытом popup Base UI временно ограничивает дерево доступности; тесты проверяют переход Tab, а не обходят его.
  • Два новых E2E проверяют ПК 1440×1000 и телефон 390×844: отсутствие переполнения документа, выбор устройства на телефоне, валидацию, клавиатурный выбор/ручной ввод и единственный PUT в правильное устройство. Четыре PNG сохранены и просмотрены. Таблица на телефоне использует внутреннюю прокрутку; это не полная приёмка контраста, screen reader или всех форм шлюзов.
  • 13 E2E прошли: layout/сохранение (4), копирование/актуальная цель/удаление/порядок/свежесть (9). TypeScript прошёл; lint 0 ошибок/13 прежних предупреждений страницы, тесты без замечаний. Build не повторялся, последние frontend/backend — 9.44. Моки HTTP проверяют live-путь; реальные RouterOS/JWT/БД не проверены.
  • Далее — оставшиеся ограничения этапа 9: первоначальные/частичные сбои IPsec, свежесть VXLAN и ошибки общего GRE-каталога. Этап 9 открыт. Перед новым блоком проверить квоту и журнал; этапы 10–12 не начаты.
  • Квота после профильных проверок: 96% пятичасовой/15% недельной. Пользователь разрешил работу до конца лимитов. Локальный коммит без push.
Образец Проверенный экран Применённая композиция
ReUI Data Grid Filtering 2 Filters ПК, телефон Устройство → свежесть → правила → действие
ReUI Sheet 8 Форма ПК, телефон Community → действие → пояснение → подтверждение API

Блок 9.47 — общая регрессия Filters (2026-09-30)

  • После блоков 9.35–9.46 последовательно прошли 27 E2E стандартной конфигурации и 6 E2E изоляции источника: данные/схемы, ошибки и повтор, каталоги, копирование и актуальная цель, удаление/порядок, история и общий замок, свежесть, гонки выбранного устройства, смена backend/mode, клавиатура и ПК/телефон.
  • Production build frontend прошёл: контракты, TypeScript, 34 страницы. Последний backend build — 9.44, после него backend не менялся. Lint блока 9.46: 0 ошибок/13 прежних предупреждений. Исходный код в этом блоке не менялся.
  • Это профильная локальная регрессия Filters по HTTP-фикстурам, не полная регрессия приложения и не приёмка RouterOS/JWT/БД. Этап 9 остаётся открыт; этапы 10–12 не начаты.
  • Следующий шаг: проверить остаток квоты и последние файлы, разобрать первоначальные/частичные сбои IPsec; затем ограничения VXLAN и общего GRE-каталога. Пользователь разрешил продолжать до конца лимитов; после 33 E2E использовано 98% пятичасовой/15% недельной квоты. Результат сохраняется локальным коммитом без push.

Блок 9.48 — состояния чтения IPsec (2026-09-30)

  • listIpsec проверяет контракт, уникальность серверов/клиентов/отказов, конфликт успешного и неответившего устройства и контекст выборного ответа. Повреждённый ответ не меняет данные. IPsec и inventory загружаются независимо через allSettled; список устройств тоже проверяется схемой.
  • Ошибка всего IPsec сохраняет последние строки; частичный отказ обновляет успешные устройства и сохраняет предыдущие строки/сводки неответивших. Новый подтверждённый пустой ответ удаляет прошлые строки. Постоянный alert даёт повтор; первоначальный отказ не изображает пустую таблицу, KPI неизвестного среза показаны «—»/«неизвестно».
  • Поколение чтения игнорирует устаревшие ответы; смена mode/backend монтирует отдельное состояние. Поздние записи и доступность действий на сохранённых данных будут проверены следующим блоком, ещё не приняты.
  • 17 E2E прошли: шесть новых сценариев чтения и 11 прежних операций. Ранее прошли три теста таблиц IPsec/GRE (два новых теста сперва требовали уточнения alert-локатора из-за Next route-announcer, исправлены). TypeScript и lint четырёх файлов чистые. Backend не менялся; последние build frontend — 9.47, backend — 9.44.
  • Далее — readiness действий, свежесть и гонки IPsec; затем VXLAN/общий GRE. Реальные RouterOS/JWT/БД не проверены. Квота: 0% использования в начале, 4% пятичасовой/16% недельной после проверок. Локальный коммит без push.

Блок 9.49 — readiness действий IPsec (2026-09-30)

  • Кнопки клиентов и серверов используют readiness конкретного serverId: требуется успешное чтение, доступный inventory, включённое устройство, отсутствие его failure и текущей загрузки/операции. Сохранённые строки не превращаются в разрешение редактировать/удалять. Успешное устройство остаётся доступным при частичном отказе другого.
  • Формы создания получают только доступные устройства, уже выполняемый запрос сохраняет список. Submit и удаление дополнительно проверяют readiness перед API. Первоначальный/полный отказ блокирует создание. Refresh во время изменения/восстановления отключён. Серверные операции с неответившим устройством недоступны; просмотр истории не является разрешением восстановления.
  • Новый E2E проверяет начальный отказ, частичный отказ двух устройств, общий отказ и восстановление с нулём write-запросов; вместе с прежними операциями/таблицами прошло 15 E2E. TypeScript и lint чистые. Табличная IPsec-фикстура теперь содержит реальный inventory устройства вместо пустого списка.
  • Следующий блок: общий замок/контекст поздних операций, restore/export readiness и свежесть. Backend не менялся; последние build frontend — 9.47, backend — 9.44. Реальные RouterOS/JWT/БД не проверены. Локальный коммит без push.

Блок 9.50 — замок и контекст операций IPsec (2026-09-30)

  • Общий синхронный operationLock охватывает инициализацию, создание/редактирование клиентов/peer, удаление и восстановление до последующего чтения. Начало записи инвалидирует предыдущий опрос; внешний refresh при записи не отправляется. Восстановление и экспорт проверяют readiness устройства, ошибки остаются в своих панелях.
  • Mounted-guard отсекает поздние успехи записи после смены источника: нет старого toast, повторного чтения или открытия сертификата. Ошибка удаления после размонтирования также игнорируется. Уже отправленная операция RouterOS не отменяется и может завершиться на прежнем backend — отмена UI не является отменой сетевой операции.
  • Успешное удаление закрывает подтверждение даже при отказе последующего опроса; таблица сохраняет последние строки с явной ошибкой чтения и отключёнными действиями до повтора. Проверки не выдают это за неуспешное удаление.
  • 30 E2E прошли: 6 отдельных тестов backend/mode контекста, 23 регрессии IPsec/истории (включая GRE smoke) и новый сценарий замка/ошибки чтения. TypeScript и lint чистые. Отдельная конфигурация ipsec-context исключена из обычной и использует порт 3101 последовательно.
  • Далее — клиентская свежесть IPsec и профильные ПК/телефон экраны; затем оставшиеся VXLAN/GRE. Последние build frontend — 9.47, backend — 9.44. Реальные RouterOS/JWT/БД не проверены. Локальный коммит без push.