Реализация 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, а не из логов.