♟️ Von Jev bis Darkwaar: Die Entwicklung eines Spiels rund um Entscheidungen und Ungewissheit
vom 27. September 2026
Jev ist das erste „System One“-Modell von TypeSafe. Man sendet einen Zustand und eine Reihe typisierter Fragen. Es gibt typisierte Antworten zurück, mit Wahrscheinlichkeiten, wenn die Frage mehr als einen Platzhalter enthält. Es gibt keinen Absatz, der analysiert werden muss.
Ein generatives Sprachmodell übernimmt die andere Aufgabe. Es ergänzt den Text. Du entscheidest dann, ob dieser Text ein Abteilungsname, eine Punktzahl oder eine Ablehnung war. Jevs Vertrag ist die Entscheidung selbst: Die zulässigen Antworten sind die von dir aufgelisteten, und die Antwort besteht aus einer dieser Antworten sowie einer Verteilung.
Diese Woche habe ich Jev nicht in Darkwood Flow eingebunden. Ich habe die Untersuchung dieser API genutzt, um ein kleines Spiel über den Moment vor einem Commit zu entwickeln: Weiß ich genug?
Drei Fragetypen
Der HTTP-Aufruf lautet POST https://api.typesafe.ai/v1/systemone. Der Body besteht aus einem Modellnamen (jev-latest ist der Alias, den ich in der Studie verwendet habe), einem state und einer Map mit questions. Die offizielle Dokumentation, die am 21. September 2026 für die Studie abgerufen wurde, beschreibt drei Fragetypen.
Auswahl. Welche dieser Optionen? Die Antwort enthält choice, probabilities und confidence. Die Wahrscheinlichkeiten sind eine Verteilung über die von Ihnen angegebenen Kriterien.
Score. Wo auf dieser geordneten Bewertungsskala? Die Antwort enthält score, eine legend, die die Bewertungsskala wiedergibt, probabilities und confidence. Die Punktzahl ist eine Position auf der Skala, kann also zwischen zwei Beschriftungen liegen.
Noul. Ist diese Aussage wahr? Die Antwort enthält noul, einen Float-Wert zwischen 0 und 1. Dieses Feld gibt den Grad der Unterstützung des Modells für die Aussage an. Es handelt sich nicht um einen Booleschen Wert, und die dokumentierte „Noul“-Antwort enthält kein separates Konfidenzfeld. „Choice“ und „Score“ hingegen schon.
Eine Anfrage wertet jede Frage anhand desselben Zustands aus. In der Dokumentation werden diese Fragen als unabhängig beschrieben: Eine spätere Frage, die eine frühere Antwort benötigt, stellt eine zweite Anfrage dar. Diese Latenz habe ich hier nicht gemessen. Die nicht authentifizierte Abfrage der Live-API im Rahmen der Studie, die ohne Schlüssel erfolgte, gab einen HTTP-403-Fehler und authentication_error zurück. Da TYPESAFE_API_KEY leer war, enthält dieser Artikel keine Live-Konfidenzwerte, Übereinstimmungsraten oder Zeitangaben.
Wahrscheinlichkeiten sind keine Garantie
Die Konfidenz – sowohl bei der Auswahl als auch bei der Bewertung – ist ein Wert, anhand dessen man verzweigen kann. Die nützliche Form im Anwendungscode ist ganz gewöhnlich:
if confidence is high and the choice is billing → route
if confidence is low, or noul sits near 0.5 → escalate
Diese Verzweigung ist eine Richtlinie. Sie ist kein Beweis. Ein hohes Konfidenzniveau kann immer noch auf die falsche Abteilung hindeuten, da die Zahl beschreibt, wie spitz die Verteilung ist, nicht aber, ob die Realität damit übereinstimmt. Ein Noul-Wert von 0,99 ist eine starke Unterstützung für die Aussage. Es ist dennoch ein Fließkommawert, den Sie als „Ja“ interpretieren.
Die Studie hat diese Felder auf dem Weg durch das ObjectResult von Symfony AI unverändert belassen. Sie hat sie innerhalb des Modell-Clients nicht zu einem Booleschen Wert zusammengefasst. Ein niedriges Konfidenzniveau ist eine erfolgreiche Antwort. Es handelt sich nicht um eine Ausnahme.
Die gleiche Studie verfügt über eine lokale Platform-Brücke unter /Users/math/Sites/tests/ai, mit dem Paket „symfony/ai-jev-platform“ und ausschließlich der Funktion INPUT_TEXT. Diese Brücke dient der lokalen Forschung. Sie wurde im Rahmen der Arbeit dieser Woche weder eingereicht, noch zusammengeführt oder veröffentlicht. Symfony AI verfügt nach wie vor über keine Kernfunktion namens „decision“, „choice“ oder „noul“. OUTPUT_STRUCTURED bezeichnet den JSON-Schema-Pfad von Symfony für ein generatives Modell. Die Struktur von Jev besteht aus den Fragen in der Anfrage. Das sind unterschiedliche Mechanismen, und die Brücke gibt nicht vor, dass dies anders sei.
Von einer Verteilung zu einer Puzzle-Regel
Darkwaar15 — Signal ruft Jev nicht auf. Es gibt keinen API-Schlüssel, keine Netzwerkanfrage und keine gesampelte Antwort. Die drei Namen stehen für die drei Operationen, die der Spieler ausführt:
- NOUL fragt, ob die beleuchteten Markierungen gerade sind.
- CHOICE fragt, welches der aufgeführten Muster zu den Markierungen passt. Eine beleuchtete Markierung ist
1, eine dunkle Markierung ist0. - SCORE fragt, welcher Bereich die Summe der Balken enthält: niedrig ist 0–1, mittel ist 2–3, hoch ist 4 und darüber.
Manche Felder sind anfangs geschlossen. Ein Quadrat zählt für die aktuelle Operation. Ein Raute ist Rauschen und verändert die Antwort niemals. Das Öffnen eines Feldes enthüllt einen Wert, der beim Erstellen des Levels festgelegt wurde.
Die Konfidenz im Spiel ist eine Zusammenfassung der verbleibenden Antworten, keine kalibrierte Wahrscheinlichkeit:
confidence = 1, wenn noch eine Antwort möglich ist
confidence = 1 - (possible - 1) / (universe - 1) andernfalls
„universe“ ist 2 für ein „noul“, die Anzahl der Muster für eine Auswahl und 3 für eine Punktzahl. Der Schwellenwert in jedem Level beträgt 0,70. Eine verbleibende Antwort entspricht einer Zuversicht von 1, was den Schwellenwert überschreitet. Zwei verbleibende Antworten von drei entsprechen 0,50, was den Schwellenwert nicht überschreitet. Der Spieler kann trotzdem auf „Commit“ drücken. Unterhalb des Schwellenwerts antwortet die Konsole mit „Nicht genug Signal“ und gibt den Messwert nicht preis. Auf oder oberhalb der Schwelle zeigt eine falsche Ausgabe den Messwert an und zählt als Fehlversuch. Drei Fehlversuche setzen das Level zurück.
Das ist die Übersetzung. Jevs Konfidenz kann sich weigern zu handeln. Das Rätsel macht diese Weigerung zur Regel und die versteckten Brunnen zum Grund dafür, dass die Antwort noch nicht eindeutig ist. Level 7 ist der eindeutigste Fall: Zwei Balken reichen aus, damit die Summe im hohen Bereich bleibt, selbst wenn ein dritter Balken noch geschlossen ist, da die Geisterhöhe dieses Balkens den Bereich nicht verlassen kann. Das Öffnen des Diamanten bewirkt nichts. Der interessante „Commit“ ist der, den man ausführt, bevor alle Brunnen geöffnet sind.
Die Lösungen sind Daten, die von einem headless Godot-Skript überprüft werden, das die skriptgesteuerten Abfragen für alle acht Level nachstellt und anschließend die reale Szene durch einen falschen Commit, eine Ablehnung bei geringer Sicherheit, einen Fehlversuch, der den Messwert anzeigt, einen Neustart und einen Clear führt. Beide Prüfungen wurden vor dem HTML5-Export als bestanden ausgegeben.
Die Konsole
Das Spiel befindet sich im Darkwaar-Monorepo als 2026-09-27-01M3H4X9806QZ6Z7D85F, Legacy-ID darkwaar15. Godot 4.6, Hochformat-Viewport 648×1152, eine Control-Szene. Drei Skripte übernehmen die Arbeit:
rules.gdenthält die acht Level und die Konfidenzregel. Es zeichnet nichts.signal_view.gdzeichnet die Vertiefungen, die Verbindungselemente und die Konfidenzanzeige. Der Strich auf der Anzeige ist das Tor.main.gdist die Commit-Schleife: Erkunden, Auswählen, Bestätigen, Fehlschlag, Neustart und der letzte Bildschirm.
Eingabe, Auswertung und Ausgabe sind auf der vertikalen Leinwand übereinander angeordnet. Geschlossene Felder behalten ihre Form, sodass ein Diamant sichtbar ist, bevor man eine Sonde daran verschwendet. Die Anzeige ist unterhalb des Gates cyanfarben und wechselt zu bernsteinfarben, sobald die Antwort eindeutig ist. Sowohl mit der Maus als auch per Touch kann man die Felder und die Schaltflächen betätigen.



