Реализация ADR-0006, ADR-0010, ADR-0013. Раздел ТЗ 37.

Репозиторий: https://github.com/ochenstarik-ui/kagent
Зависит от задачи 0.9.0 (зелёный trunk).

## Зачем

Лимит max_model_cost на задачу не ограничивает суммарные расходы: сорок
параллельных задач укладываются каждая в свой лимит и вместе выносят месячный
бюджет. Счётчик, увеличиваемый после вызова, некорректен при параллелизме —
воркеры читают устаревшую сумму и все проходят проверку.

Идемпотентность заявлена как требование в трёх разделах ТЗ, но без механизма:
при истечении lease повтор создаст второй pull request и второй деплой, и агент
об этом не узнает.

## Что сделать

### Бюджетный ledger (ADR-0006, ТЗ 37.1-37.2)

- двухфазный учёт в PostgreSQL: атомарный резерв оценки перед шагом, списание
  факта после вызова, возврат остатка;
- резерв связан с lease шага, осиротевший резерв освобождается supervisor;
- иерархия бюджетов: организация -> проект -> задача -> шаг, резерв обязан
  пройти на всех уровнях;
- append-only, атрибуция запуску, шагу и конфигурации модели;
- автостоп по burn rate: превышение порога переводит платформу в режим
  ограниченного приёма, текущие задачи доводятся до checkpoint и паркуются,
  порождается инцидент, снятие — явным действием оператора;
- глобальная пауза как отдельный переключатель, независимый от аварийной
  остановки задачи и от security read-only.

### Ledger внешних эффектов (ADR-0010, ТЗ 37.4)

- ключ идемпотентности из run_id, step_id, типа эффекта и канонического
  дайджеста payload, вычисляется до попытки выполнения;
- состояния intended / in_flight / succeeded / failed / unknown, внешний
  идентификатор от целевой системы;
- при повторе succeeded возвращает сохранённый результат без повторного
  выполнения; unknown блокирует шаг и порождает инцидент сверки;
- outbox: эффекты, порождённые изменением состояния, публикуются в одной
  транзакции с ним;
- connector с операциями записи обязан принимать ключ идемпотентности или
  предоставлять естественный ключ для сверки, иначе допускается только к
  чтению;
- процедура сверки для каждого write-connector.

### Кэш модельных вызовов (ADR-0013, ТЗ 37.3)

- prefix-stable сборка контекста: неизменяемые элементы первыми;
- кэш точных ответов по ключу (model_id, model_version,
  prompt_registry_version, request_digest, sampling);
- схлопывание одновременных идентичных запросов;
- отключение там, где разнообразие является целью: consensus, shadow mode;
- изоляция по проектам и privacy zones;
- попадание в кэш видно в Run Timeline, запуск не выглядит дешевле, чем есть.

## Критерий приёмки

- нагрузочный тест: N параллельных задач не пробивают общий бюджет ни разу;
- тест: убитый воркер и повтор шага не создают второй pull request;
- тест: истёкший резерв освобождается и не блокирует бюджет навсегда;
- отчёт стоимости успешной задачи считается из ledger, а не из логов.
