0034. Мониторинг и бронирование слотов поставок FBW
Копия ADR из репозитория:
backend/docs/adr/0034-supply-slot-booking.md. Канонический текст — в репозитории; портал обновляется командойnpm run sync:adr.
- Статус: accepted (2026-07-07 — мониторинг публичным API с общим бюджетом опроса per-аккаунт; бронь FBO-слота — assisted-manual по ADR-0026, полное авто — пост-MVP за фиче-флагом)
- Дата: 2026-07-07
- Связанные задачи: OP-115 (Spike · 5.8 · Бронировщик поставок); потребители — OP-114 (модель задания), OP-116 (монитор), OP-117 (движок), OP-118 (статусы/история), OP-119 (уведомления)
- Связанные ADR: ADR-0026 (стратегия доступа к ЛК — FBO-бронь UI-only), ADR-0006 (rate-limit/retry WB), ADR-0007 (BullMQ), ADR-0009 (планировщик)
Контекст и проблема
ТЗ 5.8 помечает «Метод бронирования — уточняется» и хочет опрос слотов «1 раз в 1–5 сек». Спайк должен авторитетно ответить: чем мониторить доступность слотов, есть ли API для самого бронирования, и с какой частотой это реально.
Проверка по контракту (локальный OpenAPI-снимок WB)
FBW-контракт 07-orders-fbw.yaml — только чтение, эндпоинта создания/планирования/бронирования
слота нет:
| Метод | Назначение |
|---|---|
POST /api/v1/acceptance/options | опции приёмки (типы тары по складу) — чтение |
GET /api/v1/warehouses | список складов |
GET /api/v1/transit-tariffs | транзитные направления |
POST /api/v1/supplies | список поставок (чтение) |
GET /api/v1/supplies/{ID} · /goods · /package | детали/товары/упаковка поставки |
POST /api/v3/supplies (marketplace) — это FBS-поставка собранных заказов, не FBO-слот
(подтверждает вывод ADR-0026).
Мониторинг слотов — публичный: GET /api/tariffs/v1/acceptance/coefficients возвращает
коэффициенты приёмки по складам на ближайшие 14 дней одним вызовом (параметр warehouseIDs,
по умолчанию — все склады). Приёмка доступна при coefficient ∈ {0, 1} и allowUnload = true.
Лимит запросов: 6/мин, интервал 10 сек (на аккаунт продавца).
Вердикт
- Мониторинг доступности слотов — публичный API, ЛК не нужен. Один вызов покрывает все склады × 14 дней.
- Само бронирование слота публичным API не выведено → UI-only (подтверждено контрактом; согласуется с ADR-0026).
- Частота ТЗ «1–5 сек» невыполнима: минимальный интервал
coefficients— 10 сек, бюджет 6/мин на аккаунт. Но поскольку один вызов возвращает всю картину, частый per-задание опрос и не нужен.
Решение
- Монитор (OP-116) — один воркер per WB-аккаунт, а не per-задание. Интервал ~10–15 сек
(в рамках 6/мин, ADR-0006), один вызов
coefficients(все склады × 14 дней) → фанаут результата по всем активным заданиям аккаунта. «Слот доступен» =coefficient ∈ {0,1}иallowUnload=true, совпадение по складу и дате ±допуск задания. - Бронь (OP-117) — в MVP assisted-manual (вариант E из ADR-0026): при появлении подходящего слота → уведомление (OP-119) с диплинком в экран планирования поставки ЛК; само нажатие делает продавец. Сессии ЛК не храним.
- Полностью автоматическая «гонка за слотом» (headless/RPA) — пост-MVP за фиче-флагом, вне критического пути, только с явным согласием и аудитом (граница из ADR-0026).
- Уведомления (OP-119) — центральный элемент MVP (детект → нотификация + диплинк), а не второстепенная фича.
- Триггер пересмотра: перепроверять живой FBW/Supplies API — как только WB откроет бронирование официально, OP-117 переезжает на API-бронь, а флаговый RPA-модуль становится не нужен.
Последствия
- Положительные: мониторинг дёшев и легален (1 вызов/10–15 сек, публичный API); MVP не хранит сессии ЛК и не нарушает оферту WB (ADR-0026); уведомление + диплинк даёт основную продуктовую ценность (продавец мгновенно узнаёт о слоте и бронирует сам).
- Границы (осознанно): полностью автоматическая бронь в MVP не поставляется — это меняет риск-профиль и требует отдельного решения/бюджета (ADR-0026); частота ограничена 10 сек (не 1–5 сек из ТЗ) — задокументированное расхождение с ТЗ.
- Влияние на задачи: OP-116 переописан (per-account монитор ~10–15 сек, не 1–5 сек);
OP-117 переописан (MVP = assisted-manual, полное авто за флагом пост-MVP). Обе разблокированы и
помечены
ai-agent-ready.