Рефакторинг раздела Модерации
Пульт — внутренняя CMS Звука для музыкальной редакции; раздел «Модерация» — рабочее место модераторов, которые каждый день разбирают эпизоды подкастов, треки, плейлисты и профили на нарушение контент-политик.
Контекст
Раздел «Модерация» никогда не проектировал дизайнер — он собрался из отдельных задач разработки без единой логики. К моменту аудита в очереди стояло больше 4 000 нерассмотренных решений и свыше 3 000 незакрытых конфликтов между модераторами, а часть проверок шла в обход Пульта — через Google-таблицы и сторонний сервис разметки изображений.
Роль и период
Product/UX-дизайнер, Q1 2026. Вёл раздел один от начала до конца — без исследователя, аналитика или второго дизайнера в процессе. Без готового брифа разобрался, как работает чужой раздел: провёл аудит с нуля. Договорился с модераторами об интервью и проводил их лично. Рисовал экраны и там же проверял их на живых модераторах перед передачей в разработку.
Задача
Понять, почему раздел с ежедневной нагрузкой в сотни решений на модератора ни разу не был спроектирован, и сделать редизайн, который вернёт всю эту работу — включая то, что уходило во внешние инструменты, — внутрь Пульта.
Масштаб
4 468
решений в очереди дашборда «Задания» на момент аудита — масштаб проблемы, с которого начался проект.
- 441
- профиль
- 390
- треков
- 129
- эпизодов
- 3 182
- конфликта
Аудит
Прежде чем что-то менять, задокументировал раздел как он есть. Карта раздела — реальная структура экранов и переходов на момент аудита:
Карта раздела
Реальная структура экранов и переходов на момент аудита: поиск разбит на пять типов контента, задачи — на семь очередей.
- Модерация
- Поиск контента
- Релизы
- Решение модератора
- Треки
- Решение модератора
- Подкасты
- Решение модератора
- Профили
- Решение модератора
- Плейлисты
- Решение модератора
- Релизы
- Задания
- Мои задачи
- Выбор типа контента
- Решение модератора
- Выбор типа контента
- Проверка плейлистов
- Добавить в мои задачи
- Проверка профилей
- Добавить в мои задачи
- Проверка треков
- Добавить в мои задачи
- Проверка эпизодов
- Добавить в мои задачи
- Проверка решений
- Решение модератора
- Разрешение конфликтов
- Решение модератора
- Мои задачи
- Разметка контента
- Отчеты
- Просмотр таблицы
- История решений
- Просмотр таблицы
- Настройки
- Качество
- Просмотр+ изменение
- Приоритеты
- Просмотр + изменение
- Стоп слова
- Создание, изменение, удаление вкл/выкл
- Политики
- Создание, изменение, удаление
- Качество
- Поиск контента
- Добавить в мои задачи
- Просмотр решений
Кроме карты — матрица ролей и прав (администратор / модератор / проверяющий / менеджер), карта сущностей и BPMN-процессы принятия решения по контенту и разбора конфликтов. Схемы ниже перерисованы в визуальном языке сайта: подписи и связи — как в исходниках:
Карта сущностей
Шесть сущностей раздела и их атрибуты: у релиза, подкаста и плейлиста есть вложенное содержимое.
- Сущности
- Релизы
- Название
- Обложка
- Содержимое (треки)
- Название
- Аудиодорожка
- Треки
- Название
- Обложка
- Текст
- Аудиозапись
- Подкасты
- Обложка
- Название
- Описание
- Автор
- Содержимое (эпизоды)
- Название
- Аудиодорожка
- Эпизоды
- Обложка
- Название
- Описание
- Автор
- Аудиозапись
- Текстовая расшифровка
- Плейлисты
- Название
- Описание
- Содержимое (треки)
- Название
- Аудиодорожка
- Профили
- Имя профиля
- Описание профиля
- Аватар профиля
- Релизы
Так же задокументированы два процесса раздела — проверка сущности и разбор конфликта:
Процесс модерации сущности
Процесс модерации контента, создания решения и проверки на конфликт.
Шаги схемы по порядку:
- Пользователь осуществил ввод фильтров по контенту, получил список и выбрал контент для проверки (1.1)
- Параллельно: проверка изображения и проверка сущности. Для пакетной сущности (релиз, подкаст, плейлист) проверяются наименования и аудиодорожки; при нарушениях создаётся задача на модерацию (1.3)
- Если в изображении выявлены нарушения, оно заменяется на изображение по умолчанию во внешних системах (1.2)
- Проверка атрибутов, не связанных с содержимым; создание решения и указание политик (1.4)
- Событие о факте модерации во внешних системах (1.5); для контента с признаком explicit — маркировка взрослого контента в Ingest (1.6)
- Проверка конфликтов с другими решениями (1.7): если решение уже есть, активно и отличается от текущего — создаётся конфликт, иначе отображается информация об уже существующем решении
Процесс разбора конфликта
Что происходит, когда по одной сущности создано два различных решения.
Шаги схемы по порядку:
- Был создан конфликт по результатам создания двух различных решений в рамках одной сущности
- Получить список конфликтов, открыть выбранный конфликт, провести модерацию сущности, указать модераторов, допустивших ошибки (2.1–2.2)
- Если нельзя обвинить одного или второго модератора в ошибке — указать этот факт и проставить флаг
- Иначе: если решение совпадает с одним из решений модераторов и оно признано корректным — далее; если нет — отобразить ошибку, и проверяющий исправляет решение по ошибкам модераторов (цикл)
- Если решение не совпадает ни с одним — указать корректные политики (только если оба не правы)
- Деактивировать старые решения (2.3), создать решение (1.4), выполнить расчёт веса ошибки модератора (2.4)
К ним — модель статусов решения: из неё видно, когда возникает конфликт, который разбирает второй процесс:
Статусная модель решений
Как созданное решение получает статус NEW, ACTIVE или REJECTED и когда возникает конфликт: когда по сущности уже есть решение и создаётся отличное от него.
Шаги схемы по порядку:
- Создано решение. Если решение уже существует — создаётся отличное от первого решение (NEW) и создаётся конфликт; если нет — решение становится активным (ACTIVE)
- После разрешения конфликта или отзыва решения оно деактивируется (REJECTED)
Интерфейс на момент аудита: отдельный экран поиска на каждый тип контента, чекбоксы вместо чипов, никакой дизайн-системы.


