Модель мира: что живёт между прогонами и как устроены модельные сутки #27

Closed
opened 2026-08-01 15:46:04 +03:00 by ddmitry · 1 comment
Owner

Part of #26.

Вопрос

Что в мире генератора живёт между прогонами (посетители, их привычки, история), а что рождается заново при каждом прогоне? Как устроены модельные сутки и переход к следующему дню?

Развилка отложена мастер-спекой (см. тикет #14). Смежные решения, которые модель мира должна уважать: N:1 «две куки» и константа «каждый двухкуковый покупатель заказывает с обеих кук» (раздел 5 мастер-спеки), правило «сессия режется по границе модельных суток» (раздел 6), «зерновой» мир конца этапа 2 (раздел 9).

Part of #26. ## Вопрос Что в мире генератора живёт между прогонами (посетители, их привычки, история), а что рождается заново при каждом прогоне? Как устроены модельные сутки и переход к следующему дню? Развилка отложена мастер-спекой (см. тикет #14). Смежные решения, которые модель мира должна уважать: N:1 «две куки» и константа «каждый двухкуковый покупатель заказывает с обеих кук» (раздел 5 мастер-спеки), правило «сессия режется по границе модельных суток» (раздел 6), «зерновой» мир конца этапа 2 (раздел 9).
ddmitry added the wayfinder:grilling label 2026-08-01 15:46:40 +03:00
ddmitry self-assigned this 2026-08-01 15:51:21 +03:00
Author
Owner

Резолюция (сессия 2026-08-01, владелец подтвердил):

  1. Мир функциональный, ничего не мутирует. Постоянный состав мира (популяция посетителей, привычки, календарь двухкуковых пар) — чистая функция зерна, вычисляется при старте любого процесса. День D — функция (зерно, D); межднёвные связи (окно заказов K, опоздания) выводятся из плана, а не копятся в состоянии. Глобальные инварианты (каждый двухкуковый заказал с обеих кук) гарантируются планом состава — счётчики манифеста известны до генерации событий.

  2. Своя ось времени. Мир всегда рождается в фиксированный день D0; реальный календарь в модели не участвует. Между прогонами живут только зерно и позиция на оси (какой день прожит). Выключенный ноут — мир замер, потом продолжил.

  3. Два режима движения времени на одной оси: пошаговый — базовый для лаб (старт с эталонного снимка ~недели, дальше «прожить следующий день» — явное действие); живой день — текущий день проигрывается с ускорением, дашборд и мониторинг «дышат». Живой режим — по требованию, не постоянный фон.

  4. Граница суток — единственный структурный шов: сессии режутся по ней (дневная партиция самодостаточна), в конце модельного дня — слепок заказов. День проживается целиком: полдня не бывает; недожитый день при обрыве доигрывается или пересчитывается (деталь реализации).

  5. Поток и пакет совместимы по построению: день-функция выдаёт один поток событий; режимы отличаются только способом проигрывания (пачкой или с темпом).

Отклонено с доводами:

  • Мутирующее состояние мира («мир стареет»): ломает параллельность по дням, требует чекпоинтов, счётчики манифеста узнаваемы только постфактум; ни один урок стенда на старении не стоит.
  • Чистая функция без слоя состава: глобальные инварианты пришлось бы выводить в каждом дне заново — тот же план мира, но неявный и размазанный.
  • Привязка модельного времени к реальному календарю (T-1 с догоном): конфликтует с ускорением ×60 (за вечер мир уезжает в будущее) и делает даты эталонного мира зависимыми от даты запуска — манифест теряет воспроизводимость.

Хвосты соседям: доставка эталонного снимка (через Kafka или напрямую в ClickHouse) — тикет #29; ускорение живого режима и длина эталонного снимка числами — тикет #30. Термины для CONTEXT.md при сборке спеки (#32): состав мира, ось модельного времени / D0, пошаговый режим, живой день, граница суток.

Резолюция (сессия 2026-08-01, владелец подтвердил): 1. **Мир функциональный, ничего не мутирует.** Постоянный состав мира (популяция посетителей, привычки, календарь двухкуковых пар) — чистая функция зерна, вычисляется при старте любого процесса. День D — функция (зерно, D); межднёвные связи (окно заказов K, опоздания) выводятся из плана, а не копятся в состоянии. Глобальные инварианты (каждый двухкуковый заказал с обеих кук) гарантируются планом состава — счётчики манифеста известны до генерации событий. 2. **Своя ось времени.** Мир всегда рождается в фиксированный день D0; реальный календарь в модели не участвует. Между прогонами живут только зерно и позиция на оси (какой день прожит). Выключенный ноут — мир замер, потом продолжил. 3. **Два режима движения времени на одной оси:** пошаговый — базовый для лаб (старт с эталонного снимка ~недели, дальше «прожить следующий день» — явное действие); живой день — текущий день проигрывается с ускорением, дашборд и мониторинг «дышат». Живой режим — по требованию, не постоянный фон. 4. **Граница суток — единственный структурный шов:** сессии режутся по ней (дневная партиция самодостаточна), в конце модельного дня — слепок заказов. День проживается целиком: полдня не бывает; недожитый день при обрыве доигрывается или пересчитывается (деталь реализации). 5. **Поток и пакет совместимы по построению:** день-функция выдаёт один поток событий; режимы отличаются только способом проигрывания (пачкой или с темпом). **Отклонено с доводами:** - *Мутирующее состояние мира* («мир стареет»): ломает параллельность по дням, требует чекпоинтов, счётчики манифеста узнаваемы только постфактум; ни один урок стенда на старении не стоит. - *Чистая функция без слоя состава*: глобальные инварианты пришлось бы выводить в каждом дне заново — тот же план мира, но неявный и размазанный. - *Привязка модельного времени к реальному календарю (T-1 с догоном)*: конфликтует с ускорением ×60 (за вечер мир уезжает в будущее) и делает даты эталонного мира зависимыми от даты запуска — манифест теряет воспроизводимость. **Хвосты соседям:** доставка эталонного снимка (через Kafka или напрямую в ClickHouse) — тикет #29; ускорение живого режима и длина эталонного снимка числами — тикет #30. Термины для CONTEXT.md при сборке спеки (#32): состав мира, ось модельного времени / D0, пошаговый режим, живой день, граница суток.
Sign in to join this conversation.