Wie ich TINAs Legacy-UI in 3 Tagen mit KI migriert habe – und warum das kein Glück war

Das TINA-Frontend, Stand 2026
Alle 12 Bereiche portiert
~90 % Line-Coverage (Gate: 80 %)
ESLint strict mit 0 Findings
Von Legacy zu neu
Angular 21 (standalone, Signals, zoneless, strict TS) + PrimeNG + Tailwind
Fachlich reviewt – seit 2 Wochen auf TINA-DEV parallel zur Legacy-UI im Einsatz.
Nein: ein Verfahren.
Das Playbook in 7 Phasen – von Fundament bis Spitze, jede Phase baut auf der vorherigen auf:

„Code, den nie jemand aufgerufen hat" – Der Agent als Legacy-Archäologe
12 Bereiche, 40 Views, LOC und Komplexität je Bereich
auftragAnlegenProduktinstanzErweitern – im Legacy nie aufgerufen → nicht portiert
Das Backend erwartet sortDirection wörtlich als "Ascending"/"Descending" – fehlt es, gibt es eine NullPointerException
getAllBetriebstypen in den Betriebstypzuordnungen
Hier glänzt das Brain: echtes Verständnis von fremdem Code.
„Die KI fragt, ich entscheide" – Nicht prüfbare Entscheidungen gehören dem Menschen – und zwar vorne.
Angular (Team ist Java-lastig mit Angular-Erfahrung), PrimeNG + Tailwind
Re-Platform + Polish, kein kompletter UX-Redesign; Big-Bang, aber modulweise
Vitest + Playwright mock-first, 80 %-Coverage-Gate, ESLint strict
Bei Unklarheit immer fragen, testbare Zwischenstände melden, keine git-Commits durch die KI
IMPLEMENTATION-PLAN.md mit Fortschritts-Checkliste im Repo – geschrieben so, dass auch eine kleinere Modell-Instanz ihn abarbeiten kann.
Erst entscheiden, dann portieren.
Zwei komplett unterschiedliche, klickbare HTML-Mockups vor der ersten View:
Später dazu: Stil „TINA Klassik" in der Arvato-Farbwelt als neuer Default.
Heute: 3 Design-Stile zur Laufzeit umschaltbar.
Dunkel, Amber-Akzente
Warmes Papier, Serifen – Editorial gewann
„Erst das Fahrwerk, dann der Motor" – Bevor das erste Feature entsteht:
80 %-Line-Coverage-Gate – der Maven-Build bricht darunter
angular-eslint + typescript-eslint

Jeder BFF-Aufruf gemockt, unbekannte Aufrufe scheitern laut
Pro Prüfebene, das der Agent selbst ausführen kann (mvn verify)

Zugestanden: Ein LLM rät das nächste Token.
Ja – der Papagei rät.
Compiler, Linter, Tests, Build.
Der Papagei darf raten, solange ein Schiedsrichter jede Antwort prüft.
Das Ergebnis ist auf vielen Ebenen maschinell prüfbar.
Es ist egal, wie die Antwort entsteht, wenn jede Antwort durch deterministische Prüfungen muss.
In einem Aufsatz über Geschichte gibt es keinen Compiler. In unserem Code gibt es sechs Prüfebenen.
Prüf-Pyramide, Grenzen des Verfahrens und das Playbook zum Nachmachen
Je mehr Ebenen, desto enger der Korridor für den Zufall.
Fachliches Review, Parallelbetrieb
mvnd verify, Bundle-Budget
81 Playwright-Tests im echten Browser
372 Tests, ~90 % Coverage
ESLint strict, 0 Findings
Basis: Typsystem / Compiler – TypeScript strict

Bereich für Bereich, jeweils komplett.
Mapper → Store (Signals) → Page + Unit-Tests + e2e-Spec
lint + unit + komplettes e2e – kein Schritt ohne vollständige Prüfung
Das externe Gedächtnis über Sessions hinweg
TinaTable, CRUD-Dialoge, CSV-Import – beschleunigen jeden weiteren Bereich
Auch der Harness kann lügen.
Bei Backend-Fehlern sahen Nutzer nur „HTTP 500" statt der echten Meldung
grün – und trotzdem falsch
Der generierte API-Client fordert alles als Blob an – die Specs flushten aber JSON. Die Fehlermeldung wurde nie geparst.
Die Detail-Ursachen (causes) wurden komplett ignoriert
e2e-Test im echten Browser beweist den Fix – erst dort wurde das echte Verhalten sichtbar

Immer den vollen Gate-Lauf – nie nur „meinen" Test.
Schlanke neue Endpoints für Dropdowns
Die e2e-Mocks zeigten noch auf die alten Pfade → 5 bestehende Tests rot
Pro Session lief nur der Spec des neuen Features
Ein Test erwartete 13 Navigationslinks – real waren es längst 14

Und die ehrliche Grenze.
Was ist identisch zur Legacy, was bewusst anders – schriftlich im Repo
Durch mich, danach Parallelbetrieb auf TINA-DEV
Race zwischen Login-Guard und Code-Austausch – erst beim manuellen Login in der echten Umgebung gefunden
UX, fachliche Richtigkeit, „Richtige Anforderung?" – dort bleibt der Papagei ein Papagei
Manche Fehler findet nur ein Mensch in der echten Umgebung. Das Verfahren konzentriert nicht-prüfbare Entscheidungen beim Menschen: vorne im Design-Gate, hinten im Review und Parallelbetrieb. Dazwischen läuft alles Automatisierbare.
Das Brain ist Voraussetzung. Der Harness ist der Hebel.
computed() auf Formularwerten ist nicht reaktiv)Brain = Motor. Harness = Fahrwerk, Lenkung, Bremsen.
Ein stärkerer Motor ohne Fahrwerk landet nur schneller im Graben.
Leistungsstarke Modelle stecken in eurer Copilot-Lizenz. Was fehlt, ist das Fahrwerk.
Mein Setup | Euer Äquivalent mit Copilot |
|---|---|
Copilot mit Opus-5 als Arch-Agent | Copilot Agent Mode |
COPILOT.md / Projektregeln | .github/copilot-instructions.md bzw. AGENTS.md |
IMPLEMENTATION-PLAN.md mit Checkliste | PLAN.md im Repo, genauso |
Memory über Sessions | Plan + Zwischenberichte im Repo |
Grill-Skill | „Stell mir eine Frage nach der anderen, mit Empfehlung" |
mvn verify / npm run e2e als Feedback-Loop | identisch |
Wiederholbar für die nächste Legacy-UI.
Agent analysiert
Mensch entscheidet
Mensch entscheidet
Agent baut, Mensch prüft
Agent
Agent schreibt, Mensch liest
Mensch entscheidet
Mensch-Gates vorne und hinten, der Agent in der prüfbaren Mitte.

Drei Schritte:
Build, Lint und Tests mit je einem Kommando, das der Agent selbst ausführen kann
Mit Checkliste im Repo
Erst dann skalieren