# Решение: слияние Hermes Hub и KAgent **Дата:** 2026-09-02. **Статус:** направление принято владельцем; исполнение — по условиям ниже. **Ревьюер проверил исполнением** обе стороны, насколько имел доступ. --- ## Решение Вести один продукт — **KAgent** как единую AI-платформу. Функциональность Hermes Hub переносится в KAgent нативно, Hermes Hub после достижения parity архивируется. Полный план — [kagent-merge-plan.md](kagent-merge-plan.md). Организация работы на переходный период (решение владельца от 2026-09-02): - **KAgent** дорабатывается на одном сервере; - **Hermes Hub** доводится на втором сервере; - после доработки — слияние; - **KAgent готовится к слиянию сразу**, с первого дня: контракты и модель безопасности проектируются под будущий перенос, а не подгоняются потом. --- ## Что ревьюер проверил сам, а не взял из аудита Аудиты — тоже отчёты, поэтому проверены исполнением. Спот-проверка совпала с аудитами на конкретных утверждениях — значит доверять им можно, но с поправками ниже. ### Hermes Hub - **CI на `main` красный** — подтверждено, несколько падений 2026-09-02. - **Баг pricing fallback реален**: `telemetry_service.py:164` делает `yaml.safe_dump(p.read_text(...))` вместо `safe_load`, затем проверяет `isinstance(data, dict)` — всегда ложно, и `except: pass` это глушит. Таблица цен из `pricing.yaml` не загружается никогда. Аудит: P2. Подтверждено. ### KAgent (репозиторий `ochenstarik-ui/kagent`, head `131c9b08`) - **Лицензии нет**, репозиторий публичный — подтверждено. - **Публичный расход средств подтверждён чтением `services/reasoning-engine/src/server.py`:** функция `require_operator_secret` существует и применяется к управлению аккаунтами (`/v1/accounts`, `pin`, `disable`, `reset-throttle`), но **НЕ** применяется к `/v1/execute`, `/v1/decide`, `/v1/telemetry`, `/v1/models`. `/v1/execute` вызывает `engine.execute(...)` — реальный расход. То есть с подключёнными ключами любой, кто найдёт порт, тратит квоты без авторизации. Это не гипотеза, а код на `main`. - **Поправка к аудиту:** аудит датирован 2026-09-02 и говорит об «активности после релиза», но последний push в KAgent — **18–19 августа**, две недели тишины. CI зелёный, но старый. KAgent сейчас не разрабатывается активно. На выводы о коде это не влияет (head-коммит совпал), на планирование сроков — влияет. --- ## Жёсткий гейт (не обсуждается) **Ни один ключ провайдера не переезжает в KAgent, пока `/v1/execute`, `/v1/decide` и `/v1/telemetry` не закрыты авторизацией и это не проверено живым запросом.** У владельца ~2 десятка оплаченных аккаунтов. Пока маршруты открыты, KAgent небезопасен даже без слияния — это надо чинить в нём независимо. Это соответствует Phase 0 плана слияния и P0 аудита KAgent. --- ## Порядок, который советует ревьюер Направление верное — два оркестратора не нужны, Крона не должна знать о Hermes. Но последовательность важнее скорости: 1. **Hermes довести до зелёного и стабильного** прежде, чем замораживать. Он — эталон переноса (reference implementation). Сломанный эталон нельзя портировать: parity-тесты будут сверяться с неверным поведением. Сегодня Hermes ещё нестабилен — аккаунты едва работают, `agy`-патч слетает после перезагрузки, `main` красный. 2. **KAgent Phase 0 (безопасность) — закрыть и проверить исполнением**, начиная ровно с четырёх незакрытых маршрутов. До этого — никаких ключей. 3. **Контракт выполнения (Phase 1)** можно проектировать уже сейчас, риска нет: `AIExecutionRequest`, `AIExecutionResult`, `ProviderAdapter`, таксономия ошибок, `RoutingDecision`. ## Почему «rewrite не нужен» — неточность Скелет KAgent есть, но роутер Hermes не портируется построчно: он переезжает в другую архитектуру (Rust gateway, TS control plane, Python-сервисы, распределённое состояние Redis/Postgres/NATS вместо процесса). Это честный rewrite роутера. Сроки планировать от этого. ## Что перенести из Hermes (проверенные тонкости, легко потерять при переносе) Эти вещи вскрылись только живым прогоном и обязаны попасть в parity-набор: - вход `agy` читается из `.gemini/antigravity-cli/antigravity-oauth-token`, не из формата Gemini CLI; - терминалу входа нельзя подменять `HOME` (X11 берёт ключ из `~/.Xauthority`); - `/props` и `/tokenize` у llama.cpp — в корне, не под `/v1`; - слот выбирается до входа и не должен плодиться; запрос пути профиля не должен создавать каталог; - проверка после подключения не блокирует ответ; - честное `Н/Д` с причиной вместо правдоподобных чисел. Подробности — в [../../agents/](../../agents/) и передаточном брифе. --- ## Координация Две сессии Claude пишут в один `main` Hermes Hub (сессия на ПК — ревьюер; сессия на сервере под `ochenstarik` — исполнитель). Плюс крупный разворот стратегии. Обе сессии должны видеть это решение. Перед пушем — `git fetch` и сверка `git log --oneline origin/main`.