argo_bot · Полный аудит

45 файлов · 11,002 строк Python · 14 апреля 2026
30
Тестов OK
2
Тестов FAIL
4
Критических
7
Высоких
6
Средних

Критические проблемы

4 issues
/etc/systemd/system/argo-bot.service
Deployed service · отличается от шаблона
CRIT ExecStart запускает jarvis_template.main, а не argo_bot.main. Бот работает из кода jarvis_template, а не из argo_bot. Все изменения в argo_bot/ не применяются.
CRIT BOT_TOKEN хардкожен в Environment= — дублирует .env.argo_bot. При смене токена нужно менять в двух местах.
HIGH SyslogIdentifier=argo-bot vs шаблон argo_bot — мелочь но путает при grep логов.
config.py · SELF_AGENT_NAME
Строка 76 · дефолт "jarvis"
CRIT SELF_AGENT_NAME = "jarvis" — Kara идентифицирует себя как Jarvis при роутинге. Должно быть "kara" или "argo".
Логи · exit code -9
journalctl -u argo-bot
CRIT Claude subprocess убивается OOM-killer (exit code -9) каждые ~30 минут idle. Причина: MemoryMax=3G при CLAUDE_MEMORY_MAX_MB=3000 — запас нулевой. Python process 133MB + Claude subprocess = впритык. При первом серьёзном запросе OOM.

Высокие проблемы

7 issues
config.py · дефолты от template
96 строк
HIGH CLAUDE_WORK_DIR = "/root/boss_gpt/jarvis" — Kara работает в директории Jarvis. Должно быть /root/boss_gpt/argo_bot. Это значит что при работе с файлами Kara может случайно изменить файлы Jarvis.
HIGH CLAUDE_PROMPT_ID = "jarvis_brain_init" — дефолт загрузит промпт Jarvis, а не Kara. Переопределяется через .env, но опасно если .env потеряется.
HIGH HTTP_PORT = 5060 — дефолт конфликтует если кто-то запустит без .env. Реальный порт 5062 задан в .env.
config.py · утечка секретов
HIGH Settings().__dict__ выводит OPENAI_API_KEY целиком (sk-proj-YBFQ...). Нет маскирования в __repr__. Любой лог с print(settings) утечёт ключ.
HIGH POSTGRES_PASSWORD = "sigma2205" — тот же пароль что и везде, но в контексте шаблона для будущих клиентов это проблема.
tests/ · 2 сломанных теста
HIGH test_settings_defaults: ожидает BOT_NAME="template", получает "argo_bot" из .env. Тест не изолирован от окружения.
HIGH test_template_files_exist: ищет systemd/bot-template.service — файл переименован в argo_bot.service. Тест не обновлён после клонирования.

Средние проблемы

6 issues
di.py · GPT fallback init
Строка 138
MED JarvisBrain(settings, pool, ctx.schema_loader) — schema_loader=None всегда (ENABLE_MCP=False), но GPT brain может упасть если попытается использовать schema. Неявная зависимость.
CLAUDE.md
822 байт · обновлён 1 день назад
MED Ссылается на "Root /root/boss_gpt/CLAUDE.md has full laws" — но Kara при работе в work_dir=/root/boss_gpt/argo_bot не видит его автоматически. Нужен явный Read в промпте или симлинк.
templates/prompt_default.md
MED Использует плейсхолдеры {date} и {work_dir} — но engine.py подставляет только {date}. {work_dir} останется литерально в промпте как "{work_dir}".
engine.py · MEMORY_CHECK_INTERVAL
MED Константа 60 секунд в коде, но в логах видно "interval=15s". Deployed service переопределяет? Или jarvis_template/core/engine.py имеет другое значение? Расхождение кода и runtime.
core/http_api.py · нет трейсинга
MED HTTP API (POST /chat) не логирует в brain.bot_interactions. Discovery counter и другие хуки не срабатывают для HTTP-запросов. Только Telegram-хэндлеры трейсятся.
templates/tools_whitelist.yaml
MED Файл существует но engine.py читает ALLOWED_TOOLS из хардкода (список в классе). YAML не используется — мёртвый файл.

Что работает хорошо

Сильные стороны
GOOD Архитектура — чистый DI через BotContext, никаких глобалов. Все зависимости инжектятся через middleware.
GOOD Синтаксис — все 45 .py файлов проходят ast.parse без ошибок.
GOOD 30 из 32 тестов проходят (engine_pool, safety, smoke, config).
GOOD Cgroup isolation (v6.1) — Kara не убивает процессы Jarvis при перезапуске.
GOOD Memory pressure monitor — трёхступенчатый (gc → compress → restart), не бинарный.
GOOD Tool denial detection — автокоррекция когда Claude забывает инструменты.
GOOD Watchdog v6.2 — ловит мёртвые subprocess в idle, не ждёт следующего запроса.
GOOD Graceful shutdown — сигналы, cancel tasks, cleanup в правильном порядке.
GOOD Feature flags — каждый optional модуль включается отдельно через Settings.
GOOD Engine pool — готов к масштабированию (пока отключён, но код рабочий, 10 тестов OK).

Главный вывод

Код argo_bot — это грамотный шаблон с хорошей архитектурой. Но deployed service запускает jarvis_template, а не argo_bot — это значит Kara работает из копии шаблона, а не из argo_bot/. Все правки в argo_bot/ сейчас мёртвый код.

Дефолты в config.py не обновлены после клонирования: work_dir, prompt_id, agent_name всё ещё указывают на Jarvis. Работает только потому что .env переопределяет. Если .env потеряется — Kara станет Jarvis.

OOM на exit code -9 каждые 30 мин — MemoryMax=3G при полной загрузке Claude subprocess. Нужно либо поднять до 4-5G, либо снизить CLAUDE_MEMORY_MAX_MB.

Приоритеты исправлений:
1. Переключить service на argo_bot.main (или убедиться что jarvis_template = argo_bot)
2. Обновить дефолты config.py (work_dir, prompt_id, agent_name)
3. Поднять MemoryMax до 4G или снизить лимит в коде
4. Починить 2 сломанных теста
5. Добавить трейсинг в http_api.py