Drei Teams gaben heute eine tiefe Integration für einen Vertrag auf
Angular, Microsoft und Cloudflare haben heute Abend Unzusammenhängendes veröffentlicht, und jedes davon ist derselbe Tausch: ein Team, das tief in ein anderes System hineingebaut hatte, tritt zurück auf eine engere, dokumentierte Grenze — und jedes Mal, weil die tiefe Variante eine Änderung nicht überlebt, die es nicht kontrolliert.
Angular sagt es unverblümt. Der Ahead-of-time-Compiler stand auf den APIs des TypeScript-Compilers, er führt eigene Transformationen über ts.Transformer aus, und diese API existiert über Sprachgrenzen hinweg nicht — die Verzahnung kann TypeScript also nicht in eine Go-Implementierung folgen. Der Ersatz, der Angular Preprocessor, versucht es gar nicht. Er nimmt Komponenten und Templates und gibt gewöhnliches TypeScript aus, das ein anderer prüft, zwei Ausgabedateien pro Eingabedatei, mit oxc als Transformator. Angular wechselt davon, Teil der Typprüfung zu sein, dazu, Eingaben für sie zu erzeugen. Aufgegeben wird die Fähigkeit hineinzugreifen; gekauft wird die Fähigkeit, anwesend zu bleiben, wenn der Wirt neu geschrieben wird.
Microsofts AG-UI-Ankündigung ist derselbe Schritt aus der anderen Richtung. Nicht das .NET-SDK ist die Nachricht, sondern der Satz, dass die AG-UI-Unterstützung des Microsoft Agent Framework nun auf diesem SDK aufsetzt statt daneben gepflegt zu werden. Ein Anbieter mit eigener Implementierung kann einer Spezifikation locker folgen und die Abweichung intern auffangen. Ein Anbieter, der die gemeinsamen Pakete nutzt, kann das nicht: ein Fehler in AGUI.Abstractions ist jetzt ein Fehler im Produkt. Die Grenze wurde enger und härter, und genau darum geht es.

Cloudflares Turnstile Spin sieht nach Bequemlichkeit aus und beruht auf derselben Beobachtung. Die Zweiteilung von Turnstile — Widget im Frontend, Siteverify-Aufruf im Backend — setzte voraus, dass eine Person beide Hälften schreibt. Als das nicht mehr galt, scheiterte die Integration auf eine bestimmte Weise: die sichtbare Hälfte installiert, die entscheidende fehlt. Das Verräterische ist der Knopf "Fix with Spin", der nur angeboten werden kann, weil Cloudflare Widgets sieht, die Tokens ausgeben, während keine Prüfaufrufe eintreffen. Die Antwort besteht nicht darin, den zweistufigen Ablauf leichter befolgbar zu machen, sondern darin, niemandem mehr abzuverlangen, ihn zu befolgen.
Was die drei verbindet, ist nicht nativer Code, sind nicht Agenten und nicht Rust. Es ist, dass eine tiefe Integration eine Wette darauf ist, dass die andere Seite stillhält. Angulars Wette lief aus, als TypeScript die Sprache wechselte. Turnstiles lief aus, als sich die Gruppe der Installierenden änderte. Microsofts war freiwillig, und das ist der interessante Fall: nichts erzwang sie, und mit der eigenen Implementierung fiel die Option weg, still abzuweichen.
Die praktische Lesart, wenn man selbst etwas pflegt, das sich in die Innereien eines anderen Systems einhängt: die Frage ist nicht, ob die Integration funktioniert, sondern welche Änderung auf der anderen Seite sie beenden würde — und ob man davon aus einer Release-Notiz erfährt oder aus dem eigenen Build. Angular wusste es: dem Beitrag nach war dem Team klar, dass die tiefe Verzahnung mit einem in Go kompilierten TypeScript nicht funktionieren kann, und die Planung begann im Frühjahr, nicht nach dem stabilen Release. Das ist der Teil, der sich zum Nachmachen lohnt.