hermes-hub/docs/research/kagent-merge-decision.md
Hermes Team 144f6a5d59 docs(research): решение и план слияния Hermes Hub → KAgent
Владелец принял направление: один продукт 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>
2026-09-02 23:29:33 +07:00

113 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Решение: слияние 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 — **1819 августа**, две недели
тишины. 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`.