Es ist soweit. Der letzte Prompt ist durch, der letzte Pull‑Request gemerged, ein frisches git clone, einmal die Befehle aus der README durchlaufen lassen – und dann:
docker compose up -d –build
Die Container starten. Keine Fehlermeldung. Breites Grinsen.
Und dann der nächste README‑Schritt: Browser öffnen, <strong>http://localhost eingeben … und dann BÄHM – die erste Fehlermeldung.
Für viele ist das der Moment, in dem man denkt: „Was für ein Scheiß. KI. Ernsthaft?“
Für mich als Entwickler war es eher: „Okay. Eine Fehlermeldung. Damit kann ich arbeiten.“
Denn der Code, der in den vorangegangenen Iterationen gut aussah, sah immer noch gut aus. Nur eben nicht vollständig. Ein paar Dinge fehlten. Ein paar Dinge waren nicht da, wo sie laut Code sein sollten. Vielleicht waren sie einmal da, wurden aber nicht sauber refactored. Alles kein Drama.
Die eigentliche Enttäuschung kam später – als localhost dann funktionierte Nicht wegen des Codes. Sondern wegen meiner SPEC.md.
Dort stand dieser Satz:
API‑first: UI ist ein Client der API. Keine direkte DB‑Kopplung.
Klingt gut. Klingt modern. Klingt nach Architektur.
War aber kopflos gedacht. Denn es stand nichts zum Frontend in der Spezifikation. Es war in meinem Kopf – zumindest dieses Bild von einem Frontend.
Und was Codex daraus gemacht hat, war der absolute Minimalstandard: eine Ausgabe der Mitarbeitertabelle – aber technisch sauber.
Dafür hat Codex den API‑First‑Ansatz ernst genommen. Sehr ernst. OpenAPI‑Dokumentation, saubere Endpoints, klare Trennung – alles da.
Und genau das ist der Punkt, an dem ich folgende Notiz gemacht habe:
Das Problem ist nicht Codex.Das Problem ist meine SPEC.md.
Was ich noch machen musste / wollte (oder machen ließ):
- Docker-/Phinx‑Setup repariert, Onboarding‑Doku verbessert
- verlässlichen Phinx‑Workflow dokumentiert, DB‑Reset‑Helper ergänzt
- Migrationen und Seeder robuster gemacht, README für Einsteiger (DAU) erweitert
- Phinx‑Crash in <code>employee_skill</code> behoben, hasColumn() ersetzt
- minimale Vanilla‑UI‑Grundstruktur für EMS‑HTML‑Routen ergänzt
Was ich bei VIPe falsch gemacht habe – und was ich beim nächsten Mal anders machen würde
Dieses Experiment hat mir gezeigt, wo VIPe stark ist – und wo ich selbst geschlampt habe.
SPEC.md war zu vage
„API‑first“ ohne Frontend‑Definition ist ein Rezept für Chaos. LLMs füllen Lücken nicht sinnvoll – sie improvisieren. Andererseits wollte ich das Experiment klein halten, also mal sehen was als nächstes kommt.
Notiz an mich selbst: hier irgendwas mit Templates.
Ich habe dem Modell zu sehr vertraut
„Bestätige, dass du SPEC.md verstanden hast“ ist ein Anti‑Pattern. LLMs simulieren Verständnis.
<strong>Nächstes Mal:</strong> Keine Bestätigungen. Stattdessen: „Liste alle Anforderungen aus SPEC.md auf, die du umsetzen wirst.“
Ich habe Drift unterschätzt
Jeder Prompt ist ein neuer Kontext. Ohne State‑Lock driftet das Modell.
Ich habe keine (oder zu wenig) No‑Guessing‑Regel gesetzt
LLMs raten, wenn etwas fehlt. Das ist ihr Naturell.
Nächstes Mal: „Wenn SPEC.md etwas nicht eindeutig definiert, stelle eine Rückfrage.“ ist vermutlich eindeutig eine blöde Idee.
Ich brauche mehr „Ich will was sehen“-Schritte
Das erste lauffähige System nicht auf die letzte Iteration schieben.