Спецификация Stipendex 0.1-draft: обзор
Нормативные слова MUST / SHOULD / MAY — по RFC 2119. Детали объектов — envelope.md, полномочия — mandate-wallet.md, транспорты — transports.md, рельсы — rails.md.
Роли
| Роль | Кто это | Держит деньги? |
|---|---|---|
| Принципал | человек/организация — источник средств и полномочий | да (свои) |
| Агент | LLM-петля; инициирует траты, но не распоряжается ими | нет |
| Кошелёк | детерминированный компонент при хосте агента; проверяет мандат, подписывает платежи | нет (только ключи) |
| Получатель | MCP-сервер / HTTP API / продавец, выставляющий Quote | да (свои) |
| Рельс | платёжная система, исполняющая расчёт (Stripe, x402, ledger) | транзитом, по своей лицензии |
| Фасилитатор | оператор счетов/верификации поверх рельса account; HITL-очередь, антифрод |
да, по своей лицензии |
| Реестр доверия | издатель подписанных дескрипторов проверенных получателей | нет |
Объекты
| Объект | Кто подписывает | Назначение |
|---|---|---|
| Mandate | принципал | полномочия кошелька: лимиты, allowlist, пороги, срок |
| Quote | получатель | одноразовая котировка: сумма или оценка+допуск, рельсы, TTL |
| Confirmation | кошелёк (опц. + passkey принципала) | зафиксированное согласие человека на итог+допуск |
| Proof | кошелёк | доказательство оплаты/холда по конкретному Quote |
| Receipt | получатель | «получено и исполнено»: финальная сумма, hash результата |
Все объекты — JSON c подписью JWS (Ed25519); суммы — десятичные строки
("0.0042"), никогда не float; идентификаторы — префиксованные
(m_, q_, c_, p_, r_), уникальные у издателя.
Базовый цикл
Агент Кошелёк Получатель Рельс/Фасилитатор
│ вызов ────────────────────────────────▶│
│ ◀──── payment_required + Quote ────────│
│──Quote──▶│ 1 allowlist (default deny) │
│ │ 2 лимиты мандата │
│ │ 3 порог HITL → Confirmation │
│ │ 4 оплата/холд по рельсу ────────────────────────────▶│
│ │◀──────────── Proof ──────────────────────────────────│
│ повтор вызова + Proof ─────────────────▶│──── верификация ─────▶│
│ ◀────── результат + Receipt ───────────│
Инварианты (нормативные):
- I1. Кошелёк — единственная точка платёжного решения. У агента (LLM) MUST NOT
существовать интерфейса с произвольным получателем или суммой; единственная
операция —
pay(quote). - I2. Quote одноразов и ограничен по времени; Proof идемпотентен (повтор не создаёт второго списания).
- I3. Списание (capture) MUST NOT превышать сумму Quote, а при
estimate— подтверждённую сумму ≤ estimate + tolerance. - I4. Получатель вне allowlist-источников мандата — deny; эскалация к человеку, не «мягкий пропуск».
- I5. Каждый платёж воспроизводим по цепочке
mandate → (confirmation) → quote → proof → receipt— это и есть аудит.
Профили
- Service (по умолчанию):
Quote.amountфиксирован; режим Proof —capture; агрегация через сессию-tab (envelope.md). - Checkout:
Quote.estimate + tolerance; Proof в режимеhold, capture — после подтверждения получателем финальной суммы; Confirmation обязателен (checkout-profile.md).
Уровни внедрения получателя
| Уровень | Что делает | Кода |
|---|---|---|
| L0 | объявляет цены в метаданных (pricing) — агенты учитывают стоимость при планировании |
0 строк платёжного |
| L1 | paywall через hosted-фасилитатора (рельс account) |
~10 строк |
| L2 | собственные рельсы (x402 напрямую, свой ledger, Stripe) | адаптер |
| L3 | расширения: подписки, metered-квоты, checkout-профиль | по потребности |
Версионирование
Каждый объект несёт поле stipendex: "<type>/<version>" (напр. "quote/0.1").
Мажорная версия ломает совместимость; кошелёк MUST отклонять объекты неизвестной
мажорной версии. Капабилити-переговоры транспорта — в transports.md.