feat(generator): добавлено опоздание заказов в слепках

- Зачем:
  - менти должен увидеть, как запоздавшая выгрузка меняет открытое окно, не подделывая аудит источника.
- Что:
  - заказам назначена задержка D, D+1 или D+2 последним броском подпотока ORDERS.
  - назначенный планом заказ приезжает сразу, а Woven передаёт эту гарантию именованным полем.
  - обновлены документы, проверки границ механики и эталонные хеши слепков.
- Проверка:
  - make lint, make typecheck и make test в generator: 436 тестов прошли.
  - make config-test: конфигурация прошла проверку.
  - world_live_day и следующий etl_pipeline перевели заказ 20260608-0001 из awaiting_order в match.
This commit is contained in:
ddadmin committed 2026-08-28 17:30:55 -04:00
1 parent 58e944aa87
commit 8db1c58c12
11 files changed
+186 -54

No files matched your search

+16 -14
View File
@@ -125,20 +125,22 @@
**Опоздание — заказ прячется от ранних слепков.** `created_at` не
подделывается — строка создана, когда заказ родился, — но в слепках дней
d…d+δ−1 её нет, а с d+δ она появляется в том состоянии, до которого заказ
дожил: отменённый на второй день и опоздавший на третий приедет в первом же
своём слепке как `cancelled` — «выгрузка догоняет жизнь». Задержка — таблица
весов из трёх строк: 0 на подавляющем весе, 1 и 2 — это и есть «D+1/D+2»
мастер-спеки. Меряется она в днях снятия слепка, а не отправки: иначе сдвиг
отправки удвоился бы, и обещанные D+1/D+2 стали бы D+2/D+3. Дальше таблица не
идёт: заказ с δ = 6 приехал бы ровно в одном слепке, и обещание «пропущенный
день ничего не ломает» на нём перестало бы быть верным; при δ ≤ 2 у всякого
заказа слепков не меньше пяти. Легенда: заказ ушёл в ручную обработку и попал
в выгрузку позже. Отклонено: *сдвиг `created_at`* — подделка аудита источника:
день создания строки разошёлся бы с днём покупки, чьё равенство держит
синхронная модель ([откуда берётся заказ](snapshot.md)), заказ уехал бы в
чужую партицию, и «выручка дня D» перестала бы отвечать покупкам дня D —
сломалась бы та самая сверка, ради которой всё строится.
а с d+δ она появляется в том состоянии, до которого заказ дожил: отменённый
на второй день и опоздавший на третий приедет в первом же своём слепке как
`cancelled` — «выгрузка догоняет жизнь». Таблица задержки состоит из трех
строк: δ = 0/1/2 с весами 90/5/5. 1 и 2 - это D+1 и D+2 мастер-спеки. Бросок
идет последним в подпотоке `ORDERS`, затем назначенному планом заказу δ
обнуляется. Меряется задержка в днях снятия слепка, а не отправки: иначе
сдвиг отправки удвоился бы, и обещанные D+1/D+2 стали бы D+2/D+3. Дальше
таблица не идет: заказ с δ = 6 приехал бы ровно в одном слепке, и
обещание «пропущенный день ничего не ломает» на нем перестало бы быть
верным; при δ ≤ 2 у всякого заказа слепков не меньше пяти.
Легенда: заказ ушёл в ручную обработку и попал в выгрузку позже. Отклонено:
*сдвиг `created_at`* — подделка аудита источника: день создания строки
разошёлся бы с днём покупки, чьё равенство держит синхронная модель
([откуда берётся заказ](snapshot.md)), заказ уехал бы в чужую партицию,
и «выручка дня D» перестала бы отвечать покупкам дня D — сломалась бы та
самая сверка, ради которой всё строится.
**Пересечения.** Броски независимы, пересечения выходят арифметикой, приоритет
мастер-спеки работает по-настоящему. Исключений два, и оба названы выше: дубль
+8 -6
View File
@@ -60,12 +60,14 @@
топик льёт даг* — второй путь доставки и второй сериализатор; *слепок едет
топиком `hits`* — убивает два режима приёма.
**Сборка окна.** Слепок дня D несёт заказы, рождённые в дни D−6…D, и
собирается переигровкой этих семи дней: заказы дня — производная всей воронки
дня, дешёвого пути к ним нет. Цена — семь проигрышей дня (~14 с) на слепок; у
начала оси окно усекается само. Отклонено: *кэш заказов на томе* — состояние
между прогонами; *окно держит хранилище* — топик перестаёт нести слепок;
*K = 1* — это страховочный срез 1 мастер-спеки, он в резерве.
**Сборка окна.** Слепок дня D берет заказы, рожденные в дни D−6…D, а несет из
них те, что уже попали в выгрузку: механика опоздания живет в
[судьбе заказа](fate.md). Окно собирается переигровкой этих семи дней: заказы
дня — производная всей воронки дня, дешёвого пути к ним нет. Цена — семь
проигрышей дня (~14 с) на слепок; у начала оси окно усекается само. Отклонено:
*кэш заказов на томе* — состояние между прогонами; *окно держит хранилище* —
топик перестаёт нести слепок; *K = 1* — это страховочный срез 1 мастер-спеки,
он в резерве.
**Отправка.** Слепок **снимается на границе суток, а отправляется следующим
прогоном**: даг, играющий день D, отправляет слепок дня D−1 — ночная выгрузка