Phase 20: Föderierte Bot-Architektur

Arc OS — von "einem Büro" zu "Kommandozentrale für alle Projekte" Autor: Rick (Lead Architect) | Datum: 2026-04-02 Status: 20.1–20.5 ABGESCHLOSSEN Genehmigt von: CEO


Das Problem

Der CEO verwaltet mehrere Projekte (Arc OS, Msolution, RTS_001) vom Telefon aus. Aktuelle Architektur: ein Telegram Bot → eine Claude-Sitzung → ein Kontextfenster. Das scheitert ab 3+ Projekten:

Die Lösung: Föderierung

CEO ↔ @citadel_master_bot (Master)          ← nur globale Befehle
       │
       ├── /status          → fragt alle Children ab
       ├── /emergency-stop  → Kill-Signal an alle
       ├── /deploy all      → kaskadiertes Deployment
       │
       ├── @citadel_v2_bot (Child 1)         ← separater Chat, separater Kontext
       │    └── Claude-Sitzung #1, cwd=/opt/repos/citadel-v2
       │
       ├── @msolution_bot (Child 2)          ← kann Designer zum Chat hinzufügen
       │    └── Claude-Sitzung #2, cwd=/opt/repos/msol
       │
       └── @rts_bot (Child 3)               ← kann Morty-Agent hinzufügen
            └── Claude-Sitzung #3, cwd=/opt/repos/rts-001

Entscheidungsanalyse: Single Bot vs. Föderierung

Option A: Single Bot + Projekt-Switcher

Kriterium Bewertung Details
Code-Komplexität Gering (1 Bot) activeProject-Variable hinzufügen, /switch ändert cwd
Kontext-Isolation SCHWACH Eine Claude-Sitzung = ein Kontextfenster für alle Projekte. Wechseln verschmutzt den Kontext.
CEO-Komfort Mittel Muss /switch merken. Risiko: Task an falsches Projekt senden. Keine visuelle Trennung.
Multi-User UNMÖGLICH Ein Chat = ein CEO. Kann keine Personen zu projekt-gebundenem Chat einladen.
Reply-Kontext KAPUTT Auf Nachricht aus einem anderen Projekt antworten = Claude verwirrt.

Urteil: Funktioniert für Solo-CEO mit 1–2 Projekten. Scheitert ab 3+.

Option B: Föderierte Bots (Master + Children) — GEWÄHLT

Kriterium Bewertung Details
Code-Komplexität Mittel (N+1 Bots) Jeder Bot = separates tmux + Claude-Sitzung. Master = leichtgewichtiger Koordinator.
Kontext-Isolation PERFEKT Jede Claude-Sitzung = eigenes Kontextfenster, eigene CLAUDE.md, eigenes cwd. Null Verschmutzung.
CEO-Komfort HOCH Separate Telegram-Chats = separate "Räume". Zwischen Projekten wischen. Native Mobile-UX.
Multi-User NATIV @designer zu @msolution_bot-Chat hinzufügen. Sie sieht nur ihr Projekt.
Reply-Kontext PERFEKT Antwort im @citadel_v2_bot-Chat = 100 % Citadel-Kontext. Telegram bewahrt Thread nativ.

Urteil: Richtige Lösung. Mehr Infra-Komplexität, löst aber ALLE Probleme.

Warum Föderierung gewinnt

  1. Kontext-Isolation — entscheidender Faktor. Eine Claude-Sitzung für 3+ Projekte = Kontext-Überlauf in 30 Minuten aktiver Arbeit. Föderierung gibt jedem Projekt saubere 200.000 Token.
  2. Multi-User-Bereitschaft — kein "zukünftiges Feature", es ist ein Fundament. Ohne es kann Arc OS kein Produkt werden.
  3. Reply = natives RAG — Telegram hat das Kontext-Problem bereits gelöst. Wir bilden Reply → GSD-Prompt ab.

Emergency-Stop-Architektur

CEO tippt /emergency-stop im Master-Chat
        │
        ▼
Master Bot (Node.js/Bun, leichtgewichtig, KEINE Claude-Sitzung)
        │
        ├── 1. config/bot_registry.json lesen
        │      { "children": [
        │          { "name": "citadel-v2", "tmux": "citadel", ... },
        │          { "name": "msolution", "tmux": "msolution", ... }
        │      ]}
        │
        ├── 2. Für jedes Child (parallel):
        │      a) tmux send-keys -t $SESSION "C-c" Enter      ← graceful: Ctrl+C
        │      b) sleep 2
        │      c) tmux send-keys -t $SESSION "/exit" Enter     ← expliziter Exit
        │      d) sleep 2
        │      e) tmux kill-session -t $SESSION                 ← erzwungen falls noch aktiv
        │
        ├── 3. office-state.json aktualisieren: alle Agents → idle
        │
        └── 4. Im Master-Chat antworten:
               "EMERGENCY STOP ausgeführt.
                citadel-v2: GESTOPPT (arbeitete an: hooks)
                msolution: GESTOPPT (war: idle)
                Alle Agents auf idle zurückgesetzt."

Kill-Protokoll (3 Ebenen)

Ebene Aktion Timeout Wann
1. Graceful Ctrl+C via tmux 2s Immer zuerst
2. Explizit /exit-Befehl 2s Falls Graceful nicht funktioniert hat
3. Erzwungen tmux kill-session sofort Letzter Ausweg

