Зафиксировать в спеках резолюцию «эталонный мир совпадает со стартовым —
8 дней», добавить недостающую проверку «пересгенерируй день N — сравни хеш
с описью» и снять обещанный замер. Тикет не закрывает #9: у этапа остаются
хвосты уровня владельца (перечислены в комментарии к #9).
Контекст решения
Обещание «14 модельных дней» родилось, когда эталонный мир мыслился хранимым
снимком. С тех пор снимок стал чистой функцией и генерируется на месте,
стартовый мир зафиксирован спекой жизненного цикла в 8 дней — и у дней 8–13
в описи не осталось читателя: лабы проигрывают мир дальше без описи,
транспорт байты с описью не сверяет, а проверке хеша день 3 годится так же,
как день 13. Расширение при этом сломало бы рамки трех потребителей описи
на свежем make up (wait_for_events, check_starting_world, classes_vs_inventory). Решение владельца 2026-08-30: не расширять; опись
вырастет, когда появится названный читатель.
Что сделать
Новый тест в generator/tests/test_inventory.py: день 4, проигранный
в файл внутри процесса через cli.main — тем же способом, что соседний
тест хеша слепка, — совпадает по sha256 со строкой days[4].sha256
описи. Имя — в стиле соседей, например test_a_replayed_day_matches_its_inventory_hash. После написания сломай
проверяемое, не ожидание: временно убери перевод строки в файловом
приемнике, убедись, что тест покраснел, откати правку и убедись в зелени;
в отчете назови, чем ломал и что увидел.
Правки спек и докстринга — все замены из раздела «Формулировки» ниже,
дословно.
Комментарии констант в двух тестах — формулировки там же; в test_plan.py константа SNAPSHOT_DAYS переименовывается в WINDOW_DAYS вместе с местами использования (не в FORTNIGHT: рядом
живут локальные переменные fortnight, имена различались бы только
регистром).
Замер двух чисел: время пересборки описи (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 в спеке генератора не трогать: отдельная
развилка, вне тикета.
Формулировки спек — дословно из постановки, свои не сочинять. В новом
тексте не используется буква «ё» — формулировки уже написаны так.
Коммиты не делать.
Сначала прочитать
docs/specs/2026-08-01-generator.md — раздел 5 и «Опись мира и словарь».
docs/specs/2026-07-30-stand-v2-realism.md — раздел 8.
generator/src/clickstream_generator/inventory.py — докстринг и main.
generator/tests/test_inventory.py — как тест хеша слепка проигрывает
в файл и меряет sha256.
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` — пусто
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.
Этап 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: не расширять; описьвырастет, когда появится названный читатель.
Что сделать
generator/tests/test_inventory.py: день 4, проигранныйв файл внутри процесса через
cli.main— тем же способом, что соседнийтест хеша слепка, — совпадает по sha256 со строкой
days[4].sha256описи. Имя — в стиле соседей, например
test_a_replayed_day_matches_its_inventory_hash. После написания сломайпроверяемое, не ожидание: временно убери перевод строки в файловом
приемнике, убедись, что тест покраснел, откати правку и убедись в зелени;
в отчете назови, чем ломал и что увидел.
дословно.
test_plan.pyконстантаSNAPSHOT_DAYSпереименовывается вWINDOW_DAYSвместе с местами использования (не вFORTNIGHT: рядомживут локальные переменные
fortnight, имена различались бы толькорегистром).
time make inventoryвgenerator/) и размер восьмидневного снимка — байты событий всех 8 днейплюс байты семи слепков, проигранные в файлы файловым приемником. Замер —
на этой машине: это машина стенда, она же референсная машина таблицы
бюджетов. Результат — датированной записью с командами замера в разделе
«Что проверено»
docs/architecture/testing.md; тем же числом заполнитьстроку бюджета в спеке генератора (место — в формулировках). Заодно
перемерь
make testи, если цифры сдвинулись заметно, поправь в картепроверок ровно три места: строку
make testв таблице целей, дату егоперемера в списке над таблицей и упоминание доли пересборки описи в
стоимости прогона. Датированные записи раздела «Что проверено» не
переписываются — новая запись добавляется рядом.
Формулировки (вставлять дословно)
docs/specs/2026-08-01-generator.md, «Целевая картина одним взглядом»,пункт «Числа» — фразу «эталонный снимок — 14 дней» заменить на:
Там же, раздел 5, пункт «Эталонный снимок — 14 дней» — заменить пункт
целиком на:
Там же, таблица бюджетов — строку про пересборку эталонного мира
заменить на (
NN— результат замера):Там же, раздел «Опись мира и словарь» — заголовок пункта
«Опись мира одна и растет до эталонной (#42, 2026-08-07; решение
владельца при нарезке, 2026-08-01).» заменить на:
— а предложение «
data/world-inventory.json— та самая опись, которуюобещает раздел 5, пока короткая; этап 7 продлит ее до 14 дней, а не заведет
вторую.» — на:
docs/specs/2026-07-30-stand-v2-realism.md, раздел 8 — во фразе прохранение заменить «сам снимок (14 модельных дней) генерируется на месте» на
«сам снимок генерируется на месте — 8 дней, совпадает со стартовым миром
(обещание в 14 дней снято на этапе 7)»; заключительный абзац раздела
(«Снимок вырастет против v1 … размер проверить при пересборке.») заменить
на:
generator/src/clickstream_generator/inventory.py, докстринг —предложение «Эталонный снимок в четырнадцать дней придёт на этапе 7 и станет
продолжением этой же описи, а не вторым файлом.» заменить на:
generator/tests/test_plan.py— комментарий и константузаменить на (использования константы — переименовать):
generator/tests/test_commerce.py— первую строку комментария«Окно эталонного снимка: доли по уровням спроса меряются на нём целиком —»
заменить на:
(вторая строка комментария остается как есть).
Критерии приемки
days[4].sha256описи;красный прогон с временно сломанным приемником показан в отчете,
правка откачена.
в спеках нет.
строка бюджета в спеке генератора заполнена числом с датой; стоимость
make testв карте проверок актуальна.data/world-inventory.jsonне изменился:git diffпо нему пуст.make lint,make typecheckиmake testвgenerator/зеленые.Границы
в «Что сделать»: докстринг
inventory.py, комментарии и константа в двухтестах, временная поломка приемника с откатом. Изменившаяся опись — сигнал
ошибки, а не повод ее пересобрать.
«14 × 50 тыс. ≈ 700 тыс. событий», окно предыстории 90 дней, раздел
«Замеры канонического мира». Это записи прошедших проверок: их числа —
факт замера, не обещание эталона.
dags/,scripts/check-clickhouse.sh) нетрогать.
развилка, вне тикета.
тексте не используется буква «ё» — формулировки уже написаны так.
Сначала прочитать
docs/specs/2026-08-01-generator.md— раздел 5 и «Опись мира и словарь».docs/specs/2026-07-30-stand-v2-realism.md— раздел 8.generator/src/clickstream_generator/inventory.py— докстринг иmain.generator/tests/test_inventory.py— как тест хеша слепка проигрываетв файл и меряет sha256.
docs/architecture/testing.md— «Что проверено» и правило «сломайпроверку руками».
Команды проверки
cd generator && make lint && make typecheck && make testgit diff --stat data/world-inventory.json— пусто