feat(generator): вариант A/B-теста в ParsedParamsKey1 #47

Open
opened 2026-08-02 16:08:47 +03:00 by ddmitry · 0 comments
Owner

Зачем

Колонка ParsedParamsKey1 входит в контракт выгрузки (мастер-спека, раздел
1.2), но генератор её не заполняет: в каждой строке пустой массив. Мастер-спека
сама называет естественное наполнение — вариант A/B-теста. Пока колонка пуста,
она ничему не учит; с вариантом появляется обычная аналитическая работа:
сравнить конверсию вариантов и решить, есть ли разница на самом деле.

Тикет заведён при исполнении #39 и в работу тогда не брался: вариант — это
константа куки, то есть третий массив паспорта в плане состава, а такой работы
ни одно задание не просило.

Что сделать

  • Вариант приписывается куке в плане состава, рядом с профилем устройства и
    городом: человек не должен перескакивать между вариантами от визита к визиту.
  • Доля вариантов — число мира в world.py, не литерал в логике.
  • День-функция кладёт вариант в ParsedParamsKey1 каждой строки.
  • Броски приписываются последними, чтобы измеренные числа канонического мира не
    сдвинулись, — проверяется прогоном счётчиков плана до и после, не на глазок.

Что решить в самом тикете

  • Сколько вариантов и в какой доле; идёт ли тест весь период снимка или с
    какого-то дня.
  • Что делать с двухкуковой парой. Человек с двумя куками — один участник
    теста, но вариант приписывается куке. Если паре выпадут разные варианты,
    человек окажется в обоих сразу — в жизни это настоящая беда A/B-тестов, и
    чинит её как раз склейка личности, на которой стоит лаба пар. Оба ответа
    осмысленны: одинаковый вариант у пары — чистый тест, разный — материал для
    лабы. Выбор владельца, решение записать в спеку.

Критерии приёмки

  • ParsedParamsKey1 заполнен во всех строках выгрузки, тип контракта не
    менялся.
  • Вариант у куки один во всех её визитах и во все её дни — сторожится
    тестом.
  • Доля вариантов вынесена в world.py с пояснением, тест сторожит связку.
  • Счётчики плана до и после правки совпадают: приток, границы дневной
    аудитории, число посетителей за 14 дней, число пар.
  • Решение по паре и по составу теста записано в спеку генератора, раздел 9.
  • make lint, make typecheck, make test зелены.

Сначала прочитать

  • docs/specs/2026-07-30-stand-v2-realism.md, раздел 1.2 — контракт колонок.
  • docs/specs/2026-08-01-generator.md, разделы 2 и 9 — дисциплина случайности
    и решения, принятые по ходу.
  • generator/src/clickstream_generator/plan.py — паспорт куки: как в #39
    приписаны профиль устройства и город.
  • generator/src/clickstream_generator/day.py — где колонка заполняется.

Границы

  • Торговые события, конверсия и любые выводы «какой вариант лучше» — не здесь:
    тикет даёт данные, а не анализ.
  • Key2..10 не заводятся: контракт берёт один уровень параметров.
  • Схема выгрузки не меняется — колонка уже есть.
## Зачем Колонка `ParsedParamsKey1` входит в контракт выгрузки (мастер-спека, раздел 1.2), но генератор её не заполняет: в каждой строке пустой массив. Мастер-спека сама называет естественное наполнение — вариант A/B-теста. Пока колонка пуста, она ничему не учит; с вариантом появляется обычная аналитическая работа: сравнить конверсию вариантов и решить, есть ли разница на самом деле. Тикет заведён при исполнении #39 и в работу тогда не брался: вариант — это константа куки, то есть третий массив паспорта в плане состава, а такой работы ни одно задание не просило. ## Что сделать - Вариант приписывается куке в плане состава, рядом с профилем устройства и городом: человек не должен перескакивать между вариантами от визита к визиту. - Доля вариантов — число мира в `world.py`, не литерал в логике. - День-функция кладёт вариант в `ParsedParamsKey1` каждой строки. - Броски приписываются последними, чтобы измеренные числа канонического мира не сдвинулись, — проверяется прогоном счётчиков плана до и после, не на глазок. ## Что решить в самом тикете - Сколько вариантов и в какой доле; идёт ли тест весь период снимка или с какого-то дня. - **Что делать с двухкуковой парой.** Человек с двумя куками — один участник теста, но вариант приписывается куке. Если паре выпадут разные варианты, человек окажется в обоих сразу — в жизни это настоящая беда A/B-тестов, и чинит её как раз склейка личности, на которой стоит лаба пар. Оба ответа осмысленны: одинаковый вариант у пары — чистый тест, разный — материал для лабы. Выбор владельца, решение записать в спеку. ## Критерии приёмки - [ ] `ParsedParamsKey1` заполнен во всех строках выгрузки, тип контракта не менялся. - [ ] Вариант у куки один во всех её визитах и во все её дни — сторожится тестом. - [ ] Доля вариантов вынесена в `world.py` с пояснением, тест сторожит связку. - [ ] Счётчики плана до и после правки совпадают: приток, границы дневной аудитории, число посетителей за 14 дней, число пар. - [ ] Решение по паре и по составу теста записано в спеку генератора, раздел 9. - [ ] `make lint`, `make typecheck`, `make test` зелены. ## Сначала прочитать - `docs/specs/2026-07-30-stand-v2-realism.md`, раздел 1.2 — контракт колонок. - `docs/specs/2026-08-01-generator.md`, разделы 2 и 9 — дисциплина случайности и решения, принятые по ходу. - `generator/src/clickstream_generator/plan.py` — паспорт куки: как в #39 приписаны профиль устройства и город. - `generator/src/clickstream_generator/day.py` — где колонка заполняется. ## Границы - Торговые события, конверсия и любые выводы «какой вариант лучше» — не здесь: тикет даёт данные, а не анализ. - `Key2..10` не заводятся: контракт берёт один уровень параметров. - Схема выгрузки не меняется — колонка уже есть.
ddmitry added the needs-triage label 2026-08-02 16:08:47 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: ddmitry/clickstream-data-platform#47