docs(generator): решения грилинга — корзина и уровень спроса товара

- Зачем:
  - приёмка #40 нашла в торговых данных два точных равенства, каких в живом
    магазине не бывает: событие корзины возникало ровно у визитов со
    страницей /cart, а внутри такого визита в корзину ложились все открытые
    карточки.
- Что:
  - в спеку генератора, раздел 9, добавлен блок «Решено при исполнении #40
    после приёмки»: корзина отвязана от страницы корзины, уровень спроса
    становится свойством товара, границы правки — вилки раздела 5.
  - записаны отклонённые варианты: свой процент у каждого sku и вывод
    склонности из цены.
  - в CONTEXT.md заведён термин «уровень спроса».
- Проверка:
  - git show --stat; текст решений читается без обращения к переписке.
This commit is contained in:
2026-08-02 21:06:51 +03:00
parent 722dbe22b7
commit fbffeda5ea
2 changed files with 48 additions and 0 deletions
+6
View File
@@ -84,6 +84,12 @@ _Избегать_: «покупатель» про того, кто купил
`data/catalog/products.csv` — общий справочник генератора и словаря
ClickHouse. Форма файла решена, длина — нет: строки дописываются.
**Уровень спроса**:
Свойство товара в каталоге: как часто открытую карточку кладут в корзину.
Три значения — магнит, обычный, залёживается. Постоянная часть мира, а не
поведение дня: он и делает конверсию «просмотр → корзина» по товарам и
брендам различимой.
**Ось модельного времени**:
Собственный календарь мира генератора. Дни считаются от фиксированного
первого дня D0; реальный календарь в модели не участвует. Между прогонами
+42
View File
@@ -719,6 +719,48 @@ pytest-тест с маркером `perf` и таймаутом-обрубан
которого в плоских колонках нет; строки живут в справочниках рядом с
устройствами и городами, а не сочиняются на месте.
Решено при исполнении #40 после приёмки (2026-08-02) — грилинг тождества
«просмотр → корзина». Приёмка нашла два точных равенства: каждое в живых
данных не встречается и потому читается аналитиком как склейка в разметке,
а не как поведение людей.
- **Корзина отвязана от страницы корзины.** Замерено до правки (день 2
канонического мира): множества «визиты с событием корзины» и «визиты со
страницей `/cart`» совпадали в точности — 802 и 802. Событие корзины
возникало только у визита, дошедшего до воронки, то есть факт добавления
идеально предсказывался более поздним просмотром страницы. Теперь
положить может любой визит, открывший карточку; страница `/cart`
остаётся шагом воронки и решается как прежде, а заказ по-прежнему
рисуется только у визита, дошедшего до подтверждения. Оговорка, без
которой появилась бы новая ложь вместо старой: у визита, дошедшего до
`/cart`, хотя бы одна позиция в корзине есть всегда — страница корзины
при пустой корзине невозможна. Брошенные корзины в мире были и до правки
(в том же дне 802 корзины против 272 покупок); правка добавляет к ним
тех, кто положил и корзину не открывал, — самый массовый сюжет магазина.
Почему это проехало при нарезке: воронка #39 записана в терминах
страниц, #40 принял решение про события («событие корзины садится на
карточку»), но вопрос «какой визит вообще кладёт» заново не задал —
страничное правило молча переехало на уровень событий.
- **Класть или нет решает и товар, а не только визит.** До правки в
корзину ложились все карточки покупающего визита: внутри воронки 100%,
вне её 0%. Привлекательность товара измерить было нечем — конверсия
«просмотр → корзина» по sku давала чистый шум, а вопрос «какие товары
кладут чаще» ответа не имел. Теперь у товара есть уровень спроса:
колонка каталога с тремя значениями (магнит, обычный, залёживается), а
вероятности трёх уровней — числа мира рядом с остальными. Отклонено:
*свой процент у каждого из 180 sku* — рукописные числа, которых никто не
обоснует, а каталог по решению #39 дописывается механически; *выводить
склонность из цены* — жёсткая связь, в которой менти найдёт ровно то,
что мы в неё вложили, и ничего сверх.
- **Границы правки — те же вилки раздела 5**: аудитория 6–8 тыс., средний
день около 50 тыс. событий (сейчас 49,5 тыс. — запас невелик, и рост
событий корзины считается против него), конверсия визита около 2%.
Заказ рисуется из корзины, а корзина сузилась, поэтому доля брошенных
позиций (15%) и состав заказа (1,9 позиции) перемеряются вместе с
остальным: сохраняется не число, а свойство — заказ уже корзины и
однопозиционных заказов около половины. Числа канонического мира после
правки перемеряются и переписываются.
Остаётся открытым, за тикетами:
- интерфейс запуска генератора (CLI / цели make) и как он делит режимы