А раздел «Задания» — тот самый дашборд с очередью, с которого и считался реальный масштаб.

Исследования
Не ограничился опросником — сел рядом с модераторами и продукт-овнером модерации и смотрел вживую на экран, как они пропускают через себя сотни эпизодов и треков в день: как ищут мат по Ctrl+F и попадают не туда, как держат список стоп-слов в голове, потому что интерфейс их не помнит, как переслушивают спорные места на ускорении и как вместо разметки в Пульте открывают сторонний сервис в соседней вкладке.
Часть находок — не то, о чём модераторы рассказали бы сами: баг с молчаливым сбоем сохранения всплыл прямо на звонке, а нелогичную сортировку политик никто из модераторов не называл проблемой вслух — они просто к нему привыкли.
CJM
CJM по эпизодам и подкастам — по каждому элементу экрана (обложка, ID, автор, описание, рекомендация ИИ, score, стоп-слова, комментарий, текст эпизода, выбор политик, кнопки управления, счётчик, поиск, история решений) сведены цель, как работает сейчас, проблема, вопрос, идея и решение.
CJM по элементам экрана
Цель, как работает сейчас, проблема, вопрос, идея и решение — по каждому элементу карточки эпизода и подкаста. Из строк этой таблицы выросли все пять решений ниже.
| Аспект | Обложка | ID подкаста/эпизода | Автор | Название подкаста/эпизода | Описание | Рекомендация AI | Score | Слова | Комментарий | Решения | Текст эпизода | Выбор политик | Итог решения | Кнопки управления | Счётчик проверенного контента | Поиск контента | История решений |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Цель | Просмотр обложки с целью модерации Могут быть изображения, которые попадают под 18+ | Есть необходимость переходить по ID в звук, для того, чтобы просмотреть обложку или описание, проверить на наличие ссылок на запрещённые сервисы | Просмотр автора | Просмотр названия | Просмотр описания на наличие запрещённых ссылок, призывов и т. д. | Помощь в принятии решения на основе рекомендации AI | Оценка веса по стоп-словам | Просмотр стоп-слов, которые определил AI | Оставить комментарий | Вынести решение по контенту | Просмотр текста эпизода для проверки по стоп-словам | Выбор политики исходя из решения | Просмотреть итог решения, перепроверить себя | Сохранение решений или переход вперёд-назад | Видеть, какое количество контента осталось проверить либо проверил уже сегодня | Найти контент чтобы посмотреть решения или принять решение по контенту из списка жалоб | Просмотреть историю решений, чтобы перепроверить себя Или сравнить решения нескольких модераторов |
| Как сейчас | Маленькая обложка | Копируют ID и вставляют в поисковую строку | Обычный просмотр без необходимости перехода в звук Опытные модераторы могут определить, что подкаст “плохой” или “хороший” по автору | Обычный просмотр без необходимости перехода в звук | При наведении открывается всплывающее окно с текстом описания. | Практически не пользуются, не обращают особого внимания | Практически не пользуются, не обращают особого внимания Только сравнивают, у кого выпал больший score | Просмотр стоп-слов, далее проверка текста по этим словам. | Конкретно этим комментарием не пользуются. | Выбор одного решения, далее выбор политики, если на контент накладывается какое-либо ограничение (блок или эксплицит) | Пользуются поиском в браузере (Ctrl+F) по стоп-словам из списка в карточке Также могут использовать дополнительные слова исходя из собственного опыта | Открывается выпадающий список с множественным выбором | Видим только решение | Сохранение используется постоянно Кнопка назад практически не используется Назад используется редко в случае, если не хочется разбираться в сложных случаях | Сейчас нет | Из огромного списка фильтров и полей с поиском пользуются только полями с ID и UPC | Таблица со списком Открывается дровер с историей решения |
| Проблемы | Трудно рассмотреть контент на обложке Обложку приходится открывать изображение в новом окне и увеличивать Или переходить в звук и смотреть там | Замедляет время обработки контента, так как приходится открывать другую вкладку со звуком и менять данные ID в поисковой строке | нет данных | нет данных | Описание может быть очень длинным Прокрутки нет, текст не умещается в экран Ссылки некликабельные Приходится переходить в звук для проверки | нет данных | нет данных | нет данных | Непонятно, куда он уходит и зачем нужен Все комментарии проставляются в решении | Сейчас 5 решений 2 из них не используются | Окно с текстом очень маленькое. Его нельзя расширить, очень много приходится прокручивать Поиск в браузере ищет по всей странице, после закрытия попапа с текстом, часто оказываешься в другой части страницы Каждый раз закрывают попап, чтобы посмотреть список стоп-слов и скопировать их, потом снова открывают текст и поиск в браузере и так несколько раз. | В выпадающем списке указаны все имеющиеся политики, не сортируются в зависимости от решения Хочется вынести самые популярные наверх Неудобно каждый раз открывать выпадающий список и выбирать | Нет возможности посмотреть какие политики выбраны Приходится отменять решение и вводить политики заново. | Иногда происходит какой-то баг, и кнопка «Сохранить» остаётся неактивной Приходится обновлять страницу и заново проставлять решения с политиками | Модераторы не понимают, сколько единиц контента проверили. Используют обходной способ — скриншоты или перезагрузку окна — для подсчёта. | нет данных | Неочевидный и неудобный просмотр решений в случае когда их несколько |
| Вопросы | Можем ли открывать обложку в попапе в увеличенном виде? | В треках идентификаторы — это ссылки на звук В эпизодах подкастов почему нет? | нет данных | нет данных | нет данных | Может быть убрать? | Может быть убрать? | нет данных | Точно не нужен? может быть мы чего-то не знаем? | нет данных | Можем ли мы добавить в попап с текстом поиск и якорные ссылки на стоп-слова? | А можем на выбор политик навесить хоткеи? | Этот случай вроде уже прорабатывается? | Из-за чего такая ошибка может быть? | Сможем ли сделать такой счетчик? Кажется, не должно быть сложным, просто +10 при сохранении решений | Для чего нам столько полей? | нет данных |
| Идеи | Открывать обложку в пульте в увеличенном формате | Сделать ID кликабельными ссылками с переходом в звук | нет данных | нет данных | Переделать UI элемента. Добавить прокрутку и возможность переходить по ссылкам | Убрать малоиспользуемый элемент, избавимся от визуального шума | Убрать малоиспользуемый элемент, избавимся от визуального шума | нет данных | Убрать неиспользуемый элемент | Убрать лишние типы решений | Добавить список стоп-слов в попап с текстом Добавить поиск Добавить якорные ссылки на стоп-слова | Сортировать политики в зависимости от выбранного решения Отказаться от выпадающего списка, выводить сразу список политик с чекбоксами Хотим попробовать хоткеи | Дать возможность видеть политики, применённые к решению | Нужно понять причину и найти способы решения | Сделать счетчик с количеством проверенного контента | Убрать неиспользуемые поля и фильтры | Улучшить UX и UI раздела просмотра истории |
| Решения | Делаем и больше, и открываем | Делаем кликабельные ID | нет данных | нет данных | Переделываем | Убираем | Убираем | нет данных | Убрать неиспользуемый элемент | Убрать/скрыть | Пробуем-делаем | Отказаться от выпадающего списка, выводить сразу список политик с чекбоксами Хотим попробовать хоткеи | Дать возможность видеть политики, применённые к решению | нет данных | Делаем (нужен ещё бэкенд) | Лишнее убираем | Улучшить UX и UI раздела просмотра истории |
Находки
Аудит и CJM вскрыли структурные проблемы, а не только локальные раздражители:
- один и тот же экран «Задания» на одних сущностях показывал несколько карточек, на других — одну, без объяснения логики;
- набор кнопок действий менялся от сущности к сущности (одобрить / сохранить / сохранить моё решение) без видимой причины;
- интерфейс не показывал, какие решения взаимоисключающие, а решение по треку внутри релиза визуально читалось как решение по всему релизу;
- один и тот же паттерн — попап поверх дровера — на разных экранах конфликтовал сам с собой;
- разметку контента и фильтры поиска нужно было пересобрать заново, а не точечно поправить;
- поиск на каждый тип контента был отдельным экраном вместо одного с переключателем — и это же подтверждала CJM-строка «Поиск контента».
Поверх системных находок — конкретные разрывы UX из интервью с модераторами:
- поиск (Ctrl+F) искал по всей странице вместо текста конкретного эпизода и перекидывал на соседние карточки;
- список политик не был отсортирован по частоте, и самые частые (безопасность несовершеннолетних, пропаганда ЛГБТ, пропаганда наркотиков, антироссийская пропаганда) стояли ниже редких;
- нельзя было посмотреть уже выставленные в решении политики, не сбрасывая его;
- не было счётчика обработанного контента и хоткеев на сохранение и выбор политик;
- сохранение решения иногда молча не срабатывало и требовало перезагрузки страницы.
Часть идей по скорости и мотивации команды сверил с тем, как это решено во внешнем сервисе разметки, которым модераторы пользовались в обход Пульта.
Решения
Каждое решение — по одной схеме: находка из аудита и интервью → что сделано в макетах → почему.
Единый экран поиска вместо пяти
Поиск на каждый тип контента был отдельным экраном — пять разных экранов. · аудит; CJM «Поиск контента»
Единый экран поиска контента с вкладками по типу: треки, релизы, эпизоды, подкасты, профили.
Из длинного списка фильтров модераторы пользовались только полями с ID и UPC — лишние поля и фильтры решили убрать, а вместо пяти форм оставить один экран с переключателем.
Карточка эпизода как основной рабочий экран
Набор кнопок менялся от сущности к сущности без причины; интерфейс не показывал, какие решения взаимоисключающие; не было счётчика обработанного контента; уже выставленные политики нельзя было посмотреть, не сбросив решение. · CJM «Решения», «Счётчик проверенного контента», «Итог решения»
Счётчик «Проверено сегодня» сразу в шапке, стоп-слова и описание над плеером, решение — переключателем Approved / Blocked / Explicit вместо чекбоксов, политики — отдельными чипами с быстрым переходом к редактированию.
Два из пяти типов решений не использовались — в CJM их предложили убрать или скрыть, поэтому в переключателе осталось три.
Политики: хоткеи вместо кликов
Список политик не отсортирован по частоте: самые частые стоят ниже редких. Хоткеев на сохранение и выбор политики нет, а модератор разбирает сотни решений в день. · CJM «Выбор политик»; интервью
Список политик вынесен в отдельный дровер с нумерованными хоткеями 1–9 и 0 — по одной цифре на политику — и сохранением по Enter вместо клика мышкой по каждому пункту.
Выпадающий список приходилось открывать заново на каждое решение, а политики в нём не сортировались в зависимости от решения. В CJM это привело к идее убрать выпадающий список и попробовать хоткеи.
Поиск внутри текста эпизода
Ctrl+F искал по всей странице, а не по тексту конкретного эпизода, и перекидывал на соседние карточки. Модераторы ищут мат и стоп-слова вручную. · CJM «Текст эпизода»; наблюдение за модераторами
Поиск внутри самой панели текста: найденное слово подсвечивается, есть счётчик совпадений и переход между ними стрелками — модератор не теряет место на странице.
Чтобы сверить стоп-слова, окно с текстом приходилось закрывать и открывать заново, — в CJM отсюда идея встроить поиск и список стоп-слов в само окно.
Обложка подкаста на полный экран
Чтобы рассмотреть обложку, модераторы переходили на основной сайт по ID — об этом просили в интервью. · CJM «Обложка»; интервью
Обложку подкаста можно раскрыть в полный размер прямо на экране модерации.
На обложке могут быть изображения 18+, а маленькую обложку трудно рассмотреть: её открывали в новом окне и увеличивали или переходили в звук.
Результат
Раздел вернулся из Google-таблиц и стороннего сервиса разметки внутрь Пульта — единая рабочая поверхность для очереди проверки контента.
Все решения — единый экран поиска, карточка с переключателем Approved / Blocked / Explicit, дровер политик с хоткеями, поиск внутри текста — сделаны не только для эпизодов. В макетах показан эпизод как самый сложный случай (плеер, текст, стоп-слова), но те же паттерны отмасштабированы на треки, релизы, подкасты, плейлисты и профили — это часть той же работы, а не отдельная задача на потом.
Структурные несоответствия — разное число сущностей на экране, разный набор кнопок, конфликт попап/дровер, пять отдельных экранов поиска вместо одного — устранены на уровне паттернов интерфейса, а не точечными правками по каждой жалобе.
Хоткеи на политики, счётчик обработанного контента и поиск внутри текста эпизода, которых не хватало по интервью, реализованы как часть основного сценария, а не как отдельная доработка.
Перед передачей в разработку провёл финальное тестирование макетов с 5 модераторами по контрольным сценариям на всех типах контента — по итогам поправил экраны релизов и подкастов по возникшим корнеркейсам, которые не были обнаружены при первоначальном интервью.




