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

+29 -10
View File
@@ -186,14 +186,18 @@ class _Events:
basket: NDArray[np.int64]
# Что торговая половина отдает дню: поток, покупки и их событийные исходы.
Woven = tuple[
dict[str, NDArray[Any]],
NDArray[np.uint8],
NDArray[np.int64],
Purchases,
NDArray[np.int8],
]
@dataclass(frozen=True, slots=True)
class Woven:
"""Что торговая половина отдает дню после вплетения событий."""
columns: dict[str, NDArray[Any]]
page: NDArray[np.uint8]
product: NDArray[np.int64]
purchases: Purchases
event_outcome: NDArray[np.int8]
# Для каждой покупки: назначен ли её заказ планом.
assigned_order: NDArray[np.bool_]
# День без единой корзины: покупок в нём нет, а форма у рядов есть.
_NO_PURCHASES = Purchases(
@@ -206,6 +210,7 @@ _NO_PURCHASES = Purchases(
moment=np.empty(0, dtype="datetime64[s]"),
)
_NO_EVENT_OUTCOMES = np.empty(0, dtype=np.int8)
_NO_ASSIGNED_ORDERS = np.empty(0, dtype=np.bool_)
def weave(
@@ -230,7 +235,14 @@ def weave(
rng = day_stream(seed, day, Component.COMMERCE)
baskets = _baskets(rng, page, product, columns["VisitID"])
if not len(baskets):
return columns, page, product, _NO_PURCHASES, _NO_EVENT_OUTCOMES
return Woven(
columns=columns,
page=page,
product=product,
purchases=_NO_PURCHASES,
event_outcome=_NO_EVENT_OUTCOMES,
assigned_order=_NO_ASSIGNED_ORDERS,
)
goods = catalog.catalog()
draws = _draws(rng, baskets)
@@ -247,7 +259,14 @@ def weave(
columns, page, product, event_outcome = _corrupt_events(
seed, day, columns, page, product, purchases, assigned
)
return columns, page, product, purchases, event_outcome
return Woven(
columns=columns,
page=page,
product=product,
purchases=purchases,
event_outcome=event_outcome,
assigned_order=assigned,
)
def _draws(rng: np.random.Generator, baskets: _Baskets) -> _Draws: