Phase 20: Federowana Architektura Botów

Arc OS — od „jednego biura" do „centrum dowodzenia dla wszystkich projektów" Autor: Rick (Lead Architect) | Data: 2026-04-02 Status: 20.1–20.5 UKOŃCZONE Zatwierdzone przez: CEO


Problem

CEO zarządza wieloma projektami (Arc OS, Msolution, RTS_001) z telefonu. Bieżąca architektura: jeden bot Telegram → jedna sesja Claude → jedno okno kontekstu. To się sypie przy 3+ projektach:

Rozwiązanie: Federacja

CEO ↔ @citadel_master_bot (Master)          ← tylko globalne komendy
       │
       ├── /status          → odpytuje wszystkie dzieci
       ├── /emergency-stop  → sygnał kill do wszystkich
       ├── /deploy all      → kaskadowy deploy
       │
       ├── @citadel_v2_bot (Child 1)         ← osobny czat, osobny kontekst
       │    └── sesja Claude #1, cwd=/opt/repos/citadel-v2
       │
       ├── @msolution_bot (Child 2)          ← można dodać designera do czatu
       │    └── sesja Claude #2, cwd=/opt/repos/msol
       │
       └── @rts_bot (Child 3)               ← można dodać agenta Morty
            └── sesja Claude #3, cwd=/opt/repos/rts-001

Analiza decyzji: Jeden bot vs Federacja

Opcja A: Jeden bot + przełącznik projektów

Kryterium Ocena Szczegóły
Złożoność kodu Niska (1 bot) Dodaj zmienną activeProject, /switch zmienia cwd
Izolacja kontekstu SŁABA Jedna sesja Claude = jedno okno kontekstu dla wszystkich projektów. Przełączanie zanieczyszcza kontekst.
Wygoda CEO Średnia Trzeba pamiętać o /switch. Ryzyko: wysłanie zadania do złego projektu. Brak wizualnego rozdziału.
Multi-user NIEMOŻLIWE Jeden czat = jeden CEO. Nie można zapraszać ludzi do chatu scoped per projekt.
Kontekst odpowiedzi ZEPSUTY Odpowiedź na wiadomość z innego projektu = Claude zdezorientowany.

Werdykt: Działa dla samotnego CEO z 1–2 projektami. Sypie się przy 3+.

Opcja B: Federacja botów (Master + Dzieci) — WYBRANA

Kryterium Ocena Szczegóły
Złożoność kodu Średnia (N+1 botów) Każdy bot = osobny tmux + sesja Claude. Master = lekki koordynator.
Izolacja kontekstu PERFEKCYJNA Każda sesja Claude = własne okno kontekstu, własny CLAUDE.md, własne cwd. Zero zanieczyszczenia.
Wygoda CEO WYSOKA Osobne czaty Telegram = osobne „pokoje". Przesuń między projektami. Natywny UX mobilny.
Multi-user NATYWNY Dodaj @designer do czatu @msolution_bot. Widzi tylko swój projekt.
Kontekst odpowiedzi PERFEKCYJNY Odpowiedź w czacie @citadel_v2_bot = 100% kontekst citadel. Telegram natywnie zachowuje wątek.

Werdykt: Właściwe rozwiązanie. Większa złożoność infrastruktury, ale rozwiązuje WSZYSTKIE problemy.

Dlaczego Federacja wygrywa

  1. Izolacja kontekstu — czynnik decydujący. Jedna sesja Claude dla 3+ projektów = przepełnienie kontekstu w 30 minut aktywnej pracy. Federacja daje każdemu projektowi czyste 200K tokenów.
  2. Gotowość na multi-user — to nie „przyszła funkcja", to fundament. Bez tego Arc OS nie może stać się produktem.
  3. Odpowiedź = natywny RAG — Telegram już rozwiązał problem kontekstu. My tylko mapujemy odpowiedź → prompt GSD.

Architektura Emergency Stop

CEO naciska /emergency-stop w czacie Mastera
        │
        ▼
Master Bot (Node.js/Bun, lekki, NIE sesja Claude)
        │
        ├── 1. Odczytaj config/bot_registry.json
        │      { "children": [
        │          { "name": "citadel-v2", "tmux": "citadel", ... },
        │          { "name": "msolution", "tmux": "msolution", ... }
        │      ]}
        │
        ├── 2. Dla każdego dziecka (równolegle):
        │      a) tmux send-keys -t $SESSION "C-c" Enter      ← łagodne: Ctrl+C
        │      b) sleep 2
        │      c) tmux send-keys -t $SESSION "/exit" Enter     ← jawne wyjście
        │      d) sleep 2
        │      e) tmux kill-session -t $SESSION                 ← wymuś kill jeśli nadal żyje
        │
        ├── 3. Zaktualizuj office-state.json: wszystkie agenty → idle
        │
        └── 4. Odpowiedz w czacie Mastera:
               "EMERGENCY STOP wykonany.
                citadel-v2: ZATRZYMANY (był: working on hooks)
                msolution: ZATRZYMANY (był: idle)
                Wszystkie agenty zresetowane do idle."

Protokół Kill (3 poziomy)

Poziom Akcja Timeout Kiedy
1. Łagodne Ctrl+C przez tmux 2s Zawsze pierwsze
2. Jawne komenda /exit 2s Jeśli łagodne nie zadziałało
3. Wymuszone tmux kill-session natychmiast Ostateczność

