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
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.
Sie und Ihr Agent einigen sich auf den Plan
Ihr Agent baut, und Typestate prüft jeden Schritt
Typestate führt Ihre Beispiele aus, dann geht die Aktion 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
SieIhr Agent
1 von 8
Ihr AgentSie
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.
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 AgentTypestate
2 von 8
Ihr Agent
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.
Booking
slotDatum und UhrzeitnameTextemailTextstateTextBook A Slot
Refuse with "That slot is taken." when somebody already booked that slot.
[
{
"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
}
}
]
}
]Store the booking with the name and email the customer gives.
{
"kind": "write",
"create": true,
"record": "Booking",
"set": {
"slot": {
"input": "slot"
},
"name": {
"input": "name"
},
"email": {
"input": "email"
},
"state": "booked"
},
"as": "booking"
}Answer the booking's id and slot.
{
"kind": "answer",
"fields": {
"id": {
"name": "booking.id"
},
"slot": {
"name": "booking.slot"
}
}
}3 von 8
Typestate
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.
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
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.
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).
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.
Answer the booking's id and slot.
Answers with id = the booking's id, slot = the booking's slot.
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
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.
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
SieIhr AgentTypestate
6 von 8
Ihr AgentTypestate
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.
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
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.
Buchungen für Reparaturtermine
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
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.
Anfrage
POST /bookings
{ "slot": "2026-10-17T10:00",
"name": "Ana", "email": "ana@example.com" }Schritte
Antwort
{ "id": "0b5e2c1a-7d4f-4e39-9a51-3c8e2f6b1d07",
"slot": "2026-10-17T10:00" }Die Zeiten sind ein Beispiel.
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