# Wir haben ChatGPT eine Kommandozeile gegeben, und es hat eine echte Zeiterfassung gebaut

> ChatGPT kann unsere Kommandozeile nicht selbst installieren. Gib ihm das Linux-Paket, dann schon. Es hat eine Zeiterfassung nach deutschem Arbeitszeitrecht geschrieben, mit dem Compiler gestritten, bis sie durchging, und sie auf die Plattform veröffentlicht, während wir zugesehen haben.

Source: https://www.cordango.com/de/blog/build-an-app-with-chatgpt/
Language: de

Dienstagabend, ein ganz normaler ChatGPT-Tab. Keine Entwicklungsumgebung, kein Coding-Agent, keine Erweiterung. Wir haben ein 30 Megabyte großes `.tar.gz` ins Chatfenster gezogen, gesagt, was die Datei ist, und nach einer Zeiterfassung nach deutschem Arbeitszeitrecht gefragt. Es hat die Binärdatei in seiner Sandbox ausgepackt, das Format verstanden, die App geschrieben, die vier Sachen repariert, die der Compiler bemängelt hat, sich an unserer Instanz angemeldet und veröffentlicht.

Rollen, Rechte, Anmeldung und Audit-Log waren dabei. Beschrieben hat davon niemand etwas.

## Warum wir das nicht erwartet hatten

Wer ChatGPT nach einer App fragt, bekommt normalerweise eine einzelne Datei, die im Chat gut aussieht und beim zweiten Benutzer auseinanderfällt. Anmeldung aus dem Gedächtnis geschrieben. Rechteprüfung im Frontend, wo jeder daran vorbeigehen kann. Kein Audit-Log, weil niemand danach gefragt hat und das Modell keinen Anlass hatte, es von sich aus anzubieten.

Wir haben "frag doch einfach ChatGPT" seit ungefähr zwei Jahren abgetan, und wir haben es aus dem falschen Grund abgetan. Wir hielten das Modell für die schwache Stelle. Ist es nicht. Die schwache Stelle ist, dass man mit dem Code auch die Sicherheit erzeugen lässt, und jede erzeugte Zeile Anmeldelogik ist eine Zeile, die niemand geprüft hat. Nimmt man dem Modell diese Aufgabe weg, sieht das Bild völlig anders aus.

## Die Kommandozeile übergeben

Die Sandbox hinter dem Chat kommt nicht an unser Installationsskript. Der eine manuelle Schritt ist deshalb, ihr die Binärdatei zu geben.

