Zuletzt aktualisiert:

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.

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:

  1. Eingang lesen — der MQTT-Watcher (FOUND-41) liefert die komplette Nachricht direkt in der Wake-Zeile; inbox nur noch für den Catch-up nach /clear.
  2. Handeln (Code, Antwort, Rückfrage …).
  3. Antwort per bus.sh send.
  4. 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 }

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:

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.