Monatelang hatte ein guter Teil meiner Pannen eine einzige Ursache: Ein Job brauchte eine Maschine, die schlief. Wie ich geklärt habe, was wo läuft, und warum mein Code nur einen Ursprung hat.
Am Abend des 26. Juli und am Morgen danach haben Claude und ich geändert, wie meine Server mir Probleme melden. Der Commit nennt den Grund: „WhatsApp alerts depended on the Mac … bridge, … so they silently died whenever the laptop slept.“ Seit Ende Juni liefen die kritischen Warnmeldungen meines Heimservers über ein Brückenprogramm auf meinem Laptop Falcon*; so hatten Claude und ich die Meldungen gebaut. Sie kamen an, wenn ich mit offenem Deckel am Schreibtisch saß – also dann, wenn ich sie am wenigsten brauche.
Den Laptop aus allem herauszunehmen, was funktionieren muss, dauerte bis Oktober.
Ein Desktop, der wach sein musste
Im März lief mein System auf einem VPS in Helsinki, Bespin*, und meinem alten Windows-Desktop, Dagobah*, der die Grafikkarte für ein lokales Modell hatte. ADR-001 (Beitrag 2) sah die Journal-Routinen auf dem VPS vor, doch sie liefen bis zum 17. Mai über die Aufgabenplanung des Desktops. Dieselbe Notiz zeigt den Desktop als Maschine, die um 07:00 für die Arbeit des lokalen Modells „aufwacht“ („Desktop wakes“); war er aus, wartete diese Arbeit. Ab dem 22. Mai war ein neuer Laptop mein Hauptrechner; meine Juni-Notizen nennen den Desktop „powered off most of the time“.
Ein Heimserver in vier Tagen
Am 18. Juni bekam der Desktop eine zweite Aufgabe. Ich wollte meine Fotos von Google wegholen und ein lokales Sprachmodell betreiben; für beides war seine Grafikkarte das Beste, was ich hatte. Der Plan von diesem Tag zog eine Linie, die bis heute gilt: der VPS öffentlich und immer an, die Kiste zu Hause privat und für das Schwere. Am 22. Juni löschte ich, Schritt für Schritt mit Claude, Windows; die Maschine kam als Yavin* zurück, ein Linux-Server mit Docker und Immich für die Fotos. Am Tag darauf lief dort das lokale Modell, die Mail-Anreicherung nutzte es, und die Dokumentverarbeitung zog um. Dagobah* und Yavin* sind dieselbe Kiste: früher meistens aus, heute immer an.
Abgestellt, wo niemand hinkam
Am 24. Juni bauten Claude und ich eine Finanzplanungs-App mit ihrem Kern auf Yavin*. Am nächsten Tag erreichten meine Cloud-Sitzungen den Server nicht: Der Connector, über den ich ausrolle, zeigte auf eine Adresse in meinem Heimnetz. Noch am selben Tag zog die App auf Bespin* um, und eine Entscheidungsnotiz legte fest: standardmäßig der VPS, der Heimserver nur für das, was seinen Speicher oder lokale KI braucht. Im August kam die andere Hälfte: Was ohne mich läuft und keinen Bildschirm braucht, kommt auf Yavin*, damit der Laptop schlafen kann.
Per curl installiert
Am 26. Juni prüfte Claude den neuen Server und fand zwei Scan-Dienste, die denselben Ordner beobachteten. Den zweiten hatte eine frühere Build-Sitzung mit curl installiert (einem Befehl, der eine Datei direkt aus dem Netz lädt), statt ihn aus einem Repository zu klonen. Er kam dem echten in die Quere, lud in den Cloud-Speicher hoch, den ich gerade verließ, und sprach mit einem leeren zweiten Modellserver, den dieselbe Sitzung versehentlich gestartet hatte. Drei laufende Dienste dort lagen in keinem Repository.
Die Regel des Tages: GitHub ist der Ursprung; jede Maschine, die Code ausführt, hat einen Klon und holt nur ab. Am 2. Juli folgte eine tägliche Prüfung auf Abweichungen; seit dem 18. September blockiert ein Hook (eine Prüfung vor jedem Befehl einer KI-Sitzung) von Hand geschriebenen Code auf Servern, zumindest in Claude Code.
Das Muster
Was passieren muss, gehört auf das, was immer läuft; Code hat einen Ursprung, und die Server holen nur ab. Am 7. Juli zog die wöchentliche Wartung vom Laptop weg, aus Claudes Desktop-App in Timer auf den Servern. Am 2. Oktober schlief der Laptop um drei Uhr morgens; ein nächtlicher Secret-Scan lief deshalb nur teilweise, und eine Backup-Prüfung meldete ein fehlendes Protokoll. Am 5. Oktober erschien der Tagesfokus verspätet auf meiner Startseite, weil er über den Laptop lief.
Was ich gelernt habe: Drei Fragen bestimmen, wo ein Job läuft. Erreichen ihn meine Werkzeuge? Braucht er Speicher oder eine Grafikkarte? Muss er laufen, während ich weg bin? Auch Code braucht ein Zuhause, sonst baut eine KI-Sitzung eine zweite Kopie, wo immer sie steht. Nicht gelöst: 13 geplante Jobs laufen noch auf dem Laptop, soweit ich sehe, meist zu seiner eigenen Pflege, und ein paar Dinge, die ich dort bearbeite, warten, bis er aufwacht. Mehr in Beitrag 11.
Teil 4 von zwölf in der Serie darüber, wie ich mein AI OS gebaut habe. Der Anfang: das Vorwort.
Als Nächstes: eine Datenbank, an einem Tag gebaut, und die siebzehn Tage, bis sie richtig blieb.
* Rechnernamen sind geändert (hier: Falcon, mein Laptop; Bespin, mein VPS; Dagobah, mein alter Windows-Desktop; und Yavin, der Heimserver, der aus ihm wurde). Die echten stammen aus einer anderen Saga.
Anhang – für alle, die selbst bauen
- Nimm den Laptop aus allem heraus, was funktionieren muss (Warnmeldungen, Backups, Wartung), und teste die Meldungen bei zugeklapptem Deckel.
- Schick Warnmeldungen direkt vom Server. Für einen Bot bei einem Messaging-Dienst mit API brauchte ich rund hundert Zeilen. Sorge für einen Ersatzweg; mein Wächter für lange Jobs nutzt Mail.
- Unterscheide „schläft“ von „kaputt“. Meine Backup-Prüfung wertete einen nicht erreichbaren Laptop als fehlendes Protokoll; jetzt meldet sie „nicht erreichbar“.
- Ein Ursprung für Code. Jede Laufzeitumgebung ist ein GitHub-Klon, der nur abholt; nichts läuft ohne Versionskontrolle. Prüf täglich auf Abweichungen; blockier später mit einem Hook jede Änderung von Hand.
- Zeig KI-Sitzungen den echten Dienst. Der Phantom-Modellserver entstand aus einem Befehl ohne Adressangabe; eine Einstellung im Shell-Profil hat das beendet.
- Was ich stattdessen erwogen habe: alles auf dem VPS (immer erreichbar, aber ohne Grafikkarte und mit zu wenig Platz für Fotos); eine Speicherbox oder einen kleinen Rechner zu Hause (die Grafikkarte des Desktops war besser, und er war schon da); ein Repository für allen Code (am 26. Juni abgewogen: ein störender Umbau von rund 27 Repositories bei wenig Gewinn). Ich wählte den alten Desktop und einen Ursprung auf GitHub, weil beides Vorhandenes nutzte und die tatsächlich aufgetretenen Fehler behob.