docs(course): маркеры «сверить-на-стенде» заменены живыми числами (#23)

Зачем: тикет #23 — каждое цитируемое число курса сверено с живым
стендом; до этого в уроках стояли заглушки.

Что:
- уроки 00–04: 18 маркеров заполнены числами свежего импорта
  (280 437 событий, нули в таблицах ошибок, счётчики ODS/DDS);
- лаба 07: таблица manifest после дня 4 (374 092 / 34 801 / 5 388),
  переходящие визиты по стыкам (35/22/26), числа после дня 5;
- лаба 08: каноническая граница трёх дней, пример замера свежести
  (лаг 3:45 модельного времени до догона, ETL ~29 с) и вернувшегося
  пользователя; две живые поправки разбора времени: убран
  принудительный UTC в разборе STG и суффикс +00:00 в сравнении
  границы (ловились только на живом стенде).

Проверка: детерминизм подтверждён двумя независимыми циклами
сброс→импорт→инкремент (числа manifest и checksum_sha256 дней 4 и 5
совпали бит в бит); chain-check зелёный; сценарий лабы 08 прогнан
вживую, включая стоп/продолжение и красный full_refresh=false из
урока 4; grep «сверить-на-стенде» пуст; ссылки и якоря целы;
make test (219+31) и make lint зелёные; /ai-text-lint по лабам — без
существенных находок.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-23 18:15:46 +03:00
co-authored by Claude Opus 4.8
parent cbf8b2d770
commit 8f03d8b347
6 changed files with 70 additions and 70 deletions
+16 -15
View File
@@ -82,19 +82,18 @@ docker compose run --rm --no-deps generator \
events visits users min_event_timestamp max_event_timestamp model_t0 model_t_end profile
```
Сверь результат с таблицей. Значения будут вписаны после контрольного прогона
эталонного мира:
Сверь результат с контрольными значениями:
| Поле | Ожидаем после дня 4 |
|------|----------------------|
| `events` | `<события-день-4>` <!-- сверить-на-стенде --> |
| `visits` | `<визиты-день-4>` <!-- сверить-на-стенде --> |
| `users` | `<пользователи-день-4>` <!-- сверить-на-стенде --> |
| `min_event_timestamp` | `<минимальное-время>` <!-- сверить-на-стенде --> |
| `max_event_timestamp` | `<максимальное-время>` <!-- сверить-на-стенде --> |
| `model_t0` | `<левая-граница>` <!-- сверить-на-стенде --> |
| `model_t_end` | `<правая-граница-дня-4>` <!-- сверить-на-стенде --> |
| `profile` | `<профиль>` <!-- сверить-на-стенде --> |
| `events` | `374092` |
| `visits` | `34801` |
| `users` | `5388` |
| `min_event_timestamp` | `2026-01-01 00:00:00.000000` |
| `max_event_timestamp` | `2026-01-04 23:59:58.581616` |
| `model_t0` | `2026-01-01T00:00:00+00:00` |
| `model_t_end` | `2026-01-05T00:00:00+00:00` |
| `profile` | `daily-wave` |
Здесь числа накопительные: `events`, `visits` и `users` относятся ко всему миру
от `model_t0` до `model_t_end`, а не только к четвёртому дню.
@@ -128,7 +127,9 @@ ORDER BY visit_start;
```
Запрос должен найти хотя бы один визит, чьи события лежат по разные стороны
полуночи. Подойдёт любой стык внутри мира: 1→2, 2→3 или 3→4.
полуночи. На контрольном мире он находит `35`, `22` и `26` визитов на стыках
1→2, 2→3 и 3→4. Для проверки нового дня достаточно увидеть `26` визитов на
стыке 3→4.
> **Как слова связаны со схемой.** В manifest написано «визит», а в SQL такой
> визит обозначен `click_id`. Отдельной таблицы визитов нет: контекст лежит в
@@ -233,8 +234,8 @@ Airflow проигрывать все пропущенные интервалы
2. `make generated-history-chain-check` заканчивается без ошибки;
3. в `Events over Time` появился день 5.
Точные числа после дня 5 не фиксируем: это результат учебной правки.
<!-- сверить-на-стенде -->
После дня 5 контрольный manifest показывает `468025` событий, `43482` визита,
`6713` пользователей и `model_t_end = 2026-01-06T00:00:00+00:00`.
### Верни как было
@@ -249,9 +250,9 @@ Airflow проигрывать все пропущенные интервалы
| Действие | Где смотреть | Что ожидать |
|----------|--------------|-------------|
| запустить `world_next_day` с пустой формой | Airflow graph | все пять задач зелёные, `etl_pipeline` вызван с `full_refresh=true` |
| прочитать manifest после дня 4 | `kafka-manifest-summary` | числа совпадают с таблицей секции 2 <!-- сверить-на-стенде --> |
| прочитать manifest после дня 4 | `kafka-manifest-summary` | числа совпадают с таблицей секции 2 |
| проверить накопленную цепочку | `make generated-history-chain-check` | команда завершается без ошибки |
| найти переходящие визиты | запрос в `dds.event` | хотя бы один `click_id` пересекает полночь <!-- сверить-на-стенде --> |
| найти переходящие визиты | запрос в `dds.event` | на стыке 3→4 найдено `26` визитов |
| снять паузу с DAG | Airflow runs | на ближайшей получасовой границе приезжает один запланированный день |
| вернуть паузу и пройти сброс | Airflow и Superset | расписание выключено, снова видны три эталонных дня |