Владелец принял направление: один продукт KAgent, функциональность Hermes переносится нативно, после parity Hermes архивируется. На переходный период KAgent доделывается на одном сервере, Hermes — на втором. Ревьюер проверил обе стороны исполнением, а не по аудиту: - Hermes: CI на main красный; баг pricing fallback реален (safe_dump вместо safe_load в telemetry_service.py:164, таблица цен не грузится). - KAgent (head 131c9b08): лицензии нет; в reasoning-engine/src/server.py require_operator_secret стоит на управлении аккаунтами, но НЕ на /v1/execute, /v1/decide, /v1/telemetry — расход провайдера открыт без авторизации. Поправка к аудиту: последняя активность 18-19 августа, репозиторий замер. Жёсткий гейт: ключи провайдеров не переезжают в KAgent, пока эти маршруты не закрыты и это не проверено живым запросом. Сам план миграции положен в репозиторий как артефакт, чтобы не жил только файлом на столе. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
113 lines
7.5 KiB
Markdown
113 lines
7.5 KiB
Markdown
# Решение: слияние 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`.
|