enhancement
major
minor
major
minor
major
#29971
React-Views: Die Ausführbarkeit eines Befehls übersieht einen Commit eines fremden Threads während des Seitenaufbaus
Betrifft jede React-View-Anwendung mit Befehlen, deren Ausführbarkeit vom Eingabeobjekt abhängt, wenn ein anderer Thread (Scheduler, Engine) dieses Objekt ändert, während die Seite aufgebaut wird. Gefunden in Pietro (Openium/Pietro #1031) am 24.10.2026.
Problem
- Beobachtet: Ein Befehl "Lauf abbrechen" mit executability auf dem Eingabeobjekt (Lauf) bleibt aktiv, wenn der Lauf auf dem Thread der Workflow-Engine endet, während die Seite des Laufs gerade aufgebaut wird. Endet der Lauf später, nach dem Aufbau, wird der Befehl richtig deaktiviert.
- Erwartet: Die Ausführbarkeit folgt dem Objekt auch für einen Commit, der in das Zeitfenster des Seitenaufbaus fällt.
- Reproduzieren: Ein Objekt mit Befehl, dessen executability dessen Zustand prüft; die Seite öffnen, während ein anderer Thread das Objekt im selben Augenblick auf einen Zustand setzt, der den Befehl sperrt (in Pietro: Läufe → Hintergrundprüfung in einem leeren Projekt → "Starten…": der Lauf endet in Millisekunden auf dem Engine-Thread, die Lauf-Seite öffnet sich gleichzeitig). A/B zweimal reproduziert: ohne Workaround aktiv, mit Workaround deaktiviert.
- Workaround in der Anwendung: observed-types="tl.ai.flow:Run" am Befehl.
- Umgebung: TopLogic 8.0.0-alpha10, React-View-DSL.
Ursache (vermutet)
- Die Beobachtung des Eingabeobjekts allein registriert sich erst nach dem ersten Rechnen der Ausführbarkeit; ein Commit zwischen Rechnen und Registrieren löst keine Neuberechnung aus. Eine Typ-Beobachtung fängt ihn, weil sie früher registriert ist oder jeden Commit des Typs sieht.
Vorschlag
- Die Beobachtung des Eingabeobjekts vor dem ersten Rechnen registrieren, oder nach der Registrierung einmal neu rechnen, wenn die Revision des Objekts seit dem Rechnen gestiegen ist.
Erledigt wenn
- Die Reproduktion oben zeigt den Befehl ohne observed-types deaktiviert.
- Ein Test, der auf dem heutigen Stand fehlschlägt: Commit auf dem Eingabeobjekt zwischen Rechnen und Registrieren der Beobachtung, danach ist die Ausführbarkeit aktuell.
Verweise
- Pietro #1031 (Commit 05614ce1, Workaround), Bericht des Workers wf-jump (Openium, lokal).
Lösung
Tatsächliche Ursache: Die Reihenfolge von Rechnen und Registrieren ist für sich harmlos: Modell-Ereignisse erreichen die Beobachter erst, wenn das Fenster sie synthetisiert (am Ende einer Anfrage), und dann ist die Beobachtung des neuen Eingabeobjekts längst registriert. Der Heartbeat des SSE-Kanals (SSEUpdateQueue, alle 15 s) synthetisiert die Ereignisse des Fensters aber auf dem Scheduler-Thread ohne die Interaktion der Sitzung (ReactWindowRegistry.beginInteraction()), die jede Anfrage beim Umbau der Kontroll-Bäume hält. Fällt der Heartbeat in den Seitenaufbau eines Befehls, liefert er den fremden Commit aus, bevor (oder für den Heartbeat-Thread unsichtbar, während) die Beobachtung des Eingabeobjekts registriert wird; das Ereignis geht verloren. Eine Typ-Beobachtung war schon lange vorher registriert und fängt es deshalb.
Behebung:
- ReactWindowRegistry bietet eine Interaktion an, die mit Zeitlimit begonnen wird und ausfällt, solange eine andere Anfrage die Bäume hält.
- Der Heartbeat synthetisiert die Modell-Ereignisse nur noch innerhalb einer solchen Interaktion. Ist das Fenster gerade belegt, entfällt die Auslieferung: die belegende Anfrage synthetisiert am Ende selbst, sonst der nächste Heartbeat.
- Die Chat-Integration (tl-chat, WindowInteraction) betritt Fenster aus Agenten-Threads über dieselbe Schnittstelle statt über einen eigenen Thread-Pool.
Test: Ein Heartbeat während einer gehaltenen Interaktion liefert keine Ereignisse aus; nach deren Ende erreicht der Commit die Beobachter, und die Ausführbarkeit eines Befehls ist ohne observed-types aktuell.