7.4 KiB
7.4 KiB
E4 UX-поток предупреждений: validate -> confirm -> apply
Дата: 2026-03-05 Статус: in-progress (E4.2 foundation реализован в GUI controller) Владелец: Engineering
1) Цель
- Зафиксировать единый UX-флоу для безопасного применения multi-client policy.
- Исключить "тихие" конфликтные применения.
- Дать пользователю прозрачный diff, риски и явное подтверждение.
2) Базовый сценарий
- Пользователь редактирует routing policy.
- UI вызывает
POST /api/v1/transport/policies/validate. - UI показывает результат валидации:
valid=trueиblock_count=0-> можно применять.valid=falseилиblock_count>0-> блокируем apply до подтверждения/исправления.
- Если пользователь выбирает принудительное применение:
- UI показывает модал подтверждения риска,
- использует
confirm_tokenиз validate.
- UI вызывает
POST /api/v1/transport/policies/apply.
2.1 Сценарий Engine Switch / Connect
- Пользователь выбирает целевой engine (
singbox|dnstt|phoenix) или нажимаетConnect. - UI формирует draft policy, где default ownership переходит к выбранному
client_id. - Дальше используется тот же pipeline:
validate-> (safe|risky) ->confirm->apply.
- После apply UI проверяет:
GET /api/v1/transport/clients/{id}/health,- расхождение
desired_enginevsactive_engine.
- Если engine не поднялся, UI предлагает
rollback.
3) Состояния UI
3.1 Draft
- Политика редактируется, но не проверена.
- Кнопка Apply отключена.
- Доступна кнопка Validate.
3.2 Validated (safe)
block_count=0.- Показываем diff (
added/changed/removed). - Apply активен без force режима.
3.3 Validated (risky)
- Есть блокирующие конфликты (
ownership,cidr_overlap,unknown_client). - Показываем список конфликтов и конкретные селекторы.
- Обычный Apply отключен.
- Доступен
Force applyтолько через отдельный confirm-step.
3.4 Confirm required
- Модал с явным предупреждением:
- что будет перезаписано,
- какие flow могут быть прерваны,
- какие сайты/сети сменят client owner.
- Кнопка подтверждения вызывает
applyсforce_override=true+confirm_token.
3.5 Applied
- Показываем
policy_revisionиapply_id. - Обновляем текущую policy в UI.
- Слушаем SSE
transport_policy_applied.
3.6 Switching engine
- Идёт переключение активного engine.
- Кнопки mutating-действий блокируются до завершения.
- Отображается прогресс:
Validating,Applying,Waiting for health.
3.7 Switch failed
applyилиhealthзавершились ошибкой.- Показываем
last_errorактивного клиента и причину валидации/применения. - Предлагаем быстрые действия:
Rollback,Switch back to previous engine.
4) Тексты предупреждений (шаблоны)
ownership:- "Один и тот же селектор назначен разным клиентам. Это может вызвать нестабильную маршрутизацию."
cidr_overlap:- "CIDR-подсети пересекаются между клиентами. Пакеты могут идти не по ожидаемому интерфейсу."
unknown_client:- "Политика ссылается на несуществующий клиент. Сначала добавьте/включите клиент."
Force confirm warning:
- "Принудительное применение может вызвать кратковременный обрыв активных сессий и смену маршрута для части трафика."
5) UX-правила безопасности
- Без
validateкнопкаapplyнеактивна. confirm_tokenне хранится между сессиями UI и считается одноразовым.- При смене
policy_revisionв фоне UI обязан повторно выполнить validate. - При
POLICY_REVISION_MISMATCHUI показывает "Конфигурация изменилась, нужно повторить проверку".
6) Web/iOS/Android паритет
- Один и тот же флоу и тексты рисков для всех клиентов.
- Разница только в визуальном представлении:
- web: side panel + modal,
- mobile: full-screen sheet.
- Логика decision-state остается одинаковой:
- draft -> validate -> (safe|risky) -> confirm -> apply.
7) Минимальный UI-чеклист внедрения
- Отображение
summary.block_count/warn_count. - Таблица
conflicts[]с фильтром по severity/type. - Видимый diff
added/changed/removed. - Модал force confirmation с явным перечислением рисков.
- Бейдж текущей ревизии policy (
policy_revision). - SSE-подписка на
transport_policy_validated,transport_policy_applied,transport_conflict_detected. - Для engine UX:
- индикатор
desired_engine / active_engine, - кнопки
Connect/Switch, - блокировка повторного switch, пока предыдущий не завершён,
- action
Rollback to previous engineпри неуспехе.
- индикатор
8) Статус внедрения (2026-03-07)
- E4.2 foundation в GUI controller реализован:
draft -> validate -> confirm -> apply. - E4.3.1 foundation в GUI реализован:
- на вкладке
AdGuardVPNбыл добавлен foundation-блокTransport engine; - доступен выбор client и действия
Prepare/Connect/Disconnect/Restartчерез API/api/v1/transport/clients/{id}/*; - отображается runtime-состояние выбранного engine (
status/iface/table/latency/last_error); - refresh блока привязан к transport SSE-событиям.
- на вкладке
- E4.3.2 реализован:
- engine-блок вынесен в отдельную вкладку
SingBox; Connect/Switchпереведён на pipelinevalidate -> confirm -> apply, directstartдля switch больше не используется;- добавлен
Rollback policybutton.
- engine-блок вынесен в отдельную вкладку
- Следующий UX-этап:
desired_engine/active_engineиндикаторы и блокировка повторного switch;- settings-переключатель видимости protocol tabs (
SingBox/DNSTT/Phoenix).