# Handoff: ручной HITL пути менти пройден — вырос в набросок редизайна Дата: 2026-07-19 21:44. Жанр: handoff по ADR-0003 после сессии «ручная HITL-проверка пути менти» (долг переносился пятый handoff подряд — закрыт). ## Что сделано - **HITL-проверка пути менти пройдена целиком, своими руками через UI.** Чистый стенд (`make clean` + `make up`) -> Airflow UI: `ddl_init` -> `generator_control` `backfill` (профиль `ci`) -> ETL -> `make superset-init` -> дашборд глазами -> `generator_control` `next-day` -> проверка стыка. Каждый шаг сверен по данным (ClickHouse, manifest, chain-check). - **Результат мира:** backfill `[00:00, 06:00)` = 16 054 события; после `next-day` = 110 602 события, визитов 10 228, пользователей 1 726; `boundaries` = три границы, `model_t_end` = `2026-01-02 06:00`. `generated-history-chain-check` — EXIT 0 (стык 06:00: 9 переходящих визитов, непарных 0, однородность подтверждена). - **9 находок + рамочная модель** — в `.scratch/generator-model-time-startup-history/hitl-findings.md`. Половина находок родилась из наблюдений менти. HITL из «проверить, что не сломалось» перерос в **набросок редизайна пути менти**. ## Ключевые выводы (кратко; подробно — в hitl-findings.md) - **Рамочная модель менти:** основной режим — `import` артефакта (база), дальше две ветки от одного состояния: `next-day` (пакетно) и `continue` (живой поток). Это три разных лабораторных. `next-day` и `continue` не схлопывать. Подтверждено `launch.py:117-137`. - **F7 + замер:** опыт на 6h беден; нужен готовый артефакт из файла. Артефакт 6h = 49 МБ; `xz -9e` -> 1,1 МБ (48x, 13,5 с). На 3 дня ~13 МБ — кладётся в обычный git. Паттерн-образец: `airflow-greenplum-solution` (`bookings/seed/demo.sql.xz`). - **Решение менти:** целевой стартовый мир — **3 дня на `daily-wave`** (обсуждаемо). На `ci` три дня плоские — волну даёт `daily-wave`. - **F8:** два профиля путают. Свести к одному учебному (волна, ×60); `ci` (×1) — служебный для тестов. ×60 оправдан live-лабой (`continue`). - **F9:** `next-day` растёт O(N²) из-за полной перечитки Kafka для счётчиков (`service.py:591`). Параллелить не то (ломает детерминизм); правильно — инкрементальные счётчики (O(N), снимает риск OOM). Это и есть решение «новый формат состояния manifest», блокирующее расписание. - **F1, F5 (баги UI):** форма `generator_control` держит необязательные поля обязательными (`type="string"` без `null`); Airflow и Superset быстро разлогинивают (ротацию секрета исключил, корень TBD). ## Состояние - Ветка `feature/data-generator`. После этого handoff в дереве останутся: `hitl-findings.md` + этот handoff (коммитятся), плюс **не коммитить** `data/ci_backfill.json` (49 МБ, побочный от backfill; `.gitignore` его не покрывает — риск, см. ниже). - Стенд **оставлен поднятым** по просьбе пользователя; в мире 1,25 суток (профиль `ci`), live-генератор не запущен. Выросший мир можно смотреть в Superset (dashboard id 1). ## Что дальше 1. **Разложить находки в постановки по плейбуку** (этапы 1-2, двойное слепое ревью). Ориентировочно ~4 задачи (номера 21+ в `issues/`): - **Ядро:** эталонный 3-дневный артефакт (`daily-wave`) как база менти через `import`; формат/сжатие (`xz`, нужен ли `raw_topics`); место хранения (git после отладки сида). Снимает F7. - **Профиль:** один учебный профиль, `ci` -> служебный тестовый. Перед слиянием проверить, не зависит ли live-тест от скорости ×1 (F8). - **Расписание + retention:** беспараметрный DAG `next-day` (F1/F3), `schedule`, инкрементальные счётчики manifest (F9/F6). Это одна связка — их корень общий. - **Баг-фиксы:** F1 (форма) и F5 (разлогин); F4 (JS-баг Grid) низкий. 2. **Три режима -> свои уроки/лабы** — вход в учебный контент (`docs/course/`). Под каждую ветку отдельная лаба: `next-day` (пакетная инкрементальная обработка) и `continue` (потоковый приём); общая база `import` — их совместное начало. Отдельно от инфраструктурных задач. 3. **Мелочь по гигиене:** `data/*.json` не покрыт `.gitignore` — побочные артефакты backfill (49 МБ) рискуют попасть в коммит. Решить: правило в `.gitignore` или чистить артефакты после прогонов. ## Проверки этой сессии - `ddl_init`: 4 слоя созданы (stg 12 / ods 8 / dds 2 / dm 6 таблиц). - Форма мира после backfill: пирамида 445 < 1516 < 16 054, интервал `[00:00, 06:00)` точный. - После `next-day`: 3 границы в manifest, мир до `2026-01-02 06:00`. - `generated-history-chain-check`: EXIT 0. - Длительность `next-day` (метаданные Airflow): задача `run_next_day` 638 с (~10,6 мин); ETL `trigger_etl` 30 с — узкое место в генерации. - Замер сжатия: `xz -9e` 48x за 13,5 с; gzip -9 17x. ## Отклонения процесса - Ревью субагентами не запускали: пользователь просил «свежий взгляд», что по договорённости = без субагентов. Проверка проведена мной руками. - Обход бага F1: форму backfill/next-day заполняли значениями профиля `ci` целиком (пустые необязательные поля UI не пропускает). ## Suggested skills - `claude-subagent-playbook` — разложить находки в постановки тем же конвейером (этапы 1-2 с нуля). - `conventional-commits` — коммиты. - `research` / Context7 — для задачи про профиль/форму (Airflow Param `type=["null","string"]`) и про формат артефакта.