Files
clickstream-ch-kafka-supers…/.scratch/backup/20260726-tracker-snapshot.md
T
ddadminandClaude Fable 5 2e42cf63ff chore(scratch): сохранены слепок трекера и handoff миграции на Gitea
- Зачем:
  - GitHub-аккаунт заблокирован 2026-07-26; трекер карты «боевой
    реализм» перенесён на git.dementev.space, контекст нужен новой
    сессии независимо от исхода апелляции.
- Что:
  - .scratch/backup/ — слепок всех 27 issues и резолюция тикета #15
    на момент блокировки;
  - .scratch/handoffs/ — handoff с состоянием карты, нюансами доступа
    к Gitea и списком хвостов (апелляция, выбор основного трекера).
- Проверка:
  - тексты читаются; ссылки на Gitea-трекер открываются
    (git.dementev.space/ddmitry/clickstream-ch-kafka-superset-demo).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-26 22:03:00 +03:00

18 KiB

Слепок трекера на 2026-07-26 (аккаунт GitHub заблокирован)

Страховочная копия wayfinder-карты и ключевых резолюций из GitHub Issues. Снята из контекста сессии в момент блокировки аккаунта dementev-dev (сразу после закрытия #15). Если аккаунт восстановят — файл можно удалить; если нет — это источник для восстановления трекера на новом месте.

Хвост, не доехавший до GitHub: строка про #15 в Decisions so far карты #10 (текст — в разделе «Карта», помечен как НЕ ОПУБЛИКОВАНО).

Состояние issues (все, на момент блокировки)

# Состояние Метки Название
27 CLOSED wayfinder:research Что отдаёт Яндекс как кликстрим: форма события и выгрузка
24 CLOSED needs-triage Вычистить прозаические тесты из test_world_dags_contract.py
23 CLOSED ready-for-agent Сверка цифр курса на живом стенде и финальная проверка
22 CLOSED ready-for-agent Лабы 07 (next-day) и 08 (continue) + метадокументы курса
21 CLOSED ready-for-agent Каркас курса и переобвязка уроков 0–6 под путь import
20 OPEN wayfinder:task Обновить мажорную версию airflow до версии 3
18 CLOSED wayfinder:grilling Модель данных: широкое событие и второй источник
17 OPEN wayfinder:task Собрать спеку боевого реализма
16 OPEN wayfinder:grilling Анонимы и identity stitching: нужно ли и сколько
15 CLOSED (2026-07-26) wayfinder:grilling Purchase с выручкой: форма события и место в стенде
14 OPEN wayfinder:grilling Кластер: где живёт опыт менти и какая топология
13 CLOSED wayfinder:research Цена кластера для пайплайна
12 CLOSED wayfinder:research Ресурсный бюджет стенда на 16 ГБ
11 CLOSED wayfinder:task Реализм генератора: границы применимости стенда
10 OPEN wayfinder:map Карта: боевой реализм стенда
9 CLOSED Редизайн пути менти: мир из артефакта и две ветки роста
8 CLOSED wontfix Техдолг: инкрементальный ETL вместо full_refresh на каждый день
7 CLOSED ready-for-agent Редизайн лаб курса под три режима менти
6 CLOSED ready-for-agent Один учебный профиль: daily-wave — учебный, ci — служебный
5 CLOSED ready-for-agent Инкрементальные счётчики manifest: next-day без перечитки всей Kafka
4 CLOSED ready-for-agent Поверхность DAG'ов: generator_control → world_init, беспараметрный world_next_day
3 CLOSED ready-for-agent Эталонный мир: 3-дневный артефакт в git и import по умолчанию
2 CLOSED wontfix Airflow Grid: всплывающая JS-ошибка при авто-обновлении
1 CLOSED Быстрый разлогин в Airflow и Superset

Блокировки #15 (нативные dependencies): blocked_by #11, #18 — обе закрыты.

Карта #10 «Карта: боевой реализм стенда» (тело)

Destination

Принятая спека в docs/specs/ «Боевой реализм стенда»: где менти получает кластерный опыт ClickHouse и в какой топологии; какие доработки реализма данных генератора делаем; явные границы. Спека готова к разбиению через /to-tickets.

Notes

  • Расчёт на ноутбук менти 16 ГБ RAM (у кого 8 ГБ — VDS за счёт менти).
  • Исполнение доработок — после фичи «Редизайн пути менти» (#9); карта решений может идти параллельно с ней.
  • Изменения генератора тянут пересборку эталонного мира (data/startup_history/reference-world.json.xz) и «поплывшие» числа в лабах — учитывать в каждом решении.
  • Скиллы: /grilling и /domain-modeling для тикетов-решений, /research для тикетов-исследований.
  • Рабочая гипотеза владельца: кластер здесь, облегчённо (2 шарда без реплик), цель — Distributed и ON CLUSTER на живом потоке; «голый» clickhouse-learning-cluster этого не даёт.
  • Порядок: решение по модели данных предшествует кластерному — иначе межшардовые джойны четырёх топиков придётся оплатить дважды.

Decisions so far

  • Реализм генератора: границы применимости стенда — документ docs/generator-realism.md (коммит 068d96f): честно как в бою — схема/воронка/сессии/волна/обвязка; упрощено — четыре топика, только pageview, клоны пользователей, нет «грязи», масштаб.
  • Ресурсный бюджет стенда на 16 ГБ — полный стенд в покое ≈3,4 ГБ; 2×1 добавляет ≈0,6–0,8 ГБ (влезает свободно), 2×2 — ≈1,7–1,9 ГБ (влезает, но впритык к дефолтному бюджету WSL2 ~8 ГБ); координатором брать clickhouse-keeper, не ZooKeeper.
  • Цена кластера для пайплайна — объём средне-крупный (~15–20 файлов, тяжёлое — SQL); главная боль — JOIN поверх Distributed и TRUNCATE в трансформациях (риск для контрольных сумм), приём из Kafka требует одного консьюмера + Distributed-цели; рекомендация исследования — опциональный make up-cluster, не дефолт.
  • Что отдаёт Яндекс как кликстрим — плоское широкое ядро (~140 колонок) плюс параллельные массивы для многозначного, вложенного JSON нет (Яндекс ближе к Snowplow, чем к Segment); доставка батчем (Logs API, TSV, лог доформировывается ~3 дня), поток только в «Метрике Про» через Data Transfer с задержкой до 15 минут — Kafka у Яндекса нет, наша Kafka учебная замена; детали в docs/research/2026-07-26-yandex-clickstream-format.md (ветка research/yandex-clickstream-format, коммит e6e34f2).
  • Модель данных: широкое событие и второй источник — переходим на одно широкое событие по образцу Яндекс Метрики (плоское ядро + параллельные массивы + сырое поле ecommerce, таксономия event_type); интеграционная ценность — заказы бэкенда той же Kafka, но пачками с опозданиями и отменами (одна труба, два режима), каталог товаров — словарь ClickHouse из файла; прямое чтение прод-Postgres и файловые источники отклонены (файлы — зона Lakehouse-стенда); Kafka — учебная замена батчевого Logs API, фиксируем в docs/generator-realism.md.
  • [НЕ ОПУБЛИКОВАНО — добавить при восстановлении доступа] Purchase с выручкой: форма события и место в стенде — деньги на обеих сторонах (клиент объявляет через dataLayer, бэкенд — итоговая правда; атрибуция по трекеру, деньги по бэкенду); клиент: pageview+add_to_cart+purchase; заказы — ежедневный полный слепок окна изменяемости K со статусами и JSON-позициями, приём через ReplacingMergeTree; сверка по purchaseID=order_id с четырьмя конструируемыми расхождениями (отмена, потеря, дельта суммы, дубль); выручка в DM — только от заказов.

Not yet specified

  • «Грязь» в данных: боты, дубли событий, опоздавшие мобильные батчи, расхождение часов клиент/коллектор — вернуться после решений по purchase и identity.
  • Политика версионирования эталонного артефакта при изменениях генератора (когда пересобирать, как жить лабам со сменой чисел).
  • Как новые возможности лягут в лабы курса (после редизайна лаб, #7).

Out of scope

  • Формат доставки событий: закрыть теорией — решение отменено 2026-07-22: исследование цены кластера показало, что четыре топика несовместимы с шардированием без GLOBAL JOIN; вопрос вернулся в рамку тикетом «Модель данных: широкое событие и второй источник».
  • Редизайн лаб курса — отдельный issue #7.
  • Инкрементальный ETL — отдельный issue #8; багфиксы — #1, #2.

Комментарии карты

  1. Решение 2026-07-23: дальнейшая работа карты пойдёт в новом v2-репозитории. v1 замораживается как стабильный стенд для менти (добить путь менти, баги #1/#2, лекции). v2 стартует пустым репозиторием с осознанным первым коммитом (переносим только нужное; генератор переписывается, переиспользуются идеи). Имя нового репозитория выберем из решения о нише; карта и открытые тикеты переедут туда после создания.
  2. Рабочий кандидат имени v2-репозитория: clickstream-data-platform (согласован 2026-07-23). Мотив: стенд перерастает классическое DWH — потоковый приём, оркестрация, кластер, витрины; «data platform» описывает целое. Финальное закрепление — при решении тикета о нише.

Тикет #15 «Purchase с выручкой: форма события и место в стенде»

Тело

Part of #10

Question: Решить форму события покупки с суммой заказа: схема и носитель (клиентское событие в широкой модели, источник заказов бэкенда или обе стороны со сверкой — зависит от решения «Модель данных» #18), как ложится в DDL/DM и дашборд, что делает с эталонным миром (пересборка артефакта и чисел лаб).

Комментарий владельца: решение #18 добавило вторую сущность — заказ бэкенда (Kafka, пачками, с опозданиями и отменами). При решении формы purchase решить и форму события заказа, и сюжет сверки «клиентский purchase против бэкенд-заказа». Фактура по ecommerce Яндекса — в docs/research/2026-07-26-yandex-clickstream-format.md.

Резолюция (опубликована 2026-07-26, тикет закрыт)

Опубликованный текст: комментарий issues/15#issuecomment-5084445090. Полная копия — в .scratch/backup/20260726-resolution-15.md (соседний файл).

Тикет #18 «Модель данных: широкое событие и второй источник» (резолюция)

Да, переходим на широкое событие. Четыре топика-осколка уходят; модель одна, целевая (двух моделей «для дефолта и для кластера» не держим). Мотив — реализм: менти должен узнавать в стенде тот кликстрим, с которым столкнётся на работе. Кластер — побочный довод, не причина.

Форма события — по образцу Яндекс Метрики (фактура — #27, docs/research/2026-07-26-yandex-clickstream-format.md): плоское широкое ядро плюс параллельные массивы для многозначного (товары, цели, свои параметры) плюс одно сырое поле-строка ecommerce. Вложенных объектов в стиле Segment/Amplitude не делаем. Таксономия event_type вместо «только pageview». Точный состав полей — в спеку (#17), опора — таблица 53 полей из исследования.

Интеграционная учебная ценность (взамен склейки осколков):

  • Второй источник — заказы бэкенда. Вторая версия правды о покупке; учебный сюжет — сверка клиентского purchase против заказа, расхождения, отмены. Форма события заказа и сверка — тикет #15.
  • Транспорт заказов — та же Kafka, но пачками: бэкенд выгружает заказы раз в модельный день, с опозданиями и отменами. Одна труба, два режима — как в бою, где батчи льют в брокер из удобства. Открывает темы, которых у менти нет после курсовой airflow-greenplum: согласование потока и батча, поздние данные, кросс-источниковые проверки, сенсоры/Datasets (DAG слоя DDS ждёт дневной батч).
  • Каталог товаров — словарь ClickHouse из файла (CSV в репозитории; тот же файл использует генератор — расхождений нет по построению). Даёт dictGet и политику обновления словаря.

Ландшафт итогом: Kafka — единственная труба (кликстрим потоком, заказы пачками); Postgres остаётся только служебной базой Airflow; смешанность ландшафта выражена режимами и частотами, а не второй трубой.

Отклонено по дороге: прямое чтение прод-базы магазина из ClickHouse (анти-приём: нагрузка на прод и связность; в документе о реализме зафиксировать как явный учебный пункт «в бою — реплика или выгрузка»); файловые дропы как источник (зона Lakehouse-стенда; остаются теорией — «настоящий Logs API — это скачанный TSV»); HTTP-сервис заказов и CDC (Debezium) — цена выше учебной отдачи; каталог отдельным топиком Kafka — выдумка, в бою так не делают.

Честность к Яндексу: у Метрики кликстрим — батч (Logs API), потока в общем доступе нет; наша Kafka — учебная замена, так и называем в docs/generator-realism.md.

Что это открывает дальше: #15 (purchase и форма заказа) и #14 (кластер: с широким событием склейка осколков исчезает, ключ шардирования решается там) разблокированы; новые приёмы стенда — ARRAY JOIN, словари, сенсоры/Datasets, кросс-источниковый DQ; кандидат — версии записи через Sign (механика CollapsingMergeTree из потока Метрики Про).