Compare commits

...
2 Commits
Author SHA1 Message Date
ddadminandClaude Opus 5 34267e8494 docs(spec): рамка — чем меряется генератор
Зачем: взгляд владельца на генератор жил только в разговорах, и каждый
следующий агент восстанавливал его заново или не восстанавливал вовсе.
Без него решения по генератору принимаются не по тому критерию: внутренняя
стройность вместо правдоподобия данных на выходе.

Что: новый раздел «Чем меряется генератор» сразу после «Зачем» — пять
утверждений рамки. Генератор меряется выходом, а не устройством; менти
внутрь не смотрит, поэтому конструкция оправдана только наблюдаемым
эффектом; повторимы эффекты, а не числа, и хеши описи обещают видимость
сдвига, а не постоянство чисел; цена ошибки мала, поэтому оборона дороже
ошибки не заводится; сложность изолирована службой ради дешевизны правки.

Рамка шире этапа 2, поэтому спеки следующих этапов ссылаются на неё, а не
копируют.

Проверка: правка только текстовая, кода не касается.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-16 12:09:11 +03:00
ddadmin c656ca198f docs(domain): уточнены роли человека и посетителя
- Зачем:
  - генератору нужен единый язык для скрытой личности и наблюдаемых идентификаторов.
- Что:
  - определены человек, посетитель и пользователь магазина.
  - закреплена граница между ClientID кликстрима и user_id заказа.
- Проверка:
  - документ перечитан целиком.
2026-08-16 11:56:57 +03:00
2 changed files with 40 additions and 0 deletions
+14
View File
@@ -34,6 +34,20 @@ _Избегать_: состояние мира
Люди, впервые пришедшие в мир в один день, со всеми их куками и днями Люди, впервые пришедшие в мир в один день, со всеми их куками и днями
активности. Единица плана состава: когорта — функция зерна и номера дня. активности. Единица плана состава: когорта — функция зерна и номера дня.
**Человек**:
Устойчивая личность в составе мира, которой принадлежат одна или две куки.
Не поле источника: кликстрим видит куку, а заказ — пользователя магазина.
**Посетитель**:
Кука, наблюдаемая в кликстриме и обозначенная `ClientID`; единица
`uniq(ClientID)`. Один человек может быть представлен несколькими посетителями.
_Избегать_: «посетитель» про человека после склейки
**Пользователь магазина**:
Представление человека со стороны заказов; в записи заказа обозначается
`user_id`. Через заказы связывает разные куки человека, в кликстрим напрямую
не попадает.
**Приток**: **Приток**:
Появление новых кук на всём протяжении оси модельного времени; единица — Появление новых кук на всём протяжении оси модельного времени; единица —
кука (`ClientID`). Из-за притока накопленная аудитория растёт с кука (`ClientID`). Из-за притока накопленная аудитория растёт с
+26
View File
@@ -25,6 +25,32 @@
касается этапа 7 — расширение подтверждено владельцем в резолюции касается этапа 7 — расширение подтверждено владельцем в резолюции
«Производительности». «Производительности».
## Чем меряется генератор
Рамка владельца, по которой принимались решения ниже. Она шире этапа 2 и
живёт дальше него: спеки следующих этапов ссылаются сюда, а не переписывают.
- **Генератор меряется тем, что приезжает на выход, а не устройством
внутри.** Он играет два источника с разными темпами: поток Метрики и
ночную выгрузку бэкенда магазина. Любое внутреннее решение отвечает перед
одним вопросом — правдоподобны ли данные на выходе.
- **Менти внутрь не смотрит.** Он видит внешние эффекты и по ним составляет
представление, как работает магазин и обо что там спотыкаются. Значит,
конструкция внутри оправдана только наблюдаемым эффектом: без него это
сложность, за которую никто не заплатил.
- **Повторимы должны быть эффекты, а не конкретные числа.** Правка свойств
мира сдвигает почти все числа разом — генератор случайных чисел выдаёт
другую последовательность. Опираться на конкретные числа поэтому нечем.
Хеши описи обещают не постоянство чисел, а то, что их сдвиг не пройдёт
молча: пересобрал опись — увидел diff.
- **Цена ошибки здесь мала.** В худшем случае испорчен урок, и чинится он
правкой генератора после взгляда на получившиеся распределения. Оборона,
которая дороже ошибки, не заводится.
- **Сложность изолирована нарочно.** Генератор вынесен отдельной службой,
чтобы его сложность не расползалась по стенду. Плата за изоляцию —
дешевизна правки: выбирается устройство, которое дёшево менять, а не то,
которое всё предусмотрело.
## Целевая картина одним взглядом ## Целевая картина одним взглядом
- **Мир — функция, не состояние.** Состав мира — чистая функция зерна; - **Мир — функция, не состояние.** Состав мира — чистая функция зерна;