docs(specs): спека «Боевой реализм v2» принята владельцем (#17)
- Зачем:
- зафиксировать вердикт владельца по трём помеченным отступлениям и
закрыть приёмку спеки.
- Что:
- статус Draft -> Accepted; подтверждены порядок страховочных срезов
и VisitID как эталон самопроверки.
- Sign взят как колонка формата без механики (всегда 1, 47-я колонка
события); честность — комментарий в DDL, абзац в документе о
реализме, лекционный крючок про CollapsingMergeTree.
- в опорные точки добавлена рамка лабы сессий: сначала собрать самому,
потом рассказ про VisitID в хитах с октября 2025.
- Проверка:
- вычитка разделов 1.1, 1.2, 10, 12 и шапки статуса.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,8 @@
|
|||||||
# Боевой реализм стенда (v2): широкое событие, заказы, кластер, анонимность
|
# Боевой реализм стенда (v2): широкое событие, заказы, кластер, анонимность
|
||||||
|
|
||||||
Статус: Draft — на приёмку владельцу.
|
Статус: Accepted (2026-07-30). Три помеченных отступления подтверждены
|
||||||
|
владельцем на приёмке: порядок страховочных срезов (раздел 9), `Sign` как
|
||||||
|
колонка без механики (раздел 1.1), `VisitID` как эталон самопроверки (1.2).
|
||||||
Дата: 2026-07-30. Тикет: #17 (сборка карты #10).
|
Дата: 2026-07-30. Тикет: #17 (сборка карты #10).
|
||||||
Источники: резолюции #18 (модель данных), #15 (`purchase` и заказы),
|
Источники: резолюции #18 (модель данных), #15 (`purchase` и заказы),
|
||||||
#14 (кластер), #13 (цена кластера), #16 (анонимность и склейка); исследование
|
#14 (кластер), #13 (цена кластера), #16 (анонимность и склейка); исследование
|
||||||
@@ -64,10 +66,13 @@ JSON-поле `ecommerce`. Сессий в потоке нет — их мент
|
|||||||
тоже не берём, но это наш выбор, а не запрет источника: исследование
|
тоже не берём, но это наш выбор, а не запрет источника: исследование
|
||||||
запрещало только выдавать это поле за формат Яндекса, оставить разрешало.
|
запрещало только выдавать это поле за формат Яндекса, оставить разрешало.
|
||||||
Разбор строки user agent — не урок этого стенда.
|
Разбор строки user agent — не урок этого стенда.
|
||||||
- **Механику версий записи (`Sign`/`HitVersion`) не берём сейчас**: по #15 это
|
- **`Sign` берём как колонку формата, без механики** (решение владельца на
|
||||||
кандидат на потом, и её дом — клиентская сторона (поток визитов Метрики
|
приёмке спеки): генератор всегда пишет `Sign = 1`, исправлений записей не
|
||||||
Про). Это помеченное отступление от рекомендации исследования («`Sign` на
|
шлёт — движки и запросы не меняются. Сама механика версий
|
||||||
хитах полезен»): колонка без механики — мёртвый вес.
|
(CollapsingMergeTree, пара `HitVersion`) — кандидат на потом, по #15.
|
||||||
|
Честность: комментарий в DDL и абзац в документе о реализме («в бою здесь
|
||||||
|
бывают −1/+1, считают через `sum(Sign)`»); в лекции — крючок про
|
||||||
|
CollapsingMergeTree (частый вопрос на собеседованиях).
|
||||||
- **Не берём** `ClientEventTime` (в выгрузке Метрики нет клиентской метки;
|
- **Не берём** `ClientEventTime` (в выгрузке Метрики нет клиентской метки;
|
||||||
расхождение часов — тема тумана «грязь»), `Params` (второй сырой JSON не
|
расхождение часов — тема тумана «грязь»), `Params` (второй сырой JSON не
|
||||||
нужен: этот навык уже несут заказы), `LastSearchEngineRoot`, `IsPageView`,
|
нужен: этот навык уже несут заказы), `LastSearchEngineRoot`, `IsPageView`,
|
||||||
@@ -78,7 +83,7 @@ JSON-поле `ecommerce`. Сессий в потоке нет — их мент
|
|||||||
- **Наша честная добавка** — `EventType`: у Метрики такого поля нет
|
- **Наша честная добавка** — `EventType`: у Метрики такого поля нет
|
||||||
(там `isPageView` + `productEventType`), стенду таксономия нужна явно.
|
(там `isPageView` + `productEventType`), стенду таксономия нужна явно.
|
||||||
|
|
||||||
### 1.2 Состав полей (46 колонок)
|
### 1.2 Состав полей (47 колонок)
|
||||||
|
|
||||||
Идентификаторы и время:
|
Идентификаторы и время:
|
||||||
|
|
||||||
@@ -92,6 +97,7 @@ JSON-поле `ecommerce`. Сессий в потоке нет — их мент
|
|||||||
| `UTCEventTime` | DateTime | единственная метка времени, как у Метрики |
|
| `UTCEventTime` | DateTime | единственная метка времени, как у Метрики |
|
||||||
| `ClientTimeZone` | Int16 | смещение пояса клиента в минутах |
|
| `ClientTimeZone` | Int16 | смещение пояса клиента в минутах |
|
||||||
| `EventType` | LowCardinality(String) | `pageview` / `add_to_cart` / `purchase` |
|
| `EventType` | LowCardinality(String) | `pageview` / `add_to_cart` / `purchase` |
|
||||||
|
| `Sign` | Int8 | всегда 1: колонка формата, механика исправлений не реализована (см. 1.1) |
|
||||||
|
|
||||||
Правила резки визитов в генераторе документируются и совпадают с лабной
|
Правила резки визитов в генераторе документируются и совпадают с лабной
|
||||||
логикой (30-минутный таймаут).
|
логикой (30-минутный таймаут).
|
||||||
@@ -155,7 +161,7 @@ Ecommerce (заполнены только у торговых событий):
|
|||||||
### 1.4 Схема как контракт
|
### 1.4 Схема как контракт
|
||||||
|
|
||||||
Одно машинное описание схемы события (python-модуль или YAML) — источник
|
Одно машинное описание схемы события (python-модуль или YAML) — источник
|
||||||
истины: из него выводятся DDL и валидация генератора, а не наоборот. 46
|
истины: из него выводятся DDL и валидация генератора, а не наоборот. 47
|
||||||
колонок повторяются примерно в семи местах (генератор, DDL, SELECT матвью,
|
колонок повторяются примерно в семи местах (генератор, DDL, SELECT матвью,
|
||||||
трансформации, витрины, манифест, доки) — без контракта они расходятся
|
трансформации, витрины, манифест, доки) — без контракта они расходятся
|
||||||
молча. Заодно это учебный артефакт: менти видит на живом примере, что такое
|
молча. Заодно это учебный артефакт: менти видит на живом примере, что такое
|
||||||
@@ -295,7 +301,7 @@ CSV в репозитории (`data/catalog/products.csv`: `sku`, `name`, `cate
|
|||||||
прогонами, куда легли данные — нет».
|
прогонами, куда легли данные — нет».
|
||||||
- **Приём строгий**: `input_format_skip_unknown_fields = 0`, обязательные
|
- **Приём строгий**: `input_format_skip_unknown_fields = 0`, обязательные
|
||||||
поля — без значений по умолчанию. Контракт присутствия: генератор выдаёт
|
поля — без значений по умолчанию. Контракт присутствия: генератор выдаёт
|
||||||
**все 46 полей в каждом событии**; «пусто» — пустой массив, пустая строка
|
**все 47 полей в каждом событии**; «пусто» — пустой массив, пустая строка
|
||||||
или 0, а не отсутствие ключа в JSON. Так строгий приём уживается с
|
или 0, а не отсутствие ключа в JSON. Так строгий приём уживается с
|
||||||
полями, пустыми по смыслу (ecommerce у `pageview`, UTM у прямого захода). Несовпадение имени поля — громкая
|
полями, пустыми по смыслу (ecommerce у `pageview`, UTM у прямого захода). Несовпадение имени поля — громкая
|
||||||
ошибка в `*_errors`, а не молчаливые нули: имена CamelCase регистрозависимы,
|
ошибка в `*_errors`, а не молчаливые нули: имена CamelCase регистрозависимы,
|
||||||
@@ -501,8 +507,8 @@ smoke-проверки, а не «дашборд зелёный». Это мин
|
|||||||
- Реплики (2×2), HAProxy, репликационная эксплуатация — в лекцию, не в стенд.
|
- Реплики (2×2), HAProxy, репликационная эксплуатация — в лекцию, не в стенд.
|
||||||
- Полный словарь торговых событий Метрики (detail, remove, impressions),
|
- Полный словарь торговых событий Метрики (detail, remove, impressions),
|
||||||
пять уровней категорий, блоки `purchasedProduct*`/`impressions*`.
|
пять уровней категорий, блоки `purchasedProduct*`/`impressions*`.
|
||||||
- `Sign`/CollapsingMergeTree — кандидат на потом (дом — поток визитов
|
- Механика `Sign`/CollapsingMergeTree — кандидат на потом (дом — поток
|
||||||
Метрики Про).
|
визитов Метрики Про); сама колонка `Sign` уже в схеме, статикой (см. 1.1).
|
||||||
- Событийный лог заказов, CDC/Debezium, HTTP-сервис заказов, шапка+строки,
|
- Событийный лог заказов, CDC/Debezium, HTTP-сервис заказов, шапка+строки,
|
||||||
отдельный поток возвратов — отклонены в #15/#18.
|
отдельный поток возвратов — отклонены в #15/#18.
|
||||||
- Файловые дропы как источник — зона следующего стенда (Lakehouse), у нас
|
- Файловые дропы как источник — зона следующего стенда (Lakehouse), у нас
|
||||||
@@ -547,7 +553,8 @@ smoke-проверки, а не «дашборд зелёный». Это мин
|
|||||||
Logs API — это скачанный TSV»); trade-off «инкремент экономнее, слепок
|
Logs API — это скачанный TSV»); trade-off «инкремент экономнее, слепок
|
||||||
надёжнее» + сноска про compacted topic; identity stitching перестаёт быть
|
надёжнее» + сноска про compacted topic; identity stitching перестаёт быть
|
||||||
чистой теорией; «прямое чтение прод-базы — анти-приём, в бою — реплика или
|
чистой теорией; «прямое чтение прод-базы — анти-приём, в бою — реплика или
|
||||||
выгрузка»; полный словарь торговых событий — теория.
|
выгрузка»; колонка `Sign` без механики — честное ограничение стенда
|
||||||
|
(в бою −1/+1 и `sum(Sign)`); полный словарь торговых событий — теория.
|
||||||
|
|
||||||
В v1 при заморозке — указатель на v2 в README (форму решить при рождении
|
В v1 при заморозке — указатель на v2 в README (форму решить при рождении
|
||||||
v2, этап 0).
|
v2, этап 0).
|
||||||
@@ -564,6 +571,11 @@ v2, этап 0).
|
|||||||
- сцена «разные consumer groups → дубли»;
|
- сцена «разные consumer groups → дубли»;
|
||||||
- словарь регионов из CSV той же машинерией, что каталог товаров (оживляет
|
- словарь регионов из CSV той же машинерией, что каталог товаров (оживляет
|
||||||
`RegionCityID`);
|
`RegionCityID`);
|
||||||
|
- лаба сессий: менти сначала собирает сессии сам, и только после — рассказ,
|
||||||
|
что с октября 2025 Метрика отдаёт `VisitID` прямо в хитах; частично
|
||||||
|
синтетическая постановка — осознанный приём;
|
||||||
|
- лекция «`Sign` и CollapsingMergeTree»: почему на стенде `sum(Sign)` =
|
||||||
|
`count()`, а в бою — нет; частый вопрос на собеседованиях;
|
||||||
- лекция про идентичность «как в бою»: `setUserID` и first-party id,
|
- лекция про идентичность «как в бою»: `setUserID` и first-party id,
|
||||||
детерминированная против вероятностной склейки, identity graph,
|
детерминированная против вероятностной склейки, identity graph,
|
||||||
кросс-девайс, CDP — с рамкой «мы склеили через транзакции, потому что трекер
|
кросс-девайс, CDP — с рамкой «мы склеили через транзакции, потому что трекер
|
||||||
|
|||||||
Reference in New Issue
Block a user