feat(generator): откалиброваны доли заказной стороны

- Зачем:
  - семь мест обещали калибровку черновых долей «при пересборке
    эталонного мира (этап 7)», а пересборки не будет (#192); числа
    сверены замером и зафиксированы (#194, хвост этапа 7 — #9).
- Что:
  - замер на каноническом мире (28 дней, без транспорта): все доли в
    пределах ориентиров; пометки «черновое» сняты, наблюдаемые доли
    вписаны в комментарии world.py, fate.md и запись «Что проверено»;
  - потеря purchase: наблюдаемых 1,78% при броске 3% — вычеты штатные
    (пары склейки, приоритет отмены), принято решением владельца;
    ориентир класса B в мастер-спеке различает бросок и наблюдаемую долю;
  - веса мира и опись не тронуты: правки world.py — только комментарии.
- Проверка:
  - cd generator && make lint && make typecheck && make test (437 passed);
  - git diff по data/world-inventory.json пуст; grep «черновое|калибровка»
    по generator/src и docs/architecture/orders пуст.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
ddadminandClaude Fable 5 committed 2026-08-30 16:42:32 -04:00
1 parent 8b7987c5c2
commit 9b1826f5ff
5 files changed
+79 -23

No files matched your search

+17 -12
View File
@@ -170,8 +170,11 @@ BUYER_CHECKOUT_OF_CART_PERCENT = 60
TRADE_DELAY_SECONDS = (2, 8)
# Событийная сторона сверки: потерянные маячки purchase и повторная
# отправка пары «просмотр подтверждения + purchase». Числа черновые:
# точная калибровка будет при пересборке эталонного мира, этап 7.
# отправка пары «просмотр подтверждения + purchase». Замер (28 дней,
# канонический мир, 2026-08-30): дубль 1,89% — в пределах ориентира ~2%;
# потеря 1,78% при броске 3% — так и задумано: назначенные планом покупки
# из броска исключены (мост склейки), часть съедает приоритет отмены;
# наблюдаемая доля принята решением владельца (#194).
LOST_PURCHASE_PERCENT = 3
DUPLICATE_PURCHASE_PERCENT = 2
DUPLICATE_DELAY_SECONDS = (30, 301)
@@ -245,8 +248,8 @@ GOAL_PURCHASE_ID = 42150002
# обычная курьерская, срочная. Это единственные деньги заказа, которых нет
# ни в одном событии: выручка клиента — сумма позиций, скидку по промокоду
# считает бэкенд по таблице `COUPONS`, а доставку решает свой бросок
# заказной стороны. Числа черновые: калибровка — пересборка эталонного
# мира, этап 7.
# заказной стороны. Замер (28 дней, канонический мир, 2026-08-30): 35,5% /
# 49,2% / 15,4% — совпадает с весами.
DELIVERY_KOPECKS_WEIGHTS = (
(0, 35),
(29_900, 50),
@@ -255,12 +258,13 @@ DELIVERY_KOPECKS_WEIGHTS = (
# Чем кончается окно изменяемости заказа: веса трёх исходов, в порядке
# `orders.OrderOutcome`. «Создан» навсегда мир не допускает — из окна заказ
# выходит либо оплаченным, либо отменённым. Доли черновые: калибровка —
# пересборка эталонного мира, этап 7.
# выходит либо оплаченным, либо отменённым. Замер (28 дней, 2026-08-30):
# отменено 5,15% заказов — 3,03% оплачен-потом-отменен, 2,12% отменен
# неоплаченным; ориентир мастер-спеки ~5%.
ORDER_OUTCOME_WEIGHTS = (
95, # оплачен
3, # оплачен, потом отменён
2, # отменён неоплаченным
2, # отменен неоплаченным
)
# Когда внутри окна случается момент заказа — оплата или отмена: веса часов
@@ -268,8 +272,8 @@ ORDER_OUTCOME_WEIGHTS = (
# с каким весом»; часов в сумме ровно 144 — самый узкий край окна, у заказа,
# рождённого в конце суток (docs/architecture/orders/fate.md). Почти всё в
# первые сутки, дальше затухание до края:
# профиль гаснет, поэтому обрыв окна в данных не виден. Веса черновые, как и
# доли исходов.
# профиль гаснет, поэтому обрыв окна в данных не виден. Веса зафиксированы
# вместе с долями исходов — тем же замером выше.
ORDER_MOMENT_HOUR_WEIGHTS = tuple(
weight
for hours, weight in ((6, 100), (18, 60), (24, 25), (48, 8), (48, 2))
@@ -280,11 +284,12 @@ ORDER_MOMENT_HOUR_WEIGHTS = tuple(
# наличии, и заказ приезжает на строку короче клиентской корзины. Бросается
# доля на все заказы дня, а достаётся дельта не всем — однопозиционному заказу
# терять нечего, и таких больше половины, — поэтому в сверке наблюдаемая доля
# выходит вдвое-втрое ниже броска, около ориентира мастер-спеки в 1–2%. Число
# черновое: калибровка — пересборка эталонного мира, этап 7.
# выходит вдвое-втрое ниже броска, около ориентира мастер-спеки в 1–2%. Замер
# (28 дней, 2026-08-30): наблюдаемая доля 1,32% — в пределах ориентира.
ORDER_DELTA_PERCENT = 4
# На сколько первых дневных слепков заказ опоздает: веса δ = 0, 1, 2.
# Назначенные планом заказы после броска получают 0, чтобы мост склейки
# появился в стартовом мире. Числа черновые: калибровка — этап 7.
# появился в стартовом мире. Замер (28 дней, 2026-08-30): доля опоздавших
# (δ>0) 8,39% — в пределах ориентира мастер-спеки ~10%.
ORDER_SNAPSHOT_DELAY_WEIGHTS = (90, 5, 5)