Стенд поднимался пустым, и всякая приёмка следующих этапов начиналась с ручной
заливки данных. Теперь 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.
Зачем
Стенд поднимался пустым, и всякая приёмка следующих этапов начиналась с
ручной заливки данных. Теперь `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 main2026-08-07 19:34:16 +03:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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. При расхожденииназывает, где искать, — в событиях или в браке.
Замер дал 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.