TypestateAnmelden

Wer was tut, von der ersten Frage bis Live

Sie entscheiden, was Ihr Produkt tun soll. Ihr Agent schreibt es, über MCP. Typestate prüft jeden Schritt, schreibt den Code mit einem Programm, führt Ihre Beispiele in Sandbox aus und hält Live hinter einer Änderung, die Sie freigeben.

Tarif wählen

  • SieSie beantworten Fragen und geben jede Änderung frei, bevor sie Live geht.
  • Ihr AgentClaude, ChatGPT, Cursor oder jeder Agent, der MCP spricht. Er fragt, schreibt und antwortet.
  • TypestateTypestate speichert Ihre Daten, prüft und baut jede Aktion und führt sie in Sandbox und Live aus.
  1. Sie und Ihr Agent einigen sich auf den Plan

    1. 1Ihr AgentSieIhr Agent fragt, bevor er baut
    2. Sie sagen Ja zum Plan
  2. Ihr Agent baut, und Typestate prüft jeden Schritt

    1. 2Ihr AgentIhr Agent schreibt die Schritte
    2. 3TypestateTypestate prüft die Aufrufe
    3. 4TypestateTypestate schreibt den Code
    4. 5TypestateIhr AgentTypestate vergleicht Schritte und Sätze
  3. Typestate führt Ihre Beispiele aus, dann geht die Aktion Live

    1. 6Ihr AgentTypestateBeispiele prüfen die Aktion in Sandbox
    2. 7Ihr AgentTypestateSieEine Änderung zeigt, was Live bekommt
    3. Sie geben die Änderung frei, bevor sie Live geht
    4. 8TypestateLive antwortet Ihren Kunden
    5. Live

Jede Aktion durchläuft 8 Stufen bis Live. Sie handeln an den 2 orange markierten Momenten: Sie sagen Ja zum Plan und geben die Änderung frei.

Die Fahrradwerkstatt unten ist erfunden. Die Ablehnung, die festen Worte und der Code sind das, was Typestate für ihre Schritte ausgegeben hat.

Teil 1 von 3

Sie und Ihr Agent einigen sich auf den Plan

SieIhr Agent

1 von 8

Ihr AgentSie

Ihr Agent fragt, bevor er baut

Vor dem ersten Datensatztyp oder der ersten Aktion einer neuen Funktion fragt Ihr Agent, wer sie nutzt, wann sie fertig ist, welche Regeln gelten und was nie passieren darf. Er fragt wenige Fragen auf einmal, fasst den Plan in Ihren Worten zusammen und wartet auf Ihr Ja.

Typestate gibt jedem Agenten diese Anweisung, wenn er sich verbindet. Eine kleine Änderung an einer bestehenden Aktion braucht weniger Fragen.

Zurück zu den 8 Stufen

Ihr AgentWer bucht einen Reparaturtermin: jeder mit dem Link oder nur angemeldete Kunden?

SieJeder. Man gibt einen Namen und eine E-Mail an.

Ihr AgentZwei Leute wollen Samstag 10:00. Was passiert mit der zweiten Person?

SieSie wird abgelehnt. Ein Fahrrad pro Termin.

Ihr AgentUnd wenn jemand absagt?

SieDann ist der Termin wieder frei.

Ihr AgentDer Plan: ein Datensatztyp Booking und eine Aktion Book A Slot, die einen belegten Termin ablehnt. Soll ich es bauen?

SieJa.

Teil 2 von 3

Ihr Agent baut, und Typestate prüft jeden Schritt

Ihr AgentTypestate

2 von 8

Ihr Agent

Jede Aktion besteht aus Schritten: ein Satz und die Aufrufe, die ihn ausführen

Ihr Agent legt zuerst den Datensatztyp an. Ein Datensatz Booking hat einen Termin, einen Namen, eine E-Mail und einen Zustand.

Dann schreibt er die Aktion Book A Slot als 3 Schritte. Jeder Schritt enthält einen Satz in Ihren Worten und die typisierten Aufrufe, die ihn ausführen: read, write, if, stop, answer und einige mehr. Der Satz sagt, was Sie wollen, und die Aufrufe sagen genau, was Typestate tut.

Zurück zu den 8 Stufen

Booking

  • slotDatum und Uhrzeit
  • nameText
  • emailText
  • stateText

