Все 450 задач подряд, каждая с обоснованием, содержанием
работы, проверяемым критерием готовности, зависимостями, оценкой, процедурой
приёмки и риском. Ничего не свёрнуто и не подгружается — поиск браузером
находит любую задачу, печать даёт полный документ.
Задач
450
Фаз и треков
10
На критическом пути
83
Человеко-недель
2681
Направлений работ
18
Под фильтры ничего не подошло.
Фаза 0
Фундамент
Месяцы
1–3
Календарь
сен–ноя 2026
Команда
6 чел.
Индекс
1 млн
Бюджет
7.8 млн ₽
Задач
23
Недель работ
51
Доказать, что связка «свой обход → свой индекс → своё ранжирование» сходится по качеству на малом масштабе, и параллельно поставить площадку, без которой бота не пустят в веб. Всё написанное здесь будет переписано: цель фазы — не код, а снятие неопределённости.
Обработкакритический путь1 ML + 1 инфраструктура2 нед.
Зачем
Обходить веб с нуля ради проверки гипотезы — это месяцы. Common Crawl отдаёт более 2 млрд страниц в каждом месячном срезе бесплатно, и из него за две недели получается корпус, на котором проверяется всё остальное.
Что делаем
Скачиваем индекс последнего среза, около 250 ГБ в сжатом виде.
Фильтруем по зонам .ru, .рф, .su, .by, .kz и по определённому языку.
Выкачиваем WARC-сегменты только для отобранных URL, а не весь срез.
Складываем в объектное хранилище, ведём учёт: сколько документов, сколько байт, сколько стоило.
Готово, когда
5 млн русскоязычных документов лежат в WARC в объектном хранилище, есть таблица «домен → число документов», известна фактическая стоимость обработки.
Как проверяем
Случайная выборка 100 документов открывается и читается — это действительно русскоязычные страницы, а не мусор и не дубликаты.
Риск
Обработка обойдётся дороже ожидаемого из-за исходящего трафика. Обрабатываем в том же облаке, где лежат данные; считаем счёт на первой неделе, а не в конце.
Всё качество поиска стоит на качестве извлечённого текста. Если мы индексируем навигацию и подвалы вместо содержания, никакое ранжирование не спасёт, а ошибку на этом шаге не видно до самого конца.
Что делаем
Прогоняем Resiliparse и Trafilatura на одной выборке в 1000 документов.
Вручную размечаем эталон: для каждого документа человек отмечает, какой текст является основным.
Считаем точность, полноту и F1 для обеих библиотек и для их комбинации.
Отдельно смотрим типы страниц, где обе ошибаются: форумы, каталоги, лендинги.
Фиксируем конфигурацию: что запускаем на всём корпусе, что на кандидатах.
Готово, когда
Есть отчёт с числами по обеим библиотекам и выбранная конфигурация с обоснованием.
Как проверяем
F1 выбранной конфигурации на русскоязычной выборке не ниже 0.80. Публичные бенчмарки дают Trafilatura около 0.859, но они на англоязычных данных — для рунета цифру нужно получить свою.
Риск
Качество на рунете окажется заметно ниже заявленного. Проверка идёт на неделе 3, до всех остальных решений, и есть запас времени на доработку правил.
Индекс и поисккритический путь2 backend3 нед.зависит от 0.2
Зачем
Проверить, что выбранное ядро действительно даёт нужную скорость и поддерживает нужную схему полей, до того как на нём построено всё остальное.
Что делаем
Схема документа по разделу 4.5 документа об обходе и индексации: заголовок, словоформы, леммы, хост, язык, дата, быстрые поля под авторитет, качество и спам.
Токенизаторы: словоформы и леммы отдельными полями. Морфология пока грубая, полноценная придёт в фазе 1.
Индексация 1 млн документов, замер скорости и размера.
Поиск в консоли: разбор простого запроса, выдача топ-10 с оценками.
Прямой индекс для сниппетов в простейшем виде, без сжатия.
Готово, когда
Поиск по 1 млн документов работает в консоли, p95 не выше 200 мс на одной машине, размер индекса измерен и записан.
Как проверяем
50 контрольных запросов отрабатывают за отведённое время; размер индекса на документ сверяется с расчётом — ориентир около 6 КБ горячих данных.
Риск
Схема окажется неудобной для будущих признаков. В фазе 0 это не страшно: индекс пересобирается за часы.
Получить первую осмысленную формулу ранжирования и точку отсчёта, относительно которой измеряется всё дальнейшее улучшение.
Что делаем
Реализуем BM25F так, чтобы взвешенная частота собиралась по всем полям до применения насыщения — именно это отличает BM25F от суммы независимых BM25 по полям.
Стартовые веса: заголовок 8.0, якорные тексты 6.0, подзаголовки 3.0, адрес 2.5, словоформы 1.5, леммы 1.0.
Ручная настройка на 50 запросах: смотрим глазами, двигаем веса.
Фиксируем конфигурацию в файле, а не в коде — она будет меняться постоянно.
Готово, когда
Формула считается, веса вынесены в конфигурацию, есть baseline-замер.
Как проверяем
На 50 запросах вручную: результат с точным вхождением в заголовке стоит выше результата с вхождением только в тексте.
Авторитет хоста — второй по важности сигнал после текстовой релевантности. Без него в топе оказываются сайты, где слова запроса встречаются чаще, а не те, которым можно доверять.
Что делаем
Извлекаем рёбра из обойденного корпуса, строим хостовый и страничный граф.
PageRank с затуханием 0.85, итеративно до сходимости.
Ядро доверия: вручную отбираем 500 хостов — государственные ресурсы, вузы, крупные СМИ, известные энциклопедии, отраслевые авторитеты. В фазе 1 ядро расширится до 10 000.
TrustRank: распространение доверия из ядра с затуханием.
Выгрузка значений в таблицу признаков для индекса.
Готово, когда
Для каждого хоста в корпусе есть значения PageRank, авторитета хоста и TrustRank, и они подмешиваются в ранжирование.
Как проверяем
Ручная проверка топ-100 хостов по авторитету: там должны быть узнаваемые крупные ресурсы, а не сетки дорвеев. Незнакомый домен в топ-50 разбирается отдельно — это либо находка, либо ошибка.
Обходкритический путь1 backend4 нед.зависит от 0.1
Зачем
Собственный обход — один из трёх обязательных активов. Проверить нужно не производительность, её проверим в фазе 1, а корректность: соблюдение robots.txt, вежливость, устойчивость к ошибкам.
Что делаем
Разбор robots.txt строго по RFC 9309 со сверкой поведения с открытой реализацией Google.
Двухуровневые очереди фронтира: передние по приоритету, задние по хостам с меткой времени следующего разрешённого запроса.
Политика вежливости: 1 запрос в секунду на хост, не более 2 соединений.
Загрузка, запись в WARC, обработка редиректов и ошибок.
Свой DNS-кэш: на будущих скоростях системный резолвер станет узким местом.
Готово, когда
Краулер обходит 100 сайтов со скоростью 10 стр/с, соблюдая все ограничения, и складывает результат в WARC.
Как проверяем
Набор из 30 синтетических robots.txt с крайними случаями — поведение совпадает с эталонной реализацией во всех случаях без исключения. Логи 100 обойденных сайтов: ни к одному не было больше одного запроса в секунду. Ни одной жалобы от владельцев сайтов за время теста.
Риск
Неверная трактовка robots.txt приведёт к обходу закрытых разделов — репутационный риск, который трудно исправить. Три места, где ошибаются чаще всего: выигрывает самое длинное совпадение пути, а не первое встреченное; Allow побеждает Disallow при равной длине; ответ 404 означает разрешено всё, а 5xx — запрещено всё временно. Сверка с эталоном обязательна и входит в критерий готовности.
Обходкритический путьинфраструктура + фронтенд2 нед.зависит от 0.14
Зачем
Вебмастер, увидевший в логах неизвестного бота, ищет его имя в поиске. Если он не находит объяснения, он его банит. Забаненный бот означает пустой индекс, а вернуть доверие после массовых банов гораздо дороже, чем изначально всё объяснить.
Что делаем
Страница /bot: кто мы, зачем ходим, какой User-Agent, с какой частотой.
Публикация диапазонов IP краулера в машиночитаемом виде по фиксированному адресу.
Инструкция, как ограничить или запретить обход через robots.txt.
Контакт для жалоб с обязательством отвечать в течение суток.
Инструмент проверки: по IP сказать, наш это бот или подделка.
Готово, когда
Страница опубликована до первого внешнего запроса краулера. Условие блокирующее: пока страницы нет, краулер не выходит за пределы тестовых доменов.
Как проверяем
Страница открывается даже при недоступности приложения — отдаётся статикой напрямую из веб-сервера.
Обходкритический путьинфраструктура2 нед.зависит от 0.13
Зачем
Вебмастер должен уметь отличить настоящего бота от подделки. Без этого любой спамер может представиться нашим ботом, а репутацию за чужие действия получим мы.
Что делаем
Заказываем PTR-записи в поддержке провайдера для всех IP краулера.
Настраиваем прямые записи на те же адреса.
Документируем процедуру двусторонней проверки.
Готово, когда
Двусторонняя проверка «адрес → имя → адрес» проходит для всех IP краулера.
Как проверяем
Для каждого адреса из публикуемого диапазона: обратный запрос даёт имя в нашей зоне, прямой запрос по этому имени возвращает исходный адрес. Проверка автоматическая и повторяется при КАЖДОМ изменении диапазона: адрес, добавленный без записи, означает, что вебмастер примет нашего бота за подделку и заблокирует его вместе с настоящим.
Риск
Провайдер долго оформляет PTR. Заявка подаётся на неделе 5, запас три недели.
Качествокритический путь1 ML + 5 асессоров4 нед.зависит от 0.4
Зачем
Без асессорских оценок качество поиска — вопрос вкуса. С ними — число, которое можно двигать. Это самая недооценённая задача фазы: её постоянно откладывают, а потом месяцами «улучшают поиск» без возможности проверить, стало ли лучше.
Что делаем
Отбираем 300 запросов: 200 случайных по частотности, 60 сложных многословных и неоднозначных, 40 навигационных с известным правильным ответом.
Пишем инструкцию асессора — первую версию на 10–15 страниц: шкала оценок, разбор пограничных случаев, примеры.
Нанимаем 5 асессоров по договору на 3 недели, обучаем по инструкции.
Для каждого запроса оцениваем топ-20 нашей выдачи и топ-10 конкурентов — последнее нужно для сравнения, а не для копирования.
Качествокритический путьтехнический лидер + ML2 нед.зависит от 0.8, 0.9
Зачем
Главный результат фазы 0 — не код, а честное понимание, где мы находимся. Отчёт нужен и команде, и инвестору, и он должен быть неприятным, если реальность неприятна.
Что делаем
Прогоняем корзину, считаем pFound для нашей выдачи и для выдачи конкурентов.
Разбираем 30 запросов с наибольшим разрывом и классифицируем причины: нет документа в индексе, документ есть но не находится, находится но низко.
Считаем, какая доля разрыва объясняется полнотой индекса, а какая ранжированием — это ключевое разделение: первое лечится обходом, второе моделями.
Пишем отчёт: где мы, почему, что делать в фазе 1.
Готово, когда
Отчёт написан, обсуждён, решение по фазе 1 принято.
Как проверяем
Отчёт содержит числа, а не оценки. Формулировка «выдача выглядит неплохо» в отчёт не попадает.
Домен — первый актив проекта. Он должен отстояться в DNS и быть оформлен правильно с самого начала: перенос с физического лица на юридическое позже происходит с задержкой и риском.
Что делаем
Регистрируем yottis.ru в Timeweb как у аккредитованного регистратора.
Одновременно берём защитные yottis.рф и yottis.com.
Включаем автопродление и запрет на смену владельца без подтверждения.
Оформляем на юридическое лицо.
Готово, когда
Три домена во владении, автопродление включено.
Как проверяем
Запрос whois показывает верного владельца и дату продления.
Риск
Домен занят. Проверка в первый день; запасные варианты подготовлены заранее.
Инфраструктураинфраструктура1 нед.зависит от 0.11, 0.12
Зачем
Без корректных записей не работает ничего: ни сайт, ни почта, ни выпуск сертификатов.
Что делаем
Делегирование на серверы имён Timeweb.
Записи A и AAAA на VPS — IPv6 обязателен, часть сетей уже без IPv4.
CNAME для www, записи A для поддоменов кабинета, API и бота.
Запись CAA с запретом выпуска сертификатов другими удостоверяющими центрами.
Записи SPF и DMARC.
TTL 300 на боевых записях: переключение при аварии за 5 минут, а не за сутки.
Готово, когда
Запросы к DNS возвращают верные ответы по всем записям.
Как проверяем
Каждая запись проверяется с нескольких резолверов ВНЕ нашей сети — публичных и сервера в другой стране: ответы совпадают между собой и с ожидаемыми значениями. Отдельно проверяется запись CAA (запрос возвращает запрет для чужих удостоверяющих центров) и фактический TTL на боевых записях. Запись SPF проверяется дважды: при настройке и в день запуска почты — -all при работающей почте это авария, а не конфигурация.
Риск
Запись v=spf1 -all означает, что домен не отправляет почту вообще. В момент запуска почты её обязательно заменить, иначе собственные письма будут отвергаться — это ровно та ошибка, которая обнаруживается на третий день, когда пользователи уже не получили коды подтверждения.
Инфраструктурафронтенд + инфраструктура2 нед.зависит от 0.14, 0.9
Зачем
Проект должен быть виден снаружи до того, как понадобится доверие: вебмастера, кандидаты и партнёры будут искать, кто мы такие.
Что делаем
Страница проекта: что строим, статус, контакты.
Макеты по адресу /demo.
Свой robots.txt — мы тоже сайт.
Готово, когда
Страницы открываются, демо работает.
Как проверяем
Все адреса витрины открываются с холодного кеша, включая /demo; проверка с мобильного устройства и на медленном канале, а не только с рабочей машины. Свой robots.txt отдаётся с кодом 200 и разрешает индексацию витрины — закрытая от индексации витрина не выполняет своей единственной задачи.
Страницы выдачи в чужом индексе — это бесконечное пространство адресов и мусор. Это ещё и правило приличия между поисковыми системами: индексировать чужую выдачу не принято, и мы не создаём такой возможности у себя.
Что делаем
Запрет обхода страниц выдачи, личных кабинетов и админки в robots.txt.
Мета-тег noindex на самих страницах выдачи: robots.txt запрещает обход, но не гарантирует отсутствие в индексе при наличии внешних ссылок.
Sitemap с документацией и инструментами.
Готово, когда
Индексируется то, что нужно; выдача закрыта двумя способами.
Как проверяем
Выдача закрыта двумя независимыми способами, и проверяются оба: Disallow в robots.txt и мета-тег noindex на самих страницах. Карта сайта не содержит ни одного закрытого адреса — расхождение между картой и robots.txt считается ошибкой сборки. Через неделю после публикации панели вебмастера не показывают страниц выдачи в индексе.
Без панелей вебмастера мы не видим, как нас индексируют конкуренты, и узнаём о проблемах последними.
Что делаем
Подтверждение прав в Яндекс.Вебмастере.
Подтверждение прав в Google Search Console.
Загрузка карты сайта в обе панели.
Готово, когда
Обе панели подключены и показывают данные.
Как проверяем
Обе панели показывают непустые данные по обходу и индексации, в каждой настроено уведомление об ошибках на общий адрес команды. Повторная проверка через неделю: данные накапливаются, а не остаются нулевыми — нулевые обычно означают неподтверждённое владение, а не отсутствие проблем.
Разметка сегодня — это не про красивый сниппет, а про однозначность: кто мы, что предлагаем, где работаем. Она же стала основным способом, которым языковые модели проверяют факты о сущности.
Что делаем
Разметка Organization на главной: название, логотип, контакты.
Разметка WebSite с описанием поиска по сайту.
Проверка валидатором.
Готово, когда
Разметка на главной проходит валидацию без ошибок.
Как проверяем
Валидатор структурированных данных не выдаёт ни ошибок, ни предупреждений на главной. Отдельно поля организации сверяются с тем, что написано на странице «О проекте»: расхождение разметки и видимого текста считается ошибкой, а не мелочью — именно на таких расхождениях разметку и перестают учитывать.
Ворота фазы 0
Все критерии обязательны. Не пройдены — фаза продлевается,
а не закрывается.
Поиск по 1 млн документов работает, p95 не выше 200 мс на одной машине
pFound@10 не ниже 0.35 на корзине из 300 запросов
F1 извлечения текста не ниже 0.80 на русскоязычной выборке
Краулер прошёл 100 сайтов без единого нарушения robots.txt
Каппа Коэна между асессорами не ниже 0.5
Сайт открывается по HTTPS, внешняя оценка не ниже A, демо доступно
Страница о боте опубликована, обратный DNS проверен в обе стороны
Выкатка одной командой из Repobase, откат проверен на практике
Бэкап восстановлен на отдельной машине
Отчёт о разрыве в качестве написан, с разделением на полноту и ранжирование
Фаза 1
Ядро
Месяцы
4–10
Календарь
дек 2026 – июн 2027
Команда
14 чел.
Индекс
50 млн
Бюджет
59.5 млн ₽
Задач
67
Недель работ
243
Превратить прототип в систему: распределённый индекс, непрерывный обход, кабинет вебмастера, аккаунты, закрытая альфа на 1000 пользователей. Главное отличие от фазы 0 — теперь код пишется надолго: схемы данных, контракты между сервисами и формат индекса, заложенные здесь, будут жить годами.
Обходкритический путь2 backend6 нед.зависит от 0.5
Зачем
Прототип держит очередь в памяти и теряет её при перезапуске. На 50 млн документов очередь — это десятки миллионов адресов, которые нельзя терять: их повторное открытие означает повторный обход всего.
Что делаем
Персистентное хранилище очереди с восстановлением после перезапуска.
Двухуровневая схема: передние очереди по приоритету — критично, высокий, обычный, хвост; задние очереди по одной на хост с меткой времени следующего разрешённого запроса.
Формула приоритета: авторитет хоста, прогноз изменения, спрос на свежесть в теме, сигнал из выдачи, подсказки вебмастера, штрафы за недоступность и за спам.
Метрики: длина очереди, лаг, распределение по приоритетам, доля отброшенных.
Готово, когда
Фронтир держит 50 млн адресов, переживает перезапуск без потерь, приоритеты измеримо влияют на порядок обхода.
Как проверяем
Убиваем процесс на полной очереди — после перезапуска очередь восстановлена, порядок сохранён, потерь нет.
Риск
Очередь станет узким местом по записи. Смягчение — батчинг записей и раздельные хранилища для передних и задних очередей.
Обходкритический путь1 backend + 1 ML4 нед.зависит от 1.1
Зачем
При индексе в 2 млрд документов и среднем интервале переобхода 14 суток нужно 1650 страниц в секунду только на поддержание свежести, до всякого роста. Переобход доминирует над первичным обходом, и без прогноза основной ресурс уходит на страницы, которые не меняются годами.
Что делаем
Для каждого адреса храним ряд отпечатков содержимого и времён обхода.
Экспоненциальное сглаживание интервалов между реальными изменениями.
Расписание по непрерывной шкале: страница без изменений за год переобходится раз в месяц, лента новостей — раз в минуту.
Отдельная обработка случая «сначала неизвестно»: новый адрес обходится через сутки, затем интервал уточняется.
Готово, когда
Средний интервал переобхода подстраивается под реальную частоту изменений документа.
Как проверяем
На выборке 10 000 адресов с известной историей доля переобходов, не давших изменений, ниже 40% против 75% при фиксированном расписании.
Ответ «не изменилось» стоит нам почти ничего и экономит трафик сайта. Это одновременно вежливость и деньги: при 10 000 страниц в секунду разница в разы.
Что делаем
Храним время последнего изменения и метку версии для каждого документа.
Отправляем условные заголовки при каждом переобходе.
Корректно обрабатываем ответ «не изменилось», не перезаписывая документ.
Готово, когда
Доля ответов «не изменилось» при переобходе не ниже 40%.
Как проверяем
Метрика доли таких ответов на панели обхода, разбивка по хостам.
Половина современного веба без выполнения скриптов отдаёт пустой контейнер. Но рендеринг стоит в 50–100 раз дороже простой загрузки, поэтому применяется выборочно и по жёсткой квоте.
Что делаем
Пул headless-браузеров с блокировкой изображений, шрифтов, медиа и рекламы.
Эвристика необходимости: доля видимого текста в объёме разметки ниже 5%, маркеры одностраничного приложения, хост в списке известных, страница ранее показывалась в выдаче.
Самообучающаяся экономия: если прирост текста после рендеринга меньше 20%, хост помечается как не требующий рендера на 30 дней.
Жёсткая квота не более 8% обходимых страниц; при превышении приоритет отдаётся страницам с ненулевым сигналом из выдачи.
Готово, когда
Рендеринг работает, доля не превышает 8%, список «рендер не нужен» пополняется автоматически.
Как проверяем
На выборке 1000 страниц одностраничных приложений рендеринг даёт содержательный текст там, где без него была пустая страница.
Риск
Пул браузеров течёт по памяти. Смягчение — перезапуск процесса каждые N страниц и жёсткий лимит памяти на процесс.
Продолжение задачи фазы 0. Теперь бот выходит в веб по-настоящему, и вебмастера должны иметь техническую возможность его проверить, а не верить на слово.
Что делаем
Машиночитаемый список диапазонов IP по фиксированному адресу, обновляемый при изменении парка.
Прототип обрабатывает документы по одному. На 300 страницах в секунду нужен конвейер с параллелизмом, устойчивостью к ошибкам и наблюдаемостью.
Что делаем
Двенадцать шагов обработки в потоковом режиме: определение типа, разбор, удаление обвязки, язык, заголовки, структурные данные, ссылки, каноникализация, отпечаток, пассажи, морфология, классификаторы.
Изоляция сбоев: падение на одном документе не роняет пачку.
Метрики по каждому шагу: пропускная способность, доля ошибок, время.
Готово, когда
300 документов в секунду на узел, ошибки изолированы и посчитаны.
Как проверяем
Прогон 1 млн документов без остановки, доля необработанных ниже 0.5%.
Один и тот же документ, доступный по пяти адресам, попадёт в индекс пять раз и будет пять раз конкурировать в выдаче сам с собой.
Что делаем
Строгий порядок шагов: регистр схемы и хоста, порт по умолчанию, префикс www, декодирование экранированных символов, нормализация пути, сортировка параметров и удаление трекинговых, удаление фрагмента.
Применение канонического адреса, объявленного страницей.
Кросс-хостовые канонические адреса принимаются только для пар доменов, подтверждённых в кабинете вебмастера: указание канонического адреса на чужой хост — распространённый приём угона трафика.
Хеш канонического адреса как идентификатор документа.
Готово, когда
Пять вариантов записи одного адреса дают один идентификатор документа.
Как проверяем
Набор из 200 пар «разный адрес — один документ» схлопывается верно, набор из 50 пар «похожие адреса — разные документы» не схлопывается.
Веб полон копий: перепечатки, зеркала, версии для печати. Без дедупликации первая страница выдачи может состоять из одного текста в пяти видах.
Что делаем
SimHash на 64 бита по трёхсловным шинглам.
Порог: расстояние Хэмминга не более 3 бит.
Поиск кандидатов через разбиение отпечатка на четыре блока по 16 бит с индексацией по каждому — при расстоянии не более трёх хотя бы один блок совпадает точно.
Дубли группируются, а не удаляются: в выдаче показывается представитель группы, остальные доступны по ссылке.
Готово, когда
Группы дублей строятся, представитель выбирается по авторитету хоста, при равенстве — по времени первого обхода, что даёт заодно сигнал первоисточника.
Как проверяем
На размеченной выборке из 5000 пар точность не ниже 0.95, полнота не ниже 0.85.
Русский язык без лемматизации в поиске не работает: падежная система даёт до двенадцати форм на существительное, и запрос «купить холодильник» обязан находить документ про покупку холодильников. Но искать только по леммам тоже нельзя — теряются точные цитаты и имена собственные.
Что делаем
Полная морфология на индексации через словарный анализатор и нейросетевой разбор.
Быстрый стемминг там, где полная морфология избыточна.
Два поля в индексе: словоформы и леммы, с разными весами в формуле.
Обработка омонимии: при неоднозначности индексируем оба варианта.
Готово, когда
Оба поля индексируются, запрос находит документ в другой падежной форме, точная фраза в кавычках по-прежнему работает дословно.
Как проверяем
Набор из 300 пар «запрос — документ в другой форме» находится; набор из 100 точных цитат находится дословно.
Язык нужен для выбора обработки и для фильтра выдачи, регион — для локальных запросов. Ошибка здесь портит и то, и другое.
Что делаем
Определение языка с оценкой уверенности, отдельная обработка многоязычных страниц.
Определение региона по доменной зоне, языку, адресам и телефонам в тексте, расположению хостинга.
Пометка «регион не определён» как отдельное состояние, а не подстановка страны по умолчанию.
Готово, когда
Язык определяется с точностью не ниже 0.97 на контрольной выборке, регион проставлен там, где он определим, а доля ОШИБОЧНЫХ определений (в отличие от отказов) не выше 0.01.
Как проверяем
Размеченная выборка из 2000 документов, замер точности по каждому языку отдельно. Отдельно — доля отказов против доли ошибок: система, отказывающаяся в 10% случаев и не ошибающаяся, лучше системы с точностью 0.97 и 3% молчаливых ошибок.
Это сырьё для колдунщиков, расширенных сниппетов и будущей панели знаний. Собирать его позже означает переобход всего корпуса.
Что делаем
Разбор JSON-LD, микроданных, RDFa и OpenGraph.
Приоритет типов: статья, товар, организация, хлебные крошки, вопросы и ответы, рецепт, событие, видео.
Валидация: битая разметка не должна ронять обработку документа.
Журнал ошибок разметки для показа в кабинете вебмастера.
Готово, когда
Разметка извлекается, ошибки логируются и доступны владельцу сайта, а битая разметка НЕ приводит к потере документа: страница индексируется как обычная, просто без разметки.
Как проверяем
На выборке из 1000 страниц с известной разметкой извлекается не менее 95% объявленных типов. Отдельно — доля ложных записей в журнале ошибок: она обязана быть близка к нулю, иначе журнал не читают. Отдельно — прогон на страницах с намеренно испорченной разметкой: ни одна не теряется, а целые блоки не пропадают вместе с битым.
Индекс и поисккритический путь2 backend5 нед.зависит от 0.3
Зачем
50 млн документов ещё помещаются на несколько машин, но схема шардирования — решение на годы: менять её позже означает переиндексацию всего корпуса.
Что делаем
Ключ шардирования — хеш хоста, а не адреса. Это даёт три выигрыша: правило разнообразия сайтов применяется локально в шарде, хостовые признаки грузятся один раз, дедупликация внутри сайта не требует сети.
Вторичное расщепление: хосты, превысившие один процент размера шарда, шардируются по хешу от хоста и корзины адреса.
Реестр топологии шардов в системе координации.
Готово, когда
Индекс разложен по трём шардам, перекос между ними не превышает 15%, ключ шардирования устойчив между перезапусками, а число корзин расщеплённого хоста хранится в реестре и только растёт.
Как проверяем
Распределение документов по шардам и проверка, что крупные хосты действительно расщеплены. Отдельно — устойчивость ключа в отдельном процессе. Отдельно — добавление страницы к расщеплённому хосту не меняет шард ни одного из уже размещённых документов.
Риск
Перекос из-за гигантских сайтов. Вторичное расщепление закладывается сразу, а не «когда понадобится» — потом оно требует переиндексации.
Один медленный шард не должен задерживать весь запрос. Неполный ответ за отведённое время лучше полного за две секунды.
Что делаем
Веерный опрос всех шардов с таймаутом 80 мс на шард.
Слияние результатов с сохранением порядка.
Пометка неполного ответа и метрика доли таких выдач.
Исключение систематически медленного шарда из веера до восстановления.
Готово, когда
При отключении одного шарда выдача формируется, доля неполных выдач считается с первого запроса и видна на панели, а исключённый шард возвращается в веер САМ после восстановления.
Как проверяем
Учение: гасим шард под нагрузкой — выдача продолжает отдаваться, задержка не растёт. Задержка меряется снаружи, независимо от собственного замера смесителя. Отдельно — учение на возврат: чиним шард и убеждаемся, что он вернулся без ручного вмешательства.
Индекс и поисккритический путь1 backend5 нед.зависит от 1.14
Зачем
Полный перебор постингов частого термина — это сотни миллионов записей на шард. Без отсечения бюджет задержки не выдержать никакими машинами.
Что делаем
Нарезка постингов на блоки с хранением верхней границы вклада для каждого блока.
Пропуск блока целиком без декодирования, если его граница не позволяет попасть в текущий топ.
Сверка поведения с эталонными реализациями.
Готово, когда
Ускорение на частых терминах не менее чем в десять раз, отсечение отключается на запросах с фильтрами (иначе выдача пуста при существующих документах).
Как проверяем
Замер на 100 запросах с частыми словами до и после. Критично: результаты выдачи идентичны полному перебору — отсечение не должно менять топ ни на одну позицию. Сравнение оценок побитовое, а не с допуском. Отдельно — прогон на случайных индексах разной формы, включая вырожденный случай, где все списки стоят на одних и тех же документах.
Индекс и поисккритический путь2 backend6 нед.зависит от 1.14, 1.15
Зачем
Пересборка всего индекса — путь, от которого Google отказался в 2010 году. Свежая новость должна попадать в индекс за минуты, а не ждать следующей полной сборки.
Что делаем
Журнал изменений в шине сообщений с секционированием по шарду.
Подход с журнально-структурированным слиянием внутри шарда: новые документы пишутся в малые сегменты, фоново сливаются.
Удаления через битовую карту мёртвых идентификаторов, применяемую при слиянии.
Отложенные производные: авторитет хоста и ссылочные признаки не пересчитываются на каждый документ, а обновляются пакетом раз в сутки и подмешиваются из отдельной таблицы. Свежий документ получает актуальный текст сразу, а актуальный авторитет — назавтра.
Готово, когда
Документ появляется в поиске в течение 10 минут после обхода.
Как проверяем
Публикуем документ на тестовом сайте, замеряем время до появления в выдаче — на выборке из 50 публикаций.
Сниппет — не аннотация страницы, а ответ на конкретный запрос. Чтобы собрать его за 35 мс, нужны позиции терминов рядом с шардом, а не поход в объектное хранилище.
Что делаем
Колоночная структура «идентификатор документа → позиции терминов, краткий текст, признаки» со сжатием и словарём на сегмент.
Алгоритм сниппета: скользящее окно 220 символов по плотности терминов запроса, расширение до границ предложений, склейка одного-двух лучших фрагментов, подсветка лемм.
Мета-описание используется в последнюю очередь: его пишут маркетологи, и оно почти всегда хуже отвечает на конкретный запрос.
Готово, когда
Сниппет собирается за 35 мс на топ-10 и меняется вместе с запросом.
Как проверяем
Один документ по трём разным запросам даёт три разных сниппета, в каждом подсвечены слова соответствующего запроса.
Операторы — это то, чем пользуется профессиональная аудитория, которая первой придёт в новый поиск и первой напишет о нём.
Что делаем
Операторы: кавычки для точной фразы, минус для исключения, «или», ограничение сайтом и исключение сайта, поиск по адресу и в адресе, поиск в заголовке, тип файла, язык, диапазон дат, регион, любое слово, синонимы, отключение лемматизации.
Синтаксис намеренно совместим с привычным по Яндексу — не переучивать пользователя.
Понятные сообщения об ошибках разбора вместо пустой выдачи.
Готово, когда
Все операторы работают, на каждый есть тест.
Как проверяем
Набор из 60 запросов с операторами даёт ожидаемые результаты; 20 запросов с намеренно сломанным синтаксисом дают осмысленное сообщение.
Отделить содержательные страницы от пустых, шаблонных и сгенерированных без редактуры. Это признак, а не фильтр: жёсткое отсечение даёт ложные срабатывания, от которых страдают добросовестные сайты.
Что делаем
Разметка 10 000 документов по качеству.
Обучение градиентного бустинга на признаках: объём текста, отношение текста к разметке, доля рекламы в первом экране, наличие автора и даты, читаемость, структурированность, признаки машинной генерации.
Калибровка оценки, чтобы она читалась как вероятность.
Готово, когда
Классификатор даёт оценку качества для каждого документа, площадь под ROC-кривой не ниже 0.85 на отложенной выборке, шкала не насыщается на верхнем дециле, а вклад каждого признака разложим и показывается владельцу сайта.
Как проверяем
Ручной просмотр 100 документов из нижнего и верхнего децилей: оценка соответствует впечатлению человека. Отдельно — проверка совета вебмастеру на страницах БЕЗ проблем: совет там обязан отсутствовать. Совет, выданный там, где проблемы нет, стоит дороже отсутствия совета: владелец идёт искать несуществующую неисправность и теряет доверие ко всем остальным советам заодно.
Пользователь, увидевший в топе три страницы одного сайта или два одинаковых текста, считает поиск сломанным независимо от их релевантности.
Что делаем
Схлопывание групп дублей на выдаче с показом представителя.
Правило «не более двух результатов с одного хоста в топ-10» с вытеснением третьего вниз, а не удалением.
Ссылка «показать похожие» для схлопнутых групп.
Готово, когда
В топ-10 не бывает трёх результатов с одного сайта и двух почти одинаковых текстов ПРИ УСЛОВИИ, что было чем заменить; схлопнутые дубли доступны по ссылке «показать похожие», а не удалены.
Как проверяем
Прогон корзины из 3000 запросов с автоматической проверкой обоих правил. Проверка обязана отличать превышение, которого можно было избежать, от неизбежного: тревога там, где выбора не было, обесценивает весь отчёт.
Аккаунт нужен для кабинета вебмастера, коллекций и истории. Но поиск обязан оставаться полноценным без входа: ни один результат не становится хуже оттого, что пользователь не вошёл.
Что делаем
Регистрация через ключ доступа как способ по умолчанию и через почту с паролем как запасной.
Пароли через современную функцию хеширования, проверка по базам утечек методом k-анонимности.
Двухфакторная аутентификация: одноразовые коды по времени, ключи доступа, резервные коды.
Сессии: короткоживущий токен плюс ротируемый токен обновления в защищённой cookie.
Журнал входов, список устройств, выход на всех устройствах.
Готово, когда
Регистрация, вход, двухфакторная аутентификация и управление сессиями работают.
Как проверяем
Аудит безопасности: перебор паролей блокируется, сессии инвалидируются при смене пароля, токены не попадают в логи.
Продукткритический путь1 backend + 1 фронтенд7 нед.зависит от 1.7, 1.29
Зачем
Блокирующая задача фазы. Без кабинета бот не будет принят вебом, а без обхода нет продукта.
Что делаем
Подтверждение прав тремя способами: файл в корне, мета-тег, запись в DNS. Перепроверка раз в сутки.
Раздел индексирования: страницы в поиске и исключённые страницы с конкретной причиной из закрытого списка — запрет в robots.txt, мета-тег noindex, канонический адрес на другую страницу, дубликат, мало текста, мягкая ошибка «не найдено», ошибка HTTP, редирект, низкое качество, нарушение правил, не дошла очередь обхода.
Статистика обхода: запросы бота, коды ответов, время ответа, объём скачанного.
Загрузка карты сайта, ручная отправка на переобход с квотой 20 адресов в сутки.
Настройка скорости обхода.
Готово, когда
Вебмастер может подтвердить права и увидеть, что происходит с его сайтом, включая конкретную причину исключения каждой страницы.
Как проверяем
50 внешних сайтов подтвердили права и пользуются кабинетом.
Риск
Причина исключения окажется неточной, и вебмастер потеряет доверие к кабинету. Смягчение — каждая причина сопровождается конкретикой: сработавшее правило дословно, адрес оригинала дубля, число найденных символов.
Поиском пользуются по сто раз в день, в том числе люди со слабым зрением и с клавиатурной навигацией. Доступность здесь не благотворительность, а условие пригодности.
Что делаем
Тёмная тема через системное предпочтение плюс явный переключатель с тремя состояниями: светлая, тёмная, как в системе.
Аудит по стандарту доступности уровня AA: контраст, клавиатурная навигация, видимый фокус, роли ориентиров, объявление изменений выдачи.
Работа при двукратном увеличении и при отключённых стилях.
Учёт предпочтения уменьшенного движения.
Готово, когда
Аудит пройден, замечаний уровней A и AA нет.
Как проверяем
Автоматическая проверка контраста в сборке плюс ручной проход всей выдачи с клавиатуры и со скринридером.
VPS не держит поисковый индекс: ему нужны локальные NVMe и предсказуемая память без соседей по гипервизору. VPS остаются под фронт, шлюз API и служебные сервисы.
Что делаем
Заказ и приёмка выделенных серверов по расчётной конфигурации.
Приёмочные тесты дисков и сети до ввода в эксплуатацию.
Схема размещения ролей по машинам.
Готово, когда
Парк принят, тесты пройдены, серверы в строю.
Как проверяем
Замер последовательного и случайного чтения дисков, пропускной способности сети между узлами; отклонение от заявленного больше 15% — основание для замены.
Обязанность по статье 10.3 привязана к российской аудитории. Применять российское скрытие к пользователю в Германии или Бразилии значит ограничивать его право на информацию без правового основания. Так же устроены и другие операторы: удаление по европейскому праву применяется к европейским пользователям, по российскому — к российским.
Что делаем
Определение юрисдикции пользователя по региону, а не по языку интерфейса: язык ничего не говорит о местонахождении.
Раздельные реестры скрытия по юрисдикциям; записи разных юрисдикций не смешиваются.
Применение реестра только к пользователям соответствующей юрисдикции.
Строка под выдачей о том, что часть результатов не показана по правовым основаниям, со ссылкой на объяснение.
Готово, когда
Скрытие применяется к российским пользователям и не применяется к остальным; реестры юрисдикций изолированы.
Как проверяем
Один и тот же запрос из России и из-за рубежа даёт разное число результатов; запись, внесённая по одной юрисдикции, не влияет на пользователей другой.
Риск
Ошибка определения региона приводит к неверному правовому режиму. Смягчение — при неопределённом регионе применяется российский режим как более строгий: ошибка в сторону излишнего скрытия исправима обращением, ошибка в сторону послабления — нет.
Оператор обязан видеть скрытое, иначе он не может ни рассмотреть обращение, ни проверить применение скрытия, ни обработать обжалование. Закон требует прекратить выдачу пользователям, а не уничтожить записи: записи нужны, потому что решение может быть отменено.
Что делаем
Просмотр доступен только ролям «юрист» и «администратор». Модератору, аналитику и поддержке доступ к материалам обращений граждан по работе не нужен.
Режим включается явным запросом, а не следует из роли: юрист, пользующийся обычным поиском, не должен случайно видеть скрытое.
Обязательны текстовое обоснование и второй подтверждающий — просмотр входит в красный список.
Каждый просмотр пишется в неизменяемый журнал и виден роли аудитора.
Режим недостижим с публичной поверхности: его нет ни в интерфейсе поиска, ни в публичном программном интерфейсе, ни в настройках аккаунта.
Значения по умолчанию выбраны так, чтобы забывчивость вызывающего приводила к более строгому поведению.
Готово, когда
Просмотр работает по полной процедуре и не работает при отсутствии любого из четырёх условий.
Как проверяем
Набор проверок на отказ: обычный аккаунт, служебная роль вне списка, роль из списка без запроса, без обоснования, без подтверждающего — во всех случаях скрытое остаётся скрытым. Каждый успешный просмотр находится в журнале с обоснованием и подтверждающим.
Риск
Если бы обычный пользователь мог получить такой доступ, механизм превратился бы в средство обхода, и ответственность легла бы на оператора. Поэтому проверка прав идёт не в интерфейсе, а в самом слое применения реестра: обойти её, минуя интерфейс, невозможно.
Регион и геокритический путь1 backend2 нед.зависит от 1.26
Зачем
Локальные запросы бессмысленны без города: «шиномонтаж» в Москве и Омске — это разные запросы. Плюс регион нужен аналитике и определению применимой юрисдикции.
Что делаем
База соответствия адреса и региона с возможностью замены поставщика одним файлом.
Явный выбор пользователя как высший приоритет, сохраняемый на год.
Оператор региона в запросе — только для этого запроса.
Геолокация браузера только на локальных запросах, с объяснением зачем и с запоминанием отказа.
Запасной вариант по языку браузера и доменной зоне.
Разрешение конфликтов между источниками по строгому приоритету.
Готово, когда
Регион определяется для каждого запроса, конфликты источников разрешаются предсказуемо.
Как проверяем
Набор из 500 адресов с известным городом: точность определения города не ниже 75%, страны — не ниже 95%.
Риск
Потолок точности на уровне города — около 85%, и это ограничение самих данных, а не поставщика. Поэтому регион всегда виден пользователю и меняется одним кликом, а ранжирование не ломается при неверном регионе: региональный признак влияет, но не отсекает.
Единая сущность для поиска, аналитики, кабинета вебмастера и будущего локального поиска. Без неё каждый сервис заводит свой список городов, и они расходятся.
Что делаем
Иерархия: страна, федеральный округ, регион, город.
Синонимы для распознавания в запросе: «Питер», «СПб», «Мск».
Координаты, радиус, часовой пояс, язык по умолчанию.
Расстояние между регионами считается по иерархии, а не по прямой: Химки ближе к Москве, чем Тверь, потому что в той же агломерации.
Готово, когда
Справочник заполнен для России и стран СНГ, есть программный интерфейс.
Как проверяем
Проверка на 200 названиях городов и их разговорных форм: все распознаются.
Админ-часть1 backend + 1 фронтенд5 нед.зависит от 1.29
Зачем
Основа, на которую наращиваются разделы. Заводится рано по одной причине: журнал действий нельзя дописать задним числом, а без него первые полгода работы останутся непрослеживаемыми.
Что делаем
Роли с раздельными правами, а не единая роль администратора.
Вход через Yottis ID с обязательной двухфакторной аутентификацией.
Журнал действий: кто, что, когда, зачем, с какого адреса, что было и что стало.
Неизменяемость журнала на уровне хранилища.
Готово, когда
Админка открывается, роли работают, все изменения состояния пишутся в журнал.
Как проверяем
Попытка изменить запись журнала отклоняется; выборочная проверка, что каждое действие в интерфейсе оставляет запись.
Админ-часть1 backend + 1 фронтенд4 нед.зависит от 1.50
Зачем
Санкции появятся раньше автоматического антиспама, и нужен механизм с обоснованием и обратимостью с самого начала.
Что делаем
Реестр хостов с признаками: страниц, авторитет, качество, спам, кабинет.
Наложение санкции только с обязательным текстовым обоснованием.
Отображение санкции владельцу в кабинете вебмастера с описанием пути выхода.
Снятие санкции с обоснованием, всё в журнале.
Готово, когда
Санкции накладываются и снимаются, владелец сайта их видит.
Как проверяем
Тестовая санкция на свой домен: она появляется в кабинете с понятным текстом и снимается без остатка.
Риск
Возможность вручную поднять сайт в выдаче рано или поздно превращается в товар. Такой ручки не существует технически: можно снять санкцию, нельзя дать преимущество.
Добавление поля в индекс на 10 млрд документов — это полная переиндексация, недели работы. Пустое поле, заведённое сейчас, стоит почти ничего.
Что делаем
Поля для вектора документа, векторов пассажей и оценок моделей в схеме документа.
Поле оценок моделей в контрактах ответа шарда и ранжировщика.
Правило: потребители обязаны игнорировать неизвестные ключи — это делает добавление модели неломающим изменением.
Готово, когда
Поля есть в схемах, контракты допускают расширение, тесты на игнорирование неизвестных ключей проходят, а неизвестные ключи при этом доступны потребителю отдельным списком.
Как проверяем
Добавляем в ответ шарда фиктивный ключ — ни один потребитель не падает, и ключ виден в списке неизвестных.
Модель съедает от 50 до 150 мс. Если бюджет распределён без резерва, добавление модели означает пересмотр всей архитектуры обслуживания.
Что делаем
Резервируем 70 мс на слот нейросетевого реранкера.
Резервируем 60 мс на параллельные ИИ-функции.
Резерв не расходуется, пока функции выключены, но и не занимается другими этапами.
Готово, когда
Бюджет пересчитан, зафиксирован и проверяется автоматически; последовательная и параллельная части резерва разведены; принято решение по превышению медианы.
Как проверяем
Регресс-тест бюджета в двух состояниях — с выключенными моделями и с включёнными: сумма последовательных этапов не превышает цель ни там, ни там. Проверка записана точным числом, а не допуском: допуск покроет и следующее превышение.
Продвижениепродукт + фронтенд4 нед.зависит от 1.41
Зачем
Документация — главный источник органического трафика для нового поиска: на запросы вроде «как работает поисковая система» мы можем отвечать авторитетнее большинства.
Что делаем
Публичная документация о том, как работает поиск.
Правила для сайтов с примерами нарушений.
Разметка технических статей и раздела вопросов и ответов — но только там, где вопросы реально есть на странице.
Готово, когда
Документация опубликована, разметка проходит валидацию.
Как проверяем
Страницы индексируются конкурентами в течение двух недель после публикации.
Разные панели показывают разные проблемы, и третий источник данных стоит недели работы.
Что делаем
Подтверждение прав в панели третьей поисковой системы.
Загрузка карты сайта.
Подключение к общему монитору индексации.
Готово, когда
Панель подключена и показывает данные.
Как проверяем
Панель показывает непустые данные по индексации, а найденные ею проблемы сверяются с двумя уже подключёнными. Расхождение разбирается всегда: это либо ошибка панели, либо реальная проблема, видимая только ей, и оба случая стоят разбора — иначе третий источник данных не нужен.
Ворота фазы 1
Все критерии обязательны. Не пройдены — фаза продлевается,
а не закрывается.
50 млн документов в индексе, обход 300 страниц в секунду непрерывно
pFound@10 не ниже 0.48 на корзине из 3000 запросов
Доля запросов без релевантных результатов не выше 12%
Задержка выдачи на p99 не выше 400 мс при 50 запросах в секунду
Каппа Коэна между асессорами не ниже 0.6
Кабинет вебмастера работает, 50 внешних сайтов подтвердили права
Утечка кода конкурента вскрыла около 1922 именованных фактора ранжирования, из которых больше трети оказались неиспользуемыми или устаревшими. Без дисциплины жизненного цикла реестр превращается в свалку, где никто не решается ничего удалить, потому что неизвестно, на что это повлияет.
Что делаем
Каждый признак — запись с именем, владельцем, версией, описанием смысла, стоимостью вычисления, зависимостями и тестами.
Метрика важности, пересчитываемая при каждом обучении.
Дата протухания: признак без подтверждения владельца после этой даты автоматически исключается из обучения.
Автоматический отчёт о неиспользуемых признаках.
Готово, когда
Реестр работает, все существующие признаки в нём, отчёт о неиспользуемых строится автоматически.
Как проверяем
Признак с истёкшей датой действительно выпадает из следующего обучения без ручного вмешательства.
Сорока признаков хватает на линейную модель, но не на градиентный бустинг: он раскрывается на сотнях признаков и нелинейных взаимодействиях между ними.
Что делаем
Группа текстовой релевантности: BM25F по полям, покрытие запроса, близость терминов, порядок слов, точная фраза, позиция первого вхождения, языковые модели с двумя видами сглаживания, пассажный максимум.
Группа семантики: косинус запроса с документом и с лучшим пассажем, расхождение тематик.
Группа ссылок: авторитет документа и хоста, доверие, число и разнообразие ссылающихся хостов и подсетей, возраст домена, доля закрытых ссылок, тематическое соответствие доноров, глубина от главной.
Группа качества: объём текста, отношение текста к разметке, доля рекламы, грамматичность, оригинальность, наличие автора и даты, читаемость, структурированность.
Группа свежести: возраст документа и последнего изменения, частота обновления, всплеск запросов по теме.
Группа региона и языка: совпадение и расстояние, качество языка.
Готово, когда
350 признаков вычисляются, важность каждого измерена и записана в реестр.
Как проверяем
Признак, дающий нулевой вклад в трёх обучениях подряд, помечается кандидатом на удаление.
Ранжированиекритический путь2 ML8 нед.зависит от 2.2
Зачем
Основная формула ранжирования. Выбранная библиотека — открытый наследник промышленной формулы конкурента, с listwise-функцией потерь, спроектированной именно под поисковое ранжирование, и нативной работой с категориальными признаками без ручного кодирования, что при тысячах доменов принципиально.
Что делаем
Обучение на асессорских оценках с обязательной группировкой по запросу.
Метрика на валидации — pFound@10; NDCG как вторичная.
Около 2000 деревьев глубины 6.
Инференс через нативный рантайм, батчами, с целевыми 20 микросекундами на документ.
Версионирование модели вместе с реестром признаков.
Готово, когда
Модель в продакшене, прирост pFound не менее 0.06 относительно линейной модели.
Как проверяем
Интерливинг против линейной модели: победа со значимостью выше 99%.
Риск
Переобучение на малой корзине. Отложенная выборка не участвует в подборе гиперпараметров; отдельно контролируется качество на холодных запросах, не встречавшихся при обучении.
У навигационного и описательного запросов признаки работают принципиально по-разному: на первом решает точное совпадение хоста, на втором — семантика. Одна формула на всё теряет качество на обоих краях.
Что делаем
Классификатор на шесть классов: навигационный, информационный, транзакционный, локальный, свежий, мультимедийный.
Классификатор отдаёт распределение вероятностей, а не жёсткую метку.
Отдельная модель ранжирования на каждый класс.
Итоговый скор — взвешенная смесь предсказаний по вероятностям классов. Смесь, а не выбор, потому что запросы часто пограничные, и жёсткий выбор даёт скачки качества на границе.
Готово, когда
Шесть моделей обучены, смесь работает, прирост pFound не менее 0.02.
Как проверяем
Отдельный замер качества по каждому классу запросов: ни один класс не деградировал.
Ранжированиекритический путь2 ML + 1 backend9 нед.зависит от 2.2
Зачем
Только текстовый поиск даёт полноту около 65%, гибрид — около 91%. Строить оба ретривера надо сразу: ретроспективное добавление второго ломает всю калибровку основной модели.
Что делаем
Обучение би-энкодера для русского на парах «запрос — кликнутый документ» и асессорских оценках.
Векторы размерности 256 с квантованием в один байт на измерение.
Индекс приближённого поиска соседей внутри тех же шардов, что и постинги, а не в отдельной базе.
Офлайн-вычисление векторов документов на этапе индексации.
Готово, когда
Плотный поиск работает, полнота по нему на топ-1000 не ниже 0.70.
Как проверяем
Замер полноты на корзине отдельно для плотного, разреженного и гибридного поиска. Отдельно — проверка обобщения на корпусе-мосте: цель, содержащая синоним, но ни одного слова запроса.
Обучаемая разреженность ложится в тот же инвертированный индекс, что и обычные термины, — то есть достаётся почти бесплатно по инфраструктуре, а качество даёт заметное.
Что делаем
Обучение модели расширения терминов с весами.
Индексация расширенных терминов в отдельное поле того же индекса.
Контроль размера индекса: агрессивное расширение раздувает постинги.
Готово, когда
Третий ретривер работает, рост размера индекса не превышает 30%.
Как проверяем
Замер прироста полноты против роста размера индекса; при неблагоприятном соотношении расширение урезается.
Три списка кандидатов надо объединить, не требуя калибровки разномасштабных оценок.
Что делаем
Слияние по обратным рангам с отраслевой константой.
Веса ретриверов зависят от класса запроса: на навигационном доминирует текстовый поиск и точное совпадение, на описательном — плотный.
Подбор весов по корзине отдельно для каждого класса.
Проверка, что развёртка веса имеет внутренний максимум. Если качество растёт монотонно до насыщения на значении «только один ретривер», корзина слишком мала или однородна, чтобы выбрать вес, и выбирать его по ней нельзя.
Готово, когда
Гибрид даёт полноту на топ-10 не ниже 0.88, а выбранные веса лежат во внутреннем максимуме развёртки, а не на её границе.
Как проверяем
Сравнение с каждым ретривером по отдельности на корзине; гибрид выигрывает у лучшего одиночного. Развёртка веса каждого ретривера от 0 до значения, при котором он доминирует, с проверкой формы кривой.
Кросс-энкодер обрабатывает пару «запрос — пассаж» совместно, что принципиально точнее раздельного кодирования, но применимо только к десяткам кандидатов.
Что делаем
Компактная предобученная модель для русского как основа.
Дообучение дистилляцией из большой модели-учителя плюс клики с коррекцией смещения.
Инференс в едином рантайме с квантованием, батчами по 50.
Обязательная отбрасываемость по таймауту: без реранкера отдаём порядок предыдущего уровня.
Готово, когда
Реранкер в продакшене, прирост pFound не менее 0.04, бюджет 70 мс на p99 соблюдён.
Как проверяем
Замер задержки под нагрузкой; при превышении бюджета реранкер автоматически отключается, и это видно на панели.
Ради этого счётчик и строился: данные о том, что человек делал после перехода из поиска.
Что делаем
Агрегация обезличенных признаков: время на странице после перехода из поиска, доля возвратов, глубина просмотра.
Признаки уровня хоста и раздела, а не отдельного пользователя.
Включение в основную модель ранжирования.
Полное разделение с историей поиска: связывания с аккаунтом нет.
Готово, когда
Признаки в модели, прирост качества измерен.
Как проверяем
Интерливинг модели с новыми признаками против модели без них.
Риск
Сайты со счётчиком получат преимущество, и это превратится в вымогательство установки. Смягчение — признаки нормализуются по тематике и не могут повышать позицию сами по себе, только уточнять оценку уже релевантного документа.
Качествокритический путь1 ML + 1 backend6 нед.зависит от 1.34
Зачем
Интерливинг требует на порядок меньше трафика для статистической значимости, чем обычный A/B-тест, потому что сравнение идёт внутри одного пользователя и одного запроса. При нашем трафике это разница между «проверим за неделю» и «проверим за квартал».
Что делаем
Смешивание двух выдач по схеме командного набора: монетка решает, кто добавляет документ первым, затем по очереди.
Клик засчитывается той формуле, которая добавила документ.
Накопление статистики и биномиальный тест.
Панель с результатами и историей экспериментов.
A/B-тест как подтверждающий инструмент перед выкаткой на весь трафик.
Готово, когда
Эксперимент запускается за 10 минут, значимость считается автоматически.
Как проверяем
Заведомо худшая формула проигрывает в интерливинге со значимостью выше 99% на ожидаемом объёме трафика.
Самая трудоёмкая часть антиспама: без размеченного корпуса классификатор не обучить, а разметка спама требует экспертизы, которой у обычного асессора нет.
Что делаем
Отбор 50 000 хостов-кандидатов по эвристикам и по жалобам.
Разметка по типам нарушений: клоакинг, дорвеи, скрапинг, ссылочные схемы, скрытый текст, автогенерация, взлом, паразитный хостинг, накрутка поведения, домены под запрос.
Отдельная разметка добросовестных сайтов, похожих на спам: это самая ценная часть выборки.
Перекрытие и контроль согласия.
Готово, когда
50 000 хостов размечены, доля добросовестных сайтов в выборке не ниже 40%.
Как проверяем
Согласие разметчиков по каппе Коэна не ниже 0.7 — для спама требование выше, чем для релевантности.
Антиспамкритический путь2 антиспам7 нед.зависит от 2.11
Зачем
Единый ML-классификатор, а не набор отдельных фильтров. Google тринадцать лет шёл от отдельных подсистем к сигналам внутри ядра, и повторять этот путь незачем.
Что делаем
Градиентный бустинг на признаках корпуса.
Теневой режим на семь дней: оценка считается, но не применяется, ложные срабатывания разбираются вручную.
Три порога: ниже 0.3 — признак без действий, от 0.3 до 0.8 — понижение и метка для ручной проверки, выше 0.8 — исключение из индекса.
Ежемесячное переобучение на новых данных.
Готово, когда
Точность не ниже 0.95 при полноте не ниже 0.70 на отложенной выборке.
Как проверяем
Разбор всех ложных срабатываний за неделю теневого режима; выкатка только при доле ложных срабатываний ниже 5%.
Риск
Ложное срабатывание бьёт по добросовестному сайту и по нашей репутации сильнее, чем пропущенный спам. Отсюда порог точности выше порога полноты и обязательный теневой режим.
Антиспам1 антиспам + 1 фронтенд4 нед.зависит от 1.52
Зачем
Автоматика ошибается, и у владельца сайта должен быть понятный путь исправления. Непрозрачные санкции — то, за что справедливо ругают крупные поисковики.
Что делаем
Наложение санкции только оператором, всегда с указанием типа нарушения.
Отображение санкции владельцу в кабинете с описанием пути выхода.
Кнопка отправки на пересмотр с очередью и сроком ответа.
История санкций по хосту.
Готово, когда
Санкции видны владельцам, пересмотр работает, срок ответа соблюдается.
Как проверяем
Сквозной прогон: наложение, отображение, заявка на пересмотр, снятие — всё в журнале.
Саму вертикаль строит отдельный трек «Картинки» (docs/plan/track-images.md): у неё свой индекс, своё ранжирование и свой правовой режим. В основном плане остаётся то, что принадлежит выдаче, а не вертикали, — вкладка, общее состояние запроса и общие настройки. Описание одной и той же работы в двух местах разошлось бы на первой же правке.
Что делаем
Вкладка в переключателе вертикалей с сохранением запроса, региона и языка при переходе.
Разбор операторов вертикали (size:, ratio:, color:, imagetype:, license:, imagesite:) общим разборщиком языка запросов.
Единая настройка безопасного поиска на продукт, а не отдельная для картинок, — стык с 2.25.
Переход из веб-выдачи в вертикаль и обратно без потери фильтров времени и языка.
Замер доли переходов между вкладками как входные данные для колдунщика «картинки в строку» (I3.3).
Готово, когда
Переход между «Всё» и «Картинки» сохраняет запрос, регион, язык и фильтр времени; операторы вертикали разбираются общим разборщиком; настройка безопасного поиска одна на весь продукт.
Как проверяем
Сценарный тест из десяти переходов между вкладками с проверкой сохранения каждого параметра; сверка выдачи по оператору size:large и по фильтру «Большие» — списки совпадают.
Риск
Вкладка появляется раньше содержимого под ней, и пустая вертикаль читается как поломка всего поиска. Смягчение: вкладка включается флагом функции и открывается только после ворот I1.
Свежесть — то, по чему новый поиск проверяют в первую очередь. Новость крупного СМИ обязана появляться в индексе за минуты.
Что делаем
Отдельный быстрый индекс с обновлением не реже чем раз в десять минут.
Определение новостных источников и приоритетный обход их лент.
Кластеризация публикаций в сюжеты.
Обязательная плюрализация источников внутри сюжета: не более двух материалов одного издания.
Хронология сюжета.
Готово, когда
Новость крупного СМИ появляется в индексе за 10 минут, сюжеты собираются.
Как проверяем
Замер задержки на 100 публикациях; проверка, что в сюжете представлено не менее трёх изданий.
Риск
Вертикаль новостей при большой аудитории влечёт статус новостного агрегатора с отдельными обязанностями. Вертикаль проектируется так, чтобы её можно было выключить или свести к показу ссылок без агрегации.
Значимая доля запросов имеет видеонамерение, и отвечать на них текстовыми страницами бесполезно.
Что делаем
Индексация по структурированной разметке видео.
Извлечение превью, длительности, автора, даты.
Транскрипты там, где они доступны на странице.
Карточки с превью в общей выдаче и отдельная вертикаль.
Готово, когда
Видео находится, карточки показываются с превью и длительностью.
Как проверяем
Корзина из 300 видеозапросов с замером доли, где нужное видео попало в топ-3. Отдельно проверяется полнота карточки: превью, длительность и дата на месте. Карточка без превью проигрывает обычному текстовому результату — показывать её вместо ссылки значит ухудшить выдачу ради формального наличия вертикали.
Продукт1 backend + 1 фронтенд7 нед.зависит от 1.29
Зачем
Аккаунт в поисковой системе даёт владельцу полную картину интересов человека, и это обоснованный повод для недоверия. Раздел управления данными должен быть образцовым, иначе аккаунтом не будут пользоваться.
Что делаем
Раздел «Мои данные»: всё, что известно о пользователе.
Показ выведенных интересов с возможностью удалить любой и запретить выведение — обычно такие данные скрывают, мы показываем.
Экспорт в архив с машиночитаемыми форматами, готовится асинхронно.
Удаление аккаунта с тридцатидневной корзиной и подтверждением по почте.
История поиска выключена по умолчанию; включение — осознанное действие с объяснением.
Готово, когда
Раздел работает, экспорт и удаление проходят полный цикл.
Как проверяем
Экспорт содержит все категории данных, перечисленные в политике конфиденциальности; после удаления данных в базах не остаётся.
Счётчик, собирающий всё подряд, юридически токсичен и подрывает нашу же позицию по приватности. Это ещё и рыночное отличие: аналитика, которая не следит.
Что делаем
Обрезка адреса до подсети через 24 часа.
Отсутствие межсайтовых идентификаторов.
Публичное описание того, что именно собирается.
Режим полного отказа от cookie.
Возможность владельца сайта отключить сбор отдельных категорий.
Готово, когда
Требования выполнены, описание опубликовано, юридическая проверка пройдена.
Как проверяем
Аудит: в хранилище нет данных, позволяющих связать посетителя между двумя сайтами.
Продуктовые решения без данных об аудитории принимаются по интуиции, и она обычно ошибается.
Что делаем
Пользователи: новые, вернувшиеся, активные.
Устройства и браузеры.
Удержание по когортам.
Источники прихода.
Готово, когда
Раздел работает, когортный анализ строится.
Как проверяем
Когортный анализ воспроизводит известное поведение на исторических данных: когорта, набранная в неделю запуска, показывает ожидаемый спад удержания. Ровная линия здесь — почти всегда признак ошибки в определении когорты, а не удивительной лояльности, и такой результат считается непройденной проверкой.
Администратор, который видит всё и ни перед кем не отчитывается, — это уязвимость, а не роль.
Что делаем
Красный список действий, требующих второго подтверждающего: просмотр истории конкретного пользователя, выгрузка персональных данных, санкция на крупный хост, изменение реестра скрытия, изменение ролей, отключение антиспама.
Роль аудитора: доступ только к журналу, включая действия администратора, без права что-либо менять.
Оповещение аудитора о действиях из красного списка.
Готово, когда
Действия из красного списка невозможны без второго подтверждающего, аудитор видит всё.
Как проверяем
Попытка выполнить действие из красного списка в одиночку отклоняется.
Всплывающее окно с запросом местоположения на главной странице — раздражитель, который большинство отклоняет навсегда, после чего геолокация недоступна и там, где она реально нужна.
Что делаем
Запрос только после классификации запроса как локального.
Объяснение зачем: «чтобы показать ближайшие».
Запоминание отказа: повторно не спрашиваем.
Готово, когда
Запрос показывается только на локальных запросах, отказ запоминается.
Как проверяем
Доля согласий на запрос геолокации не ниже 40% — при неуместном запросе она была бы втрое ниже.
Вебмастеру нужно знать, в каких регионах показывается его сайт: это меняет и содержание, и рекламные решения.
Что делаем
Разрез отчёта по запросам с фильтром по региону.
Карта показов по регионам.
Сравнение позиций между регионами.
Готово, когда
Разрез работает, данные сходятся с общим отчётом.
Как проверяем
Сумма показов по регионам совпадает с общим числом показов в отчёте; расхождение допускается только на долю «регион не определён», и она выводится явно, а не молча списывается. Дополнительно — проверка на сайте с заведомо известной географией: разрез обязан повторять реальное распределение, а не давать ровную картину по стране.
Поле языкового кластера в схеме документа нужно завести до того, как оно понадобится: добавление поля в индекс на миллиарды документов означает переиндексацию.
Что делаем
Справочник кластеров: кириллица, западная латиница, восточная латиница, иероглифика, письмо справа налево, индийские письменности.
Привязка языков к кластерам.
Поле кластера в схеме документа и в контрактах.
Готово, когда
Поле есть в схеме, заполняется при индексации, доступно как фильтр.
Определение языка запроса — отдельная задача от определения языка документа: запросы короткие, часто из одного-двух слов, и обычные методы на них работают плохо.
Что делаем
Модель на коротких строках с учётом алфавита, частотности и структуры.
Обработка запросов без языка: цифры, артикулы, имена собственные.
Отдельное состояние «язык не определён» вместо подстановки языка интерфейса.
Готово, когда
Точность не ниже 0.95 на запросах от двух слов.
Как проверяем
Размеченная выборка из 5000 запросов на пяти языках.
ИИ-структуракритический путь1 backend5 нед.зависит от 1.53, 1.54
Зачем
Единая точка журналирования, политики данных, учёта стоимости, подмены модели и — главное — выключения. Прямых вызовов моделей из других сервисов не существует.
Что делаем
Контракт запроса с обязательными полями: имя функции, срок ожидания, поведение при отказе, потолок стоимости, класс допустимых данных.
Контракт ответа: результат, использованная модель и версия, время, стоимость, уверенность, факт деградации.
Единственная реализация на старте: «функция выключена» с нулевой стоимостью.
Потребители пишутся против настоящего интерфейса с первого дня.
Готово, когда
Шлюз в продакшене, потребители ходят через него, выключенная функция не ломает вызывающий код.
Как проверяем
Отключение шлюза целиком не приводит к отказу ни одного сервиса.
Модель без журнала входов и выходов неотлаживаема, а дописать журналирование задним числом означает потерять всю историю.
Что делаем
Запись каждого вызова: функция, модель, версия, время, стоимость, уверенность, деградация.
Содержимое входа и выхода — по классу данных, с обезличиванием.
Панель по стоимости и задержке в разрезе функций и моделей.
Готово, когда
Журнал пишется с первого включённого вызова, панель строится.
Как проверяем
Модель включается на одном проценте трафика: каждый вызов виден в журнале со входом, выходом и временем, а число записей совпадает с числом вызовов по метрике. Отдельно проверяется, что ДЕГРАДАЦИИ пишутся так же, как успешные вызовы: журнал, где видны только успехи, показывает не работу модели, а её лучшую половину.
ИИ-структура1 backend + юрист3 нед.зависит от 2.53
Зачем
Отправка пользовательских данных в модель без описанной политики — юридический инцидент, а не техническая задача. Регламент здесь не работает: нужна техническая невозможность.
Что делаем
Классы данных: публичные страницы, текст запроса, запрос с историей, содержимое писем, персональные данные.
Класс проверяется шлюзом при каждом вызове.
Нарушение — отказ вызова, а не предупреждение в логе.
Содержимое писем — только локальным моделям, внешние интерфейсы запрещены категорически.
Персональные данные не передаются моделям ни при каких условиях.
Готово, когда
Политика проверяется технически, нарушение невозможно.
Как проверяем
Попытка вызвать внешнюю модель с классом данных выше публичного отклоняется на уровне шлюза.
Разделение доступа к истории поиска должно быть техническим, а не организационным: у сервисов ранжирования не должно быть учётных данных к этой базе физически.
Что делаем
Отдельный кластер для истории поиска с отдельными учётными данными.
Общий кластер для технической аналитики и метрик.
Отдельный кластер для событий Метрики.
Аудит доступа к кластеру истории.
Готово, когда
Кластеры разделены, у сервисов ранжирования нет доступа к истории.
Как проверяем
Попытка обращения к кластеру истории с учётными данными сервиса ранжирования отклоняется.
Еженедельный съём позиций по десктопу и мобильным, по пяти регионам.
Показатель видимости как взвешенная сумма по кривой кликабельности.
Выявление страниц, потерявших позиции.
Готово, когда
Монитор работает, динамика видна на панели.
Как проверяем
Данные съёма воспроизводимы при повторном замере в тот же день.
Риск
Снятие позиций делается только через официальные программные интерфейсы и разрешённые методы. Компания, строящая поисковую систему, не может нарушать чужие условия использования: это и юридический риск, и репутационный.
Открытая публикация инструкции — редкость в отрасли, поэтому она гарантированно вызовет резонанс. И она дисциплинирует прежде всего нас: инструкцию, которую увидят все, невозможно писать небрежно.
Что делаем
Подготовка публичной версии руководства.
Юридическая проверка на отсутствие раскрытия чувствительных деталей формулы.
Публикация с версионированием и историей изменений.
Готово, когда
Руководство опубликовано и версионируется.
Как проверяем
Публичная версия не содержит информации, позволяющей манипулировать ранжированием.
Складывающийся стандарт для языковых моделей: карта содержания сайта в машиночитаемом виде, отдельная от карты сайта для краулеров.
Что делаем
Файл в корне с иерархией разделов и ключевыми фактами о проекте.
Однозначные формулировки о себе, повторяющиеся везде одинаково.
Обновление при изменении структуры сайта.
Готово, когда
Файл опубликован и обновляется автоматически вместе с картой сайта.
Как проверяем
Файл валиден по схеме и обновляется вместе с картой сайта: изменение раздела появляется в обоих файлах за один цикл сборки. Расхождение проверяется автоматически — раздел, попавший в карту сайта, но не в карту содержания, считается ошибкой сборки, а не допустимой рассинхронизацией.
Ворота фазы 2
Все критерии обязательны. Не пройдены — фаза продлевается,
а не закрывается.
300 млн документов, обход 2000 страниц в секунду
pFound@10 не ниже 0.58
Доля запросов без релевантных результатов не выше 6%
Задержка на p99 не выше 320 мс при 300 запросах в секунду
Доступность 99.9% за квартал
Интерливинг показывает победу новой формулы над предыдущей со значимостью выше 99%
Антиспам: точность не ниже 0.95 при полноте не ниже 0.70
Yottis Метрика установлена не менее чем на 2000 внешних сайтов
Открытая бета: 100 000 пользователей в месяц, доля возвращающихся не ниже 30%
Админ-часть: сценарии разбора запроса, обращения по праву на забвение и проверки спам-кандидата проходятся целиком
Шлюз моделей в продакшене, обе первые функции идут через него
1500 наших страниц в индексе конкурентов, 400 ссылающихся доменов
Фаза 3
Масштаб
Месяцы
18–26
Календарь
фев – окт 2028
Команда
45 чел.
Индекс
2 млрд
Бюджет
405 млн ₽
Задач
57
Недель работ
417
Публичный запуск. Два миллиарда документов, английский сегмент, генеративный ответ, публичный программный интерфейс, каналы дистрибуции, круглосуточная эксплуатация. Это главная веха программы: на выходе из фазы 3 проект либо является поисковой системой, которой пользуются, либо не является ничем.
Индекс и поисккритический путь3 backend14 нед.зависит от 2.26
Зачем
Семикратный рост корпуса. На этом объёме перестают работать приёмы, достаточные для трёхсот миллионов: перебалансировка занимает сутки, полная пересборка — неделю.
Что делаем
Сорок шардов с тройной репликацией.
Переиндексация с новым ключом шардирования, учитывающим языковой кластер.
Перебалансировка без остановки поиска.
Проверка, что время полной пересборки остаётся в пределах трёх суток.
Готово, когда
2 млрд документов в индексе, перекос между шардами не более 15%, поиск не прерывался.
Как проверяем
Замер времени полной пересборки и времени добавления нового шарда.
Держать весь корпус на быстрых дисках при двух миллиардах документов экономически бессмысленно: девяносто девять процентов запросов приходится на малую часть индекса.
Что делаем
Горячий слой: примерно два процента документов по трафику и авторитету плюс всё свежее за двое суток, полностью в памяти и на быстрых дисках.
Тёплый слой: основной корпус на быстрых дисках.
Холодный слой: длинный хвост и архив на объектном хранилище.
Автоматическое перемещение документов между слоями по трафику.
Разная стратегия обновления для каждого слоя.
Готово, когда
Слои работают, восемьдесят пять процентов запросов обслуживаются горячим слоем.
Как проверяем
Распределение запросов по слоям на реальном трафике за неделю.
Индекс и поиск2 ML + 1 backend10 нед.зависит от 2.5, 3.2
Зачем
Держать два миллиарда векторов в памяти невозможно: это сотни гигабайт на узел. Дисковый граф с сжатым представлением в памяти решает задачу на порядок дешевле.
Что делаем
Построение графа соседства на быстрых дисках.
Сжатое представление в памяти для навигации.
Раздельные стратегии для горячего слоя, где вектора остаются в памяти, и тёплого.
Инкрементальное добавление векторов без полной перестройки графа.
Готово, когда
Векторный поиск работает на всём корпусе, полнота на первом результате не ниже 0.95, средняя задержка не выше 5 мс.
Как проверяем
Замер полноты и задержки на контрольном наборе из миллиона запросов.
Обход3 backend + 2 инфраструктура12 нед.зависит от 1.1, 1.2
Зачем
Поддержание двух миллиардов документов в актуальном состоянии требует такой скорости просто на переобход: при среднем интервале в четырнадцать суток это тысяча шестьсот пятьдесят страниц в секунду до всякого роста.
Распределение фронтира между узлами с сохранением вежливости: суммарная нагрузка на хост считается глобально, а не по узлам.
Адаптивное снижение скорости при росте времени ответа хоста.
Мониторинг по каждому крупному хосту отдельно.
Готово, когда
Обход идёт на десяти тысячах страниц в секунду непрерывно, ни один хост не получает больше разрешённого.
Как проверяем
Учение: искусственно замедляем крупный хост — скорость обхода по нему падает автоматически в течение минуты.
Риск
Распределённый фронтир нарушит вежливость: два узла независимо решат, что можно идти к одному хосту. Смягчение — глобальный счётчик на хост, а не локальный.
Ранжированиекритический путь3 ML10 нед.зависит от 2.3
Зачем
Клики — самый сильный сигнал релевантности и самый опасный: они смещены позицией и уязвимы к накрутке. Использовать их обязательно, использовать наивно — гибельно.
Что делаем
Кликстрим в обучение с коррекцией позиционного смещения; вероятность просмотра позиции оценивается на трафике исследования.
Признаки: кликабельность с поправкой на позицию, доля длинных кликов, доля быстрых возвратов, последний клик в сессии.
В инференсе используются только сглаженные агрегаты с окном не менее тридцати дней.
Лаг не менее семи дней между сбором и применением.
Байесовское сглаживание к среднему по позиции: редкие пары не двигаются вообще.
Готово, когда
Поведенческие признаки в основной модели, прирост pFound не менее 0.03.
Как проверяем
Проверка на устойчивость: искусственный всплеск кликов по паре не меняет её позицию раньше чем через неделю.
Риск
Прямая подача кликабельности в формулу создаёт петлю обратной связи — высокая позиция даёт клики, клики поднимают позицию — и открывает вектор накрутки. Отсюда лаг, сглаживание и запрет на использование сырых значений.
Ранжированиекритический путь2 ML8 нед.зависит от 3.7
Зачем
Документ, который никогда не показывали, никогда не получит кликов. Без исследования система навсегда закрепляет собственные ошибки, и качество перестаёт расти при любых усилиях.
Что делаем
Один-два процента запросов получают выдачу с внедрённым случайным документом из позиций с одиннадцатой по пятидесятую.
Оценка вероятности показа на этом трафике.
Обучение с обратным взвешиванием по этой вероятности.
Отдельная холодная корзина запросов, по которым мы намеренно не обучаемся: только замер.
Готово, когда
Исследование идёт, модель без смещения обучается, холодная корзина показывает рост качества.
Как проверяем
Рост качества на холодной корзине не отстаёт от роста на обучающей — расхождение означает переобучение на собственную выдачу.
Появились три источника признаков, которых не было: поведение, многоязычие, данные аналитики. Плюс накопилась статистика для признаков, требующих истории.
Что делаем
Группа поведения полностью.
Признаки истории документа: динамика позиций, стабильность содержания.
Признаки хоста из аналитики.
Ревизия реестра: признаки с нулевым вкладом в трёх обучениях удаляются.
Готово, когда
Около шестисот признаков в модели, реестр очищен от мёртвых.
Как проверяем
Доля признаков с нулевой важностью не выше десяти процентов.
Инфраструктура3 инфраструктура12 нед.зависит от 2.27
Зачем
Онлайн-контур должен переживать потерю целого дата-центра с деградацией задержки, но без отказа. Офлайн-контур при этом может лежать сутки — это осознанное решение, экономящее половину стоимости резервирования.
Что делаем
Полный онлайн-контур в обоих центрах.
Маршрутизация трафика по географии с быстрым переключением.
Репликация индекса между центрами.
Офлайн-контур остаётся в одном центре.
Регулярные учения по переключению.
Готово, когда
Потеря центра не приводит к отказу поиска, только к росту задержки.
Как проверяем
Учение с реальным отключением одного центра под нагрузкой.
Хранилища2 backend + 1 инфраструктура10 нед.зависит от 1.56, 2.59
Зачем
Тридцать миллиардов ключей и сто тысяч записей в секунду. Встроенное хранилище на таком объёме перестаёт справляться, а транзакции здесь не нужны: обновление статуса адреса идемпотентно.
Что делаем
Развёртывание кластера распределённого хранилища.
Реализация интерфейса доступа поверх него.
Двойная запись в старое и новое хранилище с постоянной сверкой.
Переключение чтения после схождения данных.
Всё без остановки обхода.
Готово, когда
База обхода на новом хранилище, обход не прерывался.
Как проверяем
Абстракция, введённая в первой фазе, сделала миграцию заменой реализации, а не переписыванием краулера — это проверяется по объёму изменений в коде краулера: он должен быть нулевым.
Хранилища1 backend + 1 инфраструктура8 нед.зависит от 3.2
Зачем
Длинный хвост спрашивают раз в месяц, и платить за него ценой быстрых дисков расточительно.
Что делаем
Формат самодостаточных сегментов индекса на объектном хранилище.
Поисковые узлы без состояния, читающие сегменты напрямую.
Кэширование горячих участков сегментов.
Пометка выдачи как обслуженной холодным слоем для отдельного замера задержки.
Готово, когда
Холодный слой работает, доля обслуживаемых им запросов не превышает одного процента.
Как проверяем
Задержка холодного слоя может достигать секунды — это приемлемо для одного процента запросов и неприемлемо для остальных, поэтому доля контролируется отдельной метрикой с оповещением.
Хранилища1 инфраструктура6 нед.зависит от 1.57, 3.6
Зачем
Кабинет вебмастера и аккаунты обслуживаются из одного центра, и для европейского пользователя это лишние двести миллисекунд на каждое действие.
Что делаем
Реплики только для чтения в каждом регионе присутствия.
Запись остаётся в основном центре.
Обработка задержки репликации в интерфейсе: после изменения показываем своё же изменение.
Готово, когда
Чтение обслуживается локально, задержка кабинета в удалённом регионе не выше 300 мс.
Как проверяем
Замер задержки кабинета из удалённого региона с реального канала, а не из соседнего дата-центра. Отдельно — проверка расхождения реплик: запись в центре видна в реплике за оговорённое время, и это время измеряется, а не предполагается. Сценарий с отставшей репликой проверяется явно: пользователь обязан увидеть свои собственные изменения сразу, даже если реплика ещё не догнала.
Компактная готовая модель, взятая в предыдущей фазе, ограничивает потолок качества реранкера. Собственная модель, предобученная на нашем же корпусе, знает язык веба, а не язык книг.
Что делаем
Предобучение на собственном корпусе, русский и английский.
Дообучение под задачу ранжирования на кликах и асессорских оценках.
Дистилляция в компактную версию для инференса.
Квантование и замер задержки.
Готово, когда
Собственная модель заменила готовую, прирост pFound не менее 0.02 при том же бюджете задержки.
Как проверяем
Сравнение на корзине и замер задержки под нагрузкой.
ИИ-структуракритический путь3 ML + 1 фронтенд14 нед.зависит от 2.53, 3.10
Зачем
Пользователи уже ожидают такой блок. Одновременно это самый рискованный продукт в системе: забирая трафик у источников, поисковик подрубает собственный индекс.
Что делаем
Классификатор пригодности запроса. На чувствительных темах — медицина, право, финансы, политика, безопасность — блок не показывается вообще.
Берём топ-8 после реранкера.
Семантическая фильтрация до трёх-пяти действительно отвечающих документов.
Генерация с обязательной ссылкой на каждое утверждение.
Проверка обоснованности каждого предложения отдельной моделью; неподтверждённое вырезается.
Если после проверки осталось меньше двух предложений — блок не показывается.
Готово, когда
Доля утверждений без подтверждения источником не выше одного процента на аудите.
Как проверяем
Ручной аудит двухсот сгенерированных ответов асессорами с проверкой каждого утверждения по источнику.
Риск
Блок подрывает трафик сайтов, которые нас наполняют. Жёсткие ограничения: не более шестидесяти слов, не более двадцати пяти слов подряд из одного источника, блок сворачивается с запоминанием выбора навсегда, занимает не более сорока процентов первого экрана, явная плашка об автоматической генерации.
Именно скорость цикла, а не объём разметки, определяет темп улучшения качества. Конкурент, проверяющий шесть гипотез за квартал против одной, выигрывает независимо от качества инженеров.
Что делаем
Автоматическое формирование задания на разметку из гипотезы.
Сбор оценок и включение в обучающую выборку.
Переобучение и офлайн-замер.
Автоматический запуск интерливинга при прохождении офлайн-порога.
Внутренние метрики на собственной корзине не позволяют сравнить себя с миром. Публичный набор позволяет.
Что делаем
Прогон на многоязычном наборе для оценки поиска.
Сравнение с опубликованными результатами базовых методов.
Включение в регулярный замер.
Готово, когда
Наши результаты сопоставимы с опубликованными для сильных базовых методов.
Как проверяем
Прогон на публичном наборе по опубликованной методике, без единой правки под него — подгонка под открытый набор обесценивает единственное, ради чего он берётся. Результаты сравниваются с опубликованными для сильных базовых методов и печатаются вместе с ними, включая случаи, где мы проигрываем.
Снимает спекуляции о секретных критериях и даёт вебмастерам понятную рамку.
Что делаем
Публикация полного руководства асессора в открытом доступе, тем же текстом, по которому работают наши асессоры, — сокращённая «версия для внешних» обесценивает всю затею. 2. История изменений с датами и пояснением, что именно поменялось и почему. 3. Раздел с примерами оценок: страница, оценка, обоснование. Правила без примеров каждый понимает по-своему. 4. Форма обратной связи для вебмастеров с обязательным ответом на содержательные замечания.
Готово, когда
Актуальная версия руководства опубликована с историей изменений.
Как проверяем
Внутренние асессоры работают по опубликованной версии, а не по внутренней: расхождение между текстом на сайте и инструкцией в работе означает, что опубликовано не руководство, а его изложение. Проверяется выборочной сверкой и тем, что каппа Коэна между асессорами не падает после публикации.
Многоязычиекритический путь2 backend10 нед.зависит от 2.40, 3.1
Зачем
Расхожий совет «один индекс на язык» верен для коллекций до миллиона документов и вреден для веба: многоязычные страницы попадают не туда, кросс-языковые запросы не работают, а число индексов растёт вместе с числом языков.
Что делаем
Ключ шардирования — хеш от пары «языковой кластер и хост».
Внутри кластера сохраняется хостовая локальность, между кластерами появляется возможность отсечения.
Переиндексация корпуса с новым ключом.
Обработка многоязычных сайтов: документы одного хоста могут попасть в разные шарды, и хостовые признаки должны быть доступны в каждом.
Готово, когда
Языковое отсечение шардов работает, русский запрос читает часть шардов вместо всех.
Как проверяем
Замер числа опрошенных шардов до и после на корзине русских запросов.
Отсечение по языку даёт выигрыш, но неаккуратное отсечение теряет лучший ответ.
Что делаем
Определение языка запроса и региона пользователя.
Правило: свой кластер плюс западная латиница всегда. Русскоязычный пользователь на технический запрос почти всегда хочет видеть и англоязычные результаты.
Язык не определён — опрашиваются все кластеры региона.
Явный оператор языка — только указанный кластер.
Готово, когда
Маршрутизация работает, выигрыш по задержке измерен, качество не упало.
Как проверяем
Контрольный замер на корзине: доля запросов, где полезный англоязычный результат исчез из топ-10, равна нулю.
Продукт1 backend + 1 фронтенд5 нед.зависит от 1.34
Зачем
Помогает пользователю уточнить запрос и даёт нам сигнал о том, какие формулировки работают лучше.
Что делаем
Кластеризация связанных запросов из логов.
Отбор вопросов, на которые есть хороший ответ в индексе.
Раскрытие ответа без ухода со страницы: блок не должен конкурировать с выдачей.
Готово, когда
Блок показывается на информационных запросах, раскрытие не уводит со страницы.
Как проверяем
Замер на живом трафике: доля раскрытий блока и доля уходов со страницы после раскрытия. Блок засчитывается работающим, только если раскрытие НЕ уводит пользователя со страницы чаще, чем обычный результат: блок, отправляющий людей дальше искать, ухудшает выдачу, как бы охотно его ни раскрывали.
Продукт1 фронтенд + 1 backend8 нед.зависит от 2.20
Зачем
Продолжение линии на плотность блоков с готовым ответом.
Что делаем
Картинки в строку на визуальных запросах.
Новости в строку при всплеске темы.
Факты и определения из графа сущностей.
Соблюдение общего лимита в два блока.
Готово, когда
Колдунщики работают, лимит соблюдается.
Как проверяем
Замер доли запросов с колдунщиком и соблюдения лимита на их число в выдаче. Отдельно — контрольная корзина обычных запросов: она не должна деградировать. Колдунщик, вытеснивший верный органический результат, считается ошибкой, а не удачным блоком.
Персонализация улучшает выдачу на повторных и неоднозначных запросах, но при неаккуратной реализации создаёт пузырь фильтров, из которого пользователь не может выйти.
Что делаем
Включается только явным действием пользователя.
Переупорядочивает топ-30, но не меняет состав кандидатов.
Максимальный сдвиг документа — пять позиций.
Сигналы: посещённые ранее хосты, повтор запроса, вектор интересов.
Пометка в выдаче и ссылка «показать без персонализации» одним кликом.
Сервис персонализации отдаёт производный вектор интересов, а не историю.
Готово, когда
Персонализация работает в заданных границах, пометка и отключение доступны.
Как проверяем
Замер: ни один документ не сдвинулся больше чем на пять позиций; состав топ-30 без персонализации и с ней совпадает.
Продукт, о котором никто не знает, не получает пользователей независимо от качества.
Что делаем
Пресс-материалы и работа с отраслевыми изданиями.
Выступления на профильных конференциях.
Работа с техническими сообществами.
Кампания в момент открытого запуска.
Готово, когда
Запуск состоялся, охват замерен.
Как проверяем
Замер охвата и переходов по каждому каналу отдельно, с разделением платного и органического. Главная проверка — не охват, а удержание: доля вернувшихся на второй неделе. Запуск, давший миллион визитов и нулевое удержание, считается несостоявшимся, потому что второй раз тех же людей не привести.
Продукткритический путь1 фронтенд4 нед.зависит от 3.18
Зачем
Опубликовать расширение мало — нужно, чтобы его находили и устанавливали.
Что делаем
Оптимизация страниц в магазинах расширений.
Промо-страница на сайте.
Отслеживание установок и удалений как отдельной метрики.
Готово, когда
Не менее пятидесяти тысяч установок, воронка отслеживается.
Как проверяем
Воронка прослеживается целиком: показ в каталоге, переход, установка, первый запрос, запрос на седьмой день. Число установок само по себе ничего не значит — засчитывается доля дошедших до седьмого дня, потому что расширение, удалённое через неделю, не канал дистрибуции, а строчка в отчёте.
Дешёвые каналы дистрибуции, которые стоит занять до того, как о нас узнают.
Что делаем
Встраиваемый виджет поиска.
Настраиваемая стартовая страница.
Инструкции по установке для распространённых браузеров.
Готово, когда
Оба канала доступны и документированы.
Как проверяем
Виджет встраивается на тестовый сайт по опубликованной документации без обращения в поддержку: если для встраивания нужна подсказка, документация не готова. Стартовая страница проверяется на всех поддерживаемых браузерах, включая поведение при отсутствии сети.
Быстрые ссылки формируются автоматически и иногда ведут не туда, куда владелец сайта хотел бы.
Что делаем
Просмотр сформированных быстрых ссылок.
Скрытие ненужных.
Объяснение, почему выбраны именно эти.
Готово, когда
Владелец может скрыть быструю ссылку, изменение применяется в течение суток.
Как проверяем
Скрытие быстрой ссылки применяется в выдаче в течение суток — замер по реальному сайту от нажатия до исчезновения. Отдельно проверяется, что скрытие НЕ удаляет страницу из индекса: владелец просит убрать ссылку из блока, а не выкинуть страницу из поиска, и путать эти два действия нельзя.
Индексация документов сделана в предыдущей фазе, но без отдельной вертикали пользователи о ней не знают.
Что делаем
Отдельная вкладка с фильтрами по типу файла.
Отображение типа, размера и числа страниц.
Предпросмотр первой страницы, где это возможно.
Готово, когда
Вертикаль работает, фильтры применяются.
Как проверяем
Корзина запросов по документам с замером полноты: доля запросов, где нужный документ найден. Фильтры проверяются на согласованность — сумма по типам файлов совпадает с общим числом, а фильтр по типу не теряет документы с нераспознанным типом молча.
Для новой поисковой системы это основной инструмент построения доверия, которого у неё пока нет по умолчанию.
Что делаем
Число обращений по праву на забвение, доля удовлетворённых, основания отказов.
Удаления по реестрам и судебным решениям.
Жалобы правообладателей и результат.
Запросы государственных органов и доля исполненных.
Ручные санкции по типам нарушений.
Изменения алгоритмов ранжирования: факт и характер, без раскрытия формулы.
Готово, когда
Отчёт опубликован на постоянном адресе, содержит все шесть разделов с цифрами за период, и рядом с каждой цифрой указана методика подсчёта — цифра без методики не строит доверия, а вызывает вопросы.
Как проверяем
Данные отчёта воспроизводимы из журнала админ-части.
Отчёт в формате документа читают единицы; страница с данными и выгрузкой цитируется годами.
Что делаем
Публичная страница с графиками и таблицами.
Выгрузка данных в машиночитаемом виде.
Разметка набора данных.
История отчётов.
Готово, когда
Страница опубликована, данные выгружаются.
Как проверяем
Данные на странице сходятся с внутренним учётом обращений и удалений — расхождение в отчёте о прозрачности стоит дороже отсутствия отчёта. Выгрузка открывается в табличном редакторе без правки руками, и её структура не меняется между выпусками: менять формат отчёта, который цитируют, значит обесценивать прошлые ссылки.
Постоянный источник ссылок и доказательство того, что у нас есть собственные данные.
Что делаем
Страница с агрегированной статистикой по индексу: сколько сайтов, на каких языках, в каких зонах, как менялось за год. 2. Данные обезличены и агрегированы до уровня, на котором ни один отдельный сайт не опознаётся, — иначе страница превращается в инструмент конкурентной разведки. 3. Автоматическое обновление и выгрузка в машиночитаемом виде с явной лицензией на использование со ссылкой. 4. Методика расчёта опубликована рядом: цифра без методики не цитируется, а оспаривается.
Готово, когда
Страница опубликована и обновляется автоматически.
Как проверяем
Цифры на странице воспроизводятся из индекса независимым запросом и совпадают. Проверка обезличивания: по опубликованным агрегатам нельзя восстановить показатели отдельного сайта — это проверяется попыткой, а не декларацией. Обновление идёт автоматически, и устаревшая на месяц страница считается сломанной.
Никто, кроме владельца индекса, не может посчитать долю сайтов рунета на защищённом протоколе, средний вес страницы или долю мёртвых ссылок. На такие данные принято ссылаться, и такие ссылки невозможно купить.
Что делаем
Четыре исследования в год на собственном индексе.
Публикация методики и наборов данных.
Разметка наборов данных.
Работа с профильными изданиями.
Готово, когда
Первое исследование опубликовано и процитировано внешними источниками.
Как проверяем
Не менее десяти ссылающихся доменов на исследование в течение месяца.
Без разметки языковых версий поисковые системы показывают английскому пользователю русскую страницу и наоборот.
Что делаем
Взаимная разметка языковых версий всех публичных страниц.
Указание версии по умолчанию.
Проверка корректности в аудите сборки.
Готово, когда
Разметка на всех публичных страницах, аудит проходит.
Как проверяем
Автоматический аудит разметки языковых версий на всех публичных страницах: ссылки взаимны (каждая версия ссылается на все остальные, включая себя), коды языков валидны, и на каждый набор есть версия по умолчанию. Односторонняя ссылка — самая частая ошибка в этой разметке и молча отключает её целиком.
Внедрение поиска по сайту даёт нам одновременно ссылки, брендинг и данные о тематических запросах.
Что делаем
Условия партнёрства с обязательной атрибуцией.
Пакет материалов для внедрения.
Приоритетная поддержка партнёров.
Отслеживание внедрений.
Готово, когда
Не менее пятидесяти внешних сайтов используют поиск по сайту с видимой атрибуцией.
Как проверяем
Считаются не подписанные соглашения, а работающие внедрения с видимой атрибуцией: проверяется автоматически обходом сайтов-партнёров. Отдельно замеряется, что даёт программа на деле — переходы и запросы, — потому что внедрение без трафика не отличается от отсутствующего.
Колдунщики, панель знаний и справочники требуют продуктового управления, а не правки конфигов в репозитории.
Что делаем
Управление колдунщиками: включение, пороги, источники данных.
Редактирование сущностей панели знаний и исправление фактов.
Управление справочниками регионов и категорий.
Готово, когда
Продуктовая команда управляет содержимым без участия разработчиков.
Как проверяем
Продуктовая команда вносит изменение и выкатывает его без участия разработчика — это и есть проверка, и проводится она наблюдением за реальным изменением, а не опросом. Отдельно: каждое изменение попадает в журнал с автором, и любое откатывается в один шаг.
Квоты, потребление и блокировки должны быть видны и управляемы, иначе злоупотребление обнаруживается по счёту за трафик.
Что делаем
Список ключей с тарифом, потреблением и остатком квоты.
Блокировка и разблокировка с обоснованием.
Оповещения о всплесках потребления.
Готово, когда
Ключи управляются из интерфейса, всплески видны.
Как проверяем
Всплеск потребления по ключу виден в интерфейсе в течение пяти минут, а не в конце месяца по счёту за трафик. Проверяется искусственным всплеском на тестовом ключе. Блокировка ключа вступает в силу немедленно и проверяется тем, что следующий запрос получает отказ, а не тем, что запись изменилась в базе.
Ворота фазы 3
Все критерии обязательны. Не пройдены — фаза продлевается,
а не закрывается.
2 млрд документов, обход 10 000 страниц в секунду
pFound@10 не ниже 0.62 на русском — целевой уровень программы
pFound@10 не ниже 0.58 на английском
Доля запросов без релевантных результатов не выше 3%
Задержка на p99 не выше 300 мс при 1500 запросах в секунду
Доступность 99.95% за квартал
Генеративный ответ: доля утверждений без подтверждения источником не выше 1%
Платформа заданий выдаёт не менее 10 000 оценок в неделю при согласии не ниже 0.6
Расширение для браузера: не менее 50 000 установок
1 млн пользователей в месяц
500 внешних сайтов в кабинете вебмастера, Метрика на 20 000 сайтов
Публичный программный интерфейс работает, есть платящие клиенты
6000 наших страниц в индексе конкурентов, 2000 ссылающихся доменов
Фаза 4
Полнота
Месяцы
27–38
Календарь
ноя 2028 – окт 2029
Команда
70 чел.
Индекс
10 млрд
Бюджет
1.12 млрд ₽
Задач
27
Недель работ
372
Закрыть продуктовые пробелы, из-за которых пользователь уходит к конкуренту даже тогда, когда качество основного поиска сопоставимо. К этому моменту веб-поиск работает и измеряется; проигрыш идёт по вертикалям, мобильным устройствам и локальным запросам.
Индекс и поисккритический путь3 backend + 2 инфраструктура20 нед.зависит от 3.1
Зачем
Пятикратный рост корпуса. На этом объёме векторный слой перестаёт укладываться в схему предыдущей фазы: граф соседства на десяти миллиардах точек требует другой организации.
Что делаем
Расширение до примерно двухсот шардов с тройной репликацией.
Переход векторного слоя на схему с кластеризацией поверх графа в памяти: по опубликованным замерам она вдвое быстрее предыдущей при той же полноте и той же памяти на трёхмиллиардных наборах.
Пересмотр порогов между слоями индекса: доля горячего слоя при росте корпуса падает.
Проверка, что время полной пересборки остаётся управляемым.
Готово, когда
10 млрд документов в индексе, задержка на p99 не выше 300 мс при шести тысячах запросов в секунду.
Как проверяем
Нагрузочный тест на целевом объёме и целевой нагрузке в течение суток.
За пределами пятисот терабайт эксплуатационные свойства становятся важнее простоты: нужны предсказуемое восстановление, управление размещением и работа с деградированным кластером.
Что делаем
Оценка текущего решения на целевых объёмах.
Пробное развёртывание более зрелой альтернативы.
Решение по данным, а не по репутации систем.
Миграция при положительном решении.
Готово, когда
Решение принято и записано; при переходе миграция завершена без потерь.
Как проверяем
Проверка целостности всех объектов по контрольным суммам после миграции.
Транзакционные запросы — заметная доля трафика и почти вся коммерческая ценность поиска. Без товарной вертикали пользователь с намерением купить уходит целиком.
Что делаем
Приём товарных фидов от магазинов через кабинет вебмастера.
Извлечение товаров из структурированной разметки для тех, кто фид не даёт.
Сопоставление одинаковых товаров разных продавцов.
Локальные запросы без карты отвечаются наполовину. При этом собственную картографию мы не строим никогда: это отдельная компания стоимостью в наш пятилетний бюджет.
Что делаем
Открытая картографическая подложка как основа, коммерческий фид как дополнение.
Слой организаций строим свой — это и есть наша часть работы.
Поиск организаций с фильтрами по категории, часам работы, рейтингу.
Построение маршрутов через партнёрский сервис.
Карточка организации в веб-выдаче на локальных запросах.
Готово, когда
Локальный поиск работает, организации находятся с картой.
Как проверяем
Корзина из пятисот локальных запросов по десяти городам.
Продукт2 вертикали + 1 антиспам14 нед.зависит от 4.13
Зачем
Отзывы дают уникальный контент, которого нет ни у кого, и одновременно притягивают накрутку и юридические претензии. Механика должна быть продумана до запуска, а не после.
Что делаем
Отзывы только от подтверждённых аккаунтов с историей.
Рейтинг считается внутри категории: иначе кафе сравниваются с автосервисами, и сравнение бессмысленно.
Порог: рейтинг показывается от трёх оценок.
Обязательное право владельца на публичный ответ.
Публикация с задержкой и антинакруточные проверки.
Процедура удаления отзыва по обоснованной жалобе.
Готово, когда
Отзывы работают, рейтинг считается внутри категории, накрутка обнаруживается.
Как проверяем
Учение: имитация накрутки на тестовой организации обнаруживается до публикации.
Риск
Отзывы — источник юридических претензий. Процедура рассмотрения жалоб и удаления должна быть готова и проверена юристом до запуска, а не после первой претензии.
Продукт2 вертикали + 1 ML8 нед.зависит от 2.16, I2.5, I4.1
Зачем
В вертикали картинок поиск по изображению — способ ввода (I2.4, I2.5). Как отдельный сценарий он решает другие задачи: узнать объект, найти товар, найти источник — и потому имеет собственную точку входа с главной и из мобильного приложения, а не только вкладку.
Что делаем
Отдельная точка входа с главной страницы и из приложения, с загрузкой, перетаскиванием и вставкой из буфера.
Ответ, собранный вокруг объекта: что это, похожие изображения, товар, источник и более крупные версии.
Связь с распознаванием объектов (I4.1) и с товарной вертикалью (4.2).
Поиск источника изображения: первоисточник и все известные носители (I2.9).
Единое состояние с вертикалью: сценарий и вкладка не расходятся в результатах на одном и том же файле.
Готово, когда
Изображение принимается тремя способами, ответ содержит объект, похожие, товар и источник, а результаты сценария и вертикали на одном файле совпадают.
Как проверяем
Корзина из трёхсот изображений с известным ожидаемым результатом: доля непустых верных ответов по каждому из четырёх блоков измеряется отдельно.
Риск
Сценарий дублирует вертикаль и расходится с ней в выдаче. Смягчение: обе точки входа обращаются к одному контракту поиска по изображению, что проверяется автотестом на совпадение выдачи.
Продолжение линии на плотность блоков с готовым ответом, теперь на данных партнёрских фидов.
Что делаем
Спортивные результаты и расписания матчей.
Расписания транспорта.
Товарные предложения на транзакционных запросах.
Карта и организации на локальных запросах.
Соблюдение общего лимита блоков.
Готово, когда
Колдунщики работают на партнёрских данных, лимит соблюдается.
Как проверяем
Проверка актуальности данных партнёрских фидов: колдунщик на устаревших данных хуже отсутствующего, потому что показывает неверную цену или расписание с нашей подписью. Замеряется задержка от изменения у партнёра до изменения в выдаче, и она входит в критерий приёмки наравне с долей покрытия.
Продукткритический путь6 мобильная разработка24 нед.зависит от 3.17
Зачем
Более половины трафика мобильный, и на мобильных устройствах приложение даёт то, чего не даёт браузер: место на экране, уведомления, голосовой ввод по кнопке, поиск по изображению с камеры.
Что делаем
Приложения для двух платформ с общей логикой и нативными интерфейсами.
Поиск, вертикали, аккаунт, коллекции.
Голосовой ввод и поиск по камере.
Виджет на домашнем экране.
Возможность установки поиском по умолчанию там, где платформа это позволяет.
Работа в офлайне для сохранённого содержимого.
Готово, когда
Приложения опубликованы в обоих магазинах, доля мобильного трафика не ниже пятидесяти процентов.
Как проверяем
Оценка в магазинах не ниже 4.3; доля удалений в первую неделю ниже двадцати пяти процентов.
Голосовой сценарий незакончен без озвучивания: пользователь, задавший вопрос голосом, обычно не может читать.
Что делаем
Синтез речи для быстрых ответов и генеративного блока.
Управление воспроизведением.
Отключаемость в настройках.
Готово, когда
Ответы озвучиваются в мобильных приложениях.
Как проверяем
Разборчивость проверяется на записях: слушатели, не видевшие текста, воспроизводят факты из ответа. Отдельно — обработка того, что произносится плохо: адреса, номера, сокращения и иноязычные названия проверяются списком, а не выборочно, потому что именно на них озвучивание и ломается.
Продукт4 продукт + 2 backend24 нед.зависит от 3.17
Зачем
Основная монетизация поиска. Ставится последней сознательно: реклама создаёт конфликт интересов с качеством выдачи, и запускать её до того, как качество набрано, — значит подменить цель.
Что делаем
Отдельный сервис показа рекламы, не смешанный с органикой ни в коде, ни в логах.
Явная маркировка каждого объявления и указание рекламодателя.
Не более трёх блоков сверху; первый органический результат не уходит за первый экран.
Аукцион и кабинет рекламодателя.
Регистрация креативов в учётной системе согласно требованиям законодательства.
Отдельный контроль: доля кликов по органике не должна падать после запуска.
Готово, когда
Реклама работает, маркировка соблюдается, требования законодательства выполнены.
Как проверяем
Замер доли органических кликов до и после запуска: падение больше пяти процентов означает, что реклама вытесняет органику, и объём блоков сокращается.
Риск
Реклама подменяет цель: команда начинает оптимизировать доход вместо качества. Смягчение — метрики качества остаются главными в системе целей, а доля органических кликов контролируется отдельно.
Сверка счёта с фактическим потреблением на выборке аккаунтов — расхождение в биллинге обнаруживается клиентом раньше, чем нами, и стоит доверия. Отдельно проверяются пограничные случаи: переход между тарифами в середине периода, возврат, частичный месяц. Именно они и ломаются, а не обычное списание.
Регион и гео2 ML + 1 backend14 нед.зависит от 2.30, 2.43
Зачем
Потолок точности покупных баз на уровне города — около восьмидесяти пяти процентов, и это предел их данных. У нас появляются собственные данные из аналитики и обхода, и на домашнем рынке они точнее.
Что делаем
Сбор соответствий из явных выборов региона пользователями.
Сбор из данных аналитики на сайтах с известной географией.
Обучение модели соответствия подсети и региона.
Гибрид: своя база для России и стран СНГ, покупная для остального мира.
Постоянная проверка по доле ручных смен региона.
Готово, когда
Своя база работает по домашнему рынку, доля ручных смен ниже, чем на покупной.
Как проверяем
Сравнение доли ручных смен региона до и после по каждому городу.
В крупных городах город как единица слишком крупный: «шиномонтаж» в Москве без уточнения района отвечает бесполезно.
Что делаем
Иерархия районов для городов свыше миллиона жителей.
Распознавание районов и станций транспорта в запросе.
Учёт района в локальном ранжировании.
Готово, когда
Районы в справочнике, распознаются в запросе, влияют на выдачу.
Как проверяем
Корзина локальных запросов с указанием района: результат своего района поднимается, результат соседнего не отсекается — район уточняет, но не ограничивает. Отдельно проверяется распознавание разговорных названий районов, которых нет в официальном справочнике, но которыми пользуются все.
Браузерный интерфейс распознавания зависит от платформы, работает не везде и передаёт голос третьей стороне. Своё распознавание снимает все три проблемы.
Что делаем
Модель распознавания для русского и английского.
Инференс на устройстве там, где это возможно, на сервере в остальных случаях.
Адаптация под поисковые запросы: они короткие и содержат имена собственные.
Голос не сохраняется после распознавания.
Готово, когда
Своё распознавание заменило браузерное, доля ошибок на словах не выше пятнадцати процентов.
ИИ-структура2 ML12 нед.зависит от 1.55, 2.53, 3.10
Зачем
Слот зарезервирован с первой фазы, и его включение не требует пересмотра архитектуры. На сложных запросах большая модель даёт то, чего не даёт компактный реранкер.
Что делаем
Классификатор сложности запроса: модель вызывается только там, где она нужна.
Реранкинг топ-10 большой моделью.
Доля трафика не выше двух процентов — параметр управляемый, а не следствие.
Жёсткий бюджет стоимости с автоматическим отключением при превышении.
Готово, когда
Слот работает на выбранной доле трафика, прирост качества на сложных запросах измерен.
Как проверяем
Отдельный замер на корзине сложных запросов; общая стоимость в пределах бюджета.
Извлечённый фрагмент иногда плохо отвечает на запрос: ответ разбросан по странице или сформулирован иначе. Сгенерированный сниппет решает это, но требует той же строгости, что и генеративный ответ.
Что делаем
Классификатор: где извлечённый сниппет плох.
Генерация сниппета строго по содержимому страницы.
Проверка обоснованности: сниппет не может утверждать того, чего на странице нет.
Пометка сгенерированных сниппетов.
Отбрасываемость по таймауту с возвратом к извлечённому.
Готово, когда
Абстрактивные сниппеты показываются там, где извлечённые плохи, доля необоснованных ниже одного процента.
Как проверяем
Асессорская проверка двухсот сгенерированных сниппетов на соответствие странице.
ИИ-структура1 ML + 1 фронтенд10 нед.зависит от 2.53, 2.48
Зачем
Аналитик тратит часы на составление запросов к логам. Запрос на естественном языке сокращает это до минут и снимает зависимость от знания схемы данных.
Что делаем
Перевод вопроса на естественном языке в запрос к аналитическому хранилищу.
Показ сгенерированного запроса перед выполнением: доверять, но проверять.
Ограничение прав: помощник не может обращаться к персональным данным.
Журналирование всех запросов.
Готово, когда
Помощник отвечает на типовые вопросы, сгенерированный запрос виден до выполнения.
Как проверяем
На пятидесяти типовых вопросах доля корректных запросов не ниже восьмидесяти процентов.
Реестр признаков растёт, и ручная ревизия перестаёт справляться. Урок из утечки кода конкурента прямой: без автоматики треть признаков мертва в любой момент.
Что делаем
Новые группы признаков: товарные, локальные, многоязычные, поведенческие второго порядка.
Автоматический расчёт важности при каждом обучении.
Автоматический перевод признака в кандидаты на удаление после трёх обучений с нулевым вкладом.
Автоматическое отключение по дате протухания.
Готово, когда
Около тысячи признаков, доля мёртвых не выше десяти процентов.
Как проверяем
Ежемесячный отчёт реестра: число активных, кандидатов на удаление, отключённых.
Ворота фазы 4
Все критерии обязательны. Не пройдены — фаза продлевается,
а не закрывается.
10 млрд документов, обход 40 000 страниц в секунду
pFound@10 не ниже 0.66 на русском, не ниже 0.62 на английском
Задержка на p99 не выше 300 мс при 6000 запросах в секунду
5 млн пользователей в месяц, доля мобильного трафика не ниже 50%
Одиннадцать языков в индексе с измеренным качеством по каждому
Метрика установлена на 100 000 внешних сайтов
Справочник организаций наполнен по городам свыше пятисот тысяч жителей
Доля неактуальных карточек организаций ниже 5%
Мобильные приложения: оценка в магазинах не ниже 4.3
Доля органических кликов не упала после запуска рекламы больше чем на 5%
Фаза 5
Зрелость
Месяцы
39–50
Календарь
ноя 2029 – окт 2030
Команда
100 чел.
Индекс
30 млрд
Бюджет
2.0 млрд ₽
Задач
16
Недель работ
276
Паритет качества с лидерами на целевых сегментах и выход за пределы домашнего рынка. К этому моменту продукт работает и им пользуются; задача фазы — перестать быть локальным решением.
Индекс и поисккритический путь4 backend + 3 инфраструктура24 нед.зависит от 4.1
Зачем
Трёхкратный рост корпуса и переход к по-настоящему многоязычному индексу. На этом объёме стоимость становится определяющим фактором архитектурных решений.
Что делаем
Расширение парка и числа шардов.
Пересмотр соотношения слоёв индекса: горячий слой в долях от корпуса продолжает уменьшаться.
Оптимизация стоимости запроса как самостоятельная задача: она определяет юнит-экономику.
Проверка, что операции обслуживания — пересборка, перебалансировка, восстановление — остаются выполнимыми.
Готово, когда
30 млрд документов, задержка на p99 не выше 280 мс при двадцати тысячах запросов в секунду.
Как проверяем
Нагрузочный тест на целевой нагрузке; замер стоимости обслуживания одного запроса.
Многоязычиекритический путь6 отдельная команда24 нед.зависит от 3.34
Зачем
Самая дорогая часть всемирного поиска. Без сегментации иероглифический текст невозможно ни проиндексировать, ни найти.
Что делаем
Словарные и статистические сегментаторы для китайского, японского и корейского.
Индексация биграмм как страховка на случаях, где сегментатор ошибся: это удваивает размер постингов для кластера, и в расчёте ёмкости учтено.
Обработка смешанного текста: иероглифика вперемешку с латиницей встречается постоянно.
Традиционное и упрощённое письмо как варианты одного языка.
Готово, когда
Три языка индексируются, поиск работает.
Как проверяем
Корзина из тысячи запросов на язык с носителями-асессорами.
Риск
Сегментация — не решённая до конца задача даже для крупных игроков. Смягчение — индексация биграмм даёт запасной путь: даже при ошибке сегментатора документ находится, пусть и с меньшей точностью.
Инфраструктура3 инфраструктура16 нед.зависит от 4.19, 5.9
Зачем
Задержка из Европы в Азию перекрывает весь бюджет: без локальной точки присутствия поиск для азиатского пользователя непригоден.
Что делаем
Развёртывание полного онлайн-контура.
Размещение иероглифического кластера локально.
Маршрутизация трафика по географии.
Соблюдение местных требований к данным.
Готово, когда
Азиатский трафик обслуживается локально, задержка на p99 не выше 300 мс.
Как проверяем
Замер задержки от реальных сетей региона, а не от соседнего дата-центра: разница между этими двумя замерами и есть то, ради чего точка присутствия строится. Отдельно — сценарий отказа: при недоступности локальной точки трафик уходит в ближайшую, и пользователь получает медленный ответ, а не ошибку.
Признак зрелости организации — не размер индекса, а время от гипотезы до выката. Организация, у которой этот цикл занимает квартал, проигрывает независимо от качества инженеров.
Что делаем
Автоматизация всех шагов цикла: задание на разметку, сбор оценок, переобучение, офлайн-замер, интерливинг, выкатка через флаг.
Автоматический переход между шагами при прохождении порогов.
Ручное вмешательство только на принятии решения о выкатке на весь трафик.
Замер длительности цикла как отдельного показателя.
Готово, когда
Полный цикл от гипотезы до выката на весь трафик занимает не более трёх недель.
ИИ-структура3 ML + 2 фронтенд18 нед.зависит от 3.13
Зачем
Часть запросов неоднозначна, и уточняющий вопрос даёт ответ быстрее, чем перебор выдачи. Это функция поиска, а не отдельный голосовой помощник: помощник как продукт не проходит фильтр фокуса.
Что делаем
Определение неоднозначности запроса.
Уточняющий вопрос с вариантами, а не свободным полем.
Сохранение контекста в пределах сессии.
Полная отключаемость: пользователь может никогда этого не видеть.
Готово, когда
Уточнение работает на неоднозначных запросах, отключается в настройках.
Как проверяем
Доля успешных сессий на неоднозначных запросах растёт; на однозначных уточнение не появляется.
Фильтры по году, журналу, автору, доступности полного текста.
Готово, когда
Вертикаль работает, версии связаны.
Как проверяем
Корзина научных запросов с замером полноты по известным работам. Отдельно проверяется связывание версий: препринт, журнальная версия и версия в репозитории опознаются как одна работа, и в выдаче показывается одна запись, а не три. Ошибка связывания здесь заметнее ошибки ранжирования.
Работа с европейской аудиторией без соответствия местному регулированию невозможна, а требования к прозрачности рекомендательных систем прямо влияют на архитектуру.
Что делаем
Правовые основания обработки, право на удаление, переносимость данных.
Ответственный за защиту данных и представитель в регионе.
Оценка воздействия на защиту данных.
Публичное описание принципов работы рекомендательных механизмов.
Механизм жалоб и отчётность.
Разделение контуров: требования разных юрисдикций конфликтуют, и решать это надо разделением, а не компромиссом.
Право2 юриста + 1 backend14 нед.зависит от 5.6, 1.66
Зачем
Работа с европейской аудиторией требует собственного механизма удаления по праву на забвение. Механизм территориальности уже построен в задаче 1.66 — здесь добавляется вторая юрисдикция, а не новая система.
Что делаем
Форма обращения и регламент рассмотрения по европейским требованиям.
Отдельный реестр юрисдикции, не смешивающийся с российским.
Балансировка интересов заявителя и общественного интереса как обязательный этап решения — этого требования нет в российском праве, и решение по одному и тому же обращению может различаться.
Отражение в отчёте о прозрачности отдельной строкой по каждой юрисдикции.
Готово, когда
Обращения по европейскому праву рассматриваются по регламенту, скрытие применяется к европейским пользователям и не затрагивает остальных.
Как проверяем
Сквозной прогон обращения; проверка изоляции реестров: запись одной юрисдикции не влияет на пользователей другой.
Полторы тысячи признаков вручную не сопровождаются: любая ручная процедура на таком объёме превращается в формальность.
Что делаем
Автоматическое добавление признака в реестр при первом использовании.
Автоматический расчёт важности, стоимости и корреляции с существующими.
Автоматическое предупреждение владельцу о приближении даты протухания.
Автоматическое отключение и удаление по регламенту.
Готово, когда
Реестр сопровождается без ручных операций, доля мёртвых признаков ниже пяти процентов.
Как проверяем
Доля мёртвых признаков считается автоматически и выводится на панель: признак, не использованный ни одной моделью в течение квартала, помечается и удаляется по регламенту. Проверка самого цикла — добавление признака и его вывод из эксплуатации проходят без единой ручной операции, и это подтверждается прогоном, а не описанием регламента.
Пересказ длинной переписки — заметная экономия времени. Но содержимое писем не покидает почтовый контур ни при каких условиях, поэтому только локальные модели.
Что делаем
Компактная модель суммаризации, работающая внутри почтового контура.
Пересказ длинного письма и пересказ треда.
Полная отключаемость.
Техническая невозможность передачи содержимого во внешние интерфейсы, проверяемая шлюзом моделей.
Готово, когда
Суммаризация работает, содержимое не покидает контур.
Как проверяем
Аудит сетевых обращений почтового контура: обращений к внешним интерфейсам моделей нет.
Ворота фазы 5
Все критерии обязательны. Не пройдены — фаза продлевается,
а не закрывается.
30 млрд документов, обход 100 000 страниц в секунду
pFound@10 не ниже 0.70 на русском, 0.65 на английском, 0.50 на иероглифических языках
Задержка на p99 не выше 280 мс при 20 000 запросах в секунду
Потеря любого из трёх дата-центров не приводит к деградации
Фаза 6
Развитие
Месяцы
51+
Календарь
с ноя 2030
Команда
120 чел.
Задач
10
Недель работ
0
Непрерывный цикл без фиксированного конца. Фаза 6 отличается от предыдущих принципиально: у неё нет ворот выхода, потому что выходить некуда — есть только поддержание и улучшение.
Единственное направление, где противник адаптируется в ответ на наши действия. Здесь не бывает состояния «сделано»: любое улучшение антиспама порождает новый обходной приём.
Что делаем
Постоянный мониторинг новых приёмов манипуляции.
Ежемесячное переобучение классификаторов.
Теневой режим перед каждым изменением порогов.
Разбор каждого случая массового пропуска и каждого ложного срабатывания.
Готово, когда
Показатель непрерывный: точность и полнота не деградируют квартал к кварталу.
Как проверяем
Квартальный замер на обновляемой тестовой выборке, включающей новые приёмы.
Новые вертикали и колдунщики нужно делать там, где есть спрос, а не там, где интересно команде. Данные о запросах отвечают на этот вопрос точнее любого обсуждения.
Что делаем
Регулярный анализ запросов без хорошего ответа.
Приоритизация новых блоков и вертикалей по объёму такого спроса.
Отказ от блоков с низкой пользой: колдунщик, которым не пользуются, занимает место.
Готово, когда
Показатель непрерывный: доля запросов без хорошего ответа снижается.
Как проверяем
Ежеквартальный разбор топ-1000 запросов с плохой выдачей.
Архитектура шлюза и слотов рассчитана на добавление функций, но сами модели устаревают быстро, и реестр требует постоянного обновления.
Что делаем
Замена моделей на более качественные по мере их появления.
Включение зарезервированных слотов по мере созревания технологии и экономики.
Ревизия реестра моделей: отключение устаревших.
Пересмотр политики данных при появлении новых классов задач.
Готово, когда
Показатель непрерывный: ни одна модель в проде не старше двух лет без обоснования.
Как проверяем
Ежеквартальная ревизия реестра моделей.
Параллельный трек
Почта
Месяцы
трек
Календарь
с фазы 2
Команда
22 чел.
Бюджет
470 млн ₽
Задач
56
Недель работ
386
Построить почтовую службу, которая превращает Yottis ID из формальности в актив: поисковик меняют за секунду, почтовый ящик — годами. Плюс использовать то, чего нет ни у одного отдельно стоящего почтового сервиса, — собственный веб-индекс с репутацией каждого хоста.
Правоархитектор + инфраструктура6 нед.зависит от M0.1
Зачем
Требования к техническим средствам определяют архитектуру хранения и сети, и учитывать их задним числом означает переделку.
Что делаем
Требования к оборудованию и его размещению.
Поставщики и сроки поставки.
Влияние на архитектуру: точки подключения, изоляция контуров.
План внедрения и согласования.
Готово, когда
План внедрения составлен и согласован с юристом.
Как проверяем
План согласован юристом письменно, а не устно, и содержит сроки поставки с запасом: оборудование этого класса заказывается месяцами, и срыв срока здесь останавливает запуск целиком. Отдельно проверяется, что архитектура хранения и сети уже учитывает требования, а не будет переделываться после.
Почтовое хранилище растёт монотонно и не сжимается: письма не устаревают и не выбрасываются. Это принципиально иная экономика, чем у поиска, и она требует платных тарифов с первого дня.
Что делаем
Оценка целевой аудитории по сегментам: частные пользователи, малый бизнес, организации.
Тарифная сетка: бесплатный объём, платные уровни, почта для домена.
Модель окупаемости на горизонте пяти лет с учётом контура хранения.
Готово, когда
Модель окупаемости готова, точка безубыточности определена.
Как проверяем
Модель проверяется на устойчивость к отклонениям: что происходит при вдвое меньшем притоке платящих и при вдвое большем росте хранилища. Точка безубыточности, существующая только в базовом сценарии, — не точка безубыточности. Отдельно сверяются удельные затраты на гигабайт с фактическим счётом за первый месяц эксплуатации.
Правокритический путьруководство1 нед.зависит от M0.1, M0.2, M0.3, M0.5
Зачем
Ворота трека. Решение принимается один раз, на основании расчётов, и записывается.
Что делаем
Сопоставление обязательств, стоимости и ожидаемой выручки.
Решение с обоснованием.
При отказе — письменная фиксация причины, чтобы к вопросу не возвращались каждые полгода.
Готово, когда
Решение принято, записано с цифрами и датой и доведено до команды; при отказе зафиксирована причина и условия, при которых к вопросу возвращаются.
Как проверяем
Решение записано с цифрами и датой, а не как протокол намерений. Проверка простая: через полгода по записи можно восстановить, на каких допущениях оно принималось, и понять, изменились ли они. Решение без такой записи придётся принимать заново каждый раз, когда о нём вспомнят.
Записи домена нужно спланировать до запуска, а одну существующую — обязательно заменить.
Что делаем
Проверка домена как почтового: не был ли он ранее в чёрных списках.
План записей: обмен почтой, подписи, политики, транспортная безопасность.
Резервирование адресов для приёмников и отправителей.
План замены существующей записи политики отправки: сейчас она означает, что домен почту не отправляет, и с запуском почты собственные письма начнут отвергаться.
Готово, когда
План записей готов, домен проверен на историю в чёрных списках.
Как проверяем
Проверка домена по основным чёрным спискам: записей нет.
Пользователь должен отправлять письма из почтовых клиентов, а не только из веб-интерфейса.
Что делаем
Приём на портах отправки с обязательной аутентификацией через Yottis ID.
Лимиты отправки по аккаунту с учётом возраста аккаунта.
Подпись писем от имени пользователя.
Проверка, что пользователь отправляет от своего адреса.
Готово, когда
Отправка из внешних клиентов работает, лимиты соблюдаются.
Как проверяем
Отправка проверяется из трёх распространённых клиентов на настольной системе и телефоне. Лимиты проверяются превышением: аккаунт упирается в предел и получает внятный отказ, а не молчаливую потерю письма. Отдельно — свежесозданный аккаунт обязан иметь пониженный лимит: массовая рассылка с новых аккаунтов это первый признак угона.
Часть корпоративных клиентов и устройств поддерживает только его.
Что делаем
Реализация протокола на стандартных портах с обязательным шифрованием канала. 2. Ограничения по умолчанию: протокол не поддерживает папки и синхронизацию, и это надо показывать пользователю при включении, а не оставлять на его догадливость. 3. Отключение по умолчанию для новых аккаунтов: включает тот, кому он действительно нужен. 4. Отдельные лимиты и отдельный журнал — старые протоколы чаще становятся вектором подбора паролей, чем современные.
Готово, когда
Протокол работает, проверен на трёх клиентах.
Как проверяем
Проверка на трёх реальных клиентах разных поколений, включая устройство без обновлений, ради которого протокол и поддерживается. Отдельно — попытка подбора пароля через этот протокол обязана упираться в те же ограничения, что и через основной вход: старый протокол не должен быть обходным путём вокруг защиты аккаунта.
Почтакритический путь2 backend7 нед.зависит от M0.6
Зачем
Метаданные — заголовки, флаги, папки, треды, размеры — читаются постоянно мелкими порциями: открытие списка писем это сотни строк. Нужна база с быстрым произвольным чтением и транзакциями.
Что делаем
Реляционное хранилище с шардированием по ящику.
Схема: письма, папки, флаги, треды, вложения по ссылке.
Транзакционность операций перемещения и удаления.
Индексы по времени: у ящиков свыше десяти тысяч писем обращения идут почти только к свежему.
Готово, когда
Метаданные хранятся, шардирование работает, операции транзакционны.
Как проверяем
Нагрузочный тест на ящике в миллион писем: открытие списка не дольше 200 мс.
Тела писем пишутся один раз и читаются редко, зато крупно. Держать их вместе с метаданными означает платить дорогой ценой за девяносто восемь процентов объёма.
Что делаем
Объектное хранилище для тел и вложений.
Дедупликация вложений по содержимому: одна презентация на пятьсот адресов при наивном хранении займёт место пятьсот раз.
Счётчик ссылок на объект и безопасное удаление.
Шифрование в покое.
Готово, когда
Тела хранятся отдельно, дедупликация работает.
Как проверяем
На корпоративном потоке дедупликация экономит не менее тридцати процентов объёма.
Переписка из двадцати писем, разбросанная по списку, нечитаема. Группировка в тред — базовое ожидание.
Что делаем
Группировка по заголовкам связей между письмами.
Запасной вариант по теме и участникам, когда заголовки отсутствуют или сломаны.
Обработка ветвлений переписки.
Отображение свёрнутого треда с числом писем.
Готово, когда
Треды собираются по заголовкам связей между письмами, а при их отсутствии или порче — по теме и участникам; доля неверных объединений на контрольной выборке ниже одного процента.
Как проверяем
На выборке из тысячи реальных переписок доля неверных объединений ниже одного процента.
Основа фильтрации. Берём зрелое открытое решение с подходящей лицензией: оно обрабатывает примерно вдесятеро больше сообщений, чем классическая альтернатива, на тех же правилах.
Что делаем
Развёртывание и настройка.
Байесовский классификатор на нашем потоке.
Нечёткие хеши для обнаружения повторов.
Настройка порогов с приоритетом точности над полнотой.
Готово, когда
Базовый антиспам работает, отсев не ниже восьмидесяти пяти процентов.
Как проверяем
Замер на размеченном потоке: отсев не ниже 85% при доле ложных срабатываний ниже 0.1%. Приоритет у второго числа: пропущенный спам раздражает, потерянное письмо теряет пользователя. Отдельно проверяется, что письмо, помеченное как спам ошибочно, находится поиском и восстанавливается пользователем за одно действие.
Почтакритический путь2 ML8 нед.зависит от M1.13, 1.23
Зачем
Наше преимущество, которого нет ни у одного отдельно стоящего почтового сервиса. Другие проверяют ссылки через внешние сервисы репутации; мы сами обошли эти сайты и знаем о них всё.
Что делаем
Извлечение всех ссылок из письма.
Проверка каждой по собственному индексу: авторитет хоста, доверие, оценка спама, возраст домена.
Признак «домен не обойдён вообще» — для трёхдневного домена это сильнейший сигнал.
Расхождение видимого текста ссылки и фактического адреса.
Признаки идут в общий классификатор с высоким весом.
Готово, когда
Слой работает, фишинг со ссылкой на новый домен без входящих ссылок отсекается.
Как проверяем
На корпусе известных фишинговых писем полнота обнаружения по одному этому слою не ниже семидесяти процентов.
Непрозрачная папка спама — то, за что справедливо ругают крупные почтовые сервисы. Пользователь должен видеть, почему письмо там оказалось, и уметь это отменить.
Что делаем
Конкретная причина из закрытого списка по каждому письму в спаме.
Показ результатов проверки подлинности.
Для причины по ссылке — конкретика: возраст домена, оценка спама.
Кнопки «это не спам» и «заблокировать отправителя».
Готово, когда
По каждому письму в спаме видна конкретная причина.
Как проверяем
Асессорская проверка ста писем: причина соответствует фактическому основанию решения.
Основной интерфейс для большинства пользователей. Раскладка почты устоялась за тридцать лет, и изобретать здесь новое — вредить пользователю: мышечная память переноса с другого сервиса стоит дороже оригинальности.
Что делаем
Три колонки: папки, список, письмо.
Чтение, написание, ответ, пересылка, вложения.
Треды со сворачиванием.
Базовый режим работает без скриптов.
Клавиатурные сокращения, привычные по другим сервисам.
Готово, когда
Интерфейс работает, базовый режим доступен без скриптов.
Как проверяем
Прохождение основных сценариев с клавиатуры без мыши.
Единый аккаунт — смысл всей затеи с почтой. Отдельный вход в почту обесценивает идею.
Что делаем
Единый вход с двухфакторной аутентификацией и ключами доступа.
Единый список устройств и сессий.
Пароли приложений для внешних почтовых клиентов, не поддерживающих современную аутентификацию.
Готово, когда
Вход единый, пароли приложений работают.
Как проверяем
Смена пароля в Yottis ID немедленно закрывает сессии почты — это и есть проверка единства аккаунта, а не наличие общей формы входа. Пароли приложений проверяются на клиенте без поддержки современной аутентификации, ради которого они и заведены, и отзываются по одному, не затрагивая остальные.
Те же требования, что и в поиске: почтой пользуются ежедневно, в том числе люди с ограничениями.
Что делаем
Тёмная тема с сохранением читаемости писем в чужой вёрстке — письмо приходит со своими цветами, и инвертировать его целиком нельзя. 2. Полная работа с клавиатуры: чтение, ответ, перемещение, поиск — без мыши. 3. Разметка для экранных дикторов на списке писем, чтении и составлении. 4. Контрастность и размеры по нормам уровня AA, включая состояния фокуса.
Готово, когда
Аудит доступности пройден, замечаний уровней A и AA нет.
Как проверяем
Аудит доступности проходят без замечаний уровней A и AA. Отдельно — сценарий «прочитать, ответить, отправить» выполняется полностью с клавиатуры и полностью через экранный диктор, и проверяется это прохождением сценария, а не проверкой разметки: разметка бывает формально верной при непроходимом сценарии.
Почтакритический путь1 инфраструктура8 нед.зависит от M1.23, M1.3
Зачем
Новые адреса не имеют репутации, и массовая отправка с них даёт немедленную блокировку. Прогрев начинается за два месяца до открытия — позже уже поздно.
Что делаем
Восьминедельная схема наращивания объёма по каждому крупному провайдеру.
Отслеживание доли доставки и жалоб на каждой неделе.
Остановка наращивания при росте жалоб.
Раздельный прогрев пулов транзакционных писем и рассылок.
Готово, когда
Прогрев завершён, доля доставки во входящие не ниже девяноста восьми процентов.
Как проверяем
Замер по каждому крупному провайдеру отдельно.
Риск
С пяти тысяч писем в сутки на крупного провайдера мы официально считаемся массовым отправителем и подпадаем под все требования: подписи, политики, отписка в один клик с обработкой за двое суток, доля жалоб ниже одной десятой процента.
Панели провайдеров — единственный источник данных о том, как они видят нашу репутацию.
Что делаем
Регистрация во всех крупных панелях провайдеров и подтверждение владения доменом. 2. Настройка отчётов о доставке и жалобах на общий адрес команды. 3. Подписка на петли обратной связи: жалоба пользователя провайдеру должна доходить до нас. 4. Регламент реакции: кто смотрит отчёты, с какой частотой и что делает при росте жалоб.
Готово, когда
Регистрация во всех крупных панелях выполнена, данные поступают.
Как проверяем
Тестовая рассылка на ящики в каждой панели: письма доходят до входящих, а не в спам, и это видно в самой панели. Петля обратной связи проверяется отправкой жалобы на собственное письмо — она обязана дойти до нас. Регламент проверяется тем, что отчёт за первую неделю действительно прочитан и разобран, а не просто поступает.
Папки предполагают, что письмо лежит в одном месте; метки позволяют нескольким классификациям сосуществовать.
Что делаем
Метки с цветом и иерархией, произвольное число на письме. 2. Автоматическое назначение по правилам фильтрации. 3. Фильтрация и поиск по меткам, в том числе по сочетанию нескольких. 4. Метки применяются к переписке целиком или к отдельному письму — выбор за пользователем, потому что оба сценария встречаются.
Готово, когда
Метки создаются, назначаются, фильтруются, видны в списке.
Как проверяем
Письмо с несколькими метками находится по каждой из них и по их сочетанию. Отдельно — поведение при удалении метки: письма не должны пропадать вместе с ней, а это самая частая ошибка в реализациях, где метка хранится как папка.
Отправка письма в рабочее время и напоминание об отсутствии ответа — простые функции с высокой оценкой пользователями.
Что делаем
Отправка по расписанию с возможностью отмены до момента отправки.
Напоминание, если на письмо не ответили за указанный срок.
Отложенное чтение: убрать письмо из входящих до срока.
Готово, когда
Отложенная отправка, напоминание об отсутствии ответа и отложенное чтение работают, причём отложенное письмо уходит по часовому поясу пользователя, а отмена возможна вплоть до самого момента отправки.
Как проверяем
Отложенное письмо уходит точно в указанное время с учётом часового пояса пользователя, а не сервера. Отмена до момента отправки проверяется в том числе за секунду до срока. Напоминание не срабатывает, если ответ пришёл, — включая случай, когда ответ пришёл не на само письмо, а в ту же переписку.
Одноразовый адрес для регистрации сразу показывает, кто продал базу: спам приходит на адрес, известный только одному сервису.
Что делаем
Постоянные алиасы для разных целей.
Одноразовые адреса с указанием, для какого сервиса созданы.
Отключение адреса одним действием.
Показ, на какой адрес пришло письмо.
Готово, когда
Алиасы и одноразовые адреса работают.
Как проверяем
Отключённый одноразовый адрес перестаёт принимать почту немедленно, а отправитель получает отказ, а не молчание: молчаливое поглощение писем создаёт у отправителя ложную уверенность в доставке. Отдельно проверяется, что в списке писем видно, на какой именно адрес пришло письмо — иначе весь смысл одноразовых адресов теряется.
Современная замена старому протоколу: один интерфейс поверх обычных веб-технологий вместо протокола с состоянием, дешёвая синхронизация и уведомления без опроса.
Что делаем
Реализация протокола для почты.
Уведомления об изменениях.
Собственные клиенты переводятся на него; старый протокол остаётся для совместимости.
Готово, когда
Протокол работает, есть внешний клиент, который его использует.
Как проверяем
Внешний клиент, реализующий протокол, работает с нашим сервером без правок на его стороне — это и есть проверка соответствия стандарту. Отдельно замеряется то, ради чего протокол берётся: объём трафика при синхронизации большого ящика сравнивается со старым протоколом на том же ящике.
Подпись и шаблон — это то, что человек иначе набирает по десять раз в день. Экономия кажется мелкой ровно до подсчёта: у сотрудника поддержки на шаблонных ответах уходит больше времени, чем на содержательные письма. Подписи по адресам отправки нужны отдельно: с одного ящика пишут и от себя, и от организации, и путать эти две подписи неловко перед адресатом.
Что делаем
Шаблоны с подстановкой полей: имя адресата, дата, ссылка на переписку.
Подписи, привязанные к адресу отправки, включая алиасы, с автоматическим выбором.
Общие шаблоны организации, доступные всем сотрудникам, и личные.
Вставка шаблона в существующее письмо, а не только создание из шаблона.
Готово, когда
Шаблоны сохраняются и подставляются, подписи настраиваются по адресам отправки.
Как проверяем
Подпись подставляется автоматически при смене адреса отправки, включая алиасы. Шаблон с подстановкой полей проверяется на письме без адресата и без даты — незаполненное поле не должно оставлять в тексте следов подстановки: пустой шаблон, ушедший клиенту с фигурными скобками, хуже отсутствующего.
Без уведомлений веб-почта требует постоянной проверки вкладки.
Что делаем
Уведомления в браузере с настройкой по важности.
Правила: уведомлять только о письмах из входящих, только от избранных отправителей.
Тихие часы.
Готово, когда
Уведомления работают и настраиваются.
Как проверяем
Тихие часы соблюдаются с учётом часового пояса устройства, а не аккаунта: человек в поездке не должен получать уведомления ночью по домашнему времени. Правила проверяются на письме, попадающем сразу под несколько: приоритет правил должен быть определён, а не случаен.
Часто повторяющийся поиск удобнее сохранить, чем набирать заново.
Что делаем
Сохранённые поиски как виртуальные папки.
Поиск внутри вложений.
История поисков по ящику.
Готово, когда
Сохранённые поиски работают как папки.
Как проверяем
Сохранённый поиск ведёт себя как папка: новое письмо, подходящее под условие, появляется в нём без повторного запуска поиска. Поиск внутри вложений проверяется на распространённых форматах документов, включая сканы без текстового слоя — по ним поиск не работает, и это должно быть видно пользователю, а не выглядеть как отсутствие результатов.
Почта2 backend + 1 фронтенд10 нед.зависит от M3.1, 4.7
Зачем
Компании работают с общими ящиками и делегированием, и без этого почта для домена не покрывает их сценарии.
Что делаем
Общие ящики с разграничением доступа.
Делегирование доступа к своему ящику.
Журнал действий участников.
Политики организации: обязательная двухфакторная аутентификация, ограничения на пересылку.
Готово, когда
Общие ящики и делегирование работают.
Как проверяем
Разграничение доступа проверяется попыткой обойти: сотрудник без прав на общий ящик не получает к нему доступа ни через веб, ни через почтовый клиент, ни через программный интерфейс. Журнал действий содержит достаточно, чтобы восстановить, кто прочитал и кто ответил, — в общем ящике это первый вопрос при разборе.
Календарь неотделим от рабочей почты: приглашения приходят письмами, и обрабатывать их вне почты неудобно.
Что делаем
Стандартный протокол синхронизации календарей.
Приглашения и ответы на них прямо из письма.
Общие календари в организации.
Поиск свободного времени участников.
Готово, когда
Календарь работает, синхронизируется со стандартными клиентами.
Как проверяем
Синхронизация проверяется с тремя стандартными клиентами, включая мобильные. Приглашение, принятое из письма, появляется в календаре у всех участников, а не только у принявшего. Отдельно — повторяющиеся события и события с исключениями: именно на них календарные реализации расходятся между собой.
Адресная книга — это то, ради чего почтовый клиент вообще открывают вторым. Без синхронизации контактов почта остаётся веб-страницей, а не рабочим инструментом: телефон и ноутбук должны видеть один и тот же список, иначе им перестают пользоваться на обоих. Автоматическое пополнение из переписки нужно потому, что вручную контакты не заводит никто — и адресная книга остаётся пустой.
Что делаем
Стандартный протокол синхронизации контактов.
Автоматическое пополнение из переписки.
Группы контактов и общие адресные книги организации.
Готово, когда
Контакты синхронизируются со стандартными клиентами.
Как проверяем
Контакт, созданный на телефоне, появляется в веб-интерфейсе и в почтовом клиенте без ручной синхронизации. Автоматическое пополнение из переписки проверяется на предмет мусора: адреса из рассылок и автоответчиков в адресную книгу попадать не должны, иначе она становится непригодной за месяц.
Почтовое хранилище растёт монотонно и не сжимается — платные тарифы нужны с первого дня, а не «когда наберём аудиторию».
Что делаем
Тарифы: бесплатный объём, расширенное хранилище, почта для домена, корпоративный план.
Учёт объёма и числа ящиков.
Оплата и документы для юридических лиц.
Уведомления о приближении к лимиту и мягкая деградация вместо резкого отключения.
Готово, когда
Тарифы работают, оплата проходит, документы формируются.
Как проверяем
Сверка счёта с фактическим объёмом хранилища и числом ящиков на выборке организаций. Отдельно проверяются пограничные случаи: добавление ящика в середине периода, превышение квоты, переход между тарифами. Документы для юридических лиц проверяются бухгалтером, а не разработчиком — формально верный документ бывает непригодным для учёта.
Администратор организации, вынужденный обращаться в поддержку ради заведения ящика, — это и стоимость поддержки на нашей стороне, и повод сменить провайдера на его. Панель окупается на первой же организации в сотню сотрудников. Отдельно она нужна для сценария, который случается всегда и всегда внезапно: сотрудник уволился, а его переписка нужна компании — и это должно решаться администратором за минуту, а не письмом в поддержку.
Что делаем
Управление сотрудниками, ящиками и квотами.
Политики безопасности и правила на уровне домена.
Журнал действий и отчёты.
Передача ящика уволившегося сотрудника.
Готово, когда
Администратор организации управляет всем без обращения в поддержку.
Как проверяем
Сценарии «завести сотрудника», «изменить квоту», «передать ящик уволившегося» и «включить политику для домена» проходятся администратором без обращения в поддержку и без правки конфигураций. Проверка проводится наблюдением за реальным администратором, а не прохождением сценария разработчиком, который знает, куда нажимать.
Компания переезжает целиком или не переезжает вовсе: почта без календаря и контактов её не устраивает.
Что делаем
Импорт почты, календарей и контактов из распространённых корпоративных систем.
Перенос структуры организации и групп.
Поэтапный переезд с параллельной работой двух систем.
Готово, когда
Миграция проходит на тестовой организации в сто ящиков без потерь.
Как проверяем
Миграция тестовой организации в сто ящиков: сверяется число писем, вложений, событий календаря и контактов до и после, включая структуру папок и меток. Потеря даже одного письма считается провалом: компания, потерявшая переписку при переезде, не остаётся. Отдельно проверяется параллельная работа во время переезда.
Бизнес платит не только за функции, но и за гарантии. Без соглашения об уровне обслуживания корпоративные клиенты не приходят.
Что делаем
Гарантии доступности и времени реакции по тарифам.
Приоритетная поддержка для платных планов.
Компенсации при нарушении гарантий.
Публичная страница статуса сервиса.
Готово, когда
Соглашение опубликовано, поддержка укомплектована, статус публикуется.
Как проверяем
Гарантии доступности проверяются по фактическим замерам за квартал, а не по обещаниям: публичная страница статуса показывает то же, что внутренний мониторинг. Компенсация при нарушении начисляется автоматически — компенсация по заявлению клиента не является гарантией, а является формальностью.
Почта4 мобильная разработка20 нед.зависит от M2.7, 4.4
Зачем
Почту читают с телефона чаще, чем с компьютера, и веб-версия на мобильном проигрывает нативному приложению по всем параметрам.
Что делаем
Приложения для двух платформ.
Уведомления с настройкой по важности.
Работа в офлайне с синхронизацией.
Быстрые действия по свайпу.
Единый аккаунт с поиском.
Готово, когда
Приложения опубликованы, оценка не ниже 4.3.
Как проверяем
Работа в офлайне проверяется в режиме полёта: письма читаются, ответы составляются и уходят при появлении сети — без дублей, что и есть главная ошибка офлайн-синхронизации. Оценка не ниже 4.3 замеряется через месяц после публикации, а не в день выхода.
Почта2 backend + 1 фронтенд14 нед.зависит от M1.18
Зачем
Для части аудитории это обязательное требование, а не удобство.
Что делаем
Поддержка распространённых стандартов шифрования писем.
Управление ключами на стороне пользователя.
Понятная индикация состояния шифрования.
Честное объяснение ограничений: зашифрованные письма не участвуют в поиске по содержимому.
Готово, когда
Шифрование работает, состояние понятно из интерфейса.
Как проверяем
Переписка с внешним корреспондентом на стандартном клиенте расшифровывается обеими сторонами — совместимость важнее собственной реализации. Отдельно проверяется честность индикации: письмо, зашифрованное только на участке до сервера, не должно выглядеть как сквозное зашифрованное, потому что на этом различии и строится всё доверие к функции.
Крупное вложение не проходит по лимитам почты, и пользователю нужно место, откуда его можно передать ссылкой.
Что делаем
Хранилище файлов с квотой по тарифу.
Отправка крупных вложений ссылкой.
Автоматическое сохранение вложений из писем.
Общий доступ по ссылке с ограничением срока.
Готово, когда
Хранилище работает, крупные вложения отправляются ссылкой.
Как проверяем
Крупное вложение отправляется ссылкой и открывается у получателя без регистрации. Ограничения доступа по ссылке проверяются попыткой обойти их: срок действия и пароль обязаны действительно закрывать доступ. Отдельно — что происходит с уже отправленной ссылкой при исчерпании квоты отправителя.
В организациях письмо часто обсуждают до ответа, и это обсуждение сейчас уходит в мессенджеры, теряя связь с письмом.
Что делаем
Внутренние комментарии к письму, видимые только сотрудникам организации.
Назначение ответственного за письмо.
Статусы обработки в общем ящике.
Готово, когда
Комментарии и назначение работают в общих ящиках.
Как проверяем
Внутренний комментарий не виден внешнему адресату ни при каких действиях: проверяется пересылкой, ответом всем и выгрузкой письма. Утечка внутреннего обсуждения наружу — единственная ошибка этой функции, которая имеет значение, и проверять её надо попыткой, а не чтением кода.
Ворота трека
Все критерии обязательны. Не пройдены — фаза продлевается,
а не закрывается.
M0: решение «идём или не идём» принято и записано с обоснованием
M1: доставляемость во входящие крупных провайдеров не ниже 98%
M1: отсев спама не ниже 93% при доле ложных срабатываний не выше 0.08%
M1: поиск по ящику в 50 000 писем не дольше 200 мс на p95
M1: переезд с внешнего сервиса работает на ящике в 100 000 писем
M1: контур хранения развёрнут и проверен юристом
M1: внешние проверочные сервисы не находят замечаний
M1: 1000 ящиков в закрытой альфе, ни одного потерянного письма
M2: 50 000 ящиков, доля возвращающихся ежедневно не ниже 40%
M2: сборщик перенёс не менее 10 000 ящиков с других сервисов
M2: отсев спама не ниже 95% при ложных срабатываниях не выше 0.05%
M3: 500 000 ящиков, 2000 доменов на платных тарифах
M3: выручка покрывает операционные расходы трека
M3: доступность почты 99.95% за квартал
Параллельный трек
Картинки
Месяцы
трек
Календарь
с фазы 2
Команда
22 чел.
Индекс
1 млрд
Бюджет
700 млн ₽
Задач
64
Недель работ
304
Построить вертикаль «Картинки» как отдельный поисковый контур: свой обход изображений, свой индекс, где единицей является изображение со списком страниц-носителей, своё ранжирование по внешним текстовым и внутренним визуальным признакам, свой интерфейс с сеткой и просмотрщиком и свой правовой режим показа чужих произведений. Отличие от Яндекса и Google — источник первичен: миниатюра ведёт на страницу, а не заменяет её, лицензия видна в выдаче, а вебмастер видит, что мы взяли с его сайта и почему.
Отделить «картинки есть у всех» от измеренной потребности. Доли рынка, приведённые в §24.1, — чужие; на своём потоке запросов доля визуальных намерений может отличаться вдвое в любую сторону, а от неё зависит и команда, и очерёдность.
Что делаем
Разметка выборки из 20 000 запросов собственного потока фазы 2 по визуальному намерению.
Оценка доли запросов, где картинка в веб-выдаче полезнее ссылки, — вход для колдунщика I3.3.
Разбор классов намерения из §24.8 по частоте: объект, сцена, человек, схема, скриншот, обои, товар, текст.
Оценка доли запросов, на которые сегодняшняя веб-выдача отвечает плохо именно из-за отсутствия картинок.
Письменное заключение с числами и методикой их воспроизведения.
Готово, когда
Доля визуальных намерений измерена на собственном потоке, разбивка по восьми классам зафиксирована, методика описана так, что замер воспроизводится на свежем срезе.
Как проверяем
Повторный замер на другом недельном срезе даёт долю, отличающуюся не более чем на 2 процентных пункта.
Риск
Поток фазы 2 непредставителен: у молодого поиска перекошенная аудитория. Смягчение: считаем долю отдельно по сегментам аудитории и указываем разброс, а не одно число.
Картинкикритический путьруководство трека2 нед.зависит от I0.2, I0.3, I0.4, I0.6, I0.7
Зачем
Ворота фазы существуют, чтобы у трека была возможность не начаться. Решение, принятое молча и по умолчанию, невозможно оспорить и невозможно отменить.
Что делаем
Сведение результатов I0.1–I0.7 в одну записку: спрос, право, качество, деньги.
Формулировка условий, при которых трек не стартует, и условий, при которых он стартует урезанным.
Выбор сценария бюджета и состава команды I1.
Список того, что в трек не входит, — со ссылкой на §24.22.
Публикация решения внутри проекта с датой и подписями.
Готово, когда
Решение принято письменно, сценарий выбран, исключённые сценарии перечислены с причиной.
Как проверяем
Записка содержит ответ по каждому из четырёх вопросов фазы и явный список условий, при которых решение пересматривается.
Риск
Решение принимается «по инерции»: трек стартует потому, что его планировали. Смягчение: условия отказа сформулированы до сведения результатов, а не после.
Тип содержимого — половина понимания запроса в вертикали: «схема БП АТХ» и «закат над морем» требуют разных классов, и без класса выдача смешивает чертежи с фотографиями.
Что делаем
Классы из §24.8: фото, рисунок, схема, скриншот, иконка, текст, коллаж.
Обучающая выборка с разметкой, включающая пограничные случаи.
Инференс на потоке обхода с бюджетом, укладывающимся в расчёт I0.7.
Флаг наличия лица без каких-либо биометрических признаков (§24.16).
Признак на выходе — распределение по классам, а не один класс: жёсткое решение теряет информацию.
Готово, когда
Точность классификации на контрольной выборке не ниже 0.90 макро-F1, распределение сохраняется в индекс, лицевые признаки не сохраняются.
Как проверяем
Контрольная выборка в 5000 изображений, размеченная асессорами и не участвовавшая в обучении.
Риск
Класс «скриншот» путается с классом «текст». Смягчение: классы объединяются в один при F1 ниже порога, чем сохраняется честность метрики.
Картинкикритический путь2 ML6 нед.зависит от I1.4, I0.6
Зачем
Единственное место продукта, где неуместный результат виден мгновенно всем, кто смотрит на экран, — включая тех, кто просто проходил мимо.
Что делаем
Три уровня по политике I0.6 с отдельными порогами.
Оценка «взрослого» содержимого и оценка насилия — раздельно, они требуют разных решений.
Размытие вместо скрытия в зоне неуверенности классификатора.
Подсчёт скрытого и объявление числа в интерфейсе.
Список запрещённого законом, не имеющий переключателя.
Готово, когда
Пропуск явного содержимого при умеренном уровне не выше 1.0%, ложное срабатывание не выше 3%, скрытое считается и объявляется.
Как проверяем
Замер на корзине I0.6 из 2000 изображений; отдельно замеряется, что запрещённое законом не показывается ни на одном уровне.
Риск
Классификатор, обученный на западных наборах, ошибается на культурно-специфичных изображениях. Смягчение: не менее трети обучающей выборки — из собственного обхода русскоязычного сегмента.
Цвет — второй по частоте фильтр после размера, и единственный, который нельзя заменить текстовым запросом: «синий» в запросе означает синий предмет, а не синюю картинку.
Что делаем
Пять доминирующих цветов кластеризацией в перцептивно равномерном пространстве.
Доля серого и признак прозрачности.
Сопоставление с двенадцатью образцами фильтра §24.14.
Отдельный признак «чёрно-белое», не выводимый из палитры автоматически.
Готово, когда
Палитра считается для всех изображений, фильтр по цвету возвращает изображения, которые асессор относит к выбранному цвету, не менее чем в 85% случаев.
Как проверяем
500 изображений, отфильтрованных по каждому из двенадцати цветов, оцениваются асессорами на соответствие названию цвета.
Риск
Доминирующий цвет фона побеждает цвет предмета. Смягчение: центральная область кадра получает больший вес при кластеризации.
Картинкикритический путь2 ML + юрист6 нед.зависит от I1.10, 2.28, 2.53
Зачем
Векторное представление — единственный сигнал о содержании картинки, который не контролирует автор страницы. От него зависят и поиск по картинке, и похожие, и защита от спама.
Что делаем
Отбор открытых моделей общего вида «изображение — текст» с проверкой лицензии весов и лицензии обучающих данных.
Замер качества кандидатов на корзине I0.4 и на корзине I0.5: поиск по картинке и различение дублей.
Решение о размерности и о схеме сжатия под расчёт I0.7.
Регистрация выбранной модели в реестре моделей (2.54) с версией.
Инференс на потоке обхода через шлюз моделей 2.53 с учётом стоимости.
Готово, когда
Модель выбрана, лицензия проверена и записана, качество на обеих корзинах измерено, инференс идёт на потоке обхода.
Как проверяем
Сравнительная таблица кандидатов с числами по обеим корзинам и по стоимости инференса на миллион изображений.
Риск
Лицензия обучающих данных запрещает коммерческое использование при разрешительной лицензии весов. Смягчение: проверяются обе лицензии — правило, уже действующее в треке переводчика (T0.2).
Картинки1 backend + 1 аналитик4 нед.зависит от I1.8, I1.9
Зачем
Отличие, которого нет ни у Яндекса, ни у Google (§24.4): показать, где изображение появилось первым, и понизить тех, кто живёт перепубликацией чужого.
Что делаем
Дата первой встречи изображения по каждому носителю как основа признака.
Поправка на дату публикации страницы и на дату из разметки, где она есть.
Признак «сайт живёт перепубликацией»: доля изображений, где он не первоисточник.
Показ первоисточника в просмотрщике с оговоркой «по нашим данным обхода».
Влияние признака на ранжирование с отдельным замером.
Готово, когда
Первоисточник вычисляется, показывается с оговоркой, признак участвует в ранжировании и измерен отдельно.
Как проверяем
Корзина из 200 изображений с известной историей публикации: первоисточник определён верно не менее чем в 75% случаев.
Риск
Дата первой встречи зависит от порядка обхода, а не от порядка публикации, и молодой сайт объявляется первоисточником. Смягчение: оговорка в интерфейсе обязательна, а признак имеет ограниченный вес в ранжировании.
Картинки1 backend + 1 ML6 нед.зависит от I3.1, 2.18
Зачем
Значительная часть визуального содержимого веба — видео, и поиск по кадру нужен ровно тогда, когда пользователь помнит картинку, но не помнит, где её видел.
Что делаем
Извлечение ключевых кадров из индексируемых видео на механизмах вертикали «Видео».
Индексация кадров как изображений с пометкой происхождения и тайм-кода.
Переход из кадра в видео на нужной секунде.
Отдельное правило разнообразия: не более двух кадров одного видео.
Готово, когда
Кадры индексируются с тайм-кодом, переход открывает видео на нужной секунде, правило разнообразия соблюдается.
Как проверяем
Корзина из 100 запросов по сценам из видео: доля запросов с верным кадром в топ-20 измерена и опубликована.
Риск
Кадры вытесняют фотографии из выдачи. Смягчение: доля кадров в сетке ограничена и настраивается по классу намерения.
Правокритический путьюрист + продукт6 нед.зависит от I0.1
Зачем
Миниатюра на нашей странице — воспроизведение чужого произведения. Занять позицию нужно до первой строчки кода: иначе она будет занята после первой претензии, и не нами.
Что делаем
Заключение о допустимости показа уменьшенных копий со ссылкой на источник по праву РФ.
Разбор дела Getty против Google и вывод для нашего интерфейса: что именно нельзя делать с кнопкой «открыть файл».
Позиция по хранению: миниатюры храним, оригиналы — нет, с обоснованием обоих решений.
Позиция по горячим ссылкам: чей трафик расходуется при показе оригинала.
Процедура удаления по требованию правообладателя со сроком и журналом решений.
Требования к интерфейсу, вытекающие из заключения, — списком, который станет приёмкой для I1.17.
Готово, когда
Заключение подписано юристом, требования к интерфейсу сформулированы проверяемым списком, процедура удаления описана со сроками.
Как проверяем
Каждое требование из списка проверяется на макете mockups/images.html до начала разработки I1.17.
Риск
Заключение запрещает показ миниатюр без согласия правообладателя — трек становится невозможным в исходном виде. Смягчение: этот сценарий разбирается первым, до всех остальных работ фазы, и имеет собственный выход в решение I0.8.
Фильтр по лицензии полезен ровно настолько, насколько ему можно верить. Ошибка в лицензии дороже её отсутствия: пользователь возьмёт картинку в коммерческий макет и получит претензию, ссылаясь на нас.
Правило приоритета источников и правило умолчания: лицензия неизвестна — так и пишем, ничего не додумываем.
Сопоставление значений лицензий с тремя фильтрами выдачи: использование, изменение, коммерческое использование.
Формулировки в интерфейсе, проверенные юристом, включая дисклеймер о проверке на стороне пользователя.
Корзина из 500 изображений с проверенной вручную лицензией для замера I2.11.
Готово, когда
Реестр источников заполнен, правило приоритета описано, корзина размечена, формулировки согласованы.
Как проверяем
На корзине из 500 изображений объявленная нами лицензия совпадает с проверенной вручную не менее чем в 99% случаев или помечена как неизвестная.
Риск
Разметка на сайтах массово неверна — CC-значок стоит на изображении, взятом у стока. Смягчение: правило приоритета отдаёт предпочтение разметке первоисточника, а не перепубликатора.
Правоюрист + продукт + асессоры5 нед.зависит от I0.1
Зачем
Вертикаль картинок — единственное место продукта, где неуместный результат виден мгновенно и всем, кто смотрит на экран. Порог и умолчание должны быть решением, а не побочным эффектом настройки классификатора.
Что делаем
Определение трёх уровней фильтра и того, что попадает под каждый, — с юридической и продуктовой стороны.
Решение об умолчании: умеренный уровень для всех, включая незалогиненных, с обоснованием.
Разметка корзины из 2000 изображений по трём уровням.
Правило объявления скрытого: сколько результатов скрыто и как это изменить.
Список содержимого, не показываемого ни на каком уровне, со ссылками на нормы.
Стык с семейным поиском основного плана (2.25): одна настройка на весь продукт, а не отдельная для картинок.
На корзине из 2000 изображений ручная проверка подтверждает разметку в 98% случаев при двойной слепой разметке.
Риск
Порог, настроенный по российской норме, неверен для других юрисдикций. Смягчение: уровень фильтра параметризуется юрисдикцией с первого дня, как это уже сделано для правовых ограничений в legal.py.
Правокритический путьbackend + юрист4 нед.зависит от I1.3, I0.2
Зачем
Запрет, исполняемый через неделю, юридически равен неисполненному. Для изображений это острее, чем для страниц: копия произведения уже лежит у нас.
Что делаем
Исполнение noimageindex в мета-теге и X-Robots-Tag, включая случай, когда страница разрешена, а изображения запрещены.
Применение robots.txt к адресу файла, а не только к адресу страницы.
Точечный запрет из кабинета вебмастера по файлу или маске.
Удаление миниатюр и записей из индекса за 24 часа после обнаружения запрета.
Журнал исполнения: что удалено, когда, по какому основанию.
Готово, когда
Любой из четырёх видов запрета приводит к исчезновению изображения из выдачи и удалению миниатюр не позднее чем за 24 часа, что подтверждается журналом.
Как проверяем
Контрольный сайт с четырьмя видами запрета: замер времени от публикации запрета до исчезновения из выдачи на десяти прогонах.
Риск
Запрет исполнен в выдаче, но миниатюра осталась в кэше отдачи. Смягчение: удаление из кэша — часть той же операции, а не отдельная задача.
Правокритический путьbackend + юрист3 нед.зависит от I2.4
Зачем
Пользователь, ищущий по фотографии, отдаёт нам файл, который может содержать что угодно — от лица ребёнка до документа. Правило обращения с ним должно быть коротким, проверяемым и выполненным в коде, а не в политике.
Что делаем
Срок жизни загруженного файла: до конца запроса плюс окно на повтор, названное в интерфейсе.
Запрет попадания в индекс, в обучение и в журналы — проверяемый тестом, а не декларацией.
Удаление EXIF при приёме, включая координаты.
Отсутствие связи с аккаунтом без явного согласия.
Раздел в политике приватности с описанием этого поведения простым языком.
Готово, когда
Загруженный файл удаляется по истечении названного срока, тест подтверждает отсутствие следов в индексе, журналах и обучающих выборках.
Как проверяем
Автотест загружает помеченный файл и ищет его следы во всех хранилищах после истечения срока — следов нет.
Риск
Файл остаётся в промежуточном кеше отдачи. Смягчение: кеш включён в перечень хранилищ, проверяемых тестом.
Правокритический путьbackend + юрист4 нед.зависит от I1.5, I0.2
Зачем
Процедура, описанная в I0.2, должна быть исполнимой в срок при потоке обращений, а не в единичных случаях. Просроченное требование — это иск.
Что делаем
Форма обращения с обязательными полями и подтверждением прав.
Срок рассмотрения не более трёх рабочих дней, с автоматическим контролем срока.
Удаление изображения и всех его версий из индекса и кеша одной операцией.
Неизменяемый журнал решений — на механизме 1.67.
Отчёт о числе и исходе обращений в отчёте о прозрачности (3.21).
Готово, когда
Обращения обрабатываются в срок, удаление затрагивает все версии и кеш, журнал ведётся, статистика попадает в отчёт о прозрачности.
Как проверяем
Учение на 50 тестовых обращениях: срок соблюдён во всех случаях, ни одна версия не осталась в выдаче.
Риск
Массовые недобросовестные обращения используются как оружие против конкурентов. Смягчение: подтверждение прав обязательно, решения пересматриваются человеком, злоупотребления фиксируются в журнале.
Вопрос «это фотография или сгенерировано» будет задаваться всё чаще, и ответ на него нельзя выдумывать. Читаем то, что заявлено проверяемо, и молчим там, где не заявлено (§24.22).
Что делаем
Чтение подписей C2PA и сохранение в записи изображения.
Проверка целостности подписи, а не факта её наличия.
Показ в просмотрщике: кем и когда заявлено происхождение.
Явный отказ от собственного определения «сгенерировано ИИ» по признакам изображения.
Фильтр по наличию проверенной подписи как дополнительный.
Готово, когда
Подписи читаются и проверяются, происхождение показывается только при действительной подписи, собственных догадок нет.
Как проверяем
Набор из 200 изображений с действительными, испорченными и отсутствующими подписями: классификация верна во всех случаях.
Риск
Отсутствие подписи читается пользователем как «не сгенерировано». Смягчение: формулировка говорит об отсутствии сведений, а не об отсутствии генерации.
Качество вертикали, которое не измеряется, не улучшается. Веб-корзина здесь не годится: там оценивают текст, здесь — изображение, и шкала оценки другая.
Что делаем
Отбор 500 запросов по восьми классам намерения пропорционально измеренному спросу.
Руководство асессора для картинок: что такое релевантное изображение, как оценивать дубли, как оценивать качество файла отдельно от соответствия запросу.
Разметка топ-60 на каждый запрос по пятибалльной шкале.
Замер согласия асессоров между собой; переработка руководства, пока согласие не выйдет на порог.
Отдельная разметка «первый экран»: пригодна ли сетка целиком, а не отдельная картинка.
Готово, когда
500 запросов размечены, согласие асессоров по каппе Коэна не ниже 0.6, руководство опубликовано.
Как проверяем
Контрольная переразметка 50 запросов другой группой асессоров даёт pFound, отличающийся не более чем на 0.03.
Риск
Асессоры оценивают красоту, а не релевантность. Смягчение: в руководстве качество файла и соответствие запросу разведены в две независимые оценки.
Дедупликация — главный источник «плохой» сетки: десять копий одной картинки подряд читаются как поломка. Мерить её нужно отдельно от релевантности, иначе одна метрика скроет другую.
Что делаем
Сбор 5000 пар изображений с разметкой «точный дубль / перцептивный дубль / версия другого размера / похожее / разное».
Включение в набор трудных случаев: водяной знак, обрезка полей, зеркальное отражение, смена палитры, коллаж из той же фотографии.
Разметка групп: для 200 изображений — полный список носителей с датами.
Формат хранения корзины, пригодный для автозамера в общем прогоне.
Готово, когда
5000 пар размечены, трудные случаи составляют не менее 20% набора, формат корзины принят автозамером.
Как проверяем
Порог расстояния Хэмминга, подобранный на половине корзины, даёт на второй половине точность и полноту не хуже, чем на первой, с отклонением не более 0.02.
Риск
Корзина собрана из лёгких случаев и хвалит любой алгоритм. Смягчение: доля трудных случаев зафиксирована как требование, а не как пожелание.
Ворота — единственный способ не выкатить вертикаль, которая «в целом работает». Числа заданы в §24.20 заранее, чтобы их нельзя было подогнать под результат.
Что делаем
Прогон по всем метрикам §24.20 в колонке I2.
Отдельный замер поиска по картинке на корзине из 300 изображений.
Замер безопасного поиска на корзине I0.6.
Публикация результата внутри проекта независимо от того, пройдены ворота или нет.
При непройденных воротах — разбор причин и план добора, а не смягчение порога.
Готово, когда
Все метрики колонки I2 замерены и опубликованы, решение о прохождении ворот принято письменно.
Как проверяем
Замер воспроизводится в общем прогоне тестов на тех же корзинах и даёт те же числа.
Риск
Порог смягчается ради срока. Смягчение: смягчение порога требует письменного решения с обоснованием и фиксируется в истории вместе с метрикой.
Дежурная смена воспроизводит ежедневный замер и разбор тревоги по регламенту без участия команды трека.
Риск
Сопровождение сводится к дежурству без развития, и качество медленно падает. Смягчение: в регламент включены ежеквартальное обновление корзины и обязательный отчёт о динамике метрик.
Инфраструктураинфраструктура + аналитик4 нед.зависит от I0.1
Зачем
Картинки дороже, чем кажется: обход тянет оригиналы, хранение тянет миниатюры и векторы, отдача тянет трафик. Ошибка в расчёте обнаруживается на третьем месяце обхода, когда менять что-либо поздно.
Что делаем
Расчёт по §24.19 на 100 млн, 1 млрд и 3 млрд изображений: хранение, память, трафик, ускорители.
Оценка эффекта отбраковки до загрузки: стоимость при отсеве 50%, 70% и 85%.
Расчёт отдачи миниатюр: трафик на запрос, доля кэша, стоимость канала.
Стоимость инференса классификаторов и эмбеддингов на потоке обхода.
Три сценария бюджета трека с указанием, что именно урезается в каждом.
Готово, когда
Расчёты сведены в таблицу с формулами, три сценария бюджета описаны, чувствительность к отсеву показана числом.
Как проверяем
Модель проверяется на выборке в 1 млн изображений: предсказанные объёмы расходятся с измеренными не более чем на 20%.
Риск
Средний вес оригинала занижен — трафик обхода вырастает вдвое. Смягчение: средний вес берётся не из литературы, а из собственной выборки обхода фазы 1.
Инфраструктура2 инфраструктуры5 нед.зависит от I3.1
Зачем
Одна страница выдачи — это шестьдесят файлов. Отдача миниатюр становится крупнейшей статьёй трафика продукта, крупнее самой выдачи.
Что делаем
Кеш на границе сети с раздельными правилами для трёх размеров.
Согласование форматов с браузером: AVIF, WebP, откат на JPEG.
Немедленная инвалидация при отзыве изображения (I1.5).
Защита от чужого встраивания наших миниатюр.
Замер доли попаданий в кеш и стоимости канала.
Готово, когда
Доля попаданий в кеш не ниже 90%, инвалидация при отзыве укладывается в минуты, стоимость канала соответствует расчёту I0.7.
Как проверяем
Замер под боевым профилем нагрузки; проверка, что отозванное изображение исчезает из кеша не позднее чем за пять минут.
Риск
Кеш переживает отзыв изображения, и удалённое продолжает показываться. Смягчение: инвалидация — часть операции отзыва, отдельным тестом проверяется её выполнение.
Изображение попадает в индекс не само: его нужно найти в разметке вместе со всем текстовым контекстом, который потом будет единственным текстовым сигналом.
Что делаем
Разбор источников кандидатов по таблице §24.7: img, srcset, picture, figure, og:image, JSON-LD ImageObject, noscript.
Сбор текстового контекста: alt, подпись, ближайший заголовок, окружающий текст ±300 символов, title, имя файла.
Разрешение относительных адресов и выбор наибольшей версии из srcset.
Пометка роли изображения: содержание, обвязка, картинка страницы.
Стык с конвейером экстракции 1.8 — без второго прохода по документу.
Готово, когда
На корпусе из 10 000 страниц кандидаты извлекаются вместе с контекстом, роль проставлена, второго разбора HTML не происходит.
Как проверяем
Ручная сверка на 200 страницах: доля правильно извлечённых подписей и окружающего текста не ниже 95%.
Риск
Ленивая загрузка прячет настоящий адрес в атрибутах, которые мы не знаем. Смягчение: список атрибутов ленивой загрузки ведётся как данные, а не как код, и пополняется по находкам.
Мы показываем миниатюры и только их: оригиналы не храним ни по праву, ни по деньгам (§24.6). Значит, конвейер миниатюр — не оптимизация, а основной способ показа.
Что делаем
Три размера по длинной стороне: 200, 640, 1280 px, в AVIF и WebP.
Учёт ориентации из EXIF и удаление всех остальных EXIF-полей, включая координаты.
Прогрессивная загрузка: доминирующий цвет как заглушка до прихода файла.
Хранение в объектном хранилище с адресацией по хешу содержимого.
Пересчёт при изменении оригинала и удаление при отзыве.
Готово, когда
Миниатюры собираются для всех поддерживаемых форматов, EXIF-координаты отсутствуют в результате, средний вес трёх размеров не превышает 45 КБ.
Как проверяем
На выборке в 100 000 изображений: ни в одной миниатюре нет полей EXIF с координатами и моделью устройства; средний вес соответствует расчёту I0.7 с отклонением не более 15%.
Риск
Пересчёт всех миниатюр при смене формата — многомесячная операция. Смягчение: формат и размеры зафиксированы в схеме с версией, пересчёт выполняется фоновой миграцией по частям.
Обходкритический путь2 backend4 нед.зависит от I1.1
Зачем
Главный рычаг стоимости всей вертикали (§24.19): загрузка — дорогая операция, а 70–85% кандидатов её не заслуживают. Отбраковка после загрузки экономит только диск, но не канал.
Что делаем
Шесть дешёвых проверок из §24.7 в порядке возрастания стоимости.
Счётчики по каждой причине отбраковки — они же станут отчётом вебмастеру (I1.22).
Порог повторяемости: один и тот же адрес на N страницах сайта — шаблон, а не содержание.
Настраиваемость порогов без выкатки кода.
Замер доли отсева и его влияния на полноту: сколько хороших изображений теряется.
Готово, когда
Отсев на контрольной выборке не ниже 70% при потере хороших изображений не выше 2%.
Как проверяем
Выборка из 2000 отбракованных кандидатов размечается вручную: доля ошибочно отброшенных содержательных изображений не выше 2%.
Риск
Агрессивный отсев выбрасывает единственную иллюстрацию небольшого сайта. Смягчение: правило повторяемости считается по доле от числа страниц сайта, а не по абсолютному числу.
Картиночный обход способен уронить сайт незаметнее, чем обход страниц: изображений на порядок больше, и они тяжелее.
Что делаем
Отдельный класс вежливости: не более двух изображений в секунду на хост, общий бюджет с обходом страниц.
Условные запросы по ETag и Last-Modified — картинки меняются реже страниц.
Ограничения: 20 МБ на файл, 100 мегапикселей до декодирования, таймауты на каждую стадию.
Поддержка форматов JPEG, PNG, WebP, AVIF, GIF, HEIC и SVG с обезвреживанием.
Декодирование в песочнице с ограничением памяти и времени.
Повторные попытки и карантин хостов, отдающих ошибки на изображениях, но не на страницах.
Готово, когда
Загрузчик держит заявленные лимиты под нагрузкой, декодер не выходит за границы памяти на подготовленных вредоносных файлах, доля 304 на повторном обходе не ниже 80%.
Как проверяем
Набор из 50 намеренно вредоносных файлов (зип-бомбы, гигантские размеры, битые заголовки, SVG со скриптами) не приводит ни к одному падению и ни к одному выходу за лимит памяти.
Риск
Библиотека декодирования — известная точка уязвимостей. Смягчение: декодирование в отдельном процессе с ограничением прав, обновление библиотек как отдельный регламент.
Индекс и поиск2 backend4 нед.зависит от I0.8, 1.59
Зачем
Изображение — самостоятельная сущность со списком носителей, а не поле документа (§24.1). Схема, начатая как поле, потом не переделывается: на ней успевает вырасти всё остальное.
Что делаем
Схема по §24.6 с разделением полей на четыре группы по происхождению и доверию.
Регистрация схемы в реестре 1.59 с версией и правилом совместимости.
Связь «изображение — страницы-носители» как отдельная таблица с датами первой встречи.
Поля под визуальные признаки, заполняемые позже (эмбеддинг, классы), объявляются сразу — как это сделано для заготовок ИИ в ai.py.
Ключ шардирования и правило раскладки, согласованные с 1.14.
Готово, когда
Схема зарегистрирована, несовместимое изменение не проходит сборку, связь с носителями хранится отдельной таблицей.
Как проверяем
Попытка выкатить несовместимое изменение схемы останавливается сборкой автоматически.
Риск
Ключ шардирования по хосту файла даёт перекос на крупных CDN. Смягчение: вторичное расщепление гигантов — тот же приём, что в shard.py, где перекос снижен с 51% до 7.7%.
Индекс и поиск2 backend5 нед.зависит от I1.6, I1.1
Зачем
Все текстовые сигналы изображения — внешние, и веса у них должны быть разными: подпись под фотографией и alt, написанный ради поисковика, стоят по-разному.
Что делаем
Девять полей из §24.9 как отдельные поля BM25F с априорными весами.
Морфология и лемматизация на тех же правилах, что в вебе (text.py).
Правило согласия: расхождение alt с окружающим текстом снижает доверие к alt на хосте.
Слияние текста со всех носителей одной группы дублей — с ограничением вклада одного носителя.
Инкрементальное обновление при появлении нового носителя.
Готово, когда
Поиск по текстовым полям работает на индексе из 10 млн изображений, правило согласия считается, вклад одного носителя ограничен.
Как проверяем
На корзине I0.4 замер pFound по чисто текстовому ранжированию даёт базовый уровень, зафиксированный как точка отсчёта для всех дальнейших улучшений.
Риск
Слияние текста от сорока носителей превращает запись в мешок ключевых слов. Смягчение: вклад носителя ограничен, ограничение проверяется замером на корзине.
Индекс и поисккритический путь2 backend + 1 ML6 нед.зависит от I1.4, I0.5
Зачем
Десять копий одной картинки в сетке читаются как поломка поиска, даже если каждая релевантна. Дедупликация здесь — не гигиена индекса, а видимое качество продукта.
Что делаем
Точный дубль по SHA-256 и перцептивный по dHash 64 бита.
Блочный поиск кандидатов по хешу — приём, уже применённый для текста в simhash.py.
Транзитивная группировка с ограничением диаметра группы: иначе цепочка похожестей склеивает несвязанное.
Устойчивость к обрезке полей, водяному знаку в углу и зеркальному отражению.
Подбор порога на половине корзины I0.5 с проверкой на второй половине.
Готово, когда
Полнота группировки на корзине I0.5 не ниже 0.85 при точности не ниже 0.95, диаметр группы ограничен.
Как проверяем
Замер на второй половине корзины, не участвовавшей в подборе порога; результат воспроизводится в общем прогоне тестов.
Риск
Порог, подобранный на корзине, разъезжается на реальном потоке. Смягчение: ежемесячный контрольный замер на свежей выборке с ручной разметкой 300 пар.
Из группы в сорок копий показывать нужно одну, и не первую попавшуюся: пользователю нужен крупный чистый файл, автору — чтобы его версия побеждала копию с водяным знаком перепубликатора.
Что делаем
Правило выбора по §24.10: разрешение → отсутствие водяного знака → авторитет носителя → ранняя дата.
Список версий по убыванию разрешения — для раздела «Другие размеры».
Детектор водяного знака как отдельный признак (эвристика по краевым областям на этой фазе).
Пересчёт представителя при появлении версии лучше.
Готово, когда
Представитель выбирается по правилу, список версий строится, смена представителя при появлении лучшей версии происходит на следующем пересчёте.
Как проверяем
На 200 группах из корзины I0.5 выбор представителя совпадает с экспертным в 90% случаев.
Риск
Крупнейшая версия оказывается апскейлом — формально больше, фактически хуже. Смягчение: в правило включается оценка реальной резкости, а не только число пикселей.
Уровень L0 определяет потолок качества: чего нет среди кандидатов, того не будет в выдаче ни на каком уровне переранжирования.
Что делаем
Отбор по текстовым полям с отсечением непроходных — тот же приём, что в wand.py.
Жёсткие фильтры как условия отбора, а не как постфильтрация: размер, тип, цвет, лицензия, безопасный поиск.
Схлопывание группы дублей на уровне отбора, а не после ранжирования.
Бюджет 30 мс на p95 при индексе 100 млн изображений.
Готово, когда
Отбор укладывается в бюджет, фильтры применяются до ранжирования, дубли схлопываются на отборе.
Как проверяем
Стенд с замером задержки и сверкой выдачи с полным перебором на подвыборке: расхождений в составе топ-60 нет.
Риск
Жёсткий фильтр по редкому цвету оставляет ноль кандидатов. Смягчение: при пустой выдаче фильтр ослабляется с явным сообщением пользователю, а не молча.
Ранжирование1 backend + 1 ML4 нед.зависит от I1.13, I0.4
Зачем
Первый уровень ранжирования, который можно объяснить построчно, — и потому единственный, на котором можно отладить признаки до появления машинного обучения.
Что делаем
Двадцать признаков по группам §24.11 с априорными весами.
Явное разложение вклада каждого признака — вход для панели «почему найдено» (I2.12).
Замер вклада каждого признака отдельным отключением.
Фиксация весов в реестре признаков (2.1) с датой и обоснованием.
Готово, когда
Модель работает, вклад признаков раскладывается, pFound на корзине I0.4 не ниже 0.55.
Как проверяем
Замер на корзине I0.4 в общем прогоне; отключение любого признака ухудшает или не меняет метрику, но не улучшает её.
Риск
Априорные веса выдаются за обученные. Смягчение: в интерфейсе и в реестре они помечены как априорные — так же, как это сделано в quality.py.
Сетка из шестидесяти релевантных картинок с одного сайта бесполезна. В вебе это правило уже есть (1.25), но здесь оно строже: однообразие видно взглядом, а не чтением.
Что делаем
Четыре правила из §24.11: хост, дубли, цветовая доминанта, классы содержимого в первом ряду.
Применение правил после ранжирования, но до раскладки рядов.
Замер цены разнообразия: насколько падает pFound и насколько растёт оценка «сетка целиком» из I0.4.
Настраиваемость порогов без выкатки.
Готово, когда
Правила применяются, оценка «первый экран» на корзине I0.4 растёт, падение pFound не превышает 0.02.
Как проверяем
Сравнение двух прогонов на корзине: с правилами и без, по обеим метрикам сразу.
Риск
Разнообразие ради разнообразия выталкивает лучший результат из первого ряда. Смягчение: первое место в выдаче правилам разнообразия не подчиняется.
Ранжирование1 backend + 1 ML4 нед.зависит от I2.2, I1.13
Зачем
Проект уже наступил на это в вебе: узким местом гибридного поиска оказалась не векторная ветвь, а способ слияния (§22.7). Повторять ошибку во второй раз непозволительно.
Что делаем
Слияние по обратным рангам (RRF) как основной способ — без взвешенной суммы несравнимых величин.
Вес ветвей в зависимости от класса намерения запроса.
Пометка происхождения результата: найдено текстом, вектором или обоими.
Замер вклада каждой ветви отключением.
Готово, когда
Слияние работает, происхождение результата помечено, отключение любой ветви измеримо ухудшает метрику.
Как проверяем
Три прогона на корзине I0.4: только текст, только вектор, слияние; результат слияния лучше обоих.
Риск
Векторная ветвь тянет вверх красивое, но нерелевантное. Смягчение: вес ветви привязан к классу намерения, а не задан константой.
Линейная модель исчерпывается на двадцати признаках. Дальше нужен бустинг — тот же, что в вебе, но на своих признаках.
Что делаем
Около 180 признаков по группам §24.11, включая визуальные и признаки группы дублей.
Обучение на корзине I0.4 в той же инфраструктуре, что 2.3.
Бюджет 60 мс на топ-200.
Регистрация признаков в реестре 2.1 со сроком жизни.
Сравнение с L1 на отложенной корзине и по интерливингу.
Готово, когда
L2 даёт прирост pFound не менее 0.06 относительно L1, укладывается в бюджет задержки, признаки зарегистрированы.
Как проверяем
Замер на отложенной корзине и подтверждение интерливингом на живом трафике.
Риск
Модель выучивает артефакты корзины — например, предпочтение крупным файлам. Смягчение: анализ важности признаков вручную перед выкаткой, с отклонением подозрительных.
Ранжирование1 ML + 1 backend5 нед.зависит от I3.1, 3.7
Зачем
В картинках поведение информативнее, чем в вебе: открытие карточки и переход на источник — быстрые и частые сигналы. И так же быстро накручиваются.
Что делаем
Признаки: доля открытий карточки, доля переходов на источник, возвраты, время до первого клика.
Нормировка по позиции в сетке: верхний ряд получает клики просто потому, что он верхний.
Защита от накрутки на механизмах 3.9.
Отдельный замер вклада поведенческих признаков.
Готово, когда
Признаки считаются, нормировка по позиции применена, прирост качества измерен, накрутка обнаруживается.
Как проверяем
Замер на отложенной корзине и проверка защиты имитацией накрутки на тестовом контуре.
Риск
Признаки закрепляют текущую выдачу: что показано наверху, то и кликают. Смягчение: доля трафика исследования по правилам 3.8, нормировка по позиции обязательна.
Продукткритический путь2 frontend6 нед.зависит от I1.14, 1.26
Зачем
Сетка — это и есть выдача вертикали. Ошибка в раскладке здесь стоит дороже, чем ошибка в ранжировании: искажённые пропорции портят даже правильный порядок.
Что делаем
Обоснованные ряды с целевой высотой 200 px и допуском ±25% (§24.12).
Резервирование места до загрузки файлов: CLS не выше 0.02.
Ленивая загрузка с порогом в два экрана, srcset по плотности пикселей.
Догрузка по кнопке и по прокрутке с остановкой каждые 300 результатов.
Подпись на карточке при наведении и при фокусе с клавиатуры.
Мобильная раскладка с высотой ряда 140 px.
Готово, когда
Сетка раскладывается без искажения пропорций, CLS не выше 0.02, LCP на 4G не выше 1.8 с, лента останавливается каждые 300 результатов.
Как проверяем
Замер CLS и LCP на трёх типах запросов и трёх ширинах окна; проверка соответствия макету mockups/images.html.
Риск
Раскладка пересчитывается на каждом кадре прокрутки и греет процессор. Смягчение: раскладка считается один раз на порцию и кешируется по ширине контейнера.
Продукткритический путь2 frontend5 нед.зависит от I1.16, I0.2
Зачем
Место, где решается главный правовой и этический вопрос вертикали: ведём ли мы к источнику или заменяем его (§24.13). Требования сформулированы в I0.2 и здесь исполняются.
Что делаем
Панель с изображением, метаданными и действиями; первичная кнопка — «Перейти на страницу».
Открытие файла — вторичной ссылкой с пометкой, на чьём сайте лежит файл.
Изменение адреса при открытии: «назад» закрывает просмотрщик, а не уходит с выдачи.
Построчная сверка со списком требований I0.2 и проверка сценария «открыл — вернулся» на трёх браузерах.
Риск
Первичная кнопка на источник снижает вовлечённость, и её начинают «оптимизировать». Смягчение: правило записано в документ продукта со ссылкой на правовое основание, а не на предпочтение дизайнера.
Сетка изображений — самый недоступный элемент любого поиска: бесконечная лента, отсутствие альтернативного текста и мышиные жесты вместо клавиатуры. Проект обязался соблюдать WCAG 2.2 AA (§6.8), и здесь это дороже всего.
Что делаем
Роль grid и перемещение стрелками по строкам и столбцам.
Альтернативный текст: из источника, при отсутствии — осмысленная замена, а не пустая строка.
Ловушка фокуса в просмотрщике и возврат фокуса на исходную карточку по Esc.
Объявление изменений через aria-live: сколько показано, какие фильтры применены.
Подписи на подложке, а не поверх изображения, — контраст не ниже 4.5:1 при любой картинке.
Уважение prefers-reduced-motion.
Готово, когда
Вся вертикаль проходима с клавиатуры, скринридер объявляет состояние, контраст подписей соблюдён на любом изображении.
Как проверяем
Проверка двумя скринридерами и полное прохождение сценария поиска без мыши; автоматическая проверка контраста на 200 случайных карточках.
Риск
Стрелки конфликтуют с прокруткой страницы. Смягчение: сетка перехватывает стрелки только при фокусе внутри неё, что проверяется отдельным тестом.
Требование §6.1 действует и здесь: выдача работает без JavaScript. Для сетки картинок это не идеология, а способ остаться доступным для поисковых роботов, читалок и медленных сетей.
Что делаем
Серверная отрисовка первой порции сетки с готовыми размерами рядов.
Постраничная навигация как основной путь при отключённом JavaScript.
Фильтры как обычная форма с отправкой на сервер.
Просмотрщик как отдельная страница при отсутствии JavaScript.
Готово, когда
При отключённом JavaScript работают поиск, фильтры, постраничная навигация и просмотр изображения.
Как проверяем
Полный сценарий поиска и просмотра в браузере с отключённым JavaScript и в текстовом браузере.
Риск
Серверная раскладка рядов расходится с клиентской, и при включении JavaScript сетка «прыгает». Смягчение: алгоритм раскладки один и тот же, вынесен в общий модуль и покрыт тестом на совпадение.
Продукт1 frontend + 1 backend4 нед.зависит от I1.2, I1.5, 2.24
Зачем
Вебмастер, чьи картинки не попали в индекс, сегодня не может узнать почему ни у одного поисковика. Счётчики причин отбраковки у нас уже есть (I1.2) — остаётся их показать.
Что делаем
Сколько изображений с сайта в индексе и динамика.
Отбраковано и почему — по причинам §24.7, с примерами адресов.
Ошибки alt: пустые, дублирующиеся, расходящиеся с содержимым.
Состояние разметки ImageObject — на механизме 1.13.
Точечный запрет показа по файлу или маске с исполнением через I1.5.
Готово, когда
Отчёт показывает пять разделов, запрет из кабинета исполняется за 24 часа, примеры адресов доступны для каждой причины.
Как проверяем
Контрольный сайт с намеренно внесёнными ошибками: каждая ошибка появляется в отчёте в течение суток после обхода.
Риск
Отчёт раскрывает пороги отбраковки и становится инструкцией по их обходу. Смягчение: причина называется, численный порог — нет.
Продукт1 frontend + 1 backend5 нед.зависит от I2.2, I0.2
Зачем
Способ ввода, ради которого половина пользователей приходит в вертикаль. Четыре пути ввода из §24.5 должны вести к одному результату и оставлять после себя ссылку, которую можно переслать.
Что делаем
Загрузка файла, перетаскивание в окно, вставка из буфера, ссылка на изображение.
Временный идентификатор запроса-изображения и постоянная ссылка на результат.
Ограничения по весу и формату с понятными сообщениями об ошибке.
Текстовая замена для каждого пути при отключённом JavaScript.
Индикация состояния: что загружено, чем ищем, как отменить.
Готово, когда
Все четыре пути дают одинаковый результат для одного файла, результат имеет постоянную ссылку, без JavaScript работает загрузка файлом.
Как проверяем
Один и тот же файл, введённый четырьмя способами, даёт идентичные первые двадцать результатов.
Риск
Постоянная ссылка на загруженное изображение живёт дольше, чем ожидает пользователь. Смягчение: срок жизни ограничен и назван прямо в интерфейсе (I2.13).
Продукт1 frontend + 1 backend4 нед.зависит от I2.4
Зачем
Запрос обычно относится не ко всему кадру, а к предмету в нём. Рамка на изображении — единственный способ сказать «вот это», не подбирая слов.
Что делаем
Рамка поверх загруженного изображения с перетаскиванием и изменением размера.
Пересчёт вектора по вырезанной области, а не по всему кадру.
Автоматическое предложение рамки по крупнейшему объекту (эвристика до I4.1).
Передача области в адрес результата — фрагмент воспроизводится по ссылке.
Управление рамкой с клавиатуры.
Готово, когда
Рамка задаётся мышью и клавиатурой, вектор считается по области, ссылка воспроизводит и изображение, и рамку.
Как проверяем
Корзина из 100 изображений с предметом в углу кадра: поиск по фрагменту находит предмет чаще, чем поиск по всему кадру, — измеряется долей верных ответов в топ-5.
Риск
Рамка на мобильном неуправляема пальцем. Смягчение: увеличенные зоны захвата и режим «уточнить» с отдельным экраном.
Асессорская оценка 300 лент: доля релевантных в первых десяти не ниже 0.7.
Риск
Похожие уводят от исходной задачи и повышают число действий без пользы. Смягчение: замеряется не длина цепочки, а доля цепочек, оканчивающихся переходом на источник.
Продукт1 frontend + 1 backend3 нед.зависит от I0.3, I1.18
Зачем
Для половины сценариев («нужна картинка в презентацию») право использования — главный фильтр, а не дополнительный. У Google он есть и спрятан; наше отличие в том, что он на виду (§24.4).
Что делаем
Три значения фильтра по политике I0.3 плюс «любая».
Бейдж лицензии на карточке в сетке и в просмотрщике.
Явное «лицензия неизвестна» вместо умолчания «свободная».
Ссылка на страницу приобретения лицензии, если она объявлена разметкой.
Дисклеймер о проверке на стороне пользователя в формулировке юриста.
Готово, когда
Фильтр работает, бейдж показывается, неизвестная лицензия называется неизвестной, ссылка на приобретение работает там, где объявлена.
Как проверяем
Замер на корзине I0.3: совпадение объявленной лицензии с проверенной вручную не ниже 99% при доле «неизвестна» не выше 60%.
Риск
Пользователь понимает бейдж как нашу гарантию. Смягчение: формулировка бейджа согласована с юристом и говорит об источнике сведений, а не о разрешении.
Продукт1 frontend + 1 backend3 нед.зависит от I1.14, I2.8
Зачем
Отличие проекта, уже сделанное в веб-выдаче: вебмастер видит вклад признаков в позицию. В картинках вопрос «почему моя фотография на сороковом месте» задаётся чаще, а ответа не даёт никто.
Что делаем
Разложение скора по группам признаков §24.11 в просмотрщике.
Пометка происхождения результата из I2.3: текст, вектор или оба.
Указание, какие правила применились: разнообразие, схлопывание дублей, безопасный поиск.
Ограничение раскрытия: называем группы и направление вклада, не называем численные пороги.
Готово, когда
Панель открывается для любого результата, показывает вклад групп и применённые правила, численные пороги не раскрываются.
Как проверяем
Сверка вклада, показанного в панели, с формулой ранжирования на 100 результатах — расхождений нет.
Риск
Панель становится инструкцией по накрутке. Смягчение: раскрываются группы и знак вклада, а не веса и пороги — то же правило, что в веб-выдаче.
Продукт1 frontend + 1 backend4 нед.зависит от I2.8, 3.16
Зачем
Обратная связка с вебом: на визуальном запросе ряд картинок отвечает лучше десяти ссылок. Правило вытеснения (§6.4) при этом не отменяется.
Что делаем
Триггер по классу намерения с порогом уверенности и минимальным числом хороших изображений.
Один ряд, 6–8 картинок, без прокрутки внутри ряда.
Позиция по правилам вытеснения; учёт в общем лимите блоков.
Переход в вертикаль с сохранением запроса и в просмотрщик по клику.
Замер: растёт ли доля решённых задач и не падает ли переход на органику.
Готово, когда
Колдунщик показывается по триггеру, соблюдает лимиты, переход в вертикаль сохраняет запрос.
Как проверяем
Эксперимент с разделением трафика: доля отказов не растёт, доля переходов на сайты не падает более чем на 1 процентный пункт.
Риск
Блок отодвигает органику и забирает клики у сайтов. Смягчение: правило вытеснения из §6.4 применяется без исключений, что проверяется автотестом раскладки.
Платный метод из 08 и единственный способ для автора найти свои картинки в чужих руках — сценарий, ради которого адрес оригинала отдаётся всегда (§24.21).
Что делаем
Параметры по §24.21, включая поиск по изображению и по фрагменту.
Формат ответа с миниатюрой, оригиналом, источником, первоисточником и лицензией.
Квоты и тарификация в общей схеме интерфейса.
Ошибки с именем поля — тот же контракт, что у остальных методов.
Документация с примерами и ограничениями на использование ответа.
Готово, когда
Метод отвечает по контракту, квоты применяются, документация опубликована, ошибки называют поле.
Как проверяем
Набор контрактных тестов, проверяющий каждый параметр и каждый класс ошибки.
Риск
Метод используется для массового скачивания чужих изображений. Смягчение: отдаём адреса, а не файлы; квоты и обнаружение аномального профиля использования.
Продукт1 frontend + 1 backend4 нед.зависит от I1.22, I2.9
Зачем
Вторая половина отличия из §24.4: не только показать, что мы взяли, но и дать управлять — включая ответ на вопрос «кто ещё использует мои картинки».
Что делаем
Отчёт «кто использует ваши изображения» на основе групп дублей.
Показы и переходы по изображениям сайта.
Управление точечными запретами списком с историей изменений.
Заявление о первоисточнике с проверкой прав на сайт.
Выгрузка отчёта в машинно-читаемом виде.
Готово, когда
Четыре отчёта работают, запреты управляются списком, выгрузка доступна.
Как проверяем
Контрольный сайт: изображение, скопированное на второй сайт, появляется в отчёте «кто использует» в течение недели после обхода.
Риск
Отчёт «кто использует» становится инструментом давления на добросовестных цитирующих. Смягчение: отчёт информационный, никаких автоматических действий из него не следует.
Продукт1 frontend + 1 backend5 нед.зависит от I3.9, I2.9
Зачем
У автора изображений сегодня нет ни одного инструмента, чтобы следить за своими работами в вебе. Это отличие, которое невозможно скопировать быстро: оно требует групп дублей и первоисточника, то есть всего, что построено в I1 и I2.
Что делаем
Подписка на появление новых носителей своего изображения.
Отчёт по подтверждённым сайтам автора с историей.
Выгрузка списка носителей в машинно-читаемом виде.
Прямой переход к форме обращения по праву при обнаружении нарушения.
Ограничения против использования инструмента для слежки за чужими изображениями.
Готово, когда
Подписка работает, отчёт строится по подтверждённым правам, выгрузка доступна, чужие изображения отслеживать нельзя.
Как проверяем
Попытка подписаться на изображение с неподтверждённого сайта отклоняется; появление нового носителя приводит к уведомлению в течение недели.
Риск
Инструмент используется для массовых претензий по добросовестному цитированию. Смягчение: уведомление информационное, автоматическая подача обращений не предусмотрена.
Антиспам1 ML + 1 backend5 нед.зависит от I2.1, I1.7, 2.12
Зачем
Все текстовые сигналы картинки внешние и подделываются бесплатно. Без визуальной проверки согласия вертикаль превращается в галерею дорвеев за один квартал.
Что делаем
Пять приёмов из таблицы §24.11 как отдельные детекторы.
Проверка согласия текста и изображения по общему пространству представлений.
Признак «ворованная галерея»: доля оригинальных изображений на хосте.
Проверка подмены по User-Agent выборочной загрузкой из другого пула адресов.
Защита от ложных срабатываний на добросовестных двойниках — как в spam.py.
Готово, когда
Детекторы работают, доля ложных срабатываний на добросовестном корпусе не выше 0.5%, признаки участвуют в ранжировании.
Как проверяем
Размеченный спам-корпус изображений: полнота отсева не ниже 0.85 при названной доле ложных срабатываний.
Риск
Детектор «ворованной галереи» бьёт по легальным агрегаторам стоков. Смягчение: наличие лицензионной разметки и договорных отношений — отдельный признак-исключение.
Многоязычие1 backend + 1 аналитик5 нед.зависит от I3.1, 2.42, 3.36
Зачем
Картинки — самая языконезависимая вертикаль: изображение одно, подписи на разных языках. Это делает её естественной первой ступенью выхода за пределы русского.
Что делаем
Текстовые поля на английском в том же индексе, без отдельного контура.
Слияние подписей на разных языках в одной группе дублей.
Английская корзина визуальных запросов на 200 запросов.
Замер качества отдельно по языкам.
Кросс-языковой ответ: русский запрос находит изображение с английской подписью.
Готово, когда
Английские запросы обслуживаются в том же индексе, кросс-языковой сценарий работает, качество измерено по каждому языку отдельно.
Как проверяем
Замер pFound отдельно на русской и английской корзинах; проверка кросс-языкового сценария на 100 парах запросов.
Риск
Смешение языков в полях ухудшает русскую выдачу. Смягчение: язык поля хранится явно, вес поля зависит от языка запроса.
Основа сценария «что это»: без списка объектов поиск по картинке отвечает «похоже вот на это», но не отвечает «это вот что».
Что делаем
Модель обнаружения объектов с проверкой лицензии по правилам I2.1.
Автоматическое предложение рамки фрагмента по крупнейшему объекту (замена эвристике I2.5).
Подписи объектов на русском с привязкой к сущностям графа знаний.
Переход от объекта к текстовому запросу одним нажатием.
Никакой идентификации людей — только класс «человек» (§24.16).
Готово, когда
Объекты обнаруживаются, рамка предлагается автоматически, подписи связаны с сущностями, лица не идентифицируются.
Как проверяем
Корзина из 500 изображений с размеченными объектами: полнота обнаружения не ниже 0.8 при точности не ниже 0.85.
Риск
Ошибочная подпись объекта воспринимается как утверждение поисковика. Смягчение: подпись подаётся как предположение с возможностью уточнить запрос текстом.
«Такое же, но синее» и «где это находится» невозможно сформулировать ни картинкой, ни текстом по отдельности. Это и есть та задача, ради которой строится общее пространство представлений.
Что делаем
Совмещение вектора изображения и текстового уточнения в одном запросе.
Интерфейс: строка остаётся активной при загруженной картинке.
Разбор типов уточнений: цвет, материал, количество, стиль, отрицание.
Замер на корзине пар «изображение + уточнение» с известным ответом.
Готово, когда
Комбинированный запрос обрабатывается, типы уточнений разбираются, замер на корзине проведён.
Как проверяем
Корзина из 200 пар: доля верных ответов в топ-10 не ниже 0.5, что заметно выше поиска только по изображению.
Риск
Уточнение игнорируется, и результат неотличим от поиска по картинке. Смягчение: замер сравнивает с базовым сценарием обязательно, а не по желанию.
Ворота трека
Все критерии обязательны. Не пройдены — фаза продлевается,
а не закрывается.
I0: решение «идём или не идём» принято и записано с обоснованием
I0: правовая позиция по показу чужих изображений подписана юристом
I0: корзина из 500 визуальных запросов размечена, согласие асессоров не ниже 0.6
I1: pFound@60 на визуальной корзине не ниже 0.55
I1: доля дублей в первых тридцати не выше 10%, полнота дедупликации не ниже 0.85
I1: пропуск явного содержимого при умеренном фильтре не выше 1.0%
I1: любой из четырёх видов запрета исполняется не позднее 24 часов
I1: вертикаль полностью проходима с клавиатуры и работает без JavaScript
I1: LCP сетки на 4G не выше 1.8 с, CLS не выше 0.02
I2: pFound@60 не ниже 0.68, доля дублей в первых тридцати не выше 4%
I2: при поиске по картинке исходное изображение в топ-5 не реже 80%
I2: загруженное пользователем изображение не оставляет следов после срока — подтверждено тестом
I2: объявленная лицензия совпадает с проверенной вручную не ниже 99%
I3: индекс на миллиард изображений, задержка p95 не выше 300 мс
I3: pFound@60 не ниже 0.75, LCP не выше 1.2 с
I3: слепое сравнение с Яндексом и Google на 300 запросах проведено и опубликовано
I3: обращения правообладателей рассматриваются не дольше трёх рабочих дней
I4: вертикаль передана в сопровождение с регламентом и назначенными ответственными
Параллельный трек
Переводчик
Месяцы
трек
Календарь
с фазы 3
Команда
24 чел.
Бюджет
520 млн ₽
Задач
64
Недель работ
312
Построить машинный перевод как слой платформы: один движок обслуживает пользовательский переводчик, кросс-языковой поиск, перевод сниппетов, перевод страниц, документов и озвученный перевод видео. Отличие от существующих переводчиков — источник каждого варианта: словарная карточка и альтернативы опираются на страницы собственного индекса, а не на непрозрачное решение сети.
Переводкритический путь2 ML-инженера6 нед.зависит от T0.9
Зачем
В веб-добытых параллельных данных мусора больше, чем полезного: несовпадающие пары, машинный перевод, обрывки навигации. Модель, обученная на этом, воспроизводит мусор.
Что делаем
Отбор и загрузка корпусов через OpusCleaner с записью источника и лицензии из реестра T0.2.
Фильтры: длина, соотношение длин, доля цифр и латиницы, повторы, язык каждой стороны.
Классификатор качества пары на Bicleaner AI с порогом, подобранным по корзине.
Отсев машинного перевода: пары, подозрительно похожие на выход публичных систем.
Журнал: сколько отсеяно на каждом фильтре и почему.
Готово, когда
Конвейер собирает очищенный корпус воспроизводимо, журнал показывает вклад каждого фильтра.
Как проверяем
Ручная проверка 300 случайных пар после очистки: доля пригодных не ниже 95%.
Риск
Слишком жёсткая фильтрация выбрасывает редкие, но ценные явления. Смягчение: пороги подбираются по качеству модели на корзине, а не по «чистоте» корпуса.
Переводкритический путь2 ML-инженера7 нед.зависит от T0.5, T1.1
Зачем
Параллельные страницы найдены в T0.5, но модель обучается на предложениях. Сопоставление предложений между двумя версиями страницы — отдельная задача, и её качество определяет качество корпуса.
Что делаем
Выравнивание предложений через многоязычные эмбеддинги LaBSE.
Обработка несоответствий: абзац на одном языке против двух на другом.
Отсев пар с низкой уверенностью сопоставления.
Пропуск результата через конвейер очистки T1.1.
Замер: сколько пригодных пар даёт индекс в месяц и как это растёт с обходом.
Готово, когда
Корпус из индекса собран, объём измерен, доля пригодных пар на ручной проверке не ниже 92%.
Как проверяем
Ручная проверка 300 пар; сравнение обучения с добавкой этого корпуса и без неё на корзине.
Риск
Собственный корпус не даёт прироста качества. Смягчение: проверяется обучением до того, как на нём строятся планы.
Словарь подслов определяет, как модель видит текст. Плохой словарь режет русские слова на бессмысленные куски, и никакая архитектура этого не исправит.
Что делаем
Обучение словаря SentencePiece на объединённом корпусе двух языков.
Подбор размера словаря по качеству на корзине, а не по традиции.
Проверка на русской морфологии: доля слов, режущихся по границам морфем.
Отдельные метки для непереводимых подстановок из T1.9.
Фиксация словаря как артефакта с версией: смена словаря означает переобучение.
Готово, когда
Словарь обучен, размер обоснован замером, метки подстановок зарезервированы.
Как проверяем
Сравнение двух-трёх размеров словаря на одинаковом обучении: выбранный не хуже остальных на корзине.
Риск
Словарь, оптимальный для новостей, плох для технических текстов. Смягчение: замер по типам текста отдельно.
Переводкритический путь3 ML-инженера10 нед.зависит от T1.2, T1.3, T0.6
Зачем
Русский — наш главный язык, и качество на нём определяет продукт целиком. Открытые модели ru↔en обучены на нефильтрованных данных и на нашей корзине проигрывают заметно.
Что делаем
Обучение модели на Marian: базовая архитектура, наши данные, наш словарь.
Планирование состава данных через OpusTrainer: расписание смешивания корпусов по эпохам.
Аугментация на устойчивость: опечатки, регистр, разметка внутри текста.
Обратный перевод одноязычных текстов из индекса для расширения корпуса.
Обучение в обе стороны: ru→en и en→ru — это две модели, а не одна.
Готово, когда
Обе модели обучены и по COMET на корзине превосходят лучшую открытую модель, прошедшую по лицензии.
Как проверяем
Прогон корзины на стенде T0.6 по восьми типам текста: превосходство по каждому типу, а не только в среднем.
Риск
Обучение не даёт прироста над открытой моделью. Смягчение: если после двух циклов прироста нет, берём открытую модель с дообучением — это решение T0.9, а не поражение.
Переводкритический путь2 backend5 нед.зависит от T0.9
Зачем
Потребителям в основном плане переводчик нужен раньше, чем будет обучена собственная модель. Контракт, за которым сначала стоит открытая модель, снимает эту зависимость полностью.
Что делаем
Входная точка yotti-tr-api с контрактом из документа, §23.5.6.
Открытая модель, прошедшая по лицензии, как первая реализация.
Квоты, авторизация, метрики, журнал вызовов.
Клиентская библиотека для внутренних потребителей.
Явное поле версии модели в ответе: потребитель всегда знает, чем переведено.
Готово, когда
Сервис в проде, задача 3.39 работает через него, а не через внешний интерфейс.
Как проверяем
Отключение внешнего интерфейса перевода не влияет на кросс-языковой поиск.
Риск
Контракт окажется неудобным и его придётся ломать при подмене модели. Смягчение: контракт проектируется под качественную модель, а не под ту, что стоит за ним сейчас.
Модель, не влезающая в бюджет задержек, не улучшает продукт. Квантование даёт примерно четверть исходного размера при небольшой потере качества — без него быстрая ветка не работает на процессорах.
Что делаем
Конвертация обученных моделей в формат CTranslate2.
Квантование в INT8 и замер потери качества на корзине.
Подбор параметров батчировки под два профиля нагрузки: одиночные запросы и пакеты.
Замер задержки p50, p95, p99 на каждом профиле.
Регресс-тест производительности в сборке (1.37).
Готово, когда
Быстрая ветка укладывается в 40 мс на предложение p95, потеря COMET от квантования не выше 0.5%.
Как проверяем
Нагрузочный прогон на профиле, соответствующем расчёту T0.7.
Риск
Квантование сильнее бьёт по редким языкам. Смягчение: замер потери по каждому языку отдельно, а не в среднем.
Переводкритический путьbackend + ML-инженер5 нед.зависит от T1.8, T1.3
Зачем
Без этого перевод страниц и документов ломает вёрстку, а перевод интерфейсных строк ломает подстановки. Это самая частая претензия к машинному переводу в продуктовых сценариях.
Что делаем
Замена непереводимого на метки: теги, ссылки, адреса почты, числа с единицами, эмодзи, плейсхолдеры вида {name}.
Возврат меток на место после перевода по выравниванию внимания.
Проверка целостности: если метка потерялась или размножилась, сегмент отдаётся без перевода, а не с испорченной разметкой.
Метрика сохранности разметки в стенде T0.6.
Набор тестов на вложенной разметке.
Готово, когда
Сохранность разметки на тестовом наборе не ниже 99.9%, потерянная метка приводит к отказу от перевода сегмента, а не к порче.
Как проверяем
Прогон корзины с разметкой из T0.4: сравнение дерева разметки до и после.
Риск
Модель переставляет метки местами при смене порядка слов. Смягчение: выравнивание внимания, а не позиционное соответствие.
Большая модель на каждое нажатие клавиши — это стоимость, которая не окупается ничем. Правило «печатает — быстрая, остановился — качественная» решает и стоимость, и ощущение скорости.
Что делаем
Две ветки за одним контрактом с явным параметром качества.
Правило автоматического выбора и его переопределение потребителем.
Отмена незавершённых запросов при продолжении набора.
Жёсткий таймаут для колдунщика в выдаче: не успел — колдунщик не показывается.
Учёт стоимости вызова по веткам (3.48).
Готово, когда
Обе ветки работают за одним контрактом, отмена запросов не оставляет висящих вызовов, таймаут колдунщика соблюдается.
Как проверяем
Замер: перевод в выдаче ни при каких условиях не увеличивает время ответа SERP.
Риск
Переключение веток заметно как «дёрганье» текста. Смягчение: замена результата на месте с плавным переходом, проверяется на людях.
Граница данных: публичный текст и пользовательский
Переводкритический путьbackend + юрист4 нед.зависит от T1.10
Зачем
Через переводчик проходят договоры, письма и медицинские выписки. Правило «пользовательский текст не попадает в общий кеш и в обучение» должно быть свойством типа данных, а не строчкой в регламенте.
Что делаем
Разделение источников в типе данных: текст из индекса и текст от пользователя — разные типы.
Запрет на уровне компиляции: пользовательский текст не может быть записан в общий кеш.
Правило для обучающего конвейера: пользовательские тексты в обучение не идут по умолчанию.
Согласие на использование правок для улучшения — отдельное, явное, отзываемое.
Удаление истории переводов по запросу вместе с производными.
Готово, когда
Попытка записать пользовательский текст в общий кеш не компилируется; удаление истории проверено сквозным тестом.
Как проверяем
Тест: намеренная попытка нарушить границу останавливается сборкой, а не проверкой на ревью.
Риск
Граница обходится через промежуточные структуры. Смягчение: аудит всех путей записи в кеш при приёмке задачи.
Составить глоссарий с нуля — работа на недели, и из-за неё функцией не пользуются. Мы можем предложить готовый вариант: как этот термин переводят на сайтах отрасли.
Что делаем
Извлечение терминов из загруженного документа.
Поиск их переводов в параллельном корпусе по доменам, близким к тематике документа.
Предложение вариантов с частотностью и ссылками на источники.
Принятие или отклонение варианта одним нажатием.
Сохранение принятых терминов в глоссарий организации.
Готово, когда
По документу строится черновик глоссария, доля принимаемых предложений не ниже 60% на пилоте.
Как проверяем
Пилот на пяти организациях с их реальными документами: замер доли принятых предложений.
Риск
Предложения из неподходящей отрасли. Смягчение: подбор доменов по тематике документа, показ источника рядом с вариантом.
Переводкритический путь2 backend7 нед.зависит от T3.1
Зачем
Перевод, после которого документ нужно верстать заново, экономит не время, а его половину. Сохранение форматирования — суть функции, а не приятное дополнение.
Что делаем
Извлечение переводимого текста через фильтры Okapi Framework: docx, xlsx, pptx, odt, txt.
Промежуточное представление в XLIFF, перевод сегментов, сборка документа обратно.
Переводкритический путь2 ML-инженера6 нед.зависит от T4.2, T1.4
Зачем
Перевод, который вдвое длиннее оригинала, невозможно уложить в ту же реплику. Либо речь ускоряется до неразборчивости, либо дорожка расходится с видео. Контроль длины — то, что отличает дубляж от озвученного перевода.
Что делаем
Управление длиной перевода: целевая длительность произнесения как параметр.
Обучение или дообучение на данных с контролем длины.
Компромисс «точность против длины» с явным приоритетом смысла.
Учёт скорости речи целевого языка: одинаковый текст произносится за разное время.
Замер: доля реплик, уложившихся в исходную длительность без ускорения.
Готово, когда
Не менее 85% реплик укладываются в исходную длительность с отклонением не более 10%, без потери смысла по оценке асессоров.
Как проверяем
Оценка асессорами на 200 репликах: смысл сохранён, длительность соблюдена.
Риск
Сокращение ради длины теряет смысл. Смягчение: приоритет смысла, при конфликте допускается небольшое ускорение речи.
Правокритический путьюрист + ML-инженер6 нед.зависит от T0.1
Зачем
Лицензия весов и лицензия обучающих данных — разные лицензии, и обе способны закрыть коммерческое использование. Обнаружить это после обучения означает выбросить обучение.
Что делаем
Реестр: каждая модель-кандидат, каждый корпус, лицензия, ссылка на источник лицензии, дата проверки.
Проверка производных: модели, дообученные от некоммерческих, наследуют ограничение.
Проверка корпусов OPUS поштучно: агрегатор объединяет источники с разными лицензиями.
Отдельная проверка лицензий на веса моделей распознавания и синтеза речи.
Правило в сборке: артефакт без записи в реестре не попадает в обучение и в прод.
Готово, когда
Реестр заполнен по всем кандидатам, у каждой записи есть ссылка на источник лицензии, сборка падает на артефакте без записи.
Как проверяем
Попытка обучения на корпусе, не заведённом в реестр, останавливается автоматически.
Риск
Лицензия меняется со временем — синтез Piper переехал с разрешительной на копилефт между версиями. Смягчение: в реестре хранится версия артефакта, а не только имя.
Наш главный источник данных — собственный обход. Использование текстов веба для обучения моделей регулируется хуже, чем хотелось бы, и позиция нужна до того, как корпус собран.
Что делаем
Юридическая позиция: что именно мы используем, в каком виде храним, что публикуем.
Согласование с собственными правилами для сайтов (1.62): наши обещания владельцам сайтов должны совпадать с нашими действиями.
Механизм отказа для владельца сайта: как заявить, что тексты не используются для обучения.
Учёт отказов в конвейере данных: технически, а не регламентом.
Публичное описание практики на странице о боте (0.16).
Готово, когда
Позиция получена письменно, механизм отказа описан и учтён в конвейере, страница о боте обновлена.
Как проверяем
Хост, заявивший отказ, отсутствует в собранном корпусе — проверяется выборкой по журналу сборки.
Риск
Регулирование меняется в сторону ужесточения. Смягчение: механизм отказа делаем независимо от того, обязателен ли он сегодня.
Синтез голоса, похожего на голос конкретного человека, — область, где технической возможности недостаточно. Выяснять это после реализации дубляжа дорого.
Что делаем
Правовой статус синтеза голоса, похожего на голос конкретного человека.
Требования к согласию и допустимые исключения.
Обязанность помечать синтезированную речь и форма пометки.
Ответственность за перевод содержимого, нарушающего закон.
Позиция по правам на озвучиваемое произведение.
Готово, когда
Заключение получено письменно, требования к пометке синтезированной речи зафиксированы.
Как проверяем
Заключение отвечает на все пять вопросов конкретно, без формулировок «возможно потребуется».
Риск
Заключение запрещает клонирование голоса. Смягчение: запасной вариант — фиксированные голоса Kokoro с подбором по полу и тону, дубляж остаётся возможным.
Качествокритический путьлингвист + аналитик6 нед.зависит от T0.1
Зачем
Без корзины любое улучшение модели — это мнение. Средняя оценка по всему тексту скрывает провалы на отдельных типах, поэтому корзина делится по типам с самого начала.
Что делаем
3000 сегментов ru↔en по восьми типам текста в долях из документа, §23.6.1.
Эталонные переводы от профессиональных переводчиков, двойная проверка.
Отдельный набор с разметкой: страницы, интерфейсные строки, тексты с подстановками.
Набор коротких строк без контекста — там, где модели ломаются чаще всего.
Разделение на открытую и закрытую часть: закрытая не публикуется и не попадает в обучение.
Готово, когда
Корзина собрана, эталоны проверены дважды, закрытая часть изолирована от обучающего конвейера технически.
Как проверяем
Проверка на утечку: поиск сегментов закрытой корзины в обучающем корпусе даёт ноль совпадений.
Риск
Эталоны низкого качества обесценивают все дальнейшие замеры. Смягчение: двойная проверка и отбраковка переводчиков по тестовому заданию.
Качествокритический путь2 ML-инженера6 нед.зависит от T0.4, T0.6, T0.2
Зачем
Знать в цифрах, насколько открытый baseline хуже конкурентов на нашей корзине. Это отправная точка всего трека и единственный способ обсуждать «сколько стоит закрыть разрыв» не на ощупь.
Что делаем
Прогон корзины через открытые модели-кандидаты, прошедшие по лицензии.
Прогон через публичные интерфейсы конкурентов в пределах, допустимых их условиями.
Сравнение по каждому типу текста отдельно.
Разбор ошибок вручную на подвыборке: какие категории ошибок дают основной вклад.
Отчёт: разрыв в цифрах и гипотезы о том, чем он закрывается.
Готово, когда
Разрыв измерен по восьми типам текста, категории ошибок ранжированы по вкладу.
Как проверяем
Ручной разбор 200 худших сегментов подтверждает, что категории ошибок определены верно.
Риск
Условия конкурентов запрещают такое сравнение. Смягчение: юрист проверяет допустимость до прогона; при запрете сравниваем с опубликованными результатами.
Документ на 500 страниц не переводится в синхронном запросе. Очередь с прогрессом — единственный работающий способ, и она же защищает интерактивную нагрузку.
Что делаем
Очередь задач с приоритетами: интерактивные выше пакетных.
Прогресс и оценка оставшегося времени.
Возобновление после сбоя без повторного перевода готовых сегментов.
Ограничение параллельных задач на аккаунт.
Уведомление о завершении.
Готово, когда
Документ на 500 страниц переводится, прогресс отображается, перезапуск сервиса не теряет готовые сегменты.
Как проверяем
Намеренная остановка сервиса на середине задачи: после перезапуска работа продолжается с той же точки.
Риск
Пакетные задачи забивают парк. Смягчение: раздельные очереди и приоритеты, проверка под нагрузкой.
Продукткритический путь2 frontend + дизайнер5 нед.зависит от T1.11
Зачем
Основная точка входа. Раскладка «два поля рядом» устоялась, и изобретать здесь новое — вредить пользователю: мышечная память с другого сервиса стоит дороже оригинальности.
Что делаем
Два поля, выбор языков, кнопка обмена, счётчик символов, копирование результата.
Определённый язык показывается явно, с возможностью исправить.
Тёмная тема и доступность по требованиям 09.
Мобильная раскладка: поля друг под другом, клавиатура не перекрывает результат.
Продуктfrontend + backend4 нед.зависит от T2.1, T1.11
Зачем
Именно это определяет ощущение скорости продукта. Пауза в полсекунды между «допечатал» и «увидел перевод» ощущается как медленный сервис, даже если сервер отвечает за 40 мс.
Что делаем
Отправка на быструю ветку с задержкой в 150 мс после остановки набора.
Отмена предыдущих незавершённых запросов.
Уточнение качественной веткой через 600 мс без набора.
Индикатор того, что показан быстрый перевод и он сейчас уточнится.
Работа при плохом соединении: показ последнего успешного результата, а не пустоты.
Готово, когда
Перевод появляется не позже 250 мс после остановки набора на p95, уточнение не «дёргает» страницу.
Как проверяем
Замер на записи реального набора текста при задержке сети 100 мс.
Риск
Поток запросов при быстром наборе перегружает быструю ветку. Смягчение: задержка и отмена, замер числа запросов на символ.
Та же линия, что панель «как ранжировано» в выдаче: машина обязана уметь показать, почему она так решила. У конкурентов альтернативы есть, объяснения — нет.
Что делаем
Показ альтернативных гипотез декодера с их оценками.
Замена варианта в тексте одним нажатием, с сохранением согласования.
ПродуктML-инженер + frontend6 нед.зависит от T1.6, T2.1
Зачем
Отличие, которого нет у конкурентов: текст не покидает устройство. Для юристов, врачей и всех, кому нельзя отправлять документ в облако, это не удобство, а условие использования.
Что делаем
Сборка компактной модели под WebAssembly на основе конвейера Mozilla Translations.
Загрузка модели по запросу с кешированием в браузере.
Явный переключатель приватного режима с честным указанием: качество ниже, скорость ниже, текст никуда не уходит.
Изоляция кода под лицензией MPL-2.0 в отдельных файлах согласно правилу лицензий.
Замер качества клиентской модели на корзине и честная его публикация.
Готово, когда
Приватный режим работает без сетевых запросов после загрузки модели, разница в качестве измерена и показана пользователю.
Как проверяем
Проверка сетевой активности при переводе в приватном режиме: запросов с текстом нет.
Риск
Размер модели делает первую загрузку неприемлемо долгой. Смягчение: загрузка по запросу и только для выбранной пары языков.
Многоязычие2 ML-инженера8 нед.зависит от T1.16, 3.34
Зачем
Языки добавляются вместе с языковыми кластерами поиска, а не отдельным списком: перевод на язык, которым мы не занимались в индексе, некому проверять и незачем показывать.
Что делаем
Подключение пяти языков первого кластера через MADLAD-400 с дообучением.
Сбор корзины по каждому языку не менее 500 сегментов.
Асессоры-носители для каждого языка.
Замер качества и честная публикация уровня поддержки: полная или предварительная.
Правило: язык без корзины и асессоров не включается.
Готово, когда
Пять языков работают, по каждому есть корзина и замер, уровень поддержки указан в интерфейсе.
Как проверяем
Оценка носителями: доля приемлемых переводов не ниже 85% по каждому языку.
Риск
Языки включаются быстрее, чем находятся асессоры. Смягчение: правило «нет асессоров — нет языка» действует без исключений.
Ворота трека
Все критерии обязательны. Не пройдены — фаза продлевается,
а не закрывается.
T0: реестр лицензий заполнен, ни одна некоммерческая модель не попала в стек
T0: разрыв в качестве с конкурентами измерен по восьми типам текста
T0: собственный параллельный корпус из индекса измерен, чистота не ниже 90%
T0: решение «идём дальше» принято письменно и обосновано цифрами
T1: собственная модель ru↔en превосходит лучшую открытую по COMET на каждом типе текста
T1: быстрая ветка укладывается в 40 мс на предложение p95
T1: сохранность разметки не ниже 99.9%
T1: кросс-языковой поиск работает через свой сервис, внешний интерфейс отключён
T1: пользовательский текст технически не может попасть в общий кеш
T1: ежедневный автозамер качества идёт без ручных действий
T2: страница переводчика в открытом доступе, перевод появляется не позже 250 мс после остановки набора
T2: примеры употребления из индекса покрывают не менее 90% частотных слов
T2: приватный режим работает без единого сетевого запроса с текстом
T2: перевод сниппетов не увеличил время ответа выдачи
T3: документы переводятся с сохранением вёрстки на 100 реальных файлах
T3: соблюдение глоссария не ниже 99%
T3: программный интерфейс опубликован, есть внешние интеграции
T3: выручка интерфейса и глоссариев покрывает операционные расходы ядра перевода
T4: правовое заключение по синтезу голоса получено до реализации дубляжа
T4: не менее 85% реплик укладываются в исходную длительность
T4: рассинхрон дубляжа не выше 300 мс на 95% реплик