Карта: проектирование генератора (этап 2) #26

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

Карта проектирования генератора v2. Мандат — тикет #14 (родитель — этап 2, #4): там цель, критерии приёмки и границы; карта прокладывает маршрут к ним.

Пункт назначения

Спека генератора принята владельцем, лежит файлом в docs/specs/ в main, а этап 2 нарезан на тикеты чек-листом в корневом issue #4. Карта несёт и исполнение маршрута: сборку спеки, приёмку и нарезку тикетов, а не только решения по развилкам.

Заметки

  • Источник истины — мастер-спека docs/specs/2026-07-30-stand-v2-realism.md; сначала читать разделы 1 (особенно 1.4 «схема как контракт»), 5, 9, 10 и 11.
  • Развилки вести через /brainstorm-with-docs с /grilling и /domain-modeling: сначала веер вариантов, потом конвергенция; отклонённые варианты записывать с доводами, чтобы не возвращаться.
  • Если решение развилки расходится с мастер-спекой — расхождение вносится в неё тем же коммитом, что и спека генератора.
  • Спорные API перед фиксацией в спеке сверять через MCP Context7 (правило AGENTS.md).

Решения по пути

  • Модель мира: что живёт между прогонами и как устроены модельные сутки — мир функциональный: состав — чистая функция зерна, день — функция (зерно, D); своя ось времени с фиксированным D0, между прогонами живут только зерно и позиция; два режима — пошаговый для лаб и живой день с ускорением; граница суток — единственный шов.

  • Детерминизм от зерна: что воспроизводимо и как зерно переживает параллельность — содержимое до байта (при uv.lock и каноническом контейнере), транспорт вне обещания; иерархия подпотоков «зерно → день → компонент»; целочисленная случайность, деньги в копейках; канонический seed и паспорт мира в манифесте; расхождение платформ = баг.

  • Скорость батчевой генерации в Python: подходы и порядки величин — orjson в 5–14 раз быстрее stdlib; посточная генерация с orjson ~2–5×10⁵ событий/с на ядро; живой поток ×60 ниже планки на 3–4 порядка; заметка — docs/research/2026-08-01-python-batch-generation-speed.md на ветке research/python-batch-generation-speed.

  • Архитектура: источник истины схемы и разделение потока и пакета — контракт схемы — python-модуль с чистыми данными, собственность генератора (data contract): из него — генератор, валидация и документация формата; склад пишется по документации руками, границу сторожат строгий приём и contract-тест в smoke; день-функция → один канонический сериализатор → приёмники (файл только для git-снимка, Kafka пачкой, Kafka ×60), промежуточные файлы не хранятся, обрыв — переигровка через дедуп; эталонный снимок при старте — через Kafka пакетным режимом (оговорка на объём — #30).

  • Производительность: числовые требования и чем их замерять — ~50 тыс. событий в средний модельный день; снимок 14 дней (две недели, D0 — понедельник); в git — только манифест, снимок генерируется при make up; живой день ×60 по умолчанию, флаг проигрывателя; бюджеты — ориентиры в спеке, автоматический порог один (день ≤ 30 с, pytest perf в CI), остальное — печать таймингов; прототип-замер не нужен, туман рассеян.

  • Собрать спеку генератора из решений развилок — спека docs/specs/2026-08-01-generator.md собрана из решений четырёх развилок, PR #35; мастер-спека (1.4, 8, 11) и CONTEXT.md согласованы тем же коммитом; SeedSequence.spawn сверен через Context7. Дальше — приёмка владельцем: слияние PR #35 и есть она.

  • Приёмка спеки генератора владельцем — принята: PR #35 влит в main (9e04eae). Приёмка в две вычитки: правки владельца (приток посетителей, фейкеры без гвоздя) и холодное ревью на Fable — «блокеров нет», находки внесены. Спека — docs/specs/2026-08-01-generator.md; развилки карты пройдены, остался последний шаг — нарезка (#34).

  • Нарезать тикеты этапа 2 по принятой спеке — этап 2 нарезан на тикеты #36–#43 с цепочкой блокировок (семь при нарезке; восьмой, #43, добавлен холодным ревью нарезки — см. хвост в #34), чек-лист в #4, мандат #14 закрыт; вопросы раздела 9 спеки разложены по тикетам: приток и D0 — #38, CLI и контейнер — #41, мини-манифест зернового мира — #42.

Ещё не специфицировано

Пусто: туман рассеян. Вопросы уровня тикетов из раздела 9 спеки генератора разложены по тикетам этапа 2 (#38, #41, #42) — каждый фиксирует решение в спеке тем же PR.

Вне маршрута

  • Код генератора — тикеты этапа 2, после приёмки спеки.
  • Модель данных события (47 колонок), таксономия, анонимность и заказы — решены мастер-спекой и не переоткрываются (границы #14).
  • Генератор слепков заказов — этап 3 (#5): спека генератора лишь не должна ему мешать.
  • Пересборка эталонного мира и манифест — этап 7 (#9), у него своя спека.

Тикеты

Блокировки — нативные зависимости Gitea, они же рисуют фронтир. Стартовый фронтир: #27 (модель мира) и #31 (research).

  • #27 Модель мира: что живёт между прогонами и как устроены модельные сутки
  • #28 Детерминизм от зерна: что воспроизводимо и как зерно переживает параллельность
  • #29 Архитектура: источник истины схемы и разделение потока и пакета
  • #30 Производительность: числовые требования и чем их замерять
  • #31 Скорость батчевой генерации в Python: подходы и порядки величин
  • #32 Собрать спеку генератора из решений развилок
  • #33 Приёмка спеки генератора владельцем
  • #34 Нарезать тикеты этапа 2 по принятой спеке
Карта проектирования генератора v2. Мандат — тикет #14 (родитель — этап 2, #4): там цель, критерии приёмки и границы; карта прокладывает маршрут к ним. ## Пункт назначения Спека генератора принята владельцем, лежит файлом в docs/specs/ в main, а этап 2 нарезан на тикеты чек-листом в корневом issue #4. Карта несёт и исполнение маршрута: сборку спеки, приёмку и нарезку тикетов, а не только решения по развилкам. ## Заметки - Источник истины — мастер-спека docs/specs/2026-07-30-stand-v2-realism.md; сначала читать разделы 1 (особенно 1.4 «схема как контракт»), 5, 9, 10 и 11. - Развилки вести через /brainstorm-with-docs с /grilling и /domain-modeling: сначала веер вариантов, потом конвергенция; отклонённые варианты записывать с доводами, чтобы не возвращаться. - Если решение развилки расходится с мастер-спекой — расхождение вносится в неё тем же коммитом, что и спека генератора. - Спорные API перед фиксацией в спеке сверять через MCP Context7 (правило AGENTS.md). ## Решения по пути - [Модель мира: что живёт между прогонами и как устроены модельные сутки](https://git.dementev.space/ddmitry/clickstream-data-platform/issues/27) — мир функциональный: состав — чистая функция зерна, день — функция (зерно, D); своя ось времени с фиксированным D0, между прогонами живут только зерно и позиция; два режима — пошаговый для лаб и живой день с ускорением; граница суток — единственный шов. - [Детерминизм от зерна: что воспроизводимо и как зерно переживает параллельность](https://git.dementev.space/ddmitry/clickstream-data-platform/issues/28) — содержимое до байта (при uv.lock и каноническом контейнере), транспорт вне обещания; иерархия подпотоков «зерно → день → компонент»; целочисленная случайность, деньги в копейках; канонический seed и паспорт мира в манифесте; расхождение платформ = баг. - [Скорость батчевой генерации в Python: подходы и порядки величин](https://git.dementev.space/ddmitry/clickstream-data-platform/issues/31) — orjson в 5–14 раз быстрее stdlib; посточная генерация с orjson ~2–5×10⁵ событий/с на ядро; живой поток ×60 ниже планки на 3–4 порядка; заметка — docs/research/2026-08-01-python-batch-generation-speed.md на ветке research/python-batch-generation-speed. - [Архитектура: источник истины схемы и разделение потока и пакета](https://git.dementev.space/ddmitry/clickstream-data-platform/issues/29) — контракт схемы — python-модуль с чистыми данными, собственность генератора (data contract): из него — генератор, валидация и документация формата; склад пишется по документации руками, границу сторожат строгий приём и contract-тест в smoke; день-функция → один канонический сериализатор → приёмники (файл только для git-снимка, Kafka пачкой, Kafka ×60), промежуточные файлы не хранятся, обрыв — переигровка через дедуп; эталонный снимок при старте — через Kafka пакетным режимом (оговорка на объём — #30). - [Производительность: числовые требования и чем их замерять](https://git.dementev.space/ddmitry/clickstream-data-platform/issues/30) — ~50 тыс. событий в средний модельный день; снимок 14 дней (две недели, D0 — понедельник); в git — только манифест, снимок генерируется при make up; живой день ×60 по умолчанию, флаг проигрывателя; бюджеты — ориентиры в спеке, автоматический порог один (день ≤ 30 с, pytest perf в CI), остальное — печать таймингов; прототип-замер не нужен, туман рассеян. - [Собрать спеку генератора из решений развилок](https://git.dementev.space/ddmitry/clickstream-data-platform/issues/32) — спека docs/specs/2026-08-01-generator.md собрана из решений четырёх развилок, PR #35; мастер-спека (1.4, 8, 11) и CONTEXT.md согласованы тем же коммитом; SeedSequence.spawn сверен через Context7. Дальше — приёмка владельцем: слияние PR #35 и есть она. - [Приёмка спеки генератора владельцем](https://git.dementev.space/ddmitry/clickstream-data-platform/issues/33) — принята: PR #35 влит в main (9e04eae). Приёмка в две вычитки: правки владельца (приток посетителей, фейкеры без гвоздя) и холодное ревью на Fable — «блокеров нет», находки внесены. Спека — docs/specs/2026-08-01-generator.md; развилки карты пройдены, остался последний шаг — нарезка (#34). - [Нарезать тикеты этапа 2 по принятой спеке](https://git.dementev.space/ddmitry/clickstream-data-platform/issues/34) — этап 2 нарезан на тикеты #36–#43 с цепочкой блокировок (семь при нарезке; восьмой, #43, добавлен холодным ревью нарезки — см. хвост в #34), чек-лист в #4, мандат #14 закрыт; вопросы раздела 9 спеки разложены по тикетам: приток и D0 — #38, CLI и контейнер — #41, мини-манифест зернового мира — #42. ## Ещё не специфицировано Пусто: туман рассеян. Вопросы уровня тикетов из раздела 9 спеки генератора разложены по тикетам этапа 2 (#38, #41, #42) — каждый фиксирует решение в спеке тем же PR. ## Вне маршрута - Код генератора — тикеты этапа 2, после приёмки спеки. - Модель данных события (47 колонок), таксономия, анонимность и заказы — решены мастер-спекой и не переоткрываются (границы #14). - Генератор слепков заказов — этап 3 (#5): спека генератора лишь не должна ему мешать. - Пересборка эталонного мира и манифест — этап 7 (#9), у него своя спека. ## Тикеты Блокировки — нативные зависимости Gitea, они же рисуют фронтир. Стартовый фронтир: #27 (модель мира) и #31 (research). - [x] #27 Модель мира: что живёт между прогонами и как устроены модельные сутки - [x] #28 Детерминизм от зерна: что воспроизводимо и как зерно переживает параллельность - [x] #29 Архитектура: источник истины схемы и разделение потока и пакета - [x] #30 Производительность: числовые требования и чем их замерять - [x] #31 Скорость батчевой генерации в Python: подходы и порядки величин - [x] #32 Собрать спеку генератора из решений развилок - [x] #33 Приёмка спеки генератора владельцем - [x] #34 Нарезать тикеты этапа 2 по принятой спеке
ddmitry added the wayfinder:map label 2026-08-01 15:46:02 +03:00
Author
Owner

Пункт назначения достигнут: спека генератора принята и лежит в main (docs/specs/2026-08-01-generator.md), этап 2 нарезан на тикеты #36–#42 чек-листом в #4, мандат #14 закрыт. Все восемь тикетов карты закрыты, туман рассеян — карта завершена.

Пункт назначения достигнут: спека генератора принята и лежит в main (docs/specs/2026-08-01-generator.md), этап 2 нарезан на тикеты #36–#42 чек-листом в #4, мандат #14 закрыт. Все восемь тикетов карты закрыты, туман рассеян — карта завершена.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ddmitry/clickstream-data-platform#26