Book A Slot

  1. 1

    Refuse with "That slot is taken." when somebody already booked that slot.

    Die Aufrufe, wie Ihr Agent sie schickt
    [
      {
        "kind": "read",
        "record": "Booking",
        "count": true,
        "where": {
          "slot": {
            "input": "slot"
          },
          "state": "booked"
        },
        "as": "taken"
      },
      {
        "kind": "if",
        "condition": {
          "value": {
            "name": "taken"
          },
          "at_least": 1
        },
        "then": [
          {
            "kind": "stop",
            "refuse": {
              "words": "That slot is taken.",
              "status": 409
            }
          }
        ]
      }
    ]
  2. 2

    Store the booking with the name and email the customer gives.

    Die Aufrufe, wie Ihr Agent sie schickt
    {
      "kind": "write",
      "create": true,
      "record": "Booking",
      "set": {
        "slot": {
          "input": "slot"
        },
        "name": {
          "input": "name"
        },
        "email": {
          "input": "email"
        },
        "state": "booked"
      },
      "as": "booking"
    }
  3. 3

    Answer the booking's id and slot.

    Die Aufrufe, wie Ihr Agent sie schickt
    {
      "kind": "answer",
      "fields": {
        "id": {
          "name": "booking.id"
        },
        "slot": {
          "name": "booking.slot"
        }
      }
    }

3 von 8

Typestate

Typestate prüft die Aufrufe, bevor es etwas baut

Jeder Datensatztyp und jedes Feld muss existieren, und jeder Wert muss den richtigen Typ haben. Eine Ablehnung muss in ihrem Satz zitiert sein, damit die Worte, die Ihr Kunde liest, im Schritt stehen.

Wenn eine Prüfung fehlschlägt, lehnt Typestate die Aktion ab und nennt den Schritt und den Grund. Die erste Fassung von Schritt 1 ist so gescheitert, und Ihr Agent hat den Satz korrigiert.

Zurück zu den 8 Stufen

Step 1 refuses with "That slot is taken.", and its sentence does not quote these words.

Erste Fassung

Refuse when somebody already booked that slot.

Korrigiert

Refuse with "That slot is taken." when somebody already booked that slot.

4 von 8

Typestate

Typestate schreibt jeden Schritt in festen Worten zurück und schreibt dann den Code

Ein Programm, kein Modell, macht aus den Aufrufen jedes Schritts Englisch aus einem festen Satz von Wendungen. Sie lesen, was ein Schritt tut, ohne Code zu lesen.

Dasselbe Programm schreibt das TypeScript. Dieselben Schritte ergeben immer denselben Code, und niemand bearbeitet ihn. Um den Code zu ändern, ändert Ihr Agent die Schritte.

Zurück zu den 8 Stufen

Ihr SatzWas Typestate in den Aufrufen liest
1

Refuse with "That slot is taken." when somebody already booked that slot.

Counts the Bookings whose slot is the given slot and state is "booked", as taken. When the value named taken is at least 1: Stops and refuses with "That slot is taken." (status 409).

2

Store the booking with the name and email the customer gives.

Adds a Booking: sets email to the given email, name to the given name, slot to the given slot, state to "booked", as booking.

3

Answer the booking's id and slot.

Answers with id = the booking's id, slot = the booking's slot.

Den Code zeigen, den Typestate geschrieben hat

Sie können diesen Code lesen und nicht ändern. Typestate hat ihn aus den Schritten geschrieben, mit einem Programm und ohne Modell.

import { defineFlow, Refusal, type Json } from "@typestate/sdk";

type Input = { email: string; name: string; slot: string };

export default defineFlow<Input>(async (ctx, input): Promise<Json> => {
  ctx.step?.("1.1");
  const taken = await ctx.db.Booking.count({ slot: input.slot, state: "booked" });
  ctx.step?.("1.2");
  if ((taken >= 1)) {
    ctx.step?.("1.2.then");
    ctx.step?.("1.2.then.1");
    throw new Refusal("That slot is taken.", 409);
  } else {
    ctx.step?.("1.2.else");
  }
  ctx.step?.("2.1");
  const booking = await ctx.db.Booking.create(
    { email: input.email, name: input.name, slot: input.slot, state: "booked" },
    {
      onlyWhile: {
        terms: [{ record: "Booking", where: { slot: input.slot, state: "booked" } }],
        below: 1,
        refusal: "That slot is taken.",
        status: 409,
      },
    },
  );
  ctx.step?.("3.1");
  return { id: booking.id ?? null, slot: booking.slot ?? null };
});

Sehen Sie sich Schritt 2 im Code an. Das Schreiben zählt die Buchungen im selben Moment noch einmal, in dem es die neue speichert. Zwei Personen, die in derselben Sekunde 10:00 buchen, bekommen den Termin also nicht beide.

5 von 8

TypestateIhr Agent

Typestate liest jeden Schritt gegen seinen Satz und fragt

Ein Modell liest jeden Satz neben seinen festen Worten. Wenn beide Verschiedenes sagen, stellt Typestate Ihrem Agenten eine Frage an der Aktion. Der Bau läuft weiter, und Sandbox führt ihn aus.

Ihr Agent beantwortet jede Frage einmal. Er ändert die Aufrufe, oder er behält sie mit einer Zeile Begründung. Eine behaltene Frage geht mit der Begründung nach Live, und Sie können sie später an der Änderung lesen.

Tarif wählen

Zurück zu den 8 Stufen

FrageSchritt 1