Failsafe

Cron-Job alle 5 Minuten prüft /tmp/emergency-stop.flag. Wenn die Datei existiert und frisch ist (<10 min), führt er die Kill-Sequenz aus. Deckt den Fall ab, in dem der Master Bot selbst abgestürzt ist.


Smart Context Recall

Problem

Der CEO antwortet auf eine 3 Tage alte Nachricht und sagt "mach das Gleiche, aber für ein anderes Modul". Claude hat keine Ahnung von der referenzierten Nachricht.

Lösung: Reply → GSD-Prompt-Transformation

Die Telegram Bot API stellt das reply_to_message-Objekt mit vollem Originaltext bereit.

CEO antwortet auf: "Ich habe Hooks auf VPS deployed, alles funktioniert"
CEO schreibt: "mach das Gleiche für msolution"
        │
        ▼
Child Bot empfängt:
{
  "message": {
    "text": "mach das Gleiche für msolution",
    "reply_to_message": {
      "text": "Ich habe Hooks auf VPS deployed, alles funktioniert",
      "date": 1743580800,
      "message_id": 847
    }
  }
}
        │
        ▼
Bot baut GSD-Prompt für Claude:
┌─────────────────────────────────────┐
│ KONTEXT (aus Reply):                │
│ > [2026-04-02] "Ich habe Hooks auf  │
│ > VPS deployed, alles funktioniert" │
│                                     │
│ AUFGABE (neue Nachricht):           │
│ "mach das Gleiche für msolution"    │
│                                     │
│ PROJEKT: msolution (aus Bot-Scope)  │
└─────────────────────────────────────┘

Deep Recall (ältere Nachrichten)

Ebene 1: Thread-Historie (schnell)
  Bot speichert letzte 50 Nachrichten in state/thread_history.json pro Chat.
  Reply → Bot findet Original → injiziert in CONTEXT-Block.

Ebene 2: Library Recall (Fallback)
  Wenn Nachricht nicht in Thread-Historie (>50 Nachrichten zurück) →
  Bot führt /citadel-recall mit Reply-Text aus →
  zieht Kontext aus library-export/ → injiziert in Prompt.

Ablauf: reply_to_message → thread_history → library-export/ → GSD-Prompt

Schlüsselprinzip

Claude weiß NIEMALS direkt über Telegram-Replies. Die Bot-Middleware transformiert Reply IMMER in einen sauberen CONTEXT + TASK-Block, bevor er an die Claude-Sitzung gesendet wird.


Master-Bot-Spezifikation

Was der Master Bot IST

Was der Master Bot NICHT IST

Child-Bot-Protokoll

Jeder Child Bot muss:

  1. Sich in config/bot_registry.json beim Start registrieren
  2. Heartbeat senden (alle 60s) an Master via Datei: state/heartbeat_<name>.json
  3. reply_to_message → GSD-CONTEXT-Injektion verarbeiten
  4. Letzte 50 Nachrichten in state/thread_history.json speichern
  5. Auf Emergency-Stop-Signal reagieren (graceful Ctrl+C → /exit → kill)
  6. Strukturierten Logger verwenden (shared/logger.ts) — Logs nach /var/log/citadel/<name>/
  7. BOT_NAME-Umgebungsvariable für dynamische Benennung akzeptieren
  8. /api/child/health für Watchdog-Health-Checks exponieren

Ressourcenschätzung

Ressource Aktuell Phase 20
VPS-RAM ~4 GB genutzt / 11 GB gesamt ~5,5 GB (+ ~500 MB pro Child-Sitzung)
Docker-Container 2 (Bridge + Frontend) 4–5 (+ Master + 2 Children)
Telegram-Bot-Token 1 3–4 (@BotFather, kostenlos)
tmux-Sitzungen 1 (citadel) 3–4 (Master + Children)
Ports 18889, 19200 + 19201–19203 (Child APIs)

Phase-20-Unterphasen

20.1 — Master-Bot-Fundament

20.2 — Child-Bot-Protokoll (Erster Child)

20.3 — Onboarding-Engine (FERTIG)

20.4 — Skill-Library & Projekt-Entfernung (FERTIG)

20.5 — Phantom-Ready-Infrastruktur (FERTIG)

Master-Bot-Befehle (Final)

Befehl Aktion Antwort
/status State + Health + Heartbeat aller Children lesen Aggregiertes Dashboard
/emergency_stop 3-stufige Kill-Sequenz auf allen Children Bestätigung mit Status pro Child
/list Registrierte Children anzeigen Name, Status, tmux-Sitzung
/deploy <name|all> Deploy für Child(ren) auslösen Deploy-Log pro Child
/health Health-Endpunkte aller Children prüfen Health-Matrix
/new_project <name> Onboarding-Interview starten 4-schrittiges Gespräch
/remove_project <name> Projekt mit Bestätigung entfernen Dreifach-Bestätigung + Bereinigung
/watchdog Watchdog-Status anzeigen Fehler, Neustarts, Backoff pro Child
/cancel Aktive Operation abbrechen Onboarding/Entfernung abbrechen

Nicht im Umfang (Phase 21+)


Phase-20-Architektur von Rick (Lead Architect). Phasen 20.1–20.5 abgeschlossen. Genehmigt von CEO 2026-04-02.