From 8c69397ccfca112980f6748356dc734f41ca11e4 Mon Sep 17 00:00:00 2001 From: Dmitry Dementiev Date: Sat, 1 Aug 2026 20:49:49 +0300 Subject: [PATCH] =?UTF-8?q?docs(specs):=20=D0=BF=D1=80=D0=B8=D1=82=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=BF=D0=BE=D1=81=D0=B5=D1=82=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B8=20=D1=84=D0=B5=D0=B9=D0=BA=D0=B5=D1=80?= =?UTF-8?q?=D1=8B=20=D0=B1=D0=B5=D0=B7=20=D0=B3=D0=B2=D0=BE=D0=B7=D0=B4?= =?UTF-8?q?=D1=8F=20=E2=80=94=20=D0=B2=D1=8B=D1=87=D0=B8=D1=82=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B2=D0=BB=D0=B0=D0=B4=D0=B5=D0=BB=D1=8C=D1=86=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - вычитка спеки на приёмке нашла дыру: состав мира читался как замкнутая труппа без новых посетителей — неправдоподобный магазин. - Что: - раздел 1: состав не замкнут — план задаёт календарь появления кук, доля одноразовых высока; приток — часть плана, не мутация. - раздел 6: «Faker» ослаблен до «посточные фейкеры (Faker, mimesis)», выбор библиотеки — этапу 2; там же оговорка про таблицы-литералы. - раздел 9: к интерфейсу запуска добавлены вопросы «кто зовёт генератор (даги world_init/next_day)» и «в каком контейнере живёт». - CONTEXT.md: в «Состав мира» добавлен календарь появления. - Проверка: - вычитка; правки точечные, решения развилок не пересматриваются. Co-Authored-By: Claude Opus 5 --- CONTEXT.md | 6 +++--- docs/specs/2026-08-01-generator.md | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CONTEXT.md b/CONTEXT.md index b351b7b..de3c1d0 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -12,9 +12,9 @@ _Избегать_: склад, склад данных **Состав мира**: -Постоянная часть мира генератора — популяция посетителей, их привычки, -календарь двухкуковых пар. Чистая функция зерна: вычисляется при старте -любого процесса, между прогонами не хранится. +Постоянная часть мира генератора — популяция посетителей с календарём их +появления, привычки, календарь двухкуковых пар. Чистая функция зерна: +вычисляется при старте любого процесса, между прогонами не хранится. _Избегать_: состояние мира **Ось модельного времени**: diff --git a/docs/specs/2026-08-01-generator.md b/docs/specs/2026-08-01-generator.md index 68ca0c9..537c4b4 100644 --- a/docs/specs/2026-08-01-generator.md +++ b/docs/specs/2026-08-01-generator.md @@ -48,6 +48,13 @@ плана состава, а не копятся в состоянии. Глобальные инварианты («каждый двухкуковый покупатель заказал с обеих кук») гарантируются планом — счётчики манифеста известны до генерации событий. +- **Состав не замкнут: посетители появляются и уходят.** План состава задаёт + календарь появления — у каждого посетителя есть дата первого визита и + профиль возвратов, заметная доля кук одноразовая, как в живом трафике. + Новые посетители появляются на всём протяжении оси: uniq(ClientID) растёт + с горизонтом, DAU и MAU не сходятся в одно число. Приток — часть плана, а + не мутация: счётчики манифеста по-прежнему известны до генерации + (уточнение по вычитке владельца, 2026-08-01). - **Своя ось модельного времени.** Мир рождается в фиксированный день D0 (понедельник — см. раздел 5); реальный календарь в модели не участвует. Между прогонами живут только зерно и позиция на оси: выключенный ноутбук — @@ -278,8 +285,11 @@ pytest-тест с маркером `perf` и таймаутом-обрубан звать; деньги — в целых копейках. - **Случайные значения — векторно из numpy (PCG64)**; посточный цикл — лишь там, где логика действительно посточная (цепочки сессий). -- **Faker — только для справочников** (каталог, имена), не в горячем цикле: - он медленнее numpy на 2–3 порядка. +- **Посточные фейкеры (Faker, mimesis) — только для справочников** (каталог + и прочие справочные строки), не в горячем цикле: они медленнее numpy на + 2–3 порядка. Выбор библиотеки — этапу 2: справочники генерируются один + раз, скорость безразлична; возможно, хватит таблиц-литералов в коде и + фейкер не понадобится вовсе. - **Сериализация — через единственный канонический сериализатор** (orjson); прямых `json.dumps` по коду нет. - **Распараллеливание — multiprocessing по модельным дням**; внутри дня — @@ -315,7 +325,8 @@ pytest-тест с маркером `perf` и таймаутом-обрубан Осталось из тумана карты — вопросы уровня тикетов, не развилок: - интерфейс запуска генератора (CLI / цели make) и как он делит режимы - проигрывателя; + проигрывателя; кто его зовёт в стенде — даги `world_init`/`next_day` из + оценки мастер-спеки (раздел 9) — и в каком контейнере он живёт; - формат описания мира и конфигурации (что константа кода, что параметр); - как фиксируется «зерновой» мир конца этапа 2 (раздел 9 мастер-спеки): с манифестным решением напрашивается мини-манифест зернового мира — форму