Der Web-Export zeigt dieselbe Szene. bin/build-game darkwaar15 --validate --zip hat main.gdc, rules.gdc und signal_view.gdc gepackt. bin/smoke-web-build darkwaar15 hat die Leinwand mit einer Größe von 648×1152 geladen, einen nicht leeren Frame gefunden und keine schwerwiegenden Seitenfehler gemeldet. Ein Klick auf „Commit“ im Browser-Build führte zur Aufforderung „Wähle eine Ausgabe“, da nichts ausgewählt war; die HTML5-Schleife nimmt also Eingaben entgegen.
Veröffentlichung
Das Spiel ist auf itch.io unter darkwoodcom.itch.io/darkwaar15 zu finden. Der HTML5-Kanal entspricht dem in diesem Artikel beschriebenen Build. Ich habe diese URL aufgerufen und einen HTTP-200-Status erhalten.
Der Darkwaar-Beitrag ist unter darkwaar.com/blog/2026-09-27-darkwaar15 zu finden. Er gab einen HTTP-200-Status zurück, und die Seite enthält die Spielanleitung, die drei Screenshots und den itch-Link.
Flow bleibt eine Pipeline
In der ursprünglichen Untersuchung wurde gefragt, ob Jev in Flow gehört. Die Antwort aus dem Code, der diese Woche unverändert blieb, lautet, dass Flow bereits über den Ort verfügt, an dem eine Entscheidung getroffen wird. Ein Job ist JobInterface: eine Eingabe, ein Rückgabewert. Das Paket ist ein Ip. Das Ersetzen eines Regel-Jobs durch einen Jev-Job verändert den Inhalt des Pakets. Der Treiber, die IP-Strategie oder der Stage-Graph werden dadurch nicht verändert.
Ich habe weder Decision<T>, Choice<T> noch einen JevDriver zu darkwood/flow hinzugefügt. Ich habe keinen Flow-Integrationstest durchgeführt und auch keinen veröffentlicht. Eine Antwort mit geringer Sicherheit wäre weiterhin ein normales Job-Ergebnis. Die Eskalation wäre weiterhin das PHP des nächsten Jobs. Diese Arbeit wird verschoben. Das Ergebnis dieser Woche besteht aus der Recherche, der noch nicht eingereichten lokalen Platform-Brücke und Darkwaar15.
Wozu das Experiment dient
Ein Entscheidungsverfahren besteht aus einem Zustand, einer abgeschlossenen Menge von Antworten und einer Regel, wann man handeln darf. Jev ist eine Remote-Version der ersten beiden Elemente, ergänzt um eine Verteilung. Darkwaar15 behält die geschlossene Menge bei und ersetzt die Verteilung durch eine Tatsache, die der Spieler sehen kann: wie viele Antworten die geschlossenen Brunnen noch erreichen können. Das Tor ist der dritte Teil, und es ist der Teil, für den die Anwendung zuständig ist.
Die Konsole lehnt eine zu früh gedrückte richtige Taste ab. Das ist die Eigenschaft, die ich nachempfinden wollte. Ausreichende Informationen sind ein Zustand des Rätsels, genauso wie ausreichendes Vertrauen ein Zustand des Programms ist, und keine der beiden Zahlen ist eine Garantie dafür, dass der Commit richtig war.