Failsafe

Zadanie cron co 5 minut sprawdza /tmp/emergency-stop.flag. Jeśli plik istnieje i jest świeży (<10 min), wykonuje sekwencję kill. Zabezpiecza przypadek, gdy sam Master Bot się zawiesił.


Smart Context Recall

Problem

CEO odpowiada na wiadomość sprzed 3 dni i pisze „zrób to samo, ale dla innego modułu". Claude nie ma pojęcia o tej wiadomości.

Rozwiązanie: Odpowiedź → Transformacja promptu GSD

Telegram Bot API dostarcza obiekt reply_to_message z pełnym oryginalnym tekstem.

CEO odpowiada na: "Wdrożyłem hooki na VPS, wszystko działa"
CEO pisze: "zrób to samo dla msolution"
        │
        ▼
Child Bot odbiera:
{
  "message": {
    "text": "zrób to samo dla msolution",
    "reply_to_message": {
      "text": "Wdrożyłem hooki na VPS, wszystko działa",
      "date": 1743580800,
      "message_id": 847
    }
  }
}
        │
        ▼
Bot buduje prompt GSD dla Claude:
┌─────────────────────────────────────┐
│ CONTEXT (z odpowiedzi):             │
│ > [2026-04-02] "Wdrożyłem hooki    │
│ > na VPS, wszystko działa"          │
│                                     │
│ TASK (nowa wiadomość):              │
│ "zrób to samo dla msolution"        │
│                                     │
│ PROJECT: msolution (z zakresu bota) │
└─────────────────────────────────────┘

Deep Recall (starsze wiadomości)

Warstwa 1: Historia wątku (szybka)
  Bot przechowuje ostatnie 50 wiadomości w state/thread_history.json per czat.
  Odpowiedź → bot znajduje oryginał → wstrzykuje do bloku CONTEXT.

Warstwa 2: Recall z biblioteki (fallback)
  Jeśli wiadomość nie ma w historii wątku (>50 wiad.) →
  bot uruchamia /citadel-recall z tekstem odpowiedzi →
  pobiera kontekst z library-export/ → wstrzykuje do promptu.

Przepływ: reply_to_message → thread_history → library-export/ → prompt GSD

Kluczowa zasada

Claude NIGDY nie wie bezpośrednio o odpowiedziach Telegram. Middleware bota ZAWSZE przekształca odpowiedź w czysty blok CONTEXT + TASK przed wysłaniem do sesji Claude.


Specyfikacja Master Bota

Czym Master Bot JEST

Czym Master Bot NIE JEST

Protokół Child Bota

Każdy child bot musi:

  1. Rejestrować się w config/bot_registry.json przy starcie
  2. Wysyłać heartbeat (co 60s) do Mastera przez plik: state/heartbeat_<nazwa>.json
  3. Obsługiwać reply_to_message → wstrzykiwanie CONTEXT do GSD
  4. Przechowywać ostatnie 50 wiadomości w state/thread_history.json
  5. Reagować na sygnał emergency-stop (łagodne Ctrl+C → /exit → kill)
  6. Używać strukturowanego loggera (shared/logger.ts) — logi do /var/log/citadel/<nazwa>/
  7. Akceptować zmienną env BOT_NAME dla dynamicznego nazewnictwa
  8. Udostępniać /api/child/health dla kontroli watchdoga

Szacowanie zasobów

Zasób Obecnie Phase 20
RAM VPS ~4 GB użyte / 11 GB całkowite ~5,5 GB (+ ~500 MB per sesja child)
Kontenery Docker 2 (bridge + frontend) 4–5 (+ master + 2 dzieci)
Tokeny botów Telegram 1 3–4 (@BotFather, bezpłatne)
Sesje tmux 1 (citadel) 3–4 (master + dzieci)
Porty 18889, 19200 + 19201–19203 (API dzieci)

Sub-fazy Phase 20

20.1 — Fundament Master Bota

20.2 — Protokół Child Bota (Pierwsze dziecko)

20.3 — Silnik Onboardingu (DONE)

20.4 — Biblioteka Skilli i Usuwanie Projektów (DONE)

20.5 — Infrastruktura gotowa na Phantom (DONE)

Komendy Master Bota (Finalne)

Komenda Akcja Odpowiedź
/status Odczytaj stan + zdrowie + heartbeat wszystkich dzieci Zagregowany pulpit
/emergency_stop 3-poziomowa sekwencja kill dla wszystkich dzieci Potwierdzenie ze statusem per dziecko
/list Pokaż zarejestrowane dzieci Nazwa, status, sesja tmux
/deploy <nazwa|all> Wyzwól deploy dla dziecka/dzieci Log deployu per dziecko
/health Sprawdź endpointy zdrowia wszystkich dzieci Macierz zdrowia
/new_project <nazwa> Rozpocznij wywiad onboardingu 4-krokowa rozmowa
/remove_project <nazwa> Usuń projekt z potwierdzeniem Potrójne potwierdzenie + czyszczenie
/watchdog Pokaż status watchdoga Błędy per dziecko, restarty, backoff
/cancel Anuluj aktywną operację Przerwij onboarding/usuwanie

Poza zakresem (Phase 21+)


Architektura Phase 20 autorstwa Ricka (Lead Architect). Fazy 20.1–20.5 ukończone. Zatwierdzone przez CEO 2026-04-02.