diff --git a/HANDOFF.md b/HANDOFF.md
index 354ab0c..a009aaf 100644
--- a/HANDOFF.md
+++ b/HANDOFF.md
@@ -4,6 +4,40 @@
Voller Weg funktioniert Ende-zu-Ende: externer Anruf auf Durchwahl 9 (Plusnet → FreeSWITCH → `dialog/pipecat_bootstrap.py` → WebSocket → Astra) erreicht Astra, und Astra liefert jetzt auch eine echte, fertige Antwort statt nur "Einen Moment bitte" (Fix 2026-09-13, siehe unten) - kein offener Blocker mehr bekannt.
+## 2026-09-17 — Leitung stumm nach IP-Wechsel, Watchdog-Kinder sterben
+
+**Symptom:** Durchwahl 9 (und die ganze Leitung) nahm nicht ab. Letzter
+eingehender Anruf im FreeSWITCH-Log: 2026-09-15 18:05. Trunks trotzdem
+REGED/UP.
+
+### 1. Veraltete öffentliche IP im Contact
+
+FreeSWITCH ermittelt die externe IP per STUN nur beim Laden der XML
+(`vars.xml`, `stun-set`). Contact an Plusnet war noch `9.246.125.72`,
+tatsächlich `217.142.18.120` (Zwangstrennung, 05:17 kurz 408/DOWN).
+Registrierung und Pings gehen weiter raus, eingehende INVITEs laufen ins
+Leere - kein Fehler im Log.
+
+**Fix:** `starten.sh` vergleicht bei jedem Watchdog-Lauf
+`fs_cli -x 'stun stun.freeswitch.org'` mit `Ext-SIP-IP` des
+external-Profils; bei Abweichung und 0 Gesprächen `reloadxml` +
+`sofia profile external restart`. Nach einem IP-Wechsel ist die Leitung
+also bis zu 5 min stumm. Profil-Neustart von Hand getestet (Trunks sofort
+wieder REGED); der Abweichungsfall selbst noch nicht real ausgelöst.
+
+### 2. launchd beendete alles, was starten.sh im Hintergrund startet
+
+Vom Watchdog gestarteter Pipecat-Bootstrap band Port 8095 und war
+Sekunden später weg, ohne Log. Ursache: launchd räumt nach Jobende die
+Prozessgruppe ab. Betraf auch `pipe.monitor`/`pipe.watch`/`pipe.server` -
+Fix 3 vom 2026-09-14 (Störungswache zuerst) griff unter launchd also nie.
+FreeSWITCH überlebt, weil es sich selbst abkoppelt.
+
+**Fix:** `AbandonProcessGroup` in
+`~/Library/LaunchAgents/net.dillenberg.fonagent.plist` (liegt **nicht** im
+Repo), per `launchctl bootout`/`bootstrap` neu geladen. Verifiziert:
+Bootstrap per Watchdog gestartet, lebt nach Jobende weiter.
+
## 2026-09-14 — Leitung nach Neustart ~80 min tot: Watchdog bekam nichts hoch
**Symptom:** Nach einem Neustart des Mac mini (~12:39) blieb die Leitung
diff --git a/telefon/starten.sh b/telefon/starten.sh
index e2b13f7..08feb73 100755
--- a/telefon/starten.sh
+++ b/telefon/starten.sh
@@ -108,6 +108,30 @@ else
sleep 15
fi
+# Oeffentliche IP abgleichen. FreeSWITCH holt sie per STUN nur beim Laden der
+# XML (vars.xml, stun-set) und meldet sie Plusnet als Contact. Nach einer
+# Zwangstrennung des Routers mit neuer IP bleibt der Trunk trotzdem REGED/UP
+# (Registrierung und Pings gehen raus), aber eingehende INVITEs laufen an die
+# alte Adresse - die ganze Leitung ist stumm, ohne Fehler im Log. So am
+# 2026-09-17 passiert: Contact 9.246.125.72, tatsaechlich 217.142.18.120.
+# Bei Abweichung: reloadxml (STUN neu) + external-Profil neu starten, nur wenn
+# gerade kein Gespraech laeuft - sonst im naechsten Watchdog-Lauf.
+aktuell=$(fs_cli -P "$FS_PORT" -x "stun stun.freeswitch.org" 2>/dev/null | head -1 | cut -d: -f1)
+gemeldet=$(fs_cli -P "$FS_PORT" -x "sofia status profile external" 2>/dev/null \
+ | awk '/^Ext-SIP-IP/{print $2}')
+if [[ "$aktuell" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] && [ -n "$gemeldet" ] \
+ && [ "$aktuell" != "$gemeldet" ]; then
+ gespraeche=$(fs_cli -P "$FS_PORT" -x "show calls count" 2>/dev/null | awk '/total/{print $1}')
+ if [ "${gespraeche:-0}" = "0" ]; then
+ echo "$(date '+%F %T') Oeffentliche IP geaendert ($gemeldet -> $aktuell) - external-Profil wird neu gestartet."
+ fs_cli -P "$FS_PORT" -x "reloadxml" >/dev/null 2>&1
+ fs_cli -P "$FS_PORT" -x "sofia profile external restart" >/dev/null 2>&1
+ sleep 10
+ else
+ echo "$(date '+%F %T') Oeffentliche IP geaendert ($gemeldet -> $aktuell), aber $gespraeche Gespraech(e) aktiv - naechster Lauf."
+ fi
+fi
+
# Auf die Registrierung beim Provider warten.
# Quelle ist fs_cli, nicht das Log: das Log wird zum Testen geleert und taugt
# dann nicht mehr als Zustandsquelle.