diff --git a/platform/docs/PLATFORM_DIRECTION.md b/platform/docs/PLATFORM_DIRECTION.md index f1142c2b..77057da1 100644 --- a/platform/docs/PLATFORM_DIRECTION.md +++ b/platform/docs/PLATFORM_DIRECTION.md @@ -74,14 +74,28 @@ hosted IdP (связка PII + доступность, а свою сессию `balance == SUM(ledger)`). Правки строк не существует: ошибка чинится новой записью. Только целые микро-доллары; на шве расчёта округляем ВВЕРХ (леджер движка — нижняя граница). -**Резервация — РЕШЕНО (вариант B, оркестратор 05.08; вопрос владельцу снят как переусложнённый):** -в той же транзакции, что допускает задачу в очередь, ДО спавна `tmctl` ставим холд и передаём движку -пер-книжный потолок ≤ остатка баланса. Дальше жёсткий стоп исполняет САМ движок, у которого этот -механизм уже есть, — поэтому перерасход физически невозможен, даже если платформа во время прогона -не знает ни цифры. Единственное видимое следствие: индикатор остатка обновляется на границах -попытки, а не непрерывно. Денежное событие в потоке движка (вариант A) не строим — оно трогает -движок ради обновления индикатора; вернуться, только если замер покажет, что грубость холда душит -фри-тир. +**Защита и свежесть — ДВА РАЗНЫХ механизма, строим ОБА (решение владельца 05.08 «сделаем нормально»; +моё прочтение его слов — записано так, чтобы дешёво поправить, если прочитал не то):** + +1. **Защита — холд + потолок движку (было «вариант B»).** В той же транзакции, что допускает задачу + в очередь, ДО спавна `tmctl` ставим холд и передаём движку пер-книжный потолок ≤ остатка баланса. + Жёсткий стоп исполняет САМ движок, у которого механизм уже есть ⇒ перерасход физически невозможен, + даже если платформа во время прогона слепа. Это рубеж корректности, и он НЕ зависит от доставки + событий (поток at-least-once и на краше теряет хвост). +2. **Свежесть — версионированное денежное событие в словаре потока (было «вариант A»).** Движок + эмитит НАКОПИТЕЛЬНЫЙ счётчик потраченного на границах стадии/волны; платформа материализует его + существующим идемпотентным апсертом `(engine_run_id, seq)`. Накопительная семантика делает + повтор и дубль безвредными (берём максимум по прогону). Индикатор остатка перестаёт отставать + на целую попытку. + +⚠ **Что это меняет в каноне и чего НЕ меняет.** Отменяется частная доктрина «поток событий цифр не +несёт» (записана в комменте `00003_usage.sql` и в дизайн-ответе П-5). **D39.84 НЕ затронут**: он +запрещает суммы на ПОЛЬЗОВАТЕЛЬСКОМ проводе, экране и в INFO-логах — здесь же внутренний канал +движок→платформа в приватную таблицу; наружу по-прежнему уходит только процент остатка. +⚠ **Запрет, который обязан ехать вместе с механизмом:** ЭНФОРСМЕНТ на событии строить нельзя — +иначе корректность квоты повиснет на доставке потока. Событие только показывает; останавливает +потолок. **Носитель работы движка — строка 103 единого бэклога** (словарь событий); заводится +оркестратором отдельной строкой, платформа её не пишет. ## 3. Стандарты и стек: что взять, что не брать