docs(specs): приток посетителей и фейкеры без гвоздя — вычитка владельца
- Зачем:
- вычитка спеки на приёмке нашла дыру: состав мира читался как
замкнутая труппа без новых посетителей — неправдоподобный магазин.
- Что:
- раздел 1: состав не замкнут — план задаёт календарь появления кук,
доля одноразовых высока; приток — часть плана, не мутация.
- раздел 6: «Faker» ослаблен до «посточные фейкеры (Faker, mimesis)»,
выбор библиотеки — этапу 2; там же оговорка про таблицы-литералы.
- раздел 9: к интерфейсу запуска добавлены вопросы «кто зовёт
генератор (даги world_init/next_day)» и «в каком контейнере живёт».
- CONTEXT.md: в «Состав мира» добавлен календарь появления.
- Проверка:
- вычитка; правки точечные, решения развилок не пересматриваются.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+3
-3
@@ -12,9 +12,9 @@
|
|||||||
_Избегать_: склад, склад данных
|
_Избегать_: склад, склад данных
|
||||||
|
|
||||||
**Состав мира**:
|
**Состав мира**:
|
||||||
Постоянная часть мира генератора — популяция посетителей, их привычки,
|
Постоянная часть мира генератора — популяция посетителей с календарём их
|
||||||
календарь двухкуковых пар. Чистая функция зерна: вычисляется при старте
|
появления, привычки, календарь двухкуковых пар. Чистая функция зерна:
|
||||||
любого процесса, между прогонами не хранится.
|
вычисляется при старте любого процесса, между прогонами не хранится.
|
||||||
_Избегать_: состояние мира
|
_Избегать_: состояние мира
|
||||||
|
|
||||||
**Ось модельного времени**:
|
**Ось модельного времени**:
|
||||||
|
|||||||
@@ -48,6 +48,13 @@
|
|||||||
плана состава, а не копятся в состоянии. Глобальные инварианты («каждый
|
плана состава, а не копятся в состоянии. Глобальные инварианты («каждый
|
||||||
двухкуковый покупатель заказал с обеих кук») гарантируются планом —
|
двухкуковый покупатель заказал с обеих кук») гарантируются планом —
|
||||||
счётчики манифеста известны до генерации событий.
|
счётчики манифеста известны до генерации событий.
|
||||||
|
- **Состав не замкнут: посетители появляются и уходят.** План состава задаёт
|
||||||
|
календарь появления — у каждого посетителя есть дата первого визита и
|
||||||
|
профиль возвратов, заметная доля кук одноразовая, как в живом трафике.
|
||||||
|
Новые посетители появляются на всём протяжении оси: uniq(ClientID) растёт
|
||||||
|
с горизонтом, DAU и MAU не сходятся в одно число. Приток — часть плана, а
|
||||||
|
не мутация: счётчики манифеста по-прежнему известны до генерации
|
||||||
|
(уточнение по вычитке владельца, 2026-08-01).
|
||||||
- **Своя ось модельного времени.** Мир рождается в фиксированный день D0
|
- **Своя ось модельного времени.** Мир рождается в фиксированный день D0
|
||||||
(понедельник — см. раздел 5); реальный календарь в модели не участвует.
|
(понедельник — см. раздел 5); реальный календарь в модели не участвует.
|
||||||
Между прогонами живут только зерно и позиция на оси: выключенный ноутбук —
|
Между прогонами живут только зерно и позиция на оси: выключенный ноутбук —
|
||||||
@@ -278,8 +285,11 @@ pytest-тест с маркером `perf` и таймаутом-обрубан
|
|||||||
звать; деньги — в целых копейках.
|
звать; деньги — в целых копейках.
|
||||||
- **Случайные значения — векторно из numpy (PCG64)**; посточный цикл — лишь
|
- **Случайные значения — векторно из numpy (PCG64)**; посточный цикл — лишь
|
||||||
там, где логика действительно посточная (цепочки сессий).
|
там, где логика действительно посточная (цепочки сессий).
|
||||||
- **Faker — только для справочников** (каталог, имена), не в горячем цикле:
|
- **Посточные фейкеры (Faker, mimesis) — только для справочников** (каталог
|
||||||
он медленнее numpy на 2–3 порядка.
|
и прочие справочные строки), не в горячем цикле: они медленнее numpy на
|
||||||
|
2–3 порядка. Выбор библиотеки — этапу 2: справочники генерируются один
|
||||||
|
раз, скорость безразлична; возможно, хватит таблиц-литералов в коде и
|
||||||
|
фейкер не понадобится вовсе.
|
||||||
- **Сериализация — через единственный канонический сериализатор** (orjson);
|
- **Сериализация — через единственный канонический сериализатор** (orjson);
|
||||||
прямых `json.dumps` по коду нет.
|
прямых `json.dumps` по коду нет.
|
||||||
- **Распараллеливание — multiprocessing по модельным дням**; внутри дня —
|
- **Распараллеливание — multiprocessing по модельным дням**; внутри дня —
|
||||||
@@ -315,7 +325,8 @@ pytest-тест с маркером `perf` и таймаутом-обрубан
|
|||||||
Осталось из тумана карты — вопросы уровня тикетов, не развилок:
|
Осталось из тумана карты — вопросы уровня тикетов, не развилок:
|
||||||
|
|
||||||
- интерфейс запуска генератора (CLI / цели make) и как он делит режимы
|
- интерфейс запуска генератора (CLI / цели make) и как он делит режимы
|
||||||
проигрывателя;
|
проигрывателя; кто его зовёт в стенде — даги `world_init`/`next_day` из
|
||||||
|
оценки мастер-спеки (раздел 9) — и в каком контейнере он живёт;
|
||||||
- формат описания мира и конфигурации (что константа кода, что параметр);
|
- формат описания мира и конфигурации (что константа кода, что параметр);
|
||||||
- как фиксируется «зерновой» мир конца этапа 2 (раздел 9 мастер-спеки):
|
- как фиксируется «зерновой» мир конца этапа 2 (раздел 9 мастер-спеки):
|
||||||
с манифестным решением напрашивается мини-манифест зернового мира — форму
|
с манифестным решением напрашивается мини-манифест зернового мира — форму
|
||||||
|
|||||||
Reference in New Issue
Block a user