Im September hat eine KI-Sicherheitsschicht verhindert, dass ein Agent meine Serverarbeit erledigt, während ich weg war. Sie hatte recht, wie ein Job zeigte, der am selben Tag unbeaufsichtigt lief.
Gegen eins, am 16. September, musste ich den Laptop mitten in einem Umbau zuklappen: ein Spiegel auf Yavin*, meinem Heimserver, damit Handy und Tablet die PDFs hinter meinen Notizen öffnen können. Die letzten Schritte brauchten Administratorrechte; ich bat Claude, sie an einen Hintergrund-Agenten zu übergeben.
Die Sicherheitsschicht in Claudes Werkzeugen (ein Klassifikator, der prüft, was ein Agent gleich tun will) lehnte ab. Claude nahm sudo (Administratorrechte) aus der Anfrage heraus und wurde erneut abgewiesen. Meine Notizen halten beide fest – und keinen Versuch, sie zu umgehen.
Worum es bei der Ablehnung ging
Die Schicht weist privilegierte Arbeit ab, bei der niemand zusehen oder eingreifen kann. Am Abend, mit mir dabei, liefen dieselben Befehle in vierzig Minuten einzeln durch, und aus dem Job wurde ein systemd-Timer (der Linux-Planer), der stündlich ganz ohne Agent läuft. Am selben Tag kam die Regel ins Regelwerk, mit einem eigenen Zusatz: erst das Muster erkennen und mit dem Plan beginnen, statt viermal zu scheitern.
Der Job, der wirklich unbeaufsichtigt lief
Am selben Tag durchsuchte ein Skript, das eine andere Claude-Sitzung zurückgelassen hatte, mein kDrive – aus einem temporären Ordner, ohne Zeitlimit, mit zwölf parallelen Threads. Jede Anfrage kam mit „too many requests“ zurück. In 3 Std. 10 Min. protokollierte es 67.251 dieser Fehler, erzeugte eine Datei von zwei Bytes und hielt das Laufwerk für jeden anderen Job gedrosselt, auch für den neuen Spiegel.
Zweimal schob Claude die Drosselung auf den ersten Download des Spiegels. Auf meine Nachfrage prüfte es gründlich und fand den Crawler. Nach dem Stopp erholte sich das Laufwerk binnen etwa einer Minute.
Was ich geändert habe
Zwei Tage später kam eine Regel in die kurze Liste, mit der jede Claude-Sitzung startet: Ein Job, der seine Sitzung überdauern soll, läuft aus einem versionierten Ordner, mit Zeitlimit und registriert bei meinem Long-Runner-Wächter – oder im Vordergrund. Der Wächter fragt ein lokales Modell, ob jeder Job noch vorankommt. Ein Hook blockiert heute die Form des Jobs vom 16. September; ein Suchlauf findet lange laufende Skripte, die niemand registriert hat.
Das Recht, das ich selbst vergeben hatte
Am 31. August, nach einem Tag, an dem ich jeden Root-Schritt selbst einfügen musste, hatte ich jeder Agenten-Sitzung auf Yavin* erlaubt, sudo ohne Nachfrage zu nutzen, auch den unbeaufsichtigten. Drei engere Varianten lehnte ich ab und setzte mich schriftlich über die Warnung des Werkzeugs hinweg. Die Plattform, nicht meine Konfiguration, hielt die Privilegien aus der unbeaufsichtigten Spur heraus.
Am selben Tag hatte ich gesagt, was ich eigentlich wollte: „a setup where most, if not all, can be done with user credentials and not with admin rights“. Am 2. Oktober kam eine kurze Liste benannter Befehle neben die alte Freigabe; am 9. Oktober, mit mir dabei, fiel die Pauschalfreigabe weg.
Was nachts läuft
Am Freitag, dem 2. Oktober, arbeitete Claude in einer Live-Sitzung in weniger als einer halben Stunde alle 51 Aufgaben ab, die überfällig oder an dem Tag fällig waren; in derselben Nacht wurde daraus ein Job. Um 23:00 schließt ein Headless-Lauf von Claude die Aufgaben des Tages ab, bereitet sie vor oder verschiebt sie und schickt mir für den Morgen eine Zusammenfassung über Telegram. Er darf Notizen bearbeiten und lesende Prüfungen ausführen, aber weder sudo nutzen noch löschen, committen oder pushen; nach 45 Minuten ist Schluss.
Das Muster
Bauen und Betreiben trennen; ein Programm mit Timer ist kein unbeaufsichtigter Agent. Bauen verlangt Urteil und Privilegien, also bin ich dabei; Betreiben heißt: ein Programm mit Timer oder ein Agent ohne Privilegien, mit Zeitlimit und einem Bericht, den ein Mensch liest. Die Grenze, auf die es mir ankommt, sind Privilegien, bei denen niemand zusieht.
Gelöst ist nicht alles: Hook und Suchlauf erreichen keine Cloud-Sitzungen, der wöchentliche Sonntagslauf hat ein Zeitlimit, aber noch keine Sperrliste, und der Job mit 3 Std. 10 Min. wurde durch eine Frage gefunden, nicht durch ein System.
Teil 9 von zwölf in der Serie darüber, wie ich mein AI OS gebaut habe. Der Anfang: das Vorwort.
Als Nächstes: Obsidian hat mir lange gute Dienste geleistet, bis mir eine Grenze nach der anderen gezeigt hat, dass ich mit ihnen nicht mehr leben muss.
* Rechnernamen sind geändert (hier: Yavin, mein Heimserver). Die echten stammen aus einer anderen Saga.
Anhang – für alle, die selbst bauen
- Schreib zuerst auf, welche Schritte Privilegien brauchen, und erledige sie live, mit einem Menschen dabei; alles andere lässt sich planen.
- Mach den laufenden Teil zu einem Programm. Wo er Urteil braucht, ruf das Modell ohne Werkzeuge auf und lass das Programm schreiben. Vier meiner sechs nächtlichen Modellaufrufe funktionieren so.
- Wenn ein Agent allein handeln muss, zäun ihn ein: Listen erlaubter und gesperrter Werkzeuge (sudo, löschen, verschieben, Commit, Push, Mail), ein Zeitlimit, ein Bericht, den ein Mensch liest, und ein Test des Zauns: Der Selbsttest meines nächtlichen Laufs kontrolliert, dass sudo abgewiesen wird.
- Gib jedem abgekoppelten Job einen versionierten Pfad, ein Zeitlimit und eine Registrierung, und lass den Wächter fragen „kommt er voran?“, nicht „läuft er?“. Der Crawler lief tadellos.
- Wiederhole mit Wartezeit, und gib dann auf. Mein Laufwerks-Client wiederholte bei „too many requests“ gar nicht. Jetzt wartet er begrenzt und wiederholt Schreibzugriffe nur bei diesem Fehler, weil ein fehlgeschlagener Upload trotzdem angekommen sein kann.
- Halte eine Rechtevergabe als Entscheidung fest: den Grund, die Warnung, über die sie sich hinwegsetzt, und die Schritte zurück. Deshalb ließ sich meine zurücknehmen.
- Was ich stattdessen erwogen habe: am 31. August drei engere Varianten statt einer dauerhaften sudo-Freigabe; ich nahm die breite, damit die Arbeit nicht an jedem Root-Schritt hängen bleibt, und verbrachte den Oktober damit, sie zurückzunehmen. Am 16. September einen Weg an der Sicherheitsschicht vorbei; weder Claude noch ich haben ihn versucht, und die zwei Ablehnungen gelten. Ich habe die Trennung gewählt, weil sie jedes Risiko dorthin legt, wo jemand es sehen kann: Privilegien nur, wenn ein Mensch dabei ist; unbeaufsichtigt nur ein einfaches Programm oder ein eingezäunter Agent, der mir berichtet.