# Замечания к кабинетам — 18 октября 2026

Статусы: открыто → исправлено → проверено. «Проверено» требует указанных доказательств, не количества тестов. Сохранять этот реестр при следующих правках; новые замечания добавлять, старые не стирать. Техническая проверка не закрывает ручную приёмку владельца.

Предыдущая проверка: код `0b8a148`; образ `sha256:fcb445da16ab753a02abafdd94e3526532ced1fe29b74cfd6a5aa96c5e997c39`. [Результаты сценариев](https://preview.mdmatvey.com/automated.html), [отчёт](https://preview.mdmatvey.com/ui-review.html). Физический iPad и реальные внешние провайдеры в этот объём не входят.

| ID         | Экран / проблема                                 | Требуемое поведение                                                                                 | Проверка                                                                | Статус  |
| ---------- | ------------------------------------------------ | --------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | ------- |
| AUTH-01    | Чужая роль входит через форму туриста            | Проверка назначения формы и серверных прав; чужая роль не получает туристические данные             | J41; 24 пары роль/форма, 197 маршрутов и отрицательная HTTP-матрица PostgreSQL | проверено в указанном объёме |
| TOUR-01    | Лишние действия в бронированиях, профиле, email  | Убрать повторный выбор экскурсии и возврат в профиль; полностью убрать блок выгрузки JSON из профиля | Прежняя проверка J34 не подтверждала удаление блока; повторно открыто владельцем. См. TOUR-02 | блок профиля удалён и проверен в TOUR-02 |
| CRM-01     | Дублирование статусов, кнопки поиска/сброса      | Debounce всех фильтров; статус внутри фильтров; чипы выбранных значений с удалением                 | J35; отмена прежнего запроса в коде; визуальный обход 390–1440 | проверено в указанном объёме |
| TASK-01    | Навигация похожа на обычный текст                | Явные вкладки или кнопки перехода, заметное текущее состояние                                       | J30; задачи/отзывы ADMIN и OPERATOR, Chromium/WebKit | проверено в указанном объёме |
| TASK-02    | Пустой список оставляет белую область            | Сдержанное пустое состояние вместо пустого списка/таблицы                                           | Пустые состояния задач/отзывов в двух браузерах и темах | проверено в указанном объёме |
| TASK-03    | Текстовая каша в услугах поставщиков             | Название, статус, дата и цена разделены; вторичные подробности отдельно                             | Карточки B2B в обходе Chromium/WebKit; J29, J36 | проверено в указанном объёме |
| EXC-01     | Отдельные кнопки перехода статусов               | Dropdown с только допустимыми переходами; сервер проверяет переход                                  | J43: публикация без расписания запрещена, с расписанием разрешена | проверено в указанном объёме |
| EXC-02     | Поломанные поля редактора, слишком длинная форма | Группы по задаче, необходимые поля сначала, дополнительные опционально                              | J43: создание/сохранение; J09: правки предложения; вкладки и ошибки в визуальном обходе | проверено в указанном объёме |
| EXC-03     | Выделение посещённых административных ссылок     | Нет маркеров/усиления просмотренных записей в рабочих интерфейсах                                   | Единый стиль visited проверен в коде; повторные переходы в визуальном обходе | проверено в указанном объёме |
| NAV-01     | Пункт меню и заголовок отличаются                | Одинаковое основное название, пояснение отдельно                                                    | Шесть ролей, все пункты меню; названия сверены с заголовками | проверено в указанном объёме |
| B2B-01     | Заявки слеплены, доставка уведомлений сверху     | Расстояния между карточками; рабочая информация первая, доставка вторичная                          | J11, J29, J33, J36, J39; карточки/диалоги в двух браузерах | проверено в указанном объёме |
| PART-01    | Партнёры: плотный текст и слепленные элементы    | Читаемая иерархия, показатели и действия визуально разделены                                        | J15, J45; заполненные карточки/QR/диалоги в двух темах | проверено в указанном объёме |
| PRICE-01   | Предоплата и промокоды как одна форма            | Отдельные разделы/табы; удобные вводы; дополнительные параметры скрыты явно                         | J16: промокод/лимит/отключение; J44: раздельные настройки; визуальный обход | проверено в указанном объёме |
| MONEY-01   | Деньги: терминология и текстовый формат ввода    | Понятные названия; структурированные поля вместо строк специального формата; история операций       | J44: точные проценты; 137 PostgreSQL; шесть мобильных финансовых сценариев | проверено в указанном объёме |
| REPORT-01  | Отчёты и журнал: много полей в ряд               | Компактная основная задача; дополнительные фильтры отдельно, выбранные видны                        | Мобильный аудит: фильтры/пагинация/отзыв доступа; отчёт и воронка в независимом ревью | проверено в указанном объёме |
| REFRESH-01 | Баллы: очистка и запрос при каждом фокусе        | Осознанная частота обновления; без мигания при живом доступе; отзыв доступа по-прежнему защищён     | J45; мобильный отзыв прав баллов/выплат/аудита; очередь событий фокуса | проверено в указанном объёме |
| EMPTY-01   | Пустые состояния слишком яркие                   | Общий сдержанный цвет текста с достаточным контрастом                                               | Единый muted-токен; пустые списки/расписание в светлой и тёмной темах | проверено в указанном объёме |
| SYSTEM-01  | Аналогичные дефекты вне названных экранов        | Обход всех страниц, форм, карточек; убрать дубли, жаргон, плотные поля                              | 55 определений страниц; 309 состояний на браузер; независимый просмотр проблемных экранов | проверено в указанном объёме |
| QA-01      | Предыдущее ревью не замечало очевидного          | Отдельные проверки прав, бизнес-сценариев и визуального удобства; независимый строгий ревьюер       | 344 unit, 137 PostgreSQL, 52 journeys, 6 mobile, 3 bank; независимое ревью точного образа | проверено в указанном объёме |

## Почему прежняя проверка пропустила дефекты

Проверка загрузки страниц и отсутствия переполнения была ошибочно принята за проверку удобства. Не были достаточно пройдены заполненные формы, пустые состояния и повторные действия. Кроме того, часть тестов повторяла прежние допущения реализации: например, допуск ADMIN к туристическому профилю. Это ошибка процесса ревью, а не отсутствие подробных требований от владельца.

Теперь результат привязывается к конкретному сценарию и образу: реальные формы/сессии/API/база, отрицательная матрица прав, просмотр снимков с активной вкладкой, независимое ревью. Успешные тесты не заменяют ручную приёмку владельца и не доказывают отсутствие всех ошибок. [Правила проверки](../03-tech/ui-ux-principles.md#как-подтверждать-исправление).

## Постоянные принципы

- Меню и заголовок используют один словарь. Пояснение не подменяет название раздела.
- Любое действие выглядит как действие; переход отличается от справочного текста. Посещённость не выделяет административные записи.
- Карточка: идентичность, состояние, дата/сумма, действие. Не превращать её в технический журнал; диагностику раскрывать отдельно.
- Форма делится по задачам, максимум две смысловые колонки на широком экране и одна на телефоне. Необязательные группы можно раскрывать; обязательное и ошибки не прятать.
- У фильтров один источник состояния. Применение автоматическое с debounce; выбранные значения доступны для удаления по одному.
- Пустое состояние заменяет список, а не оставляет его пустую оболочку. Для вторичного текста использовать цвет токена, не opacity всего контейнера.
- Обновление данных и проверка прав — разные задачи. Частота зависит от изменчивости данных; фоновые обновления не должны стирать рабочий экран. Отзыв прав проверяется сервером при каждом запросе.
- Вход через форму не доказывает доступ. Матрица включает отрицательные комбинации ролей, прямой запрос, чужой объект, отзыв доступа, смену сессии.
- Оценивать не только отсутствие переполнения: смотреть реальный снимок заполненной формы и пользоваться ею как оператор.

Источники методики: [OWASP: Authorization](https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html), [OWASP: Business Logic Security](https://cheatsheetseries.owasp.org/cheatsheets/Business_Logic_Security_Cheat_Sheet.html), [Carbon: Forms](https://www.carbondesignsystem.com/building-blocks/core/patterns/forms), [Carbon: Empty states](https://www.carbondesignsystem.com/building-blocks/core/patterns/empty-states). Это основания для проверок, не гарантия безопасности сгенерированного кода.

## Дополнительно найдено независимым ревью

| Проблема | Исправление | Статус |
|---|---|---|
| Кнопка закрытия переносилась по буквам | Несжимаемая кнопка шапки диалога | проверено на финальном образе: Chromium/WebKit; независимое визуальное ревью |
| Пустая панель действий у поставщика | Не выводить пустую панель; заголовок и обновление рядом | проверено на финальном образе: Chromium/WebKit; независимое визуальное ревью |
| Обрезанная вкладка профиля гида | Перенос мобильных вкладок без скрытых пунктов | проверено на финальном образе: Chromium/WebKit; независимое визуальное ревью |
| Неочевидный переход в редактор | Кнопка «Редактировать» в карточке | проверено на финальном образе: Chromium/WebKit; независимое визуальное ревью |
| Разорванная пара количества участников | Отдельная группа «от / до» | проверено на финальном образе: Chromium/WebKit; независимое визуальное ревью |
| Пустое расписание услуги | Пустое состояние и добавление времени внутри диалога | проверено на финальном образе: Chromium/WebKit; независимое визуальное ревью |
| Начисление по внутреннему UUID | Поиск по номеру BT и выбор завершённой заявки | проверено на финальном образе: Chromium/WebKit; независимое визуальное ревью |
| Технические названия в CRM | Заголовки экскурсий из переводов, включая заявки снятых с публикации программ | проверено на финальном образе: Chromium/WebKit; независимое визуальное ревью |
| Растянутая воронка отчёта | Компактная группа статусов | проверено на финальном образе: Chromium/WebKit; независимое визуальное ревью |
| Кнопка создания услуги исчезла после скрытия пустой панели | Раздельные условия прав для панели заявок и панели услуг | проверено J39: создание, изменение цены, добавление времени |
| Адрес вкладки менялся без содержимого | Использовать поддерживаемое Next обновление истории; проверять выбранную вкладку | проверено J09, J37, J39 и визуальным обходом Chromium |
| Статусы отзывов выходили за край в WebKit | Перенос элементов переключателя и общий размер текста | проверено на финальном образе: Chromium/WebKit; независимое визуальное ревью |
| Названия экскурсии и гида сжаты в таблице планшета | Две колонки карточек на планшете; отдельная строка гида и дата без секунд | проверено на финальном образе: Chromium/WebKit; независимое визуальное ревью |
| Технические адреса в финансовых настройках и отчётах | Названия из переводов в селекторах, условиях возврата, отчёте и очереди отзывов | проверено на финальном образе: Chromium/WebKit; независимое визуальное ревью |
| Быстрый фокус мог пропустить отзыв прав | Событие во время запроса ставится в очередь; запрет по времени убран, частота загрузки данных сохранена | проверено: J45 и мобильный отзыв доступа в баллах, выплатах и аудите |

## Наблюдение при проверке опубликованного сайта

Один запуск WebKit не дождался перехода «Профиль → Email» за 5 секунд. Независимый повтор точного сценария и ещё 16 переходов прошли без повторного клика (точный сценарий — 83 мс, HTTP 200 — 19 мс). Причина исходного сбоя не установлена; объявлять его задержкой прокси или исправленным дефектом нельзя. Итоговый обход опубликованного сайта (63 состояния WebKit) прошёл. Таймаут сохранён, при следующем падении тест записывает клики, запросы и снимок. Это наблюдение сохраняется отдельно от исправленных замечаний.

## Проверка зависимостей после публикации UI

Аудит дополнительно обнаружил новые advisory в Handlebars, source-map-js и косвенной зависимости sharp. Исправленные версии закреплены для всего графа. Повторные проверки и оценка оставшихся двух moderate-записей Next — в [журнале зависимостей](../03-tech/dependency-hardening.md#проверка-18-октября-2026). Исключения ради зелёного результата не добавлены.

## Политика обновления

- Баллы: пять минут, только видимая вкладка; возврат на страницу отдельно проверяет права.
- Выплаты, начисления и аудит: минута; ручное обновление финансов оставлено для явной сверки после внешних действий.
- Профиль туриста: проверка доступа при возвращении, без перезаписи несохранённой формы; одновременные сигналы фокуса объединяются.
- Ожидание оплаты/возврата: десять секунд на видимой странице; возвращение из оплаты проверяет актуальный статус.
- Календарь: пятнадцать секунд только в ожидании синхронизации и на видимой вкладке.
- Очередь удаления данных: пятнадцать секунд во время обработки, минута без активных задач; скрытая вкладка не опрашивается.
- Контакты туриста у гида по-прежнему скрываются при уходе со страницы: это отдельное ограничение доступа к контактам, а не перезагрузка всего кабинета.

## Ранее полученные замечания (сохраняются)

| ID | Замечание | Постоянный критерий | Предыдущее исправление |
|---|---|---|---|
| HIST-01 | iPad, перегруженная шапка, нативно-синие кнопки | Адаптивная навигация, оформленные контролы в обеих темах | Проверять J31 и визуальным обходом |
| HIST-02 | Замена удачной светлой палитры при исправлении тёмной | Сохранять брендовые цвета; исправлять тему, контраст и системные контролы отдельно | Палитра сохранена |
| HIST-03 | Личный кабинет теряется среди разделов сайта | Отдельный заметный вход в кабинет | Отдельная кнопка шапки, QA-21 |
| HIST-04 | Огромные пустые обложки с эмодзи | Отсутствие фотографии не создаёт пустой декоративный экран | Исправлено ранее; visual-audit.html |
| HIST-05 | Табы туриста были якорями, Email терял навигацию | Смена содержимого без прокрутки, одна активная вкладка, общий каркас | J34 и QA-01 |
| HIST-06 | Названия кабинетов не соответствовали ролям | Кабинет оператора, гида и поставщика называются раздельно; общие меню последовательны | cabinets.html и обход шести ролей |
| HIST-07 | Основные действия прятались в аккордионах | Важное — видимыми кнопками; details только для дополнительных полей/справки | Текущий реестр EXC-02, TASK-01 |
| HIST-08 | Скучные карточки заказов и неудобные партнёрские QR | Заказ с понятным состоянием/датой/ценой; QR виден, отдельно копирование и скачивание | Карточки поездок и партнёра, QA-21 |
| HIST-09 | Недостаточное тестирование и неверные данные входа | Проверять реальные бизнес-сценарии и все роли; публиковать актуальные QA-данные | Изолированные journeys, PostgreSQL, ручная QA |
| HIST-10 | Разработка уезжала на другой домен | Рабочая версия — batumi.mdmatvey.com; план и QA — preview.mdmatvey.com | Новые тестовые публичные домены не создаются |

Подробности прошлой сессии сохранены в правилах UI/UX и прежних отчётах; этот реестр добавляет новые замечания, не заменяет их.

Проверка опубликованного плана выявила ещё один дефект: при 768 px длинная метка этапа выходила за карточку в WebKit. Метки теперь переносятся, карточки на планшете идут в две колонки, вводный блок — в одну; между абзацами добавлены интервалы. Статические страницы QA входят в визуальную проверку наряду с приложением.


## Повторное визуальное ревью: исправления после фактического просмотра

Код исправлений: `3d188e3`. Основной кандидат `e85901f5` просмотрен отдельно от исходного сайта. Последние изменения отдельно просмотрены на окончательном образе `22258ddc`: VIS-06, CF-01, WUX-08. Полный digest хранится в журнале. Доказательства: [журнал изображений](https://preview.mdmatvey.com/visual-review-results.json). В журнале захват, просмотр, частичная видимость и версия образа различаются.

| ID | Найдено и исправлено | Доказательство / статус |
|---|---|---|
| TP-U01 | Кнопка сохранения профиля соприкасалась с блоком конфиденциальности; был добавлен отступ | Проверка отступа не закрывала исходный вопрос о необходимости блока. Блок удалён целиком в TOUR-02 |
| TP-U02 | Защита входа описывала обязательность для другой роли; текст относится к текущей учётной записи | Проверено визуально в e859 |
| TP-U03 | В деталях заказа туриста отсутствовало название экскурсии | Проверено визуально в e859 |
| WUX-01 | Необязательный промокод вытеснял контакты; группы «Поездка» и «Турист», промокод ниже | Проверено визуально в e859; сохранение — journeys |
| WUX-02 | Текст политики 2FA чужой роли | Проверено визуально в e859 |
| WUX-03 | Длинный заголовок диалога накладывался на закрытие; отдельная область 44×44 | Проверено визуально в e859; дополнительно J46 |
| WUX-04 | Растянутый календарь; слоты сгруппированы по локальному дню, компактные строки | Проверено визуально в e859; два теста дат/сортировки |
| WUX-05 | Коды языков, секунды, склонение; читаемые названия, краткие даты, выбор языков | Проверено визуально в e859 |
| WUX-06 | Разреженные заявки поставщикам; единая панель действий, подписанные факты | Проверено визуально в e859 |
| WUX-07 | Из каталога нельзя заказать выбранную услугу; форма с выбранной услугой и датами | Проверено визуально в e859; нижняя часть диалога без дат дополнительно просмотрена на `22258ddc`, WebKit 390 в обеих темах |
| WUX-08 | В предложении программы оставались коды языков и тесные checkbox | Проверено визуально на окончательном образе `22258ddc` |
| VIS-01 | Большие промежутки в аудите; единая строка события и компактные фильтры | Проверено визуально в e859 |
| VIS-02 | Решение по заявке терялось; сводка и подтверждение первыми, остальные задачи во вкладках | Проверено визуально в e859; J03/J04/J05/J46 |
| VIS-03 | Предоплата занимала узкую длинную колонку; две колонки на широком экране, одна на телефоне | Проверено визуально в e859 |
| VIS-04 | Слипшиеся кнопки отчёта и текстовые показатели; группы и подписанные факты | Проверено визуально в e859; дополнительная находка CF-01 |
| VIS-05 | Пояснения и слипшиеся действия вытесняли начисления, выплаты, приватность | Проверено визуально в e859 |
| VIS-06 | Повторный просмотр выявил лишние интервалы заявки, перенос кнопок WebKit, нумерованные уведомления | Проверено визуально на окончательном образе `22258ddc` |
| CF-01 | Строки отчёта растягивались из-за вертикальных чисел; показатели в колонках | Проверено визуально на окончательном образе `22258ddc` |
| AC-01 | В админке не было видимого QR и копирования | Проверено визуально в e859; QR и состояние копирования |
| AC-02 | Целевая страница вводилась путём; выбор по названию, ручной путь дополнительным вариантом | Проверено визуально в e859; выбор, сброс, редактирование |
| AC-03 | Сохранение и preview CMS терялись в длинной форме; действия закреплены сверху | Проверено визуально в e859; начало, середина, низ, несохранённый preview |

### Честные границы проверки

- Прежние «309 состояний на движок» означали захват и автоматические проверки, а не просмотр каждого изображения. Они не доказывают завершённое визуальное ревью.
- Прочитаны реальные снимки и крупные фрагменты длинных страниц. Скрытый внутренним скроллом участок не считается просмотренным по наличию полного PNG.
- Непросмотренные дополнительные кадры сохранены как `not_reviewed`. Они не используются для закрытия исправлений. Это не список подтверждённых ошибок.
- Обзор e859 не объявляется обзором следующего образа. На окончательной версии отдельно проверяются последние изменения и опубликованный сайт.
- Физический iPad, экранная клавиатура, все ошибки внешних провайдеров и ручная приёмка владельца остаются вне этого прохода.
- Первое прохождение новых сценариев: 52/53. J05 остановился на неоднозначном селекторе подписи; исправлен на доступное имя контрола. Реальная форма, сохранение и повторная загрузка затем проверены. Таймауты и проверки результата не ослаблены.

### Итог окончательного образа

Образ `sha256:22258ddcf6b779a6b0cc30c9ee373fc251a13ceeb9e52e31d4547fb47f043a82` опубликован без пересборки. 346 юнит-проверок, 137 сценариев PostgreSQL; 53 пользовательских сценария завершились успешно. Первый запуск окончательного образа: 45 прошли, 8 получили отказ соединения после закрытия локального SSH-forward. На удалённом стенде приложение оставалось доступным (HTTP 200). После восстановления канала повторены только эти 8: все прошли. Причина закрытия SSH не установлена; исходный результат и попытки сохранены. Таймауты не увеличены.

Отдельные шесть мобильных финансовых и три BOG-теста из предыдущего отчёта в этом проходе не повторялись. Их прежний результат не переносится на новый образ. GitHub Actions по-прежнему не стартует из-за биллинга; [запуск с причиной отказа](https://github.com/mdmatvey/batumi-travel/actions/runs/39115214680).

PV-01: при просмотре опубликованного отчёта на 390 px обнаружено сжатие двух текстовых колонок. Мобильные строки перестроены в отдельные блоки, описания сокращены; версия после исправления открыта и прочитана на 390/768/1440 в WebKit. Первый экран отчёта сценариев и поиск J46 также проверены.

## Повторное замечание: «Конфиденциальность и данные»

| ID | Решение | Проверка | Статус |
| --- | --- | --- | --- |
| TOUR-02 | Полностью убрать из профиля туриста блок выгрузки JSON, связанное состояние и оформление. В профиле остаются контактные данные и сохранение. | Образ `23de0aaf`; 12 открытых и просмотренных снимков Chromium/WebKit, обе темы; переключение вкладок и черновик; [журнал](https://preview.mdmatvey.com/profile-cleanup-results.json) | опубликовано и проверено в этом объёме |

Прежнее закрытие TOUR-01 было ошибочным: экспорт остался под другим названием в аккордионе. Принцип: вопрос о необходимости раздела нельзя закрыть переименованием, скрытием или косметическими изменениями.
