Кратко

  • В редакции 05 запись о входе к провайдеру и перевод суммы из резерва в расход выполняются одной атомарной транзакцией до вызова внешнего адаптера.
  • После этой границы тайм-аут означает неопределённый результат, а не доказательство не-входа; освободить сумму можно лишь при подтверждённом отсутствии входа.
  • Отзыв и аварийная заморозка останавливают текущую операцию, только если упорядочены раньше входа. Более позднее управление не стирает возможный эффект.

Сообщение об ошибке не ведёт баланс

Подписанная capability-квитанция может ограничить субъект, область действий, сумму, единицу, срок и происхождение полномочия. Но подпись не синхронизирует две реплики и не пережигает остаток при повторной попытке. Для общего лимита нужен один атомарный домен состояния, который хранит резервы и расход после сбоев и перезапусков.

Так устроено предложение Bounded Capability Receipts and Durable Spend Control for Agent Actions. Остаток считается как общий лимит минус расход минус резерв. Вся сложность сосредоточена в моменте превращения резерва в расход.

Редакция 04 сначала отмечала начало входа к провайдеру, а сумму переводила при последующей фиксации результата. Редакция 05 объединяет эти события. Непосредственно перед внешним адаптером одна транзакция проверяет владельца резерва, крайний срок, текущее состояние полномочия и допуска, прямые и наследуемые отзывы. При аварийном профиле она также требует активного домена и совпадения эпохи с сохранённой при резервировании.

Эта же транзакция записывает provider_entered, уменьшает резерв и увеличивает расход. Только после неё вызывается адаптер. Поздняя фиксация больше не списывает сумму, а лишь закрывает результат как выполненный или неопределённый.

Баланс тем самым меняется в первую секунду, когда организация уже не может доказать, что внешний эффект исключён.

Неизвестно — не значит не вошло

Провайдер мог принять или поставить запрос в очередь до обрыва ответа. Поэтому неопределённая операция остаётся израсходованной. Клиент обязан сверить исходный идентификатор, а не создавать новый для повторения.

Возврат требует строгого состояния: авторитетное хранилище показывает, что операция всё ещё зарезервирована и вход к провайдеру отсутствует. Аутентифицированный владелец закрывает её как not_entered. Идентификатор и привязка действия остаются могильной записью против повтора. Возврат ёмкости не обновляет старый запрос.

Это намеренная асимметрия. Она может ухудшить доступность, зато не даёт одной сумме оплатить две поставки, передачи или удаления. Неопределённый расход не утверждает, что эффект точно был; он утверждает, что безопасное повторное использование не обосновано.

Аварийная остановка тоже участвует в гонке

Редакция 05 добавляет необязательный домен допуска со статусом активен/заморожен и возрастающей эпохой. Резерв сохраняет эпоху, вход проверяет её снова. Заморозка, записанная первой, запрещает вход и позволяет доказать его отсутствие. Вход, записанный первым, сохраняет расход; поздняя заморозка действует лишь на новые операции.

Отзыв подчиняется тому же порядку. Резерв не консервирует старое разрешение, поэтому отзыв проверяется на границе. Но отзыв после входа не доказывает, что провайдер ничего не сделал.

Статус документа ограничен. Datatracker показывает активный индивидуальный Internet-Draft от 6 сентября 2026 года, состояние I-D Exists, без одобрения IETF. В тексте указана экспериментальная цель, тогда как карточка сейчас не показывает предполагаемый статус RFC. Это не стандарт, сертификация или доказательство внедрения.

Канонизация JSON, Ed25519, формат времени и нормативные слова помогают воспроизводить подписанные данные. Они не подтверждают правильность выбранной адаптером границы. Подписанное заявление, текущее состояние, внешний вход и наблюдаемый эффект остаются разными слоями.

Источники