Agent-Bus – direkter Draht StratoClaude ⇄ MacClaude
StratoClaude → MacClaude, 08.06.2026. Wichtig für MacClaude: lies das ganz, dann nutzen wir ab sofort den Bus statt Git-Handoffs für Chat/Bestellungen. Dennis' Wunsch: kein Commit-Lärm, kein clean-worktree-Zwang, kein Rebase-Ping-Pong. Git bleibt nur noch für echten Code/Dateien.
Setup per Bootstrap-Skill (der schnelle Weg)
Du musst das alles nicht von Hand aufsetzen: Dennis tippt /stratoclaude
(VPS) bzw. /macclaude (Mac), und die Skills (.claude/skills/) nehmen die
Identität an, starten den Bus-Watcher als persistenten Monitor und schnappen das
Handoff auf (optionaler Prompt als Skill-Argument, sonst aus dem Repo +
Bus-Eingang). Einen Git-Commit-Monitor gibt es nicht mehr (entfernt
13.06.) — Koordination läuft komplett über den Bus. Der Rest dieses Docs ist der
Vertrag dahinter.
Wo der Bus lebt
Auf dem VPS (immer an, hat die SQLite). Tabelle agent_bus, vier Endpoints
unter /api/bus* in backend/main.py. Von der Auth-Middleware ausgenommen →
eigener Token-Check.
- MacClaude → Bus:
http://192.168.3.8:9300(WireGuard, dein bekannter WG-Fallback). - StratoClaude → Bus:
http://127.0.0.1:9300(lokal). - Wake-Ping (Sender steht): StratoClaude → MacClaude
192.168.1.60:9399/wake, damit du ohne Dennis-Antippen aufwachst — Empfänger baust du (s. „Schritt 2" unten).
Auth – scoped Token (least privilege)
Der Bus nutzt nicht den allmächtigen INTERNAL_API_TOKEN (der den
kompletten Auth-Bypass öffnet), sondern einen eigenen BUS_TOKEN, der nur
/api/bus* autorisiert. Header: X-Bus-Token: <token>. (Der Internal-Token
gilt als Superset und funktioniert auch — den nutzen nur VPS-Host-Worker + die
Gate-Tests.)
MacClaude-Setup (einmal, auf dem Mac): den BUS_TOKEN gibt dir Dennis
(steht in der VPS-.env, nicht im Repo). Dann:
export BUS_AGENT=mac BUS_URL=http://192.168.3.8:9300 BUS_TOKEN=<von Dennis>
CLI: app/bus.sh (beide Seiten, im Repo)
app/bus.sh send "Text…" # Nachricht an die andere Session stellen
app/bus.sh inbox # ungelesene Nachrichten an mich (JSON)
app/bus.sh log [n] # letzte n (Verlauf, default 30)
app/bus.sh read # meinen Eingang als gelesen markieren
Auf der VPS-Seite liest bus.sh den Token automatisch aus der .env; auf dem
Mac kommt er aus deinem export. Braucht curl + jq.
Eingang abarbeiten (Echo-Zwang abgeschafft)
Bei jedem Aufwachen:
- Eingang lesen — der MQTT-Watcher (FOUND-41) liefert die komplette Nachricht
direkt in der Wake-Zeile;
inboxnur noch für den Catch-up nach/clear. - Handeln (Code, Antwort, Rückfrage …).
- Antwort per
bus.sh send. - Eingang als erledigt markieren (
bus.sh read).
Die früher verpflichtende Zitat-Echo-Spiegelung in den eigenen Stream ist abgeschafft (Dennis-Freigabe 13.06.). Echoen ist optional, wenn es im Einzelfall die Mitlesbarkeit verbessert — aber keine Pflicht mehr.
Endpoint-Vertrag (snake_case rein, kompakt raus)
| Methode | Pfad | Body / Query | Antwort |
|---|---|---|---|
| POST | /api/bus |
{from_agent, body, to_agent?="all", kind?="msg"} |
{sent:true, message:{…}} |
| GET | /api/bus/inbox |
?agent=strato\|mac\|terra |
{agent, count, messages:[…]} (ungelesen an mich, älteste zuerst) |
| GET | /api/bus/log |
?limit=30 |
{messages:[…]} (alle, neueste zuerst) |
| POST | /api/bus/read |
{agent, ids?} |
{read:<n>} (ids weg = ganzer Eingang) |
message-Shape:
{ "id": 1, "from": "strato", "to": "mac", "kind": "msg",
"body": "…", "created_at": "2026-06-08 16:09:43", "read_at": null }
- Agenten:
strato|mac|terra(to_agentzusätzlichall). Andere → 400. (terra= Foundation-Agent seit 12.06.; der Bus-Broker lebt noch hier, wandert später nach Foundation — FOUND-5.) kind: frei nutzbar zur Sortierung —msg(Chat) ·order(Bestellung) ·status(Fortschritt) ·ack(Quittung). Kein Server-Zwang.- Eingang-Semantik:
inboxzeigt Nachrichten an mich (an mich oderall), nicht von mir,read_at IS NULL.readmarkiert genau diese Menge. In einem 2-Parteien-Kanal liest immer nur der jeweils andere → einread_atreicht (kein Fan-out). - Idempotenz: bewusst keine (anders als
notify) — eine Bestellung 2× schicken = 2 Einträge. Wiederholung ist eine echte neue Nachricht.
Revier (unverändert)
app/bus.sh + die /api/bus-Endpoints + dieses Doc = StratoClaude (Backend/
docs). Du baust die Mac-Seite nur als Nutzer des CLI (kein Code von dir nötig).
Brauchst du eine Vertragsänderung (neues kind, Wake-Ping, Push-Spiegelung an
Dennis' Handy via notify()), bestell's über den Bus — ich setze es
serverseitig.
Schritt 2: Autonomes Aufwachen (kein Antippen mehr)
Ziel: Dennis muss keine Session mehr antippen. Zwei Bausteine.
Auto-Poll (StratoClaude: läuft)
Der VPS ist immer an → StratoClaude hält einen persistenten Monitor, der
GET /api/bus/inbox?agent=strato alle 3 s pollt und die Session bei jeder
neuen Nachricht weckt (Wasserzeichen per id, kein Spam, kein Re-Emit gelesener
Nachrichten). Damit erreichst du StratoClaude jederzeit ohne Umweg.
MacClaude: eine der beiden Varianten wählen
Damit auch du ohne Antippen aufwachst:
- (a) Poll spiegeln — denselben Mechanismus auf dem Mac: ein persistenter
Monitor, der
app/bus.sh inboxim Sekundentakt liest und dich bei neuen Nachrichten weckt. Robust, unabhängig vom Netz, kein offener Port. - (b) Wake-Ping empfangen — du betreibst an
192.168.1.60:9399einen Mini-Listener aufPOST /wake. Wenn StratoClaude dir sendet, feuert dessenbus.shbest-effort:POST http://192.168.1.60:9399/wake {"wake": true, "from": "strato"}(max 2 s, blockiert/failt nie). Dein Listener triggert daraufhinapp/bus.sh inbox. Schneller als Polling, aber nur solange der Listener läuft. Port änderbar — sag mir den Port, ich passeBUS_PEER_WAKE_URL(VPS-.env) an.
Empfehlung: (a) als Boden (immer da), (b) optional obendrauf für niedrige
Latenz. Den Wake-Ping in deine Richtung (Mac → VPS) brauchst du nicht — der
VPS pollt ja schon; richtest du dort trotzdem BUS_PEER_WAKE_URL ein, verpufft
es mangels Empfänger harmlos.
Konfiguration (Sender, beide Seiten)
bus.sh send feuert den Wake-Ping, wenn BUS_PEER_WAKE_URL gesetzt ist (Env
oder VPS-.env). Auf dem VPS zeigt es auf deinen Mac-Listener; setzt du keinen
auf, lass es einfach weg.
Erste Nachricht liegt bereit
Im Bus liegt schon id:1 (strato → mac, kind status). Sobald du den Token
hast: app/bus.sh inbox → du solltest sie sehen. Antworte mit app/bus.sh send,
dann läuft der Kanal.