Ereigniszustellung und Hostgrenzen korrigieren und Change archivieren
This commit is contained in:
@@ -4,6 +4,18 @@ Geprüfter Code: `19804e0e2de9eb5a8b0ef256b5be76c741560e07` in TerminalBasic. De
|
||||
|
||||
Die Implementierung deckt breite Grundpfade ab, erfüllt den gesamten Vertrag aber nicht. **25 Befunde**: 10 mit hoher, 12 mit mittlerer Priorität, 2 Dokumentationsabweichungen und 1 Vertragsklärung. Die Priorität bewertet die Auswirkung, nicht den Aufwand. Befunde können mehrere Requirements betreffen.
|
||||
|
||||
## Umsetzungsstand: Ereigniszustellung und Hostgrenzen
|
||||
|
||||
F04, F05, F06, F07, F08, F18 und F20 sind im archivierten Change
|
||||
[ereigniszustellung-und-hostgrenzen](../../openspec/changes/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md)
|
||||
implementiert. Die fünf Restfehler der anschließenden
|
||||
[Verifikation](../../openspec/changes/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/review.md)
|
||||
sind behoben: 419 Workspace-Tests und alle sechs ursprünglichen Review-Proben
|
||||
bestehen. Die konkreten Implementierungs- und aktuellen Abnahmenachweise stehen in
|
||||
[verification.md](../../openspec/changes/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/verification.md).
|
||||
Die Befundtexte und die Matrix unten dokumentieren weiterhin den ursprünglichen
|
||||
Reviewstand; die übrigen Changes bleiben eigenständig.
|
||||
|
||||
## Prüfmethode und Grenzen
|
||||
|
||||
- Alle Requirements/Szenarien gelesen und gegen Einstiegspunkte, Implementierung und vorhandene Tests abgeglichen. Die Matrix unten enthält jeden Requirement-Titel einmal.
|
||||
@@ -46,7 +58,7 @@ Ein eingespeistes Signal(2) bei definiertem und eingeschaltetem Trap ergibt kein
|
||||
|
||||
Beleg: [crates/tb-runtime/src/builtins.rs:121](../../crates/tb-runtime/src/builtins.rs#L121). Vertrag: [openspec/specs/ereignissteuerung/spec.md:186](../../openspec/specs/ereignissteuerung/spec.md#L186).
|
||||
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
|
||||
### F05 — KEY STOP entfernt die Taste aus dem Eingabestrom (hoch)
|
||||
|
||||
@@ -54,7 +66,7 @@ Bei KEY(1) STOP wird F1 zwar für das spätere ON gemerkt, aber aus dem normalen
|
||||
|
||||
Beleg: [crates/tb-runtime/src/traps.rs:215](../../crates/tb-runtime/src/traps.rs#L215). Vertrag: [openspec/specs/ereignissteuerung/spec.md:81](../../openspec/specs/ereignissteuerung/spec.md#L81), [openspec/specs/ereignissteuerung/spec.md:143](../../openspec/specs/ereignissteuerung/spec.md#L143).
|
||||
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
|
||||
### F06 — Forms-Handler und Eingaben verlieren ihre Reihenfolge (hoch)
|
||||
|
||||
@@ -62,7 +74,7 @@ Der Fokuswechsel Text1 nach Text2 ergibt in der VM GL statt LG: GotFocus läuft
|
||||
|
||||
Beleg: [crates/tb-vm/src/interp.rs:570](../../crates/tb-vm/src/interp.rs#L570). Vertrag: [openspec/specs/ereignissteuerung/spec.md:32](../../openspec/specs/ereignissteuerung/spec.md#L32), [openspec/specs/forms-steuerelemente/spec.md:30](../../openspec/specs/forms-steuerelemente/spec.md#L30), [openspec/specs/forms-objektmodell/spec.md:106](../../openspec/specs/forms-objektmodell/spec.md#L106).
|
||||
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
|
||||
### F07 — Offenes Menü verhindert Traps nicht an allen Zustellpunkten (hoch)
|
||||
|
||||
@@ -70,7 +82,7 @@ Ein UEVENT-Trap wird während eines geöffneten Menüs an einer gewöhnlichen An
|
||||
|
||||
Beleg: [crates/tb-vm/src/interp.rs:1139](../../crates/tb-vm/src/interp.rs#L1139). Vertrag: [openspec/specs/forms-steuerelemente/spec.md:102](../../openspec/specs/forms-steuerelemente/spec.md#L102), [openspec/specs/ereignissteuerung/spec.md:59](../../openspec/specs/ereignissteuerung/spec.md#L59).
|
||||
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
|
||||
### F08 — Zeit- und Wartepfade verletzen die Hostgrenze (mittel)
|
||||
|
||||
@@ -78,7 +90,7 @@ Drei einfache Anweisungen ohne Trap/Form-Timer lesen die Hostzeit sechsmal. form
|
||||
|
||||
Beleg: [crates/tb-vm/src/interp.rs:602](../../crates/tb-vm/src/interp.rs#L602). Vertrag: [openspec/specs/vm-ausfuehrung/spec.md:118](../../openspec/specs/vm-ausfuehrung/spec.md#L118), [openspec/specs/ereignissteuerung/spec.md:15](../../openspec/specs/ereignissteuerung/spec.md#L15), [openspec/specs/ereignissteuerung/spec.md:59](../../openspec/specs/ereignissteuerung/spec.md#L59), [openspec/specs/forms-objektmodell/spec.md:106](../../openspec/specs/forms-objektmodell/spec.md#L106).
|
||||
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
|
||||
### F09 — Control-Namen sind faktisch global statt formularlokal (hoch)
|
||||
|
||||
@@ -158,7 +170,7 @@ Statisch belegt: Der Terminal-Mapper behandelt KeyCode::Tab, aber nicht KeyCode:
|
||||
|
||||
Beleg: [crates/tb-ui/src/host.rs:179](../../crates/tb-ui/src/host.rs#L179). Vertrag: [openspec/specs/forms-steuerelemente/spec.md:30](../../openspec/specs/forms-steuerelemente/spec.md#L30).
|
||||
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
|
||||
### F19 — Der Zonenzustand ist für BASIC nicht abfragbar (mittel)
|
||||
|
||||
@@ -174,7 +186,7 @@ tb-vm hängt unmittelbar von tb-ui ab; dort sind ratatui, crossterm und signal-h
|
||||
|
||||
Beleg: [crates/tb-vm/Cargo.toml:15](../../crates/tb-vm/Cargo.toml#L15). Vertrag: [openspec/specs/textbildschirm/spec.md:92](../../openspec/specs/textbildschirm/spec.md#L92).
|
||||
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
Umsetzung: [ereigniszustellung-und-hostgrenzen](../../openspec/changes/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
|
||||
|
||||
### F21 — Inventarstatus beweist kein vorhandenes Laufzeitverhalten (mittel)
|
||||
|
||||
@@ -221,7 +233,7 @@ Umsetzung: [spezifikationsabgleich-und-regressionsnachweise](../../openspec/chan
|
||||
| Reihenfolge | Change | Befunde | Abhängigkeit |
|
||||
|---|---|---|---|
|
||||
| 1 | [isam-transaktionen-und-dateinummern](../../openspec/changes/archive/2026-09-05-isam-transaktionen-und-dateinummern/proposal.md) | F01, F02, F03 | Eigenständig; bei gemeinsamen Dateien sequenziell integrieren |
|
||||
| 2 | [ereigniszustellung-und-hostgrenzen](../../openspec/changes/ereigniszustellung-und-hostgrenzen/proposal.md) | F04, F05, F06, F07, F08, F18, F20 | Eigenständig; bei gemeinsamen Dateien sequenziell integrieren |
|
||||
| 2 | [ereigniszustellung-und-hostgrenzen](../../openspec/changes/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md) | F04, F05, F06, F07, F08, F18, F20 | Eigenständig; bei gemeinsamen Dateien sequenziell integrieren |
|
||||
| 3 | [forms-zustand-und-bedienung](../../openspec/changes/forms-zustand-und-bedienung/proposal.md) | F12, F13 | Nach Ereigniszustellung |
|
||||
| 4 | [projektmodule-und-kompilat](../../openspec/changes/projektmodule-und-kompilat/proposal.md) | F09, F10, F11, F24 | Eigenständig; bei gemeinsamen Dateien sequenziell integrieren |
|
||||
| 5 | [laufzeit-eingabe-und-systemstatus](../../openspec/changes/laufzeit-eingabe-und-systemstatus/proposal.md) | F14, F15, F16, F17, F19 | Eigenständig; bei gemeinsamen Dateien sequenziell integrieren |
|
||||
|
||||
@@ -55,15 +55,76 @@ enum Value {
|
||||
|
||||
## Ausführungsmodell / Unterbrechbarkeit
|
||||
|
||||
- Die Interpreterschleife läuft in **Ticks**: nach jeder Anweisung (Grenze
|
||||
aus der Zeilentabelle) prüft sie ein Flag-Set: Breakpoint? Einzelschritt?
|
||||
Strg+Untbr? Ereignis-Queue nicht leer und Zustellung erlaubt?
|
||||
- Ereigniszustellung (Forms, Timer) erfolgt kooperativ: nur an
|
||||
Zustellpunkten (`DOEVENTS`, `SLEEP`, blockierende Eingabe, Ende einer
|
||||
Ereignisprozedur) — wie im Vorbild.
|
||||
- Die VM ist eine gewöhnliche zustandsbehaftete Struktur, `step()`-basiert;
|
||||
die einbettende Schleife (IDE-Debugger oder Runner) treibt sie. Kein
|
||||
eigener Thread nötig; Terminal-Events werden zwischen Ticks gepollt.
|
||||
Die VM läuft auf dem aufrufenden Thread. `Vm::run` liefert bei STOP,
|
||||
Breakpoint, Einzelschritt, Programmende oder Fehler ein `RunEvent` an den
|
||||
Runner zurück. `Stmt` markiert Anweisungsgrenzen; es gibt keine Prüfung
|
||||
nach jedem Opcode.
|
||||
|
||||
Die gemeinsame Zustellentscheidung gilt an Anweisungsgrenzen, bei
|
||||
`DOEVENTS`, während `SLEEP` und während blockierender Konsoleneingabe. Eine
|
||||
zugestellte Ereignisprozedur beginnt ihre erste Anweisung, bevor ein
|
||||
weiterer Handler sie unterbrechen darf. Forms-Handler laufen normalerweise
|
||||
bis zur Rückkehr; explizites DOEVENTS und blockierendes Warten können andere
|
||||
Handler verschachteln, aber nie dieselbe laufende Forms-Ereignisprozedur.
|
||||
Die Rückkehr aus dem äußersten normalen Forms-Handler arbeitet wartende
|
||||
Forms-Ereignisse geordnet ab. Objekt-Opcodes stellen nur erforderliche
|
||||
synchrone LOAD-Handler zu; deren Rückkehr zieht keine unabhängigen Ereignisse
|
||||
mitten in eine Anweisung vor. Ein offenes
|
||||
Menü sperrt klassische Traps und Forms-Timer, ohne ON/OFF/STOP zu verändern.
|
||||
Beim Menüschließen wird die Zustellbarkeit vor erneutem Warten geprüft.
|
||||
|
||||
INPUT, LINE INPUT, INPUT$ und RANDOMIZE ohne Argument teilen einen
|
||||
fortsetzbaren Konsolenleser. Teiltext und Restlänge liegen im aufrufenden
|
||||
Frame; Referenzen und Ausdrucksoperanden bleiben bis zum Abschluss auf dem
|
||||
Stack. Nach jedem Hostereignis kann die VM einen Handler ausführen und
|
||||
danach am Eingabe-Opcode fortsetzen, auch über STOP/CONT und verschachtelte
|
||||
Eingaben hinweg. Fehler-Unwinding und RETURN label verwerfen die abgebrochene
|
||||
Eingabe. Während dieses Lesens gehören ungetrappte Tasten der Konsole.
|
||||
|
||||
`RtState::eingaben` hält Tasten und Maus in Hostreihenfolge, auch beim
|
||||
Übergeben an Dialoge. Die VM nimmt eine Forms-Eingabe samt ihren Handlern
|
||||
vor der nächsten Eingabe an. Konsolentasten bleiben lesbar; Maus ohne
|
||||
Formular oder außerhalb der Bildschirmfläche wird verworfen. KEY ON
|
||||
entnimmt getrappte Tasten. KEY STOP merkt höchstens einen Trap, markiert die
|
||||
betroffenen Eingaben als bereits gemerkt und lässt sie lesbar, auch nach ON.
|
||||
Vor der klassischen Quellenauswahl wird der getrappte Tastenanfang der Queue
|
||||
gemeldet: KEY behält seine Priorität vor TIMER/UEVENT/SIGNAL, ohne eine davor
|
||||
wartende Mauseingabe zu überholen. EOF beendet die Quelle; modale und
|
||||
modellose Formularschleifen arbeiten schon angenommene Ereignisse noch ab.
|
||||
|
||||
`Host::jetzt_ms` ist die einzige Uhr für Ereignisfristen. Die VM fragt sie
|
||||
nur für aktive Zeitquellen, SLEEP-Fristen und zeitabhängige Mausauswertung
|
||||
ab. Der klassische TIMER wird weiterhin bei Anzeigen, expliziter
|
||||
Kooperation und ansonsten alle 64 Anweisungsgrenzen geprüft.
|
||||
`Host::warten(Option<u64>)` wartet auf ein Ereignis oder die absolute
|
||||
Deadline derselben Uhr; `None` als Ergebnis meldet eine erreichte Deadline.
|
||||
Ohne Deadline liefert der Host erst ein Ereignis oder explizites
|
||||
`Ereignis::Ende`. Die VM verwendet weder Instant noch Sleep/Yield als
|
||||
Rückfallebene. Auch modale und nach Programmende sichtbare Forms verwenden
|
||||
diesen Wartepfad. CaptureHost liefert vorbereitete Ereignisse zuerst und
|
||||
rückt beim Warten andernfalls bis zur Deadline vor; ohne Deadline meldet
|
||||
er Eingabeende. Seine Uhr bleibt außerhalb dieser ausdrücklichen
|
||||
Warteoperation oder manueller Zeitänderungen stehen.
|
||||
|
||||
`tb-ui` hat standardmäßig keine Terminalabhängigkeiten. Das Feature
|
||||
`terminal` schaltet die Module `host`, `screen`, `signale` und die optionalen
|
||||
Dependencies crossterm, ratatui und signal-hook ein. `tb-cli` aktiviert es
|
||||
explizit; VM, Forms-Modell, FRM-Reader und Dialoge brauchen es nicht. Einbetter
|
||||
müssen die neue Host-Wartemethode implementieren. Dialog-Eingabequeues tragen
|
||||
`Eingabe` statt nackter `Ereignis`-Werte, damit KEY-STOP-Markierungen erhalten
|
||||
bleiben; Ereignisse lassen sich mit `.into()` einreihen.
|
||||
|
||||
Der separate Workspace `tests/terminalfrei` prüft Einbettung ohne
|
||||
Feature-Unifikation mit CLI oder IDE:
|
||||
|
||||
```sh
|
||||
cargo run --manifest-path tests/terminalfrei/Cargo.toml --offline
|
||||
cargo tree --manifest-path tests/terminalfrei/Cargo.toml --edges normal
|
||||
```
|
||||
|
||||
Der erste Befehl lädt ein FRM-Korpusprogramm und prüft dessen `KM`-Ausgabe
|
||||
mit CaptureHost. Der zweite Baum darf crossterm, ratatui und signal-hook
|
||||
nicht enthalten.
|
||||
|
||||
## `.tbc`-Container (Stand Phase 2, Formatversion 1)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user