State machine: Zustand per Wert setzen und verzweigen (Maschine aus Variable/Liste) #58

Closed
opened 2026-09-12 18:02:39 +02:00 by meleki · 1 comment
Owner

Grenze aus #51 (Punkt 3 der Entscheidungen): Kommt die Maschine an State branch/Set state aus einer Variablen oder einem Item at, gibt es keine Zustandsports – ein Port wird aus dem Graphen abgeleitet, nicht aus einem Laufzeitwert. Damit lässt sich eine Maschine zwar als Wert herumreichen (Art statemachine), aber nicht dynamisch bedienen.

Vorschlag: zwei Nodes, die mit dem Zustands-Namen arbeiten statt mit Ports:

  • Set state by name: exec, machine, state (Text) rein; setzt den Zustand, dessen Name (oder Id) passt, sonst nichts.
  • State branch bekommt zusätzlich einen festen Ausgang else/none für „kein Zustand“ – heute endet der Fluss dort stumm, was beim Debuggen schwer zu sehen ist.

Passt zu Current state (#57): Name raus, Name rein.


Folge-Issue zu #51 (State machine, Commit e7d82bd, 2026-09-12).

Grenze aus #51 (Punkt 3 der Entscheidungen): Kommt die Maschine an `State branch`/`Set state` aus einer **Variablen** oder einem `Item at`, gibt es **keine Zustandsports** – ein Port wird aus dem Graphen abgeleitet, nicht aus einem Laufzeitwert. Damit lässt sich eine Maschine zwar als Wert herumreichen (Art `statemachine`), aber nicht dynamisch bedienen. **Vorschlag: zwei Nodes, die mit dem Zustands-*Namen* arbeiten** statt mit Ports: - `Set state by name`: `exec`, `machine`, `state` (Text) rein; setzt den Zustand, dessen Name (oder Id) passt, sonst nichts. - `State branch` bekommt zusätzlich einen festen Ausgang `else`/`none` für „kein Zustand“ – heute endet der Fluss dort stumm, was beim Debuggen schwer zu sehen ist. Passt zu `Current state` (#57): Name raus, Name rein. --- Folge-Issue zu #51 (State machine, Commit `e7d82bd`, 2026-09-12).
meleki added the state-machine label 2026-09-12 18:02:39 +02:00
admin added the low-priority label 2026-09-12 18:11:03 +02:00
admin added this to the Development project 2026-09-13 13:29:59 +02:00
admin removed this from the Development project 2026-09-13 13:30:59 +02:00
admin added this to the Development project 2026-09-13 13:45:44 +02:00
admin moved this to Next in Development on 2026-09-14 21:44:19 +02:00
admin moved this to Queue in Development on 2026-09-14 21:47:44 +02:00
admin moved this to Next in Development on 2026-09-16 08:19:19 +02:00
Author
Owner

Umgesetzt in 1135205, Wiki in eacf87e.

Die Lücke, gemessen: Set state und State branch leiten ihre Ports aus dem Graphen ab (machineIdOf() liest den Inline-Pick oder ein State machine-Literal). Kam die Maschine aus einer Variablen oder aus Item at, lieferte machineOf() null, statePorts() eine leere Liste — Set state hatte dann keinen einzigen Eingang, State branch keinen einzigen Ausgang. Die Maschine ließ sich herumreichen, aber nicht bedienen.

Vier Entscheidungen, abgestimmt:

  1. Auflösung Id zuerst, dann Name. stateByName() in stateMachine.ts: passt der Text auf eine State-Id, wird die genommen, sonst der Zustand dieses Namens. Ein Name, den zwei Zustände tragen, antwortet mit nichts — dieselbe Regel, die transitionTo bei zwei gleichnamigen Übergängen befolgt, und aus demselben Grund: ohne etwas im Graphen, das zwischen ihnen entscheidet, wäre jede Wahl geraten.
  2. State branch bekommt else — abgeleitet statt fest, damit der Ausgang unter den Zuständen sitzt, so wie die Ausnahme es am Branch auch tut. Er feuert, wann immer kein Zustands-Ausgang passt: kein Zustand gesetzt, ein Zustand einer fremden Maschine, oder eine Maschine, die als Wert ankommt und deshalb gar keine Zustands-Ausgänge hat. Ein Fluss, der in State branch läuft, kommt damit immer irgendwo heraus. Ein Guard verhindert die Schlüssel-Kollision, falls je eine State-Id else hieße.
  3. Set state by name (neuer Node): exec, machine, Text state — und ein zweiter Exec-Ausgang not found, damit ein Tippfehler, ein gelöschter Zustand oder eine leere Maschine nicht still verschluckt wird, sondern beantwortet werden kann (Log, Standardzustand).
  4. Datenseite unangetastet — Current state liefert bei dynamischer Maschine schon heute name und id, wer vergleichen will nimmt Equals. Kein vierter Weg, dasselbe zu fragen.

Belegt:

npm run check              -> 86 Files, 1097 Tests, grün (vorher 1090)
npm run build              -> ok
GM_STEPS=26 node e2e.mjs   -> ALL PASSED - 63 checks
voller Lauf                -> ALL PASSED - 932 checks, 0 FAIL

Der eigentliche Nachweis ist der neue e2e-Block 26j: ein String mit der Maschinen-Id speist Set state by name und einen State branch, der Graph kann die Maschine also nicht benennen — im Lauf funktioniert sie trotzdem. Geprüft wird alles drei in einer laufenden Runde: Zustand per Name gesetzt, dynamischer Branch verlässt über else, falscher Name landet auf not found.

Wiki: State-machines.md (der Absatz "Ports kommen aus dem Graphen" nennt jetzt auch den Ausweg samt Preis: ein Tippfehler ist nicht mehr unmöglich), Behaviors.md, Home.md, Development.md auf 932.

CI-Task 54 auf 1135205 läuft noch; fällt er rot, mache ich das Issue wieder auf.

Umgesetzt in `1135205`, Wiki in `eacf87e`. **Die Lücke, gemessen:** `Set state` und `State branch` leiten ihre Ports aus dem *Graphen* ab (`machineIdOf()` liest den Inline-Pick oder ein `State machine`-Literal). Kam die Maschine aus einer Variablen oder aus `Item at`, lieferte `machineOf()` `null`, `statePorts()` eine leere Liste — `Set state` hatte dann keinen einzigen Eingang, `State branch` keinen einzigen Ausgang. Die Maschine ließ sich herumreichen, aber nicht bedienen. **Vier Entscheidungen, abgestimmt:** 1. **Auflösung Id zuerst, dann Name.** `stateByName()` in `stateMachine.ts`: passt der Text auf eine State-Id, wird die genommen, sonst der Zustand dieses Namens. Ein Name, den **zwei** Zustände tragen, antwortet mit nichts — dieselbe Regel, die `transitionTo` bei zwei gleichnamigen Übergängen befolgt, und aus demselben Grund: ohne etwas im Graphen, das zwischen ihnen entscheidet, wäre jede Wahl geraten. 2. **`State branch` bekommt `else`** — abgeleitet statt fest, damit der Ausgang *unter* den Zuständen sitzt, so wie die Ausnahme es am `Branch` auch tut. Er feuert, wann immer kein Zustands-Ausgang passt: kein Zustand gesetzt, ein Zustand einer fremden Maschine, oder eine Maschine, die als Wert ankommt und deshalb gar keine Zustands-Ausgänge hat. Ein Fluss, der in `State branch` läuft, kommt damit immer irgendwo heraus. Ein Guard verhindert die Schlüssel-Kollision, falls je eine State-Id `else` hieße. 3. **`Set state by name`** (neuer Node): `exec`, `machine`, Text `state` — und ein zweiter Exec-Ausgang **`not found`**, damit ein Tippfehler, ein gelöschter Zustand oder eine leere Maschine nicht still verschluckt wird, sondern beantwortet werden kann (Log, Standardzustand). 4. **Datenseite unangetastet** — `Current state` liefert bei dynamischer Maschine schon heute `name` und `id`, wer vergleichen will nimmt `Equals`. Kein vierter Weg, dasselbe zu fragen. **Belegt:** ``` npm run check -> 86 Files, 1097 Tests, grün (vorher 1090) npm run build -> ok GM_STEPS=26 node e2e.mjs -> ALL PASSED - 63 checks voller Lauf -> ALL PASSED - 932 checks, 0 FAIL ``` Der eigentliche Nachweis ist der neue e2e-Block 26j: ein `String` mit der Maschinen-Id speist `Set state by name` und einen `State branch`, der Graph kann die Maschine also nicht benennen — im Lauf funktioniert sie trotzdem. Geprüft wird alles drei in einer laufenden Runde: Zustand per Name gesetzt, dynamischer Branch verlässt über `else`, falscher Name landet auf `not found`. **Wiki:** `State-machines.md` (der Absatz "Ports kommen aus dem Graphen" nennt jetzt auch den Ausweg samt Preis: ein Tippfehler ist nicht mehr unmöglich), `Behaviors.md`, `Home.md`, `Development.md` auf 932. CI-Task 54 auf `1135205` läuft noch; fällt er rot, mache ich das Issue wieder auf.
admin moved this to Done in Development on 2026-09-16 09:12:02 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#58