Der Satz lehnt ab, wenn jemand diesen Termin schon gebucht hat.

Die Aufrufe zählen nur Buchungen im Zustand "booked". Eine abgesagte Buchung hält den Termin also nicht.

keep_units  reason: "The owner said a cancelled booking frees the slot."

Die Worte einer Frage schreibt ein Modell, darum sind sie bei jedem Lauf etwas anders.

Teil 3 von 3

Typestate führt Ihre Beispiele aus, dann geht die Aktion Live

SieIhr AgentTypestate

6 von 8

Ihr AgentTypestate

Beispiele in Ihren Begriffen prüfen die Aktion in Sandbox

Ihr Agent schreibt für jede Aktion mindestens ein Beispiel: was vorher gilt, was die Aktion gefragt wird und was passieren soll. Ein Modell prüft, dass jedes Beispiel zu den Schritten passt, für die es spricht.

Typestate führt jedes Beispiel gegen den echten Code in Sandbox aus, unter einer eigenen Adresse wie repairs--leipzig-bikes.typestate.dev und mit einer eigenen Datenbank. Live wartet, bis jedes Beispiel besteht.

Zurück zu den 8 Stufen

Ein freier Termin wird gebucht

Was vorher gilt
Keine Buchungen
Was die Aktion gefragt wird
Ana bucht Samstag 10:00
Was passieren soll
Eine Booking für Samstag 10:00 entsteht, sonst nichts

Ein belegter Termin wird abgelehnt

Was vorher gilt
Ben hat Samstag 10:00
Was die Aktion gefragt wird
Ana bucht Samstag 10:00
Was passieren soll
Abgelehnt mit "That slot is taken." (409)

Ein abgesagter Termin ist frei

Was vorher gilt
Ben hat Samstag 10:00 abgesagt
Was die Aktion gefragt wird
Ana bucht Samstag 10:00
Was passieren soll
Eine Booking für Samstag 10:00 entsteht

run_examples

- A free slot is booked (passed). Judge: agrees with its sentences
- A held slot is refused (passed). Judge: agrees with its sentences
- A cancelled slot is free (passed). Judge: agrees with its sentences

Beispiele laufen ab Starter, dem ersten Tarif mit Live. Im kostenlosen Tarif schreibt Ihr Agent sie, und Typestate bewahrt sie auf.

7 von 8

Ihr AgentTypestateSie

Eine Änderung sammelt, was Live fehlt

Wenn Sandbox stimmt, legt Ihr Agent eine Änderung an. Sie listet jede Aktion, jeden Datensatztyp und jeden Web-Endpunkt, der von Live abweicht, mit jeder Änderung an gespeicherten Daten, und Typestate merkt sich einen Fingerabdruck ihres Inhalts. Eine spätere Bearbeitung macht die Änderung ungültig.

Ihr Agent zeigt Ihnen die Änderung und hält Ihre Zustimmung fest. Eine Änderung mit offener Frage, oder eine, die Zahlungen annimmt, geben Sie selbst im Cockpit frei.

Zurück zu den 8 Stufen

Buchungen für Reparaturtermine

  • AktionBook A Slotneu
  • DatensatztypBookingneu
  • Web-EndpunktPOST /bookingsneu

Von Ihrem Agenten behalten, lesen Sie es, wenn Sie Zeit haben

Schritt 1 von Book A Slot. Ihr Agent hat ihn behalten und diesen Grund genannt: The owner said a cancelled booking frees the slot.

Keine offenen FragenFreigeben und Live schalten

8 von 8

Typestate

Live antwortet Ihren Kunden, und der Code bleibt sichtbar

Die Freigabe startet das Deployment. Live hat eine eigene Adresse wie repairs--leipzig-bikes.typestate.live und eine eigene Datenbank, und es läuft auf Cloudflare, nahe bei dem, der es aufruft.

Typestate zeichnet jeden Lauf auf, mit jedem Schritt und seiner Dauer. Der Code bleibt im Reiter Code der Aktion, nur lesbar, als Beleg dafür, was läuft.

Zurück zu den 8 Stufen

Anfrage

POST /bookings
{ "slot": "2026-10-17T10:00",
  "name": "Ana", "email": "ana@example.com" }

Schritte

1 Buchungen des Termins gezählt4 ms
2 Buchung gespeichert11 ms
3 Geantwortet1 ms

Antwort

{ "id": "0b5e2c1a-7d4f-4e39-9a51-3c8e2f6b1d07",
  "slot": "2026-10-17T10:00" }

Die Zeiten sind ein Beispiel.

Beginnen Sie in Sandbox

Mit dem kostenlosen Tarif bekommt Ihr Agent die Sandbox: Er baut, und Sie probieren jede Aktion unter ihrer Sandbox-Adresse aus. Starter führt Ihre Beispiele aus und öffnet Live.

Starter: 15 EUR im Monat (17,85 EUR inkl. USt.).

Tarif wählen