docs(handoff): добавлен независимый ревью-проход в handoff цепочки

- Зачем:
  - следующий шаг handoff — независимый ревью диапазона c672ed0..HEAD;
    результат нужно зафиксировать для продолжения в новой сессии.
- Что:
  - добавлен раздел «Независимый ревью-проход» (свежий взгляд, без субагентов):
    вердикт, прогнанные тесты 172+5, находки по задачам, косметические мелочи.
  - обновлены «Открытые риски» и «Следующий шаг»: остаётся HITL-приёмка и
    решение по задаче 13.
- Проверка:
  - git show --stat HEAD; ревью-раздел читается в handoff.
This commit is contained in:
2026-07-04 23:58:09 +03:00
parent ec815cea82
commit 549ce0c00d
@@ -119,7 +119,67 @@
- Финальные `rg`-проверки по PRD, чекбоксам, Superset-маркерам и
startup-history-дрифту — PASS перед `f8b419d`.
## Независимый ревью-проход (2026-07-04, свежий взгляд)
Кто и как: Claude, свежим взглядом по диапазону `c672ed0..HEAD`, без субагентов
(правило проекта: «свежим взглядом» = без субагентов). Читались реальные диффы
всех пяти задач и сверялись с текстами issue; тесты прогонялись заново, а не со
слов handoff.
Вердикт: цепочка выполнена на уровне кода и тестов; правок для приёмки не нужно.
Доказательства (прогонял сам):
- `generator/tests` — 172 passed (в том числе контрактный тест DAG и тесты пульта).
- `tests/test_superset_dashboard_config.py` — 5 passed.
- Грепы: старых маркеров `world_map`/`Geography Map` в коде и доках нет (остались
только законный историч. след в спеке, `previous_slice_names` и тест
переименования); во всех done-issue 0 пустых чекбоксов; `state v2` в отгруженном
коде не осталось.
- `etl_pipeline` действительно принимает `conf` `full_refresh` (`Param(True,
type="boolean")`) — имя параметра из `TriggerDagRunOperator` пульта совпадает.
По задачам:
- Issue 09 (гейт): донор `base_click_id` хранится в state; восстановление громко
падает на неизвестном доноре (тихие `.get`-fallback'и убраны); запасная ветка
рождения сделана восстановимой и провалидирована. Отдельная реальная находка —
µs-фикс `_timestamp_to_state_offset` (целочисленная арифметика вместо
`total_seconds()*1e6`). Тесты бьют прямо в критерии приёмки.
- Issue 12 (пульт): `retries=0`, `is_paused_upon_creation`, join после ветвления
через `NONE_FAILED_MIN_ONE_SUCCESS`, `wait_for_completion=True`, env до
`Config()`, предпроверка пустоты Kafka и STG. Compose-профиль `live-generator`
оставляет `make up` чистым; явные пути включают профиль по имени сервиса.
- Issue 14: `daily-wave` speed 1→60, tick 60→1; `ci` не тронут; пер-тиковые INFO
приглушены до DEBUG.
- Issue 10: `echarts_timeseries_bar` с tooltip, легендой и единицами; дедуп дублей
при переименовании; экспорт-JSON защищён тестами и от рассинхрона с конфигом, и
от дрейфа раскладки.
- Issue 08: доки, старый путь `make data`/`kafka_load` убран как основной, грепы
чисты.
Мелочи (косметика, не блокеры):
- `test_default_version` (`test_state.py`): docstring говорит «версии 2», а ассерт
уже `"3.0"`.
- `build_control_env` для `import` тоже зовёт `build_launch_env("backfill", …)` —
безвредно (важен только «мир»-env), но может смутить читателя.
- `tooltipTimeFormat: "smart_date"` на категориальной оси — рудиментарный
параметр, безвреден.
## Открытые риски (обновление 2026-07-04)
- Кросс-линейный проход *другой родословной* (иная модель/агент) не выполнялся:
этот ревью сделан Claude свежим взглядом без субагентов. Для кода и тестов
этого достаточно; если нужна ещё одна родословная — отдельный шаг.
- Ручная приёмка (HITL) остаётся, код к ней честен (пропуски печатаются):
- Airflow UI: `generator_control` backfill/import/check на чистом стенде.
- Superset: кадр `Top Countries by Events` целиком и кадр с tooltip.
- Курс 00-06: проход по новому startup-history-пути.
- Задача 13 (`backfill-top-up-from-snapshot`) — `needs-triage`; предпосылка
(исправный restore из issue 09) выполнена, можно дооформлять.
## Следующий шаг
Запустить независимый кросс-линейный ревью-проход по диапазону `c672ed0..HEAD` и
handoff-коммиту, затем отдельно решить, дооформлять ли issue 13.
Независимый ревью кода и тестов пройден. Осталось: ручная HITL-приёмка (Airflow
UI, Superset-кадры, проход курса) и отдельное решение по задаче 13.