Задания, отчёты и патчи, лежавшие в C:\Users\Ochenstarik\projects и в домашней папке, перенесены в agents/. Разложено по агентам там, где имя файла позволяло определить автора; остальное — в _salvage-2026-08-18/ и разбирается вручную. Патчи в notes/salvage-2026-08-18/ — незакоммиченная работа из брошенных рабочих копий: она существовала только на диске. Тяжёлое (релизные архивы, инсталляторы, наборы данных) в репозиторий не попало: оно лежит рядом, в Agent_projects/_archive и Agent_projects/_data. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
4.6 KiB
4.6 KiB
Реализация 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, а не из логов.