Phase 20: Федеративная архитектура ботов

Arc OS — от "одного офиса" к "командному центру для всех проектов" Автор: Rick (Lead Architect) | Дата: 2026-04-02 Статус: 20.1–20.5 COMPLETE Одобрено: CEO


Проблема

CEO управляет несколькими проектами (Arc OS, Msolution, RTS_001) с телефона. Текущая архитектура: один Telegram-бот → одна Claude-сессия → одно контекстное окно. При 3+ проектах это ломается:

Решение: Федерация

CEO ↔ @citadel_master_bot (Master)          ← только глобальные команды
       │
       ├── /status          → опрашивает всех дочерних
       ├── /emergency-stop  → kill signal для всех
       ├── /deploy all      → каскадный деплой
       │
       ├── @citadel_v2_bot (Child 1)         ← отдельный чат, отдельный контекст
       │    └── Claude session #1, cwd=/opt/repos/citadel-v2
       │
       ├── @msolution_bot (Child 2)          ← можно добавить дизайнера в чат
       │    └── Claude session #2, cwd=/opt/repos/msol
       │
       └── @rts_bot (Child 3)               ← можно добавить агента Morty
            └── Claude session #3, cwd=/opt/repos/rts-001

Анализ решений: Single Bot vs Federation

Вариант A: Single Bot + Project Switcher

Критерий Оценка Детали
Сложность кода Низкая (1 бот) Добавить переменную activeProject, /switch меняет cwd
Изоляция контекста СЛАБАЯ Одна Claude-сессия = одно контекстное окно для всех проектов. Переключение загрязняет контекст.
Удобство для CEO Среднее Нужно помнить /switch. Риск: отправить задачу не в тот проект. Нет визуального разделения.
Мультипользователь НЕВОЗМОЖНО Один чат = один CEO. Нельзя пригласить людей в проектный чат.
Контекст ответов СЛОМАН Ответить на сообщение из другого проекта = Claude запутается.

Вердикт: Работает для одиночного CEO с 1-2 проектами. Ломается при 3+.

Вариант B: Федеративные боты (Master + Children) — ВЫБРАНО

Критерий Оценка Детали
Сложность кода Средняя (N+1 ботов) Каждый бот = отдельная tmux + Claude сессия. Master = лёгкий координатор.
Изоляция контекста ИДЕАЛЬНАЯ Каждая Claude-сессия = своё контекстное окно, свой CLAUDE.md, свой cwd. Нулевое загрязнение.
Удобство для CEO ВЫСОКОЕ Отдельные чаты Telegram = отдельные "комнаты". Свайп между проектами. Нативный мобильный UX.
Мультипользователь НАТИВНЫЙ Добавить @designer в чат @msolution_bot. Она видит только свой проект.
Контекст ответов ИДЕАЛЬНЫЙ Ответить в чате @citadel_v2_bot = 100% контекст citadel. Telegram нативно сохраняет тред.

Вердикт: Правильное решение. Больше инфраструктурной сложности, но решает ВСЕ проблемы.

Почему федерация побеждает

  1. Изоляция контекста — решающий фактор. Одна Claude-сессия для 3+ проектов = переполнение контекста за 30 минут активной работы. Федерация даёт каждому проекту чистые 200K токенов.
  2. Готовность к мультипользователю — не "будущая фича", а фундамент. Без неё Arc OS не может стать продуктом.
  3. Reply = нативный RAG — Telegram уже решил проблему контекста. Мы просто маппим reply → GSD prompt.

Архитектура Emergency Stop

CEO нажимает /emergency-stop в чате Master
        │
        ▼
Master Bot (Node.js/Bun, легковесный, НЕ Claude-сессия)
        │
        ├── 1. Читает config/bot_registry.json
        │      { "children": [
        │          { "name": "citadel-v2", "tmux": "citadel", ... },
        │          { "name": "msolution", "tmux": "msolution", ... }
        │      ]}
        │
        ├── 2. Для каждого дочернего (параллельно):
        │      a) tmux send-keys -t $SESSION "C-c" Enter      ← graceful: Ctrl+C
        │      b) sleep 2
        │      c) tmux send-keys -t $SESSION "/exit" Enter     ← явный выход
        │      d) sleep 2
        │      e) tmux kill-session -t $SESSION                 ← принудительное завершение если ещё жив
        │
        ├── 3. Обновить office-state.json: все агенты → idle
        │
        └── 4. Ответить в чат Master:
               "EMERGENCY STOP executed.
                citadel-v2: STOPPED (was: working on hooks)
                msolution: STOPPED (was: idle)
                All agents reset to idle."

Kill Protocol (3 уровня)

Уровень Действие Таймаут Когда
1. Graceful Ctrl+C через tmux Всегда первым
2. Explicit команда /exit Если graceful не сработал
3. Force tmux kill-session немедленно Последнее средство

Failsafe

Cron-задача каждые 5 минут проверяет /tmp/emergency-stop.flag. Если файл существует и свежий (<10 мин), выполняет kill-последовательность. Покрывает случай, когда Master Bot сам упал.


Smart Context Recall

Проблема

CEO отвечает на сообщение 3-дневной давности и пишет "сделай то же самое, но для другого модуля". Claude понятия не имеет о referenced сообщении.

Решение: Reply → GSD Prompt Transformation

Telegram Bot API предоставляет объект reply_to_message с полным оригинальным текстом.

CEO отвечает на: "Я задеплоил хуки на VPS, всё работает"
CEO пишет: "сделай то же для msolution"
        │
        ▼
Child Bot получает:
{
  "message": {
    "text": "сделай то же для msolution",
    "reply_to_message": {
      "text": "Я задеплоил хуки на VPS, всё работает",
      "date": 1743580800,
      "message_id": 847
    }
  }
}
        │
        ▼
Бот строит GSD prompt для Claude:
┌─────────────────────────────────────┐
│ CONTEXT (from reply):               │
│ > [2026-04-02] "Я задеплоил хуки   │
│ > на VPS, всё работает"             │
│                                     │
│ TASK (new message):                 │
│ "сделай то же для msolution"        │
│                                     │
│ PROJECT: msolution (from bot scope) │
└─────────────────────────────────────┘

Deep Recall (более старые сообщения)

Слой 1: Thread History (быстрый)
  Бот хранит последние 50 сообщений в state/thread_history.json для каждого чата.
  Reply → бот находит оригинал → вставляет в блок CONTEXT.

Слой 2: Library Recall (fallback)
  Если сообщения нет в thread history (>50 сообщений назад) →
  бот запускает /citadel-recall с текстом reply →
  подтягивает контекст из library-export/ → вставляет в prompt.

Флоу: reply_to_message → thread_history → library-export/ → GSD prompt

Ключевой принцип

Claude НИКОГДА не знает о Telegram reply напрямую. Middleware бота ВСЕГДА трансформирует reply в чистый блок CONTEXT + TASK перед отправкой в Claude-сессию.


Спецификация Master Bot

Что Master Bot ЯВЛЯЕТСЯ

Что Master Bot НЕ ЯВЛЯЕТСЯ

Протокол Child Bot

Каждый дочерний бот должен:

  1. Регистрироваться в config/bot_registry.json при запуске
  2. Отправлять heartbeat (каждые 60с) в Master через файл: state/heartbeat_<name>.json
  3. Обрабатывать reply_to_message → вставку GSD CONTEXT
  4. Хранить последние 50 сообщений в state/thread_history.json
  5. Реагировать на сигнал emergency-stop (graceful Ctrl+C → /exit → kill)
  6. Использовать структурированный logger (shared/logger.ts) — логи в /var/log/citadel/<name>/
  7. Принимать env var BOT_NAME для динамического именования
  8. Открывать /api/child/health для watchdog health checks

Оценка ресурсов

Ресурс Текущее Phase 20
VPS RAM ~4GB используется / 11GB всего ~5.5GB (+ ~500MB на дочернюю сессию)
Docker-контейнеры 2 (bridge + frontend) 4-5 (+ master + 2 дочерних)
Токены Telegram-ботов 1 3-4 (@BotFather, бесплатно)
tmux-сессии 1 (citadel) 3-4 (master + дочерние)
Порты 18889, 19200 + 19201-19203 (child APIs)

Подфазы Phase 20

20.1 — Основа Master Bot

20.2 — Child Bot Protocol (первый дочерний)

20.3 — Onboarding Engine (DONE)

20.4 — Библиотека скиллов и удаление проектов (DONE)

20.5 — Phantom-Ready Infrastructure (DONE)

Команды Master Bot (финальные)

Команда Действие Ответ
/status Читает состояние + health + heartbeat всех дочерних Агрегированный дашборд
/emergency_stop 3-уровневая kill-последовательность для всех дочерних Подтверждение с per-child статусом
/list Показать зарегистрированных дочерних Имя, статус, tmux-сессия
/deploy <name|all> Триггер деплоя для дочернего(их) Лог деплоя на каждого
/health Проверить health endpoints всех дочерних Health matrix
/new_project <name> Начать onboarding-интервью 4-шаговый разговор
/remove_project <name> Удалить проект с подтверждением Тройное подтверждение + очистка
/watchdog Показать статус watchdog Ошибки на дочернего, перезапуски, бэкофф
/cancel Отменить активную операцию Прервать onboarding/удаление

Вне скоупа (Phase 21+)


Архитектура Phase 20 от Rick (Lead Architect). Phases 20.1–20.5 завершены. Одобрено CEO 2026-04-02.