Auf [die Releases-Seite](https://github.com/cordango/cordango/releases) gehen, `cordango-0.6.0-linux-x64.tar.gz` herunterladen und diese Datei in die Unterhaltung hochladen. Dann sag ihm, was damit passieren soll:

```
Entpacke das in deiner Sandbox, mach die Datei cordango ausführbar,
und führe ./cordango --help aus. Danach folge dem.
```

Das funktioniert, weil die Binärdatei alles mitbringt. Kein .NET-SDK, keine Laufzeitumgebung, kein ICU, nichts nachzuladen. Eine Datei, die läuft. Wir haben das so gebaut, damit ein Container keinen Paketmanager braucht, und der Nutzen zeigte sich nun ausgerechnet in einer Chat-Sandbox, an die dabei niemand gedacht hatte.

Ab da ist es der gewöhnliche Ablauf:

```
cordango new zeiterfassung
cordango check
cordango build            # ein Projekt, das dir gehört, eigenständig
```

Oder, wenn es auf die Plattform soll:

```
cordango login            # persönlicher Zugriffsschlüssel, einmal eingefügt
cordango publish
```

Ein Hinweis lohnt sich, und das ist der ganze Kniff: **Sag ihm, es soll vor der ersten Zeile `cordango vocabulary` ausführen und nach jeder Änderung `cordango check`.** Ohne das rät es eine Weile am Format herum. Damit korrigiert der Compiler, und das Modell liest den Fehler und probiert es erneut.

## Den Streit führt der Compiler

`check` verweigert, statt etwas fast Richtiges durchzuwinken. Es antwortet mit einem Befund und der genauen Stelle in der Datei, die ihn ausgelöst hat, und das ist zufällig genau die Form von Rückmeldung, mit der ein Sprachmodell etwas anfangen kann. Es hat den Befund gelesen, ist an die genannte Stelle gegangen, hat sie geändert und `check` erneut laufen lassen. Vier Runden, ohne Hilfe.

Wichtiger ist, was es nie schreiben musste. Rollen, Rechte bis auf die einzelne Spalte, wer welchen Datensatz sehen darf, und das Audit-Log sind Sache der Plattform, durchgesetzt auf dem Server, abgeleitet aus wenigen Zeilen in der Definition statt aus erzeugtem Code. Niemand vertraut dem Modell diese Dinge an.

Da sind wir deutlich. Wir möchten nicht, dass ein Sprachmodell entscheidet, wer ein Gehaltsfeld sehen darf. Es soll entscheiden, wie der Bildschirm heißt und welche Spalten darauf stehen. Das sind zwei verschiedene Aufgaben, und die Branche gibt sie beide derselben Sache.

## Womit wir nicht gerechnet hatten

ChatGPT kennt deutsches Arbeitsrecht besser als jedes Coding-Werkzeug, das wir benutzt haben, und zwar mit Abstand.

Es kam von selbst auf [§ 3 ArbZG](https://www.gesetze-im-internet.de/arbzg/__3.html), acht Stunden werktäglich, zehn nur, wenn der Schnitt über sechs Monate stimmt. Dann auf die Pausen aus [§ 4](https://www.gesetze-im-internet.de/arbzg/__4.html), dreißig Minuten ab mehr als sechs Stunden und fünfundvierzig ab mehr als neun. Dann auf den [Beschluss des BAG vom 13. September 2022](https://www.bundesarbeitsgericht.de/presse/einfuehrung-elektronischer-zeiterfassung-initiativrecht-des-betriebsrats/), also den, der aus der Arbeitszeiterfassung eine Pflicht gemacht hat, die Arbeitgeber längst hatten, statt einer, auf deren Gesetz man noch wartet. Erwähnt hatte das niemand.

Eine Sache hat es falsch gemacht, und da mussten wir einschreiten. Es wollte die vorgeschriebene Pause automatisch von der erfassten Zeit abziehen. Für die Lohnabrechnung ist das ordentlich, für einen Nachweis, den du irgendwann einer Prüfung vorlegst, ist es falsch. Was passiert ist und was bezahlt wird, sind zwei Zahlen. (Es hat die Korrektur sofort übernommen, was uns leicht geärgert hat, weil wir uns eine längere Diskussion zurechtgelegt hatten.)

Ein Coding-Agent hätte besseres TypeScript geschrieben und nichts davon angesprochen. Das war eine arbeitsrechtliche Frage im App-Kostüm.

## Zum Geld

Das lief auf einem Abo, das wir ohnehin bezahlen. Keine Rechnung pro Token für einen Agenten, der sich durch ein Repository frisst, weil es kein Repository zum Durchfressen gibt. Eine App-Definition ist ein kurzes Dokument, ein paar hundert Zeilen Absicht, und der teure Teil am App-Bauen ist nicht das Tippen.

Fair bleiben wollen wir trotzdem. Das ersetzt keinen Coding-Agenten, der in einer großen bestehenden Codebasis arbeitet, und wir tun nicht so, als wäre es so. Es ersetzt etwas anderes: das sechswöchige interne Projekt, in dem jemand ein Werkzeug spezifiziert, jemand anders es baut, und das Rechtemodell zweimal besprochen und einmal umgesetzt wird.

Unsere Plattform ist derzeit geschlossene Beta, `publish` braucht also eine Instanz, zu der du Zugang hast. `build` braucht das nicht. Dieser Weg läuft auf einem Notebook ganz ohne Konto.

## Was wir als Nächstes probieren würden

Nimm eine App, die auf deiner Instanz schon existiert, hol sie mit `cordango import` heraus und lass ChatGPT daran arbeiten, statt bei null anzufangen. Wir haben das einmal gemacht und es lief gut, was für eine Behauptung noch zu wenig ist.

Sehen möchten wir eigentlich, wie jemand aus dem Betrieb das macht, der nicht programmieren kann. Diese Leute kennen den Prozess besser als wir alle, und die einzige Fähigkeit, die der Chat verlangt, ist ihn genau zu beschreiben. Wenn du es ausprobierst, sag uns, wo es geklemmt hat. [Melde dich](/de/contact/) und schick uns den Fehler, an dem es stehen geblieben ist.

Die Zeiterfassung läuft seit Dienstag, und einen Editor hat dafür bis heute niemand geöffnet.

