feat(stand): стартовый мир при make up и опись, которая его сторожит #64

Merged
ddmitry merged 2 commits from feat/42-world-manifest into main 2026-08-07 19:34:16 +03:00
Owner

Closes #42

Зачем

Стенд поднимался пустым, и всякая приёмка следующих этапов начиналась с ручной
заливки данных. Теперь make up сам приводит стенд к одному и тому же
состоянию, а в git лежит то, чем это состояние проверяется.

Что

  • Опись мира data/world-inventory.json: паспорт (зерно, версия
    генератора, хеш каталога) и по строке на каждый из восьми дней — дата, число
    событий, хеш байтов. Собирается make inventory, свежесть сторожит
    test_inventory.py — тем же способом, что свежесть описания выгрузки.
  • Заливка при подъёме: разовая служба world-init вышла из-под профиля и
    играет в топик восемь дней при каждом make up; зависимый у неё —
    airflow-init, иначе --wait считает успешно отработавшую службу упавшей.
  • Ожидание доезда: scripts/wait-for-world.sh — вторая половина make up.
    Приём асинхронный, поэтому ждать надо доезда до ods.event, а не завершения
    заливки. Ограниченный цикл опроса, не пауза наугад.
  • Девятая проверка make check-clickhouse: подневный счёт событий против
    описи, рамка по датам стартового мира, счёт через FINAL. При расхождении
    называет, где искать, — в событиях или в браке.
  • Порог снят: «день ≤ 30 с» убран из спеки генератора во всех трёх местах.
    Замер дал 1,7 с — порог был выше факта в восемнадцать раз. На его месте
    замеры с датой. Раздел 9 спеки закрыт: открытых вопросов не осталось.

Слова

Термины тикета заменены решением владельца по ходу работы: «мини-манифест» →
опись мира, «зерновой мир» → стартовый мир. Переименование проведено
сплошь, включая мастер-спеку: «манифест» встречался 56 раз, и оставить половину
значило бы завести ровно ту путаницу, от которой уходили. Оба слова заведены
в словарь CONTEXT.md.

Отступление от буквы тикета

Тикет просил «чек-скрипт: пересгенерируй день N — сравни хеш». Сделано тестом
make test, а не отдельным скриптом: репозиторий уже умеет ровно это
(test_schema_doc.py::test_doc_is_up_to_date), и второй способ задать один
вопрос стоил бы менти лишней конструкции. Цена — make test вырос с 58 до
71 с. Если фоновая петля должна остаться быстрой, вынести в отдельную цель
дёшево.

Проверка

make clean && make up с нуля — 2 м 50 с, доехало ровно 401 185 событий.
Повторный make up — 1 м 5 с. make check-clickhouse зелёный (8 с),
make smoke зелёный (9 с), make test — 407 тестов за 71 с; make lint,
make typecheck, make config-test зелёные.

Что проверка умеет краснеть, снято двумя поломками на живом стенде. Снос
партиции 2026-06-03 дал диагноз «таблица брака пуста, события не доехали до
ODS». Негодная строка в сырье — второй диагноз, с признаком различения.
Строки опыта убраны, день переигран, счёт вернулся к 401 185 — заодно видно
дедупликацию: повтор дня не удвоил счёт под FINAL. Тест свежести проверен
молчаливой правкой цены в каталоге: покраснел.

Что поймало холодное ревью

Три места, где написанное было сильнее сделанного, — поправлены вторым
коммитом. Главное: непустая таблица брака выдавалась за доказательство
сломанного разбора, но модельного дня у брака нет и строки прежних уроков
живут месяц — после первого же урока с мусором диагноз был бы неверным
навсегда. Теперь проверка даёт признак различения, а не утверждает причину.
Там же снято ложное обещание в комментарии world-init и довод, опиравшийся
на несуществующий этап 5.

Closes #42 ## Зачем Стенд поднимался пустым, и всякая приёмка следующих этапов начиналась с ручной заливки данных. Теперь `make up` сам приводит стенд к одному и тому же состоянию, а в git лежит то, чем это состояние проверяется. ## Что - **Опись мира** `data/world-inventory.json`: паспорт (зерно, версия генератора, хеш каталога) и по строке на каждый из восьми дней — дата, число событий, хеш байтов. Собирается `make inventory`, свежесть сторожит `test_inventory.py` — тем же способом, что свежесть описания выгрузки. - **Заливка при подъёме**: разовая служба `world-init` вышла из-под профиля и играет в топик восемь дней при каждом `make up`; зависимый у неё — `airflow-init`, иначе `--wait` считает успешно отработавшую службу упавшей. - **Ожидание доезда**: `scripts/wait-for-world.sh` — вторая половина `make up`. Приём асинхронный, поэтому ждать надо доезда до `ods.event`, а не завершения заливки. Ограниченный цикл опроса, не пауза наугад. - **Девятая проверка** `make check-clickhouse`: подневный счёт событий против описи, рамка по датам стартового мира, счёт через `FINAL`. При расхождении называет, где искать, — в событиях или в браке. - **Порог снят**: «день ≤ 30 с» убран из спеки генератора во всех трёх местах. Замер дал 1,7 с — порог был выше факта в восемнадцать раз. На его месте замеры с датой. Раздел 9 спеки закрыт: открытых вопросов не осталось. ## Слова Термины тикета заменены решением владельца по ходу работы: «мини-манифест» → **опись мира**, «зерновой мир» → **стартовый мир**. Переименование проведено сплошь, включая мастер-спеку: «манифест» встречался 56 раз, и оставить половину значило бы завести ровно ту путаницу, от которой уходили. Оба слова заведены в словарь `CONTEXT.md`. ## Отступление от буквы тикета Тикет просил «чек-скрипт: пересгенерируй день N — сравни хеш». Сделано тестом `make test`, а не отдельным скриптом: репозиторий уже умеет ровно это (`test_schema_doc.py::test_doc_is_up_to_date`), и второй способ задать один вопрос стоил бы менти лишней конструкции. Цена — `make test` вырос с 58 до 71 с. Если фоновая петля должна остаться быстрой, вынести в отдельную цель дёшево. ## Проверка `make clean && make up` с нуля — 2 м 50 с, доехало ровно 401 185 событий. Повторный `make up` — 1 м 5 с. `make check-clickhouse` зелёный (8 с), `make smoke` зелёный (9 с), `make test` — 407 тестов за 71 с; `make lint`, `make typecheck`, `make config-test` зелёные. **Что проверка умеет краснеть**, снято двумя поломками на живом стенде. Снос партиции `2026-06-03` дал диагноз «таблица брака пуста, события не доехали до ODS». Негодная строка в сырье — второй диагноз, с признаком различения. Строки опыта убраны, день переигран, счёт вернулся к 401 185 — заодно видно дедупликацию: повтор дня не удвоил счёт под `FINAL`. Тест свежести проверен молчаливой правкой цены в каталоге: покраснел. ## Что поймало холодное ревью Три места, где написанное было сильнее сделанного, — поправлены вторым коммитом. Главное: непустая таблица брака выдавалась за доказательство сломанного разбора, но модельного дня у брака нет и строки прежних уроков живут месяц — после первого же урока с мусором диагноз был бы неверным навсегда. Теперь проверка даёт признак различения, а не утверждает причину. Там же снято ложное обещание в комментарии `world-init` и довод, опиравшийся на несуществующий этап 5.
ddmitry added 2 commits 2026-08-07 18:49:44 +03:00
Зачем
Стенд поднимался пустым, и всякая приёмка следующих этапов начиналась с
ручной заливки данных. Теперь `make up` сам приводит стенд к одному и тому
же состоянию, а в git лежит то, чем это состояние проверяется.

Что
- Опись мира `data/world-inventory.json`: паспорт (зерно, версия
  генератора, хеш каталога) и по строке на каждый из восьми дней — дата,
  число событий, хеш байтов. Собирается `make inventory`, свежесть сторожит
  `test_inventory.py` — тем же способом, что свежесть описания выгрузки.
- Разовая служба `world-init` вышла из-под профиля и играет в топик восемь
  дней при каждом подъёме; зависимый у неё — `airflow-init`, иначе `--wait`
  считает успешно отработавшую службу упавшей.
- `scripts/wait-for-world.sh` — вторая половина `make up`: приём
  асинхронный, поэтому ждать надо доезда до `ods.event`, а не завершения
  заливки. Ограниченный цикл опроса, не пауза наугад.
- Девятая проверка `make check-clickhouse`: подневный счёт событий против
  описи, рамка по датам стартового мира, счёт через `FINAL`. При
  расхождении называет, где искать, — в событиях или в браке.
- Порог «день ≤ 30 с» снят из спеки генератора в обоих местах: замер дал
  1,7 с, порог был выше факта в восемнадцать раз. На его месте — замеры с
  датой. Раздел 9 спеки закрыт: открытых вопросов не осталось.
- Слова: «манифест» стал описью мира, «зерновой мир» — стартовым миром
  (решение владельца). Оба заведены в словарь CONTEXT.md.

Проверка
`make clean && make up` с нуля — 2 м 50 с, доехало ровно 401 185 событий.
`make check-clickhouse` зелёный (8 с), `make smoke` зелёный (9 с),
`make test` — 407 тестов за 71 с, `make lint`, `make typecheck`,
`make config-test` зелёные.

Что проверка умеет краснеть, снято двумя поломками: снос партиции
2026-06-03 дал диагноз «не доехали до ODS», негодная строка в сырье —
«сломан разбор». Строки опыта убраны, день переигран, счёт вернулся.
Тест свежести проверен молчаливой правкой цены в каталоге: покраснел.

Ссылка: #42
Зачем
Холодное ревью нашло три места, где написанное сильнее сделанного.

Что
- Непустая таблица брака больше не выдаётся за доказательство сломанного
  разбора. Модельного дня у брака нет, обрамить его нечем, и строки прежних
  уроков лежат в нём месяц: после первого же урока с мусором проверка
  давала бы неверный диагноз навсегда. Теперь она даёт признак, по которому
  причину отличают, — сошлась недостача с числом брака или нет.
- Комментарий у world-init обещал, что расхождение числа дней с
  STARTING_DAYS поймают счётчики. Это неправда в одну сторону: лишний день
  ложится за рамкой дат описи. Обещание убрано, дыра названа.
- Довод «даг next_day этапа 5 продолжит ось» опирался на несуществующий
  этап; заменён настоящей причиной — заливка замыкает цепь разовых служб.
- Потолок ожидания 300 с получил обоснование замером с кратностью, а сам
  скрипт — честную оговорку: его обещание работает на пустом стенде, на
  живом ждать нечего.
- Третья, пропущенная ссылка на снятый порог скорости дня убрана из спеки.
- Даты замеров в карте целей разведены: #42 менял три цели, а не шесть.

Проверка
Обе ветви диагноза сняты заново на живом стенде: без брака — «не доехали»,
с браком — признак различения. Стенд восстановлен, все 9 проверок зелёные,
брака 0. make lint, typecheck, config-test, test (407 тестов) зелёные.

Ссылка: #42
ddmitry merged commit 600bd74b04 into main 2026-08-07 19:34:16 +03:00
ddmitry deleted branch feat/42-world-manifest 2026-08-07 19:34:17 +03:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ddmitry/clickstream-data-platform#64