Стрелка вверх — не ответ
Любой инструмент A/B рано или поздно показывает два числа и зелёную стрелку. Стрелка — простая часть. Сложное — всё, что она прячет: хватает ли выборки, пересекаются ли доверительные интервалы, не сломал ли выигравший вариант что-нибудь ещё.
Lift сделан так, чтобы решение можно было защитить через месяц. Экран результата говорит вывод одной строкой, а под ним показывает работу: интервал Уилсона, p-значение, вероятность обойти контроль, сколько данных тесту ещё нужно и что случилось с метриками, которым двигаться было нельзя.
Что внутри
Детерминированные вёдра
SHA-256 от «соль:флаг:человек» в 10 000 вёдер. Один и тот же человек получает один и тот же вариант на любом запросе и любом сервере — без сессии, без таблицы соответствий и без похода в базу.
Правила с объяснением
Условия по любому атрибуту, внутри правила «и», между правилами решает порядок. Ответ возвращает вариант, причину и номер сработавшего правила — вопрос «почему у этого человека старая кнопка» решается одним полем формы.
Статистика без пакетов
Интервал Уилсона, двухвыборочный z-тест, бета-апостериорная вероятность выигрыша и расчёт размера выборки написаны руками и проверены против учебных значений — включая обратную нормальную функцию по Моро.
Метрики-ограничители
То, чему нельзя становиться хуже, даже если основная метрика растёт. Значимое ухудшение фоновая задача сама пишет в журнал, а экран показывает красным рядом с выводом: заказов больше, но возвраты выросли сильнее.
Идемпотентная свёртка
Человек считается один раз в сутки на вариант, а задача перезаписывает день целиком, а не складывает его с собой. Опоздавшие события просто поправляют цифры на следующем прогоне; экраны читают только свёртку и остаются мгновенными.
API для SDK
Две ручки: забрать конфигурацию и прислать события пачкой до 500 штук. Ключ привязан к окружению, конфигурация лежит в кэше десять минут и сбрасывается в момент сохранения флага.