Files
TerminalBasic/openspec/changes/archive/2026-09-04-phase-4-ereignisschleife/tasks.md

7.9 KiB
Raw Blame History

1. Belege aus der Original-Hilfe

  • 1.1 Einzelseiten zu ON TIMER, ON KEY, ON UEVENT, ON SIGNAL, TIMER, KEY(n), UEVENT, SIGNAL(n), EVENT und SetUEvent erfassen und in umfang-und-form.md dieses Changes wortgetreu festhalten (Syntaxzeilen, Wertebereiche von n, Reihenfolge gleichzeitig fälliger Ereignisse, Verhalten in Prozeduren); verifiziert durch die vorhandene Datei mit Quellenangabe je Element
  • 1.2 Aus 1.1 die Festlegungen ableiten, die die Hilfe nicht hergibt, und sie als Abweichung in docs/sprachreferenz.md §8 eintragen — insbesondere die Quellenzuordnung von SIGNAL(n); verifiziert durch den Abschnitt „Abweichungen" mit je einem Satz Begründung
  • 1.3 Delta-Specs an die Belege aus 1.1 angleichen (Leitplanke „Referenzverhalten schlägt Eleganz"): EVENT ohne STOP, automatischer STOP/ON um den Handler, OFF verwirft Gemerktes, Wertebereiche von KEY/TIMER/SIGNAL; verifiziert durch openspec validate --strict und die geänderten Requirements

2. Zeit- und Mausquelle im Host (BREAKING)

  • 2.1 Host-Trait um eine monotone Zeitabfrage erweitern und TerminalHost daran anschließen; verifiziert durch cargo build, das alle drei Host-Implementierungen ohne Warnung übersetzt
  • 2.2 CaptureHost um eine stellbare virtuelle Uhr erweitern (setzen und vorrücken); verifiziert durch einen Unit-Test, der die Uhr vorrückt und den gelesenen Wert prüft
  • 2.3 Signalquelle: Marke im Signalhandler setzen, Übersetzung in ein Ereignis beim Abholen (D8), SIGINT und SIGTERM plattformübergreifend über signal-hook; verifiziert durch einen Unit-Test, der eine gesetzte Marke als Ereignis wiederfindet
  • 2.4 Mausereignis in das Ereignismodell aufnehmen (Drücken, Loslassen, Bewegung, Taste, Umschaltzustand, Position) und TerminalHost die crossterm-Mausereignisse durchreichen lassen, statt sie zu verwerfen; verifiziert durch Unit-Tests der Abbildung je Ereignisart
  • 2.5 Umrechnung auf 1-basierte Zellenkoordinaten in der Darstellungsschicht, Ereignisse außerhalb der Fläche verwerfen (D7); verifiziert durch Unit-Tests an den Rändern — Zelle 1,1, letzte Zelle, Position außerhalb, und dieselben Fälle nach einer Größenänderung
  • 2.6 CaptureHost kann Mausereignisse einspeisen und die Reihenfolge gegenüber Tastenereignissen bleibt erhalten; verifiziert durch einen Unit-Test mit gemischter Folge

3. Trap-Zustände in der Laufzeit

  • 3.1 Trap-Tabelle in RtState: je Quelle Zustand ON/OFF/STOP, höchstens ein anstehendes Ereignis, Zielkennung; verifiziert durch Unit-Tests für die drei Zustandsübergänge inklusive „STOP merkt genau eines"
  • 3.2 Hauptschalter EVENT als Überlagerung der Einzelzustände; verifiziert durch einen Unit-Test, der nach EVENT ON den vorherigen Einzelzustand wiederfindet
  • 3.3 Fälligkeit der Zeit-Traps aus der Host-Zeit berechnen; verifiziert durch einen Unit-Test mit virtueller Uhr über mehrere Fristen inklusive übersprungener Frist
  • 3.4 SetUEvent als Auslöser des benutzerdefinierten Ereignisses; verifiziert durch einen Unit-Test, der genau eine Zustellung sieht
  • 3.5 Getrappte Tasten am Zustellpunkt aus der Tastenschlange nehmen (D5); verifiziert durch Unit-Tests für beide Richtungen — getrappte Taste erscheint nicht bei INKEY$, nicht getrappte bleibt erhalten
  • 3.7 Umschaltzustand im Tastenereignis mitführen und KEY n, CHR$(flag)+CHR$(scan) für n = 1525 als Erklärung einer Trap-Taste (statt Makrozuweisung); verifiziert durch Unit-Tests für Strg+A mit und ohne Strg sowie durch die Scancode-Tabelle aus der Original-Hilfe
  • 3.6 Mausereignisse ohne Verbraucher am Zustellpunkt verwerfen und die Warteschlange begrenzen (D7); verifiziert durch einen Unit-Test, der viele Bewegungsereignisse einspeist und die Warteschlangenlänge prüft

4. Zustellung in der VM

  • 4.1 Zustellbit im Flagwort und Fälligkeitsprüfung an Instr::Stmt; verifiziert durch einen VM-Test, der ohne aktiven Trap keine Zustellung auslöst
  • 4.2 Trap-Frame auf den Modulrumpf legen und mit RETURN abräumen (D2), inklusive eigenem GOSUB-Stapel und RETURN label; verifiziert durch VM-Tests für Zustellung aus dem Modulrumpf und aus einer SUB heraus, jeweils mit unverändertem Zustand danach
  • 4.3 Eigene Quelle während des Handlers stoppen und mit RETURN freigeben; verifiziert durch einen VM-Test, der den Handler nicht erneut betritt
  • 4.7 Anweisungsgrenze in den Rücksprung jeder Schleife legen — ohne sie ist FOR i = 1 TO n: NEXT für Ereignisse, Breakpoints und Abbruch taub (Befund bei 4.2); verifiziert durch einen Test, der für alle vier Schleifenformen eine Grenze im Kreis nachweist, und dadurch, dass die Trap-Tests mit leerem Schleifenrumpf laufen
  • 4.4 Reihenfolge bei mehreren fälligen Ereignissen nach Beleg aus 1.1 festlegen; verifiziert durch einen VM-Test mit zwei gleichzeitig fälligen Quellen
  • 4.5 DOEVENTS und SLEEP von Builtins auf Anweisungen mit Zustellung umstellen; verifiziert durch VM-Tests — Handler läuft innerhalb einer DOEVENTS-Schleife, und SLEEP endet vorzeitig durch eine Zustellung
  • 4.8 Befund bei 4.6: ERL meldete die Zeile des Fehlerhandlers statt der Fehlerzeile, sobald der Handler selbst nummeriert war — laufende Zeilennummer und ERL getrennt; verifiziert durch einen Regressionstest mit nummeriertem Handler
  • 4.6 Fehler in einem Handler an die geltende Fehlerbehandlung geben, RESUME bezieht sich auf den Handler; verifiziert durch einen VM-Test, dessen ERL die Zeile im Handler nennt

5. Frontend

  • 5.1 Grammatik für ON TIMER(n)/KEY(n)/UEVENT/SIGNAL(n) GOSUB ziel als eigene Konstrukte; verifiziert durch einen Parser-Test, der zeigt, dass daraus kein berechnetes ON ausdruck GOSUB entsteht
  • 5.2 Signaturen und Wertebereichsprüfung der Steueranweisungen und von SetUEvent; verifiziert durch Sema-Tests, deren Diagnosen das Element namentlich nennen (ON KEY(99), ON PEN, CALL SetUEvent)
  • 5.3 Trap-Ziele wie GOSUB-Ziele auflösen; verifiziert durch einen Sema-Test, der ein fehlendes Label namentlich meldet
  • 5.4 Absenkung ins HIR/Bytecode, Unsupported-Absenkung von SETUEVENT entfernen; verifiziert durch cargo test -p tb-frontend, inklusive des Inventartests

6. Korpus und Harness

  • 6.1 Kopfzeilen-Direktive ' tb-clock: <n>ms/Zustellpunkt im Harness auswerten und ohne Direktive den Lauf mit zeitgesteuerten Traps abweisen (D6); verifiziert durch einen Harness-Test für beide Fälle
  • 6.2 Korpusprogramme mit Sollausgabe anlegen: Zeit-Trap, Tasten-Trap mit Eingabestrom-Nachweis, SetUEvent, die drei Maskierungszustände, EVENT-Hauptschalter, Rückkehr in eine unterbrochene Schleife; verifiziert durch cargo test -p tb-cli, byte-genau gegen die .out
  • 6.3 Denselben Korpuslauf zweimal ausführen und auf identische Ausgabe prüfen; verifiziert durch einen Test, der die Reproduzierbarkeit sicherstellt

7. Dokumentation und Inventar

  • 7.1 docs/sprachreferenz.md §8 ausformulieren: Zustellpunkte, Maskierung, Wiedereintritt, Wertebereiche; verifiziert durch den Abschnitt, der jede Spec-Zusicherung wiederfindet
  • 7.2 docs/bibliothek.md um die zehn Elemente erweitern; verifiziert durch je einen Eintrag mit Syntax und Wirkung
  • 7.3 docs/inventar.md: die zehn Einträge auf implementiert mit Fundstelle setzen; verifiziert durch inventar_stimmt_mit_code_ueberein
  • 7.4 PLAN.md: Eingangsaufgabe und Punkt „Klassische Ereignis-Traps" der Phase 4 abhaken, Befunde festhalten; verifiziert durch die aktualisierte Phase-4-Liste

8. Abnahme

  • 8.1 benches/vm.rs vor und nach der Änderung messen und das Ergebnis in der Änderungsnotiz festhalten; verifiziert durch die Messwerte zur Zusicherung „ohne aktiven Trap kein messbarer Aufwand"
  • 8.2 cargo test über alle Crates grün und openspec validate phase-4-ereignisschleife --strict ohne Befund; verifiziert durch beide Kommandos