Этап 7, остаток: эталонный мир равен стартовому, проверка дня по хешу #192

Closed
opened 2026-08-30 22:04:36 +03:00 by ddmitry · 0 comments
Owner

Этап 7, остаток: эталонный мир равен стартовому, проверка дня по хешу

Part of #9.

Цель

Зафиксировать в спеках резолюцию «эталонный мир совпадает со стартовым —
8 дней», добавить недостающую проверку «пересгенерируй день N — сравни хеш
с описью» и снять обещанный замер. Тикет не закрывает #9: у этапа остаются
хвосты уровня владельца (перечислены в комментарии к #9).

Контекст решения

Обещание «14 модельных дней» родилось, когда эталонный мир мыслился хранимым
снимком. С тех пор снимок стал чистой функцией и генерируется на месте,
стартовый мир зафиксирован спекой жизненного цикла в 8 дней — и у дней 8–13
в описи не осталось читателя: лабы проигрывают мир дальше без описи,
транспорт байты с описью не сверяет, а проверке хеша день 3 годится так же,
как день 13. Расширение при этом сломало бы рамки трех потребителей описи
на свежем make up (wait_for_events, check_starting_world,
classes_vs_inventory). Решение владельца 2026-08-30: не расширять; опись
вырастет, когда появится названный читатель.

Что сделать

  1. Новый тест в generator/tests/test_inventory.py: день 4, проигранный
    в файл внутри процесса через cli.main — тем же способом, что соседний
    тест хеша слепка, — совпадает по sha256 со строкой days[4].sha256
    описи. Имя — в стиле соседей, например
    test_a_replayed_day_matches_its_inventory_hash. После написания сломай
    проверяемое, не ожидание: временно убери перевод строки в файловом
    приемнике, убедись, что тест покраснел, откати правку и убедись в зелени;
    в отчете назови, чем ломал и что увидел.
  2. Правки спек и докстринга — все замены из раздела «Формулировки» ниже,
    дословно.
  3. Комментарии констант в двух тестах — формулировки там же; в
    test_plan.py константа SNAPSHOT_DAYS переименовывается в
    WINDOW_DAYS вместе с местами использования (не в FORTNIGHT: рядом
    живут локальные переменные fortnight, имена различались бы только
    регистром).
  4. Замер двух чисел: время пересборки описи (time make inventory в
    generator/) и размер восьмидневного снимка — байты событий всех 8 дней
    плюс байты семи слепков, проигранные в файлы файловым приемником. Замер —
    на этой машине: это машина стенда, она же референсная машина таблицы
    бюджетов. Результат — датированной записью с командами замера в разделе
    «Что проверено» docs/architecture/testing.md; тем же числом заполнить
    строку бюджета в спеке генератора (место — в формулировках). Заодно
    перемерь make test и, если цифры сдвинулись заметно, поправь в карте
    проверок ровно три места: строку make test в таблице целей, дату его
    перемера в списке над таблицей и упоминание доли пересборки описи в
    стоимости прогона. Датированные записи раздела «Что проверено» не
    переписываются — новая запись добавляется рядом.

Формулировки (вставлять дословно)

docs/specs/2026-08-01-generator.md, «Целевая картина одним взглядом»,
пункт «Числа»
— фразу «эталонный снимок — 14 дней» заменить на:

эталонный снимок совпадает со стартовым миром — 8 дней

Там же, раздел 5, пункт «Эталонный снимок — 14 дней» — заменить пункт
целиком на:

  • Эталонный снимок совпадает со стартовым миром — 8 дней: понедельник
    по понедельник, полная неделя и один закрытый день за окном K = 7.
    Обещание в 14 дней снято на этапе 7 (решение владельца 2026-08-30):
    у дней 8–13 не нашлось читателя — лабы проигрывают мир дальше без описи,
    транспорт байты с описью не сверяет, а проверке «пересгенерируй день N —
    сравни хеш» день 3 годится так же, как день 13. Замеры и тесты, меряющие
    мир на окне в две недели, не меняются: мир — функция без края, окну
    замера опись не нужна. Удлинение описи остается дешевым ходом
    (пересборка) и делается, когда читатель появится — например, если
    растяжке classes_vs_inventory понадобится сверять больше одного
    закрытого дня.

Там же, таблица бюджетов — строку про пересборку эталонного мира
заменить на (NN — результат замера):

| Пересборка эталонного мира (8 дней + опись, без транспорта) | NN с (замер 30 августа 2026 года) |

Там же, раздел «Опись мира и словарь» — заголовок пункта
«Опись мира одна и растет до эталонной (#42, 2026-08-07; решение
владельца при нарезке, 2026-08-01).» заменить на:

Опись мира одна (#42, 2026-08-07; эталонная длина — 8 дней, этап 7,
2026-08-30).

— а предложение «data/world-inventory.json — та самая опись, которую
обещает раздел 5, пока короткая; этап 7 продлит ее до 14 дней, а не заведет
вторую.» — на:

data/world-inventory.json — та самая опись, которую обещает раздел 5.
Этап 7 оставил ее восьмидневной: у хвоста в шесть дней не нашлось читателя
(резолюция — в разделе 5); вырастет она продолжением этого же файла, а не
вторым.

docs/specs/2026-07-30-stand-v2-realism.md, раздел 8 — во фразе про
хранение заменить «сам снимок (14 модельных дней) генерируется на месте» на
«сам снимок генерируется на месте — 8 дней, совпадает со стартовым миром
(обещание в 14 дней снято на этапе 7)»; заключительный абзац раздела
(«Снимок вырастет против v1 … размер проверить при пересборке.») заменить
на:

Размер снимка замерен на этапе 7 — запись в разделе «Что проверено»
карты проверок.

generator/src/clickstream_generator/inventory.py, докстринг —
предложение «Эталонный снимок в четырнадцать дней придёт на этапе 7 и станет
продолжением этой же описи, а не вторым файлом.» заменить на:

Это и есть эталонный мир: обещание в четырнадцать дней снято на этапе 7 —
у хвоста не нашлось читателя. Понадобится длиннее — опись продолжит этот
же файл, а не заведет второй.

generator/tests/test_plan.py — комментарий и константу

# Горизонт эталонного снимка — две недели (спека, раздел 5).
SNAPSHOT_DAYS = 14

заменить на (использования константы — переименовать):

# Окно замера плана — две недели: два цикла недельной сезонности.
WINDOW_DAYS = 14

generator/tests/test_commerce.py — первую строку комментария
«Окно эталонного снимка: доли по уровням спроса меряются на нём целиком —»
заменить на:

Окно замера — две недели: доли по уровням спроса меряются на нем целиком —

(вторая строка комментария остается как есть).

Критерии приемки

  • Новый тест сверяет проигранный день 4 с days[4].sha256 описи;
    красный прогон с временно сломанным приемником показан в отчете,
    правка откачена.
  • Все замены из раздела «Формулировки» внесены дословно; других правок
    в спеках нет.
  • Замер снят; датированная запись с командами — в «Что проверено»;
    строка бюджета в спеке генератора заполнена числом с датой; стоимость
    make test в карте проверок актуальна.
  • data/world-inventory.json не изменился: git diff по нему пуст.
  • make lint, make typecheck и make test в generator/ зеленые.

Границы

  • Механику мира и код генератора не трогать. Исключения — только названные
    в «Что сделать»: докстринг inventory.py, комментарии и константа в двух
    тестах, временная поломка приемника с откатом. Изменившаяся опись — сигнал
    ошибки, а не повод ее пересобрать.
  • Исторические замеры и расчеты на 14-дневном окне не трогать: оговорка
    «14 × 50 тыс. ≈ 700 тыс. событий», окно предыстории 90 дней, раздел
    «Замеры канонического мира». Это записи прошедших проверок: их числа —
    факт замера, не обещание эталона.
  • Рамки потребителей описи (dags/, scripts/check-clickhouse.sh) не
    трогать.
  • Упоминание CI amd64/arm64 в спеке генератора не трогать: отдельная
    развилка, вне тикета.
  • Формулировки спек — дословно из постановки, свои не сочинять. В новом
    тексте не используется буква «ё» — формулировки уже написаны так.
  • Коммиты не делать.

Сначала прочитать

  1. docs/specs/2026-08-01-generator.md — раздел 5 и «Опись мира и словарь».
  2. docs/specs/2026-07-30-stand-v2-realism.md — раздел 8.
  3. generator/src/clickstream_generator/inventory.py — докстринг и main.
  4. generator/tests/test_inventory.py — как тест хеша слепка проигрывает
    в файл и меряет sha256.
  5. docs/architecture/testing.md — «Что проверено» и правило «сломай
    проверку руками».

Команды проверки

  • cd generator && make lint && make typecheck && make test
  • git diff --stat data/world-inventory.json — пусто
# Этап 7, остаток: эталонный мир равен стартовому, проверка дня по хешу Part of #9. ## Цель Зафиксировать в спеках резолюцию «эталонный мир совпадает со стартовым — 8 дней», добавить недостающую проверку «пересгенерируй день N — сравни хеш с описью» и снять обещанный замер. Тикет не закрывает #9: у этапа остаются хвосты уровня владельца (перечислены в комментарии к #9). ## Контекст решения Обещание «14 модельных дней» родилось, когда эталонный мир мыслился хранимым снимком. С тех пор снимок стал чистой функцией и генерируется на месте, стартовый мир зафиксирован спекой жизненного цикла в 8 дней — и у дней 8–13 в описи не осталось читателя: лабы проигрывают мир дальше без описи, транспорт байты с описью не сверяет, а проверке хеша день 3 годится так же, как день 13. Расширение при этом сломало бы рамки трех потребителей описи на свежем `make up` (`wait_for_events`, `check_starting_world`, `classes_vs_inventory`). Решение владельца 2026-08-30: не расширять; опись вырастет, когда появится названный читатель. ## Что сделать 1. **Новый тест** в `generator/tests/test_inventory.py`: день 4, проигранный в файл внутри процесса через `cli.main` — тем же способом, что соседний тест хеша слепка, — совпадает по sha256 со строкой `days[4].sha256` описи. Имя — в стиле соседей, например `test_a_replayed_day_matches_its_inventory_hash`. После написания сломай проверяемое, не ожидание: временно убери перевод строки в файловом приемнике, убедись, что тест покраснел, откати правку и убедись в зелени; в отчете назови, чем ломал и что увидел. 2. **Правки спек и докстринга** — все замены из раздела «Формулировки» ниже, дословно. 3. **Комментарии констант в двух тестах** — формулировки там же; в `test_plan.py` константа `SNAPSHOT_DAYS` переименовывается в `WINDOW_DAYS` вместе с местами использования (не в `FORTNIGHT`: рядом живут локальные переменные `fortnight`, имена различались бы только регистром). 4. **Замер** двух чисел: время пересборки описи (`time make inventory` в `generator/`) и размер восьмидневного снимка — байты событий всех 8 дней плюс байты семи слепков, проигранные в файлы файловым приемником. Замер — на этой машине: это машина стенда, она же референсная машина таблицы бюджетов. Результат — датированной записью с командами замера в разделе «Что проверено» `docs/architecture/testing.md`; тем же числом заполнить строку бюджета в спеке генератора (место — в формулировках). Заодно перемерь `make test` и, если цифры сдвинулись заметно, поправь в карте проверок ровно три места: строку `make test` в таблице целей, дату его перемера в списке над таблицей и упоминание доли пересборки описи в стоимости прогона. Датированные записи раздела «Что проверено» не переписываются — новая запись добавляется рядом. ## Формулировки (вставлять дословно) **`docs/specs/2026-08-01-generator.md`, «Целевая картина одним взглядом», пункт «Числа»** — фразу «эталонный снимок — 14 дней» заменить на: > эталонный снимок совпадает со стартовым миром — 8 дней **Там же, раздел 5, пункт «Эталонный снимок — 14 дней»** — заменить пункт целиком на: > - **Эталонный снимок совпадает со стартовым миром — 8 дней**: понедельник > по понедельник, полная неделя и один закрытый день за окном K = 7. > Обещание в 14 дней снято на этапе 7 (решение владельца 2026-08-30): > у дней 8–13 не нашлось читателя — лабы проигрывают мир дальше без описи, > транспорт байты с описью не сверяет, а проверке «пересгенерируй день N — > сравни хеш» день 3 годится так же, как день 13. Замеры и тесты, меряющие > мир на окне в две недели, не меняются: мир — функция без края, окну > замера опись не нужна. Удлинение описи остается дешевым ходом > (пересборка) и делается, когда читатель появится — например, если > растяжке `classes_vs_inventory` понадобится сверять больше одного > закрытого дня. **Там же, таблица бюджетов** — строку про пересборку эталонного мира заменить на (`NN` — результат замера): > | Пересборка эталонного мира (8 дней + опись, без транспорта) | NN с (замер 30 августа 2026 года) | **Там же, раздел «Опись мира и словарь»** — заголовок пункта «**Опись мира одна и растет до эталонной** (#42, 2026-08-07; решение владельца при нарезке, 2026-08-01).» заменить на: > **Опись мира одна** (#42, 2026-08-07; эталонная длина — 8 дней, этап 7, > 2026-08-30). — а предложение «`data/world-inventory.json` — та самая опись, которую обещает раздел 5, пока короткая; этап 7 продлит ее до 14 дней, а не заведет вторую.» — на: > `data/world-inventory.json` — та самая опись, которую обещает раздел 5. > Этап 7 оставил ее восьмидневной: у хвоста в шесть дней не нашлось читателя > (резолюция — в разделе 5); вырастет она продолжением этого же файла, а не > вторым. **`docs/specs/2026-07-30-stand-v2-realism.md`, раздел 8** — во фразе про хранение заменить «сам снимок (14 модельных дней) генерируется на месте» на «сам снимок генерируется на месте — 8 дней, совпадает со стартовым миром (обещание в 14 дней снято на этапе 7)»; заключительный абзац раздела («Снимок вырастет против v1 … размер проверить при пересборке.») заменить на: > Размер снимка замерен на этапе 7 — запись в разделе «Что проверено» > [карты проверок](../architecture/testing.md). **`generator/src/clickstream_generator/inventory.py`, докстринг** — предложение «Эталонный снимок в четырнадцать дней придёт на этапе 7 и станет продолжением этой же описи, а не вторым файлом.» заменить на: > Это и есть эталонный мир: обещание в четырнадцать дней снято на этапе 7 — > у хвоста не нашлось читателя. Понадобится длиннее — опись продолжит этот > же файл, а не заведет второй. **`generator/tests/test_plan.py`** — комментарий и константу ```python # Горизонт эталонного снимка — две недели (спека, раздел 5). SNAPSHOT_DAYS = 14 ``` заменить на (использования константы — переименовать): ```python # Окно замера плана — две недели: два цикла недельной сезонности. WINDOW_DAYS = 14 ``` **`generator/tests/test_commerce.py`** — первую строку комментария «Окно эталонного снимка: доли по уровням спроса меряются на нём целиком —» заменить на: > Окно замера — две недели: доли по уровням спроса меряются на нем целиком — (вторая строка комментария остается как есть). ## Критерии приемки - [ ] Новый тест сверяет проигранный день 4 с `days[4].sha256` описи; красный прогон с временно сломанным приемником показан в отчете, правка откачена. - [ ] Все замены из раздела «Формулировки» внесены дословно; других правок в спеках нет. - [ ] Замер снят; датированная запись с командами — в «Что проверено»; строка бюджета в спеке генератора заполнена числом с датой; стоимость `make test` в карте проверок актуальна. - [ ] `data/world-inventory.json` не изменился: `git diff` по нему пуст. - [ ] `make lint`, `make typecheck` и `make test` в `generator/` зеленые. ## Границы - Механику мира и код генератора не трогать. Исключения — только названные в «Что сделать»: докстринг `inventory.py`, комментарии и константа в двух тестах, временная поломка приемника с откатом. Изменившаяся опись — сигнал ошибки, а не повод ее пересобрать. - Исторические замеры и расчеты на 14-дневном окне не трогать: оговорка «14 × 50 тыс. ≈ 700 тыс. событий», окно предыстории 90 дней, раздел «Замеры канонического мира». Это записи прошедших проверок: их числа — факт замера, не обещание эталона. - Рамки потребителей описи (`dags/`, `scripts/check-clickhouse.sh`) не трогать. - Упоминание CI amd64/arm64 в спеке генератора не трогать: отдельная развилка, вне тикета. - Формулировки спек — дословно из постановки, свои не сочинять. В новом тексте не используется буква «ё» — формулировки уже написаны так. - Коммиты не делать. ## Сначала прочитать 1. `docs/specs/2026-08-01-generator.md` — раздел 5 и «Опись мира и словарь». 2. `docs/specs/2026-07-30-stand-v2-realism.md` — раздел 8. 3. `generator/src/clickstream_generator/inventory.py` — докстринг и `main`. 4. `generator/tests/test_inventory.py` — как тест хеша слепка проигрывает в файл и меряет sha256. 5. `docs/architecture/testing.md` — «Что проверено» и правило «сломай проверку руками». ## Команды проверки - `cd generator && make lint && make typecheck && make test` - `git diff --stat data/world-inventory.json` — пусто
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ddmitry/clickstream-data-platform#192