docs(generator): заморожена спека этапа 2, решения — в ADR 0015-0017
- Зачем:
- спека разрослась до 1058 строк, а журнал решений в разделе 9 читался
только целиком; агентам и людям нужен дешевый адресный заход к
основаниям решений генератора.
- Что:
- заведены ADR 0015 (пояс счетчика), 0016 (паспорт куки) и 0017 (номер
заказа); четыре адресные ссылки на «раздел 9» перешиты на них.
- раздел 9 пересобран в 11 тематических подразделов с датами и тикетами
у каждого решения и закрыт пометкой о заморозке; устаревшие
промежуточные замеры свернуты до указателей на актуальные.
- строка статуса в шапке отмечает закрытие спеки как документа этапа 2.
- Проверка:
- wc -l docs/specs/2026-08-01-generator.md (951, было 1058);
rg -n 'раздел[а-яё]* 9|разделы 8 и 9' docs -g '*.md' — 18 попаданий,
все классифицированы; разделы 1-8 нетронуты (сверка хешем).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
74061aa499
commit
6f18e9989c
9 files changed
+522
-526
No files matched your search
@@ -0,0 +1,36 @@
|
||||
# ADR 0015. Модельный день считается в часовом поясе счетчика
|
||||
|
||||
Дата: 28 августа 2026 года. Статус: принято. Реализация — тикет #39.
|
||||
|
||||
## Решение
|
||||
|
||||
Модельные сутки считаются в часовом поясе счетчика UTC+4. `EventDate` обозначает
|
||||
дату в этом поясе, а `UTCEventTime` — абсолютную метку времени. Граница
|
||||
модельного дня приходится на полночь счетчика.
|
||||
|
||||
Суточная волна посетителя привязана к его местному времени. У гостя из другого
|
||||
пояса она сдвигается на разницу с поясом счетчика, но общая граница дня остается
|
||||
прежней.
|
||||
|
||||
## Почему
|
||||
|
||||
Так устроена выгрузка Метрики: дата события уже посчитана в поясе счетчика.
|
||||
Полночь в этом поясе не разрезает утренние сессии в регионе мира. Регион можно
|
||||
выбирать независимо от технического пояса счетчика.
|
||||
|
||||
Для всего потока дня нужна одна граница суток. Местное время гостя описывает
|
||||
поведение в пределах этих суток, а отдельная дата для каждого посетителя не
|
||||
нужна.
|
||||
|
||||
## Отклонено
|
||||
|
||||
В разделе 9 отклоненные варианты не зафиксированы.
|
||||
|
||||
## Следствия
|
||||
|
||||
У ночных событий `toDate(UTCEventTime) != EventDate`. Хранилище берет день из
|
||||
готового `EventDate`, а не выводит его из абсолютной метки. Поворот суточной
|
||||
волны слегка размывает общий пик активности гостей из разных поясов.
|
||||
|
||||
Решение принято при исполнении тикета #39 и зафиксировано в спеке этапа 2,
|
||||
раздел 9.
|
||||
@@ -0,0 +1,28 @@
|
||||
# ADR 0016. Паспорт куки хранится в плане состава на всю ее жизнь
|
||||
|
||||
Дата: 28 августа 2026 года. Статус: принято. Реализация — тикет #39.
|
||||
|
||||
## Решение
|
||||
|
||||
Браузер, операционная система, устройство, экран и город принадлежат куке на всю
|
||||
ее жизнь. План состава выбирает и хранит паспорт, а день только переносит его в
|
||||
поля событий.
|
||||
|
||||
Две куки одного человека получают один город и разные устройства. Броски
|
||||
паспорта идут после прежних бросков состава, поэтому прежние измерения не
|
||||
сдвинулись.
|
||||
|
||||
## Почему
|
||||
|
||||
Кука представляет браузер на устройстве, поэтому ее паспорт не должен меняться
|
||||
между днями. Только план состава связывает две куки с одним человеком. Поэтому
|
||||
он может задать им один город и разные устройства.
|
||||
|
||||
## Отклонено
|
||||
|
||||
- Выводить паспорт арифметикой из `ClientID`: этот идентификатор не несет
|
||||
сведений о двухкуковой паре, поэтому по нему нельзя задать двум кукам одного
|
||||
человека один город и разные устройства.
|
||||
|
||||
Решение принято при исполнении тикета #39 и зафиксировано в спеке этапа 2,
|
||||
раздел 9.
|
||||
@@ -0,0 +1,34 @@
|
||||
# ADR 0017. Номер заказа объединяет две проекции покупки
|
||||
|
||||
Дата: 28 августа 2026 года. Статус: принято. Реализация — тикет #40.
|
||||
|
||||
## Решение
|
||||
|
||||
Номер заказа включает день по модельному времени и порядковый номер покупки в
|
||||
этот день, например `20260603-0042`. Событийная сторона пишет его в
|
||||
`purchaseID`, бэкенд — в `order_id`; обе стороны берут один номер из плана
|
||||
покупки.
|
||||
|
||||
Все покупки, попавшие в поток дня, нумеруются в порядке событий и до любых
|
||||
потерь следующих этапов.
|
||||
|
||||
## Почему
|
||||
|
||||
По читаемому номеру сразу виден день заказа. Один номер соединяет две проекции
|
||||
одной покупки. Генераторы кликстрима и бэкенда не согласуют его отдельно.
|
||||
|
||||
Присвоение до потерь сохраняет номера остальных заказов: исчезновение одного
|
||||
события не должно перенумеровывать чужие покупки и разрывать связь с бэкендом.
|
||||
|
||||
## Отклонено
|
||||
|
||||
- Присваивать номера после внесения потерь: одна потеря сдвинула бы все
|
||||
следующие номера за день и разорвала бы связь уже созданных проекций.
|
||||
|
||||
## Следствия
|
||||
|
||||
`purchaseID` и `order_id` изначально совпадают. Из-за расхождения событие может
|
||||
исчезнуть после присвоения номера, но номера сохранившихся заказов не меняются.
|
||||
|
||||
Решение принято при исполнении тикета #40 и зафиксировано в спеке этапа 2,
|
||||
раздел 9.
|
||||
Reference in new issue
Block a user