Files
TerminalBasic/docs/reviews/2026-09-05-openspec-code-review.md

503 lines
43 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# OpenSpecCode-Review vom 05.09.2026
Geprüfter Code: `19804e0e2de9eb5a8b0ef256b5be76c741560e07` in TerminalBasic. Der Arbeitsbaum war zu Beginn sauber. Gegenstand waren alle 15 Hauptspezifikationen mit 121 Requirements und 263 Szenarien; es gab zu Beginn keine aktiven Changes. Archivierte Entscheidungen und die lokalen Referenzdokumente wurden zur Einordnung herangezogen. Die nach diesem Review angelegten Changes ändern diese Bestandsaufnahme nicht.
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.
## Umsetzungsstand: Forms-Zustand und Bedienung
F12 und F13 sind im archivierten Change
[forms-zustand-und-bedienung](../../openspec/changes/archive/2026-09-05-forms-zustand-und-bedienung/proposal.md)
implementiert. Listenauswahl und Timerphasen sind durch Modell-, VM- und
Korpustests abgesichert: 207 Tests bestanden, 1 bewusst ignoriert. Details
stehen im [Implementierungsnachweis](../../openspec/changes/archive/2026-09-05-forms-zustand-und-bedienung/verification.md).
Die anschließende [Verifikation](../../openspec/changes/archive/2026-09-05-forms-zustand-und-bedienung/review.md)
hat zusätzlich zwei Vertragslücken bei nachträglicher Sortierung und der
Simple-ComboBox-Darstellung aufgedeckt; beide sind inzwischen behoben.
Auch der anschließend gefundene Überlauf bei Mindestmaßen (V3) ist behoben,
einschließlich breiter Zeichen und Bildschirmränder. Die erneute Verifikation
hat keine offenen Befunde im Change: 428 Workspace-Tests und alle vier
Review-Proben bestehen; eine Bildschirmmatrix deckt 3.360 Kombinationen ab.
## Umsetzungsstand: Projektmodule und Kompilat
F09, F10, F11 und F24 sind im archivierten Change
[projektmodule-und-kompilat](../../openspec/changes/archive/2026-09-05-projektmodule-und-kompilat/proposal.md)
umgesetzt. Die zunächst sechs offenen Reviewbefunde und alle bei der
Nachprüfung zusätzlich reproduzierten Abweichungen sind behoben.
Die [abschließende Verifikation](../../openspec/changes/archive/2026-09-05-projektmodule-und-kompilat/review.md)
hat keine offenen Befunde im Change: 453 Workspace-Tests, alle sieben
unveränderten Reviewproben, Clippy, Format-/Spec-Prüfung und das echte
Mehrmodul-Compile-Budget bestehen. Alle zwölf Tasks sind abgeschlossen;
Die Hauptspecs wurden synchronisiert und der Change am 05.09.2026
archiviert. Details und
Szenariozuordnung: [Implementierungsnachweis](../../openspec/changes/archive/2026-09-05-projektmodule-und-kompilat/verification.md).
Die folgenden Befundtexte bleiben die historische Bestandsaufnahme.
## 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.
- `openspec validate --all --strict`: 15/15 Hauptspecs gültig; nur Hinweise zu langen Requirement-Texten.
- `cargo test --workspace --quiet`: **380 bestanden, 0 fehlgeschlagen, 1 ignoriert**. Der ignorierte Test erzeugt Golden Files und wurde nicht ausgeführt.
- `cargo bench -p tb-vm --bench compile`: Einzelmodul 508 Zeilen **0,48 ms** bei Budget 50 ms; 49.760 Zeilen **61 ms** bei Budget 1.000 ms. Gemessen auf diesem Rechner im Release-Profil; der Projektbenchmark übersetzt 20 Module einzeln und ersetzt keinen Mehrmodul-Linktest.
- Zusätzliche CLI-Proben und ein temporärer Rust-Treiber gegen die aktuell gebauten Bibliotheken. Die beobachteten Ausgaben stehen bei den Befunden. Es wurde kein Anwendungscode geändert und keine Sollausgabe neu erzeugt.
- Kein erneuter interaktiver Fremdprogramm-/Terminalvergleich, kein erneuter vollständiger Lauf über externe 56 Binärformulare, keine Windows-/Linux-Matrix, kein neuer Vergleich sämtlicher Original-Hilfe-Themen. Die lokalen Importtests liefen mit. Solche Nachweise sind nicht durch eine grüne Unit-Testsuite ersetzt.
- „Grundpfad belegt“ in der Matrix bedeutet: zuordenbarer Code und vorhandene Tests, keine zusätzliche konkrete Abweichung in dieser Prüfung. Es bedeutet **nicht**, dass jede Eingabekombination, jedes Szenario oder die vollständige historische Kompatibilität bewiesen wurde.
## Befunde
### F01 — ISAM-OPEN blockiert in laufender Transaktion (hoch)
Nach OPEN, BEGINTRANS und INSERT blockiert ein zweites OPEN derselben Datenbank. Die CLI-Probe wurde nach 3 Sekunden beendet. oeffnen startet eine weitere Schreibtransaktion, während die eigene Transaktion bereits den exklusiven Schreibzugriff hält. Erwartet: zusätzliche Tabellenbindung ohne Selbstblockade und ohne vorzeitigen Commit.
Beleg: [crates/tb-runtime/src/isam.rs:560](../../crates/tb-runtime/src/isam.rs#L560). Vertrag: [openspec/specs/isam-datenbank/spec.md:11](../../openspec/specs/isam-datenbank/spec.md#L11), [openspec/specs/isam-datenbank/spec.md:146](../../openspec/specs/isam-datenbank/spec.md#L146).
Umsetzung: [isam-transaktionen-und-dateinummern](../../openspec/changes/archive/2026-09-05-isam-transaktionen-und-dateinummern/proposal.md).
### F02 — SAVEPOINT nimmt Indexänderungen nicht zurück (hoch)
BEGINTRANS; s%=SAVEPOINT; CREATEINDEX; ROLLBACK s% lässt den neuen Index bestehen: SETINDEX gelingt und GETINDEX$ liefert new. Das Undo-Protokoll kennt nur Satzänderungen. Erwartet: Indexbestand und Sätze entsprechen dem Sicherungspunkt.
Beleg: [crates/tb-runtime/src/isam.rs:1253](../../crates/tb-runtime/src/isam.rs#L1253). Vertrag: [openspec/specs/isam-datenbank/spec.md:43](../../openspec/specs/isam-datenbank/spec.md#L43), [openspec/specs/isam-datenbank/spec.md:146](../../openspec/specs/isam-datenbank/spec.md#L146).
Umsetzung: [isam-transaktionen-und-dateinummern](../../openspec/changes/archive/2026-09-05-isam-transaktionen-und-dateinummern/proposal.md).
### F03 — FREEFILE übersieht ISAM-Bindungen (mittel)
Mit einer offenen ISAM-Tabelle auf #1 liefert FREEFILE erneut 1. Nur der gewöhnliche Dateispeicher wird durchsucht. Erwartet: kleinste in beiden Dateiverwaltungen freie Nummer.
Beleg: [crates/tb-runtime/src/builtins.rs:1434](../../crates/tb-runtime/src/builtins.rs#L1434). Vertrag: [openspec/specs/datei-eio/spec.md:12](../../openspec/specs/datei-eio/spec.md#L12).
Umsetzung: [isam-transaktionen-und-dateinummern](../../openspec/changes/archive/2026-09-05-isam-transaktionen-und-dateinummern/proposal.md).
### F04 — SIGNAL(2) erreicht seinen Trap nicht (hoch)
Ein eingespeistes Signal(2) bei definiertem und eingeschaltetem Trap ergibt keinen anstehenden Trap. Wegen des Kurzschlusses n == 1 wird melden für SIGTERM gar nicht aufgerufen. Erwartet: beide spezifizierten Signale folgen derselben Zustellung.
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/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
### F05 — KEY STOP entfernt die Taste aus dem Eingabestrom (hoch)
Bei KEY(1) STOP wird F1 zwar für das spätere ON gemerkt, aber aus dem normalen Tastenpuffer entfernt. Probe: Eingabepuffer leer; nach ON ist der Trap anstehend. Die Spec verlangt unter STOP beides: höchstens ein gemerktes Ereignis und weiterhin lesbare Taste.
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/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
### F06 — Forms-Handler und Eingaben verlieren ihre Reihenfolge (hoch)
Der Fokuswechsel Text1 nach Text2 ergibt in der VM GL statt LG: GotFocus läuft vor LostFocus. Taste vor Maus ergibt MK statt KM. Tasten und Maus werden getrennt gesammelt; zusätzlich wird am ersten Statement eines bereits ausgewählten Handlers der nächste Handler auf dessen Frame gestapelt. Erwartet: FIFO-Zustellung einschließlich der beobachtbaren Handlerwirkungen.
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/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
### F07 — Offenes Menü verhindert Traps nicht an allen Zustellpunkten (hoch)
Ein UEVENT-Trap wird während eines geöffneten Menüs an einer gewöhnlichen Anweisungsgrenze ausgeführt: Zähler 11 statt 1, Menü weiterhin offen. zustellen prüft das Menü; der separate Stmt-Pfad umgeht diese Prüfung. Erwartet: gleiche Menüsperre an jedem Zustellpunkt.
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/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
### F08 — Zeit- und Wartepfade verletzen die Hostgrenze (mittel)
Drei einfache Anweisungen ohne Trap/Form-Timer lesen die Hostzeit sechsmal. forms_zustellen fragt sie bedingungslos zweimal ab. SLEEP bei eingefrorener Hostzeit endet außerdem nach Realzeit (Probe SLEEP 0.001: ca. 6 ms), weil die VM Instant benutzt. Im SLEEP-Pfad wird zudem nur der klassische Trap-Dispatch aufgerufen, nicht forms_zustellen. Erwartet: keine Uhrabfrage ohne Zeitbedarf; Warten und Forms-Zustellung folgen der Hostzeit.
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/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
### F09 — Control-Namen sind faktisch global statt formularlokal (hoch)
Zwei Formulare mit je Text1 lassen sich laden, aber Form2!Text1.Text erzeugt Control TEXT1 not found in form FORM2. Die Suche nimmt zuerst den global ersten Namen und prüft erst danach dessen Container. Erwartet: Namensauflösung innerhalb des angegebenen Formulars.
Beleg: [crates/tb-frontend/src/sema.rs:949](../../crates/tb-frontend/src/sema.rs#L949). Vertrag: [openspec/specs/forms-objektmodell/spec.md:14](../../openspec/specs/forms-objektmodell/spec.md#L14), [openspec/specs/forms-objektmodell/spec.md:36](../../openspec/specs/forms-objektmodell/spec.md#L36), [openspec/specs/sprach-frontend/spec.md:251](../../openspec/specs/sprach-frontend/spec.md#L251).
Umsetzung: [projektmodule-und-kompilat](../../openspec/changes/archive/2026-09-05-projektmodule-und-kompilat/proposal.md).
### F10 — Quellorte und Debuggerziele verlieren die Modulidentität (hoch)
Ein Overflow in lib.bas:2 wird über app.mak als Overflow in line 5 ohne Moduldatei gemeldet. Include-Expansion und Projektverkettung liefern einen einzigen String; Stmt und Breakpoints speichern nur eine Zahl. Erwartet: ursprüngliche Datei/Zeile und Breakpoints auf (Modul, Zeile).
Beleg: [crates/tb-cli/src/main.rs:184](../../crates/tb-cli/src/main.rs#L184). Vertrag: [openspec/specs/bytecode-kompilat/spec.md:46](../../openspec/specs/bytecode-kompilat/spec.md#L46), [openspec/specs/sprach-frontend/spec.md:96](../../openspec/specs/sprach-frontend/spec.md#L96), [openspec/specs/vm-ausfuehrung/spec.md:89](../../openspec/specs/vm-ausfuehrung/spec.md#L89), [openspec/specs/vm-fehlerbehandlung/spec.md:11](../../openspec/specs/vm-fehlerbehandlung/spec.md#L11).
Umsetzung: [projektmodule-und-kompilat](../../openspec/changes/archive/2026-09-05-projektmodule-und-kompilat/proposal.md).
### F11 — Formularwerte fehlen im serialisierten Kompilat (hoch)
Mit FormFile.apply liest die VM den initialen Text hello; nach Serialisierung und Laden desselben Kompilats liest sie einen leeren String. build verwirft die FormFile-Werte; OBJS speichert nur Namen, Klasse, Elternname und Arrayflag. Erwartet: ein aus einer FRM gebautes Kompilat trägt auch deren Anfangszustand und läuft ohne erneutes Anwenden der Quelldatei gleich.
Beleg: [crates/tb-vm/src/bytecode.rs:484](../../crates/tb-vm/src/bytecode.rs#L484). Vertrag: [openspec/specs/bytecode-kompilat/spec.md:28](../../openspec/specs/bytecode-kompilat/spec.md#L28).
Umsetzung: [projektmodule-und-kompilat](../../openspec/changes/archive/2026-09-05-projektmodule-und-kompilat/proposal.md).
### F12 — ListIndex = -1 wird abgewiesen (mittel)
Das Setzen auf -1 liefert Fehler 5, auch wenn die Liste Einträge besitzt. Die negative Zahl wird als usize verglichen. Erwartet: -1 hebt die Auswahl auf und hält Text/ListIndex/ListCount konsistent.
Beleg: [crates/tb-ui/src/forms.rs:409](../../crates/tb-ui/src/forms.rs#L409). Vertrag: [openspec/specs/forms-steuerelemente/spec.md:72](../../openspec/specs/forms-steuerelemente/spec.md#L72).
Umsetzung: [forms-zustand-und-bedienung](../../openspec/changes/archive/2026-09-05-forms-zustand-und-bedienung/proposal.md).
### F13 — Forms-Timer holen Zeit vor ihrer Aktivierung nach (mittel)
Wird Interval=100 erst bei Hostzeit 1000 ms gesetzt, entstehen sofort zehn TIMER-Ereignisse. timer_last wird entfernt und anschließend mit 0 initialisiert. Erwartet: erstes Ereignis nach dem neuen Intervall ab Aktivierung, kein Nachholen früherer inaktiver Zeit.
Beleg: [crates/tb-ui/src/forms.rs:1780](../../crates/tb-ui/src/forms.rs#L1780). Vertrag: [openspec/specs/forms-steuerelemente/spec.md:87](../../openspec/specs/forms-steuerelemente/spec.md#L87).
Umsetzung: [forms-zustand-und-bedienung](../../openspec/changes/archive/2026-09-05-forms-zustand-und-bedienung/proposal.md).
### F14 — INPUT # verwirft Felder und ersetzt fehlende Daten still (hoch)
Nach WRITE #1, "a", "b" liest INPUT #1, a$ die ganze Zeile und verwirft b; das zweite INPUT endet mit Fehler 62. Umgekehrt endet INPUT #1, a$, b$ bei nur einem gespeicherten Feld erfolgreich mit b$="". Erwartet: Felder werden fortlaufend gelesen; fehlende Daten erzeugen Fehler 62 statt eines erfundenen leeren Felds.
Beleg: [crates/tb-vm/src/interp.rs:2529](../../crates/tb-vm/src/interp.rs#L2529). Vertrag: [openspec/specs/datei-eio/spec.md:35](../../openspec/specs/datei-eio/spec.md#L35).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/laufzeit-eingabe-und-systemstatus/proposal.md).
### F15 — INPUT$ zählt weder durchgehend Zeichen noch die verlangte Länge (mittel)
INPUT$(1) mit F1 liefert zwei Zeichen (Nullzeichen und Scancode). INPUT$(1,#1) aus einer UTF-8-Datei mit ä liest ein Byte und liefert das Ersatzzeichen <20>. Erwartet: exakt n Unicode-Codepoints; Rest einer Sondertastenfolge bzw. UTF-8-Sequenz bleibt für die nächste Leseoperation erhalten.
Beleg: [crates/tb-runtime/src/builtins.rs:2116](../../crates/tb-runtime/src/builtins.rs#L2116). Vertrag: [openspec/specs/textbildschirm/spec.md:144](../../openspec/specs/textbildschirm/spec.md#L144).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/laufzeit-eingabe-und-systemstatus/proposal.md).
### F16 — CV-Funktionen akzeptieren zu lange Byte-Strings (mittel)
CVI("abc") läuft erfolgreich und liefert 25185. Die Implementierung prüft nur die Mindestbreite; die Spec verlangt Fehler 5 bei nicht passender Länge. Erwartet: exakt 2/4/8 Zeichen entsprechend dem CV-Typ.
Beleg: [crates/tb-runtime/src/builtins.rs:1640](../../crates/tb-runtime/src/builtins.rs#L1640). Vertrag: [openspec/specs/datei-eio/spec.md:68](../../openspec/specs/datei-eio/spec.md#L68).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/laufzeit-eingabe-und-systemstatus/proposal.md).
### F17 — Fehlender Elternpfad wird als fehlende Datei gemeldet (mittel)
OPEN "absentdir/file.txt" FOR INPUT liefert Fehler 53; der Vertrag unterscheidet fehlende Datei (53) von fehlendem Pfad (76). MKDIR behandelt dies bereits gesondert, OPEN benutzt die allgemeine I/O-Abbildung.
Beleg: [crates/tb-runtime/src/fileio.rs:69](../../crates/tb-runtime/src/fileio.rs#L69). Vertrag: [openspec/specs/datei-eio/spec.md:135](../../openspec/specs/datei-eio/spec.md#L135).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/laufzeit-eingabe-und-systemstatus/proposal.md).
### F18 — Umschalt-Tab wird am Terminal verworfen (mittel)
Statisch belegt: Der Terminal-Mapper behandelt KeyCode::Tab, aber nicht KeyCode::BackTab; letzterer fällt in _ => None. Das Forms-Modell unterstützt Rückwärtstab, erhält diesen Terminalfall jedoch nicht. Erwartet: BackTab erreicht die Fokussteuerung als Tab mit Shift. Kein zusätzlicher interaktiver Terminalversuch in diesem Review.
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/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
### F19 — Der Zonenzustand ist für BASIC nicht abfragbar (mittel)
Zeitzone::Unbekannt ist auf Rust-Ebene vorhanden und der CLI-Runner schreibt eine Warnung auf stderr. Eine BASIC-Signatur zum Abfragen dieses Zustands fehlt; bei später scheiternder Zonenermittlung benutzt versatz still 0. Die Spec verlangt eine für das Programm erkennbare Rückfallebene.
Beleg: [crates/tb-runtime/src/datetime.rs:147](../../crates/tb-runtime/src/datetime.rs#L147). Vertrag: [openspec/specs/konsolen-basisbibliothek/spec.md:260](../../openspec/specs/konsolen-basisbibliothek/spec.md#L260).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/laufzeit-eingabe-und-systemstatus/proposal.md).
### F20 — VM hängt transitiv von Terminalbibliotheken ab (mittel)
tb-vm hängt unmittelbar von tb-ui ab; dort sind ratatui, crossterm und signal-hook unbedingte Dependencies. Der Zellenpuffer selbst ist terminalfrei, die Ausführungsschicht insgesamt erfüllt die explizite Abhängigkeitsgrenze nicht mehr. Erwartet: separat baubare VM samt Forms ohne Terminalbackend.
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/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md).
### F21 — Inventarstatus beweist kein vorhandenes Laufzeitverhalten (mittel)
Alle Eigenschaften/Ereignisse aus der Klassentabelle werden im Inventartest pauschal als implementiert erwartet; Parseranweisungen werden ausdrücklich schwächer geprüft. Konkretes Gegenbeispiel: FORM_KEYPRESS und FORM_KEYUP stehen auf implementiert, aber handle_key erzeugt im Formular-Fallback nur KEYDOWN; die beiden Ereignisse werden nur für aktive Controls erzeugt. Erwartet: Verhaltensnachweise statt Selbstauskunft derselben Tabelle.
Beleg: [crates/tb-frontend/tests/inventar.rs:206](../../crates/tb-frontend/tests/inventar.rs#L206). Vertrag: [openspec/specs/sprachinventar/spec.md:12](../../openspec/specs/sprachinventar/spec.md#L12), [openspec/specs/sprachinventar/spec.md:56](../../openspec/specs/sprachinventar/spec.md#L56), [openspec/specs/forms-objektmodell/spec.md:106](../../openspec/specs/forms-objektmodell/spec.md#L106).
Umsetzung: [spezifikationsabgleich-und-regressionsnachweise](../../openspec/changes/spezifikationsabgleich-und-regressionsnachweise/proposal.md).
### F22 — Der Korpus deckt die verlangten Kombinationen nicht ab (mittel)
traps.bas prüft STOP nur für TIMER, nicht für KEY und UEVENT; formular.frm hat keinen Alt-Access-Key auf ein Control (Alt+D öffnet das Menü) und keinen Rückwärtstab. Einige Nachweise existieren als Unit-Test, aber die ausdrücklich verlangte Korpusabdeckung fehlt. Fremdprogramme wurden in diesem Review nicht erneut interaktiv bedient; vbdos-befunde.md ist ein historischer Nachweis.
Beleg: [tests/compat/traps.bas:1](../../tests/compat/traps.bas#L1). Vertrag: [openspec/specs/kompat-testkorpus/spec.md:114](../../openspec/specs/kompat-testkorpus/spec.md#L114), [openspec/specs/kompat-testkorpus/spec.md:132](../../openspec/specs/kompat-testkorpus/spec.md#L132), [openspec/specs/kompat-testkorpus/spec.md:149](../../openspec/specs/kompat-testkorpus/spec.md#L149).
Umsetzung: [spezifikationsabgleich-und-regressionsnachweise](../../openspec/changes/spezifikationsabgleich-und-regressionsnachweise/proposal.md).
### F23 — Die pauschale Grafik-Abweisung ist überholt (Dokumentation)
sprach-frontend nennt Grafik-Anweisungen pauschal als Non-Features. LINE, PAINT, VIEW und SCREEN 013 werden inzwischen ausgeführt und sind in der Sprachreferenz ausdrücklich erlaubt; tbc check der Probe liefert 0. Die Hauptspec muss die bereits dokumentierte Untermenge nennen.
Beleg: [docs/sprachreferenz.md:526](../../docs/sprachreferenz.md#L526). Vertrag: [openspec/specs/sprach-frontend/spec.md:83](../../openspec/specs/sprach-frontend/spec.md#L83).
Umsetzung: [spezifikationsabgleich-und-regressionsnachweise](../../openspec/changes/spezifikationsabgleich-und-regressionsnachweise/proposal.md).
### F24 — Container- und Opcode-Beschreibung sind nicht aktuell (Dokumentation)
Die Hauptspec verlangt separate CODE/LINES-Abschnitte und vollständige Prozedursignaturen. Implementiert sind MODN/CONS/TYPS/GLOB/PROC/DATA/JMPT/OBJS mit Inline-Code und Inline-Zeilen. docs/tbvm-design.md spricht noch von Version 1 und künftigem FORMS, der Code von Version 3 und OBJS. Die Opcode-Tabelle lässt unter anderem die Forms-/Trap-Instruktionen aus. Die Strukturabweichung allein ist nicht der funktionale Fehler F11.
Beleg: [docs/tbvm-design.md:69](../../docs/tbvm-design.md#L69). Vertrag: [openspec/specs/bytecode-kompilat/spec.md:12](../../openspec/specs/bytecode-kompilat/spec.md#L12), [openspec/specs/bytecode-kompilat/spec.md:28](../../openspec/specs/bytecode-kompilat/spec.md#L28).
Umsetzung: [projektmodule-und-kompilat](../../openspec/changes/archive/2026-09-05-projektmodule-und-kompilat/proposal.md).
### F25 — FRM-Schreibvertrag enthält zwei unvereinbare Universalregeln (Klärung)
write_text gibt unveränderte gelesene Dateien bytegleich zurück, einschließlich expliziter Defaultwerte. Bei kanonischer Neuausgabe werden Defaults ausgelassen. Die Spec verlangt beides ohne Unterscheidung. Für nichtkanonische Eingaben mit expliziten Defaults ist das logisch nicht gleichzeitig erfüllbar. Das bestehende Verhalten sollte präzisiert werden: Erhaltungsmodus gegenüber kanonischem Schreiben.
Beleg: [crates/tb-ui/src/frm.rs:348](../../crates/tb-ui/src/frm.rs#L348). Vertrag: [openspec/specs/forms-dateiformat/spec.md:31](../../openspec/specs/forms-dateiformat/spec.md#L31).
Umsetzung: [spezifikationsabgleich-und-regressionsnachweise](../../openspec/changes/spezifikationsabgleich-und-regressionsnachweise/proposal.md).
## Gebündelte Changes und Reihenfolge
| 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/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/archive/2026-09-05-forms-zustand-und-bedienung/proposal.md) | F12, F13 | Nach Ereigniszustellung |
| 4 | [projektmodule-und-kompilat](../../openspec/changes/archive/2026-09-05-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 |
| 6 | [spezifikationsabgleich-und-regressionsnachweise](../../openspec/changes/spezifikationsabgleich-und-regressionsnachweise/proposal.md) | F21, F22, F23, F25 | Abschließende Gesamtabnahme nach den fünf Korrektur-Changes |
## Vollständige Requirement-Matrix
### bytecode-kompilat
Implementierungs-/Testpfade: [crates/tb-vm/src/codegen.rs:1](../../crates/tb-vm/src/codegen.rs#L1), [crates/tb-vm/src/bytecode.rs:1](../../crates/tb-vm/src/bytecode.rs#L1), [crates/tb-vm/benches/compile.rs:1](../../crates/tb-vm/benches/compile.rs#L1).
| Requirement | Ergebnis |
|---|---|
| [Monomorpher Opcode-Satz](../../openspec/specs/bytecode-kompilat/spec.md#L12) | F24 |
| [`.tbc`-Containerformat](../../openspec/specs/bytecode-kompilat/spec.md#L28) | F11, F24 |
| [Zeilentabelle für Fehlerortung](../../openspec/specs/bytecode-kompilat/spec.md#L46) | F10 |
| [Instant-Compile-Budget](../../openspec/specs/bytecode-kompilat/spec.md#L55) | Grundpfad belegt |
### datei-eio
Implementierungs-/Testpfade: [crates/tb-runtime/src/fileio.rs:1](../../crates/tb-runtime/src/fileio.rs#L1), [crates/tb-runtime/src/builtins.rs:1260](../../crates/tb-runtime/src/builtins.rs#L1260), [crates/tb-vm/src/interp.rs:2343](../../crates/tb-vm/src/interp.rs#L2343).
| Requirement | Ergebnis |
|---|---|
| [Dateinummern und Öffnen in drei Zugriffsarten](../../openspec/specs/datei-eio/spec.md#L12) | F03 |
| [Sequenzielle Datenübertragung](../../openspec/specs/datei-eio/spec.md#L35) | F14 |
| [Wahlfreier Zugriff mit Record-Puffern](../../openspec/specs/datei-eio/spec.md#L51) | Grundpfad belegt |
| [Record-Konvertierungsfunktionen](../../openspec/specs/datei-eio/spec.md#L68) | F16 |
| [Festtextfelder als UTF-32 mit fester Recordlänge](../../openspec/specs/datei-eio/spec.md#L88) | Grundpfad belegt |
| [Binärzugriff auf Byteebene](../../openspec/specs/datei-eio/spec.md#L100) | Grundpfad belegt |
| [Positions- und Statusfunktionen](../../openspec/specs/datei-eio/spec.md#L110) | Grundpfad belegt |
| [Satzsperren](../../openspec/specs/datei-eio/spec.md#L125) | Grundpfad belegt |
| [Dateisystem-Anweisungen mit plattformübergreifender Pfadsemantik](../../openspec/specs/datei-eio/spec.md#L135) | F17 |
| [LPRINT als Druckausgabe](../../openspec/specs/datei-eio/spec.md#L162) | Grundpfad belegt |
### ereignissteuerung
Implementierungs-/Testpfade: [crates/tb-runtime/src/traps.rs:1](../../crates/tb-runtime/src/traps.rs#L1), [crates/tb-runtime/src/builtins.rs:105](../../crates/tb-runtime/src/builtins.rs#L105), [crates/tb-vm/src/interp.rs:592](../../crates/tb-vm/src/interp.rs#L592).
| Requirement | Ergebnis |
|---|---|
| [Ereignisquellen mit Zeit vom Host](../../openspec/specs/ereignissteuerung/spec.md#L15) | F08 |
| [Mausereignisse in Zellenkoordinaten](../../openspec/specs/ereignissteuerung/spec.md#L32) | F06 |
| [Abschließende Liste der Zustellpunkte](../../openspec/specs/ereignissteuerung/spec.md#L59) | F07, F08 |
| [Maskierung je Quelle mit drei Zuständen](../../openspec/specs/ereignissteuerung/spec.md#L81) | F05 |
| [EVENT klammert Abschnitte ohne Ereignisprüfung](../../openspec/specs/ereignissteuerung/spec.md#L102) | Grundpfad belegt |
| [Zustellung als GOSUB ohne Wiedereintritt](../../openspec/specs/ereignissteuerung/spec.md#L121) | Grundpfad belegt |
| [Getrappte Tasten verlassen den Eingabestrom](../../openspec/specs/ereignissteuerung/spec.md#L143) | F05 |
| [Benutzerdefiniertes Ereignis](../../openspec/specs/ereignissteuerung/spec.md#L157) | Grundpfad belegt |
| [Reihenfolge bei mehreren fälligen Ereignissen](../../openspec/specs/ereignissteuerung/spec.md#L166) | Grundpfad belegt |
| [Fehler in einem Handler](../../openspec/specs/ereignissteuerung/spec.md#L176) | Grundpfad belegt |
| [Signal-Trap auf Betriebssystemsignalen](../../openspec/specs/ereignissteuerung/spec.md#L186) | F04 |
### forms-dateiformat
Implementierungs-/Testpfade: [crates/tb-ui/src/frm.rs:1](../../crates/tb-ui/src/frm.rs#L1), [crates/tb-ui/src/frm_pcode.rs:1](../../crates/tb-ui/src/frm_pcode.rs#L1), [crates/tb-cli/tests/convert_frm.rs:1](../../crates/tb-cli/tests/convert_frm.rs#L1).
| Requirement | Ergebnis |
|---|---|
| [Aufbau des Textformats](../../openspec/specs/forms-dateiformat/spec.md#L13) | Grundpfad belegt |
| [Schreiben ist die Umkehrung des Lesens](../../openspec/specs/forms-dateiformat/spec.md#L31) | F25 |
| [Fehlerhafte Dateien werden benannt](../../openspec/specs/forms-dateiformat/spec.md#L45) | Grundpfad belegt |
| [Konvertierung binärer Formulardateien](../../openspec/specs/forms-dateiformat/spec.md#L59) | Grundpfad belegt |
### forms-objektmodell
Implementierungs-/Testpfade: [crates/tb-frontend/src/forms.rs:1](../../crates/tb-frontend/src/forms.rs#L1), [crates/tb-ui/src/forms.rs:151](../../crates/tb-ui/src/forms.rs#L151), [crates/tb-vm/tests/vm.rs:1165](../../crates/tb-vm/tests/vm.rs#L1165).
| Requirement | Ergebnis |
|---|---|
| [Formulare und Steuerelemente als benannte Objekte](../../openspec/specs/forms-objektmodell/spec.md#L14) | F09 |
| [Container-Zugriff über den Bang-Operator](../../openspec/specs/forms-objektmodell/spec.md#L36) | F09 |
| [Lade- und Entladezyklus](../../openspec/specs/forms-objektmodell/spec.md#L50) | Grundpfad belegt |
| [Modales und nicht-modales Anzeigen](../../openspec/specs/forms-objektmodell/spec.md#L70) | Grundpfad belegt |
| [Steuerelement-Arrays](../../openspec/specs/forms-objektmodell/spec.md#L86) | Grundpfad belegt |
| [Ereignisdispatch an Name_Ereignis](../../openspec/specs/forms-objektmodell/spec.md#L106) | F06, F08, F21 |
| [SCREEN-Objekt](../../openspec/specs/forms-objektmodell/spec.md#L125) | Grundpfad belegt |
### forms-steuerelemente
Implementierungs-/Testpfade: [crates/tb-ui/src/forms.rs:848](../../crates/tb-ui/src/forms.rs#L848), [crates/tb-ui/src/forms.rs:1780](../../crates/tb-ui/src/forms.rs#L1780), [tests/compat/formular.frm:1](../../tests/compat/formular.frm#L1).
| Requirement | Ergebnis |
|---|---|
| [Darstellung im Zellenpuffer](../../openspec/specs/forms-steuerelemente/spec.md#L12) | Grundpfad belegt |
| [Fokus, Tabreihenfolge und Access-Keys](../../openspec/specs/forms-steuerelemente/spec.md#L30) | F06, F18 |
| [Maussteuerung mit Trefferprüfung](../../openspec/specs/forms-steuerelemente/spec.md#L51) | Grundpfad belegt |
| [Steuerelemente mit Listeninhalt](../../openspec/specs/forms-steuerelemente/spec.md#L72) | F12 |
| [Timer-Steuerelement](../../openspec/specs/forms-steuerelemente/spec.md#L87) | F13 |
| [Menüsystem](../../openspec/specs/forms-steuerelemente/spec.md#L102) | F07 |
| [Vordefinierte Dialoge](../../openspec/specs/forms-steuerelemente/spec.md#L119) | Grundpfad belegt |
### isam-datenbank
Implementierungs-/Testpfade: [crates/tb-runtime/src/isam.rs:524](../../crates/tb-runtime/src/isam.rs#L524), [crates/tb-runtime/src/isam/tests.rs:1](../../crates/tb-runtime/src/isam/tests.rs#L1).
| Requirement | Ergebnis |
|---|---|
| [Datenbank- und Tabellenbindung an eine Dateinummer](../../openspec/specs/isam-datenbank/spec.md#L11) | F01 |
| [Indexverwaltung](../../openspec/specs/isam-datenbank/spec.md#L43) | F02 |
| [Cursorbewegung in der Ordnung des aktiven Index](../../openspec/specs/isam-datenbank/spec.md#L73) | Grundpfad belegt |
| [Schlüsselsuche](../../openspec/specs/isam-datenbank/spec.md#L89) | Grundpfad belegt |
| [Satzoperationen auf dem aktuellen Satz](../../openspec/specs/isam-datenbank/spec.md#L112) | Grundpfad belegt |
| [Transaktionen mit Rücknahme](../../openspec/specs/isam-datenbank/spec.md#L146) | F01, F02 |
| [Vergleichsreihenfolge für Indizes](../../openspec/specs/isam-datenbank/spec.md#L170) | Grundpfad belegt |
| [Pufferverwaltung mit benanntem Fehler](../../openspec/specs/isam-datenbank/spec.md#L182) | Grundpfad belegt |
| [Eigenes Datenbankdateiformat](../../openspec/specs/isam-datenbank/spec.md#L196) | Grundpfad belegt |
### kompat-testkorpus
Implementierungs-/Testpfade: [crates/tb-cli/tests/compat.rs:1](../../crates/tb-cli/tests/compat.rs#L1), [crates/tb-frontend/tests/corpus.rs:1](../../crates/tb-frontend/tests/corpus.rs#L1), [tests/compat/README.md:1](../../tests/compat/README.md#L1).
| Requirement | Ergebnis |
|---|---|
| [Korpusdateien mit byte-genauer Sollausgabe](../../openspec/specs/kompat-testkorpus/spec.md#L11) | Grundpfad belegt |
| [Frontend-Meilenstein über den Korpus](../../openspec/specs/kompat-testkorpus/spec.md#L35) | Grundpfad belegt |
| [Laufzeitvergleich über den Korpus](../../openspec/specs/kompat-testkorpus/spec.md#L45) | Grundpfad belegt |
| [Korpusabdeckung der Phase-2-Semantik](../../openspec/specs/kompat-testkorpus/spec.md#L67) | Grundpfad belegt |
| [Korpusabdeckung der Phase-3-Semantik](../../openspec/specs/kompat-testkorpus/spec.md#L78) | Grundpfad belegt |
| [Nachweis der Größenunabhängigkeit](../../openspec/specs/kompat-testkorpus/spec.md#L96) | Grundpfad belegt |
| [Korpusabdeckung der Ereignis-Traps](../../openspec/specs/kompat-testkorpus/spec.md#L114) | F22 |
| [Korpusabdeckung der Formularprogramme](../../openspec/specs/kompat-testkorpus/spec.md#L132) | F22 |
| [Kompatibilitätsnachweis an Fremdprogrammen](../../openspec/specs/kompat-testkorpus/spec.md#L149) | F22 |
### konsolen-basisbibliothek
Implementierungs-/Testpfade: [crates/tb-runtime/src/builtins.rs:1](../../crates/tb-runtime/src/builtins.rs#L1), [crates/tb-runtime/src/using.rs:1](../../crates/tb-runtime/src/using.rs#L1), [crates/tb-runtime/src/finanz.rs:1](../../crates/tb-runtime/src/finanz.rs#L1), [crates/tb-runtime/src/datetime.rs:1](../../crates/tb-runtime/src/datetime.rs#L1).
| Requirement | Ergebnis |
|---|---|
| [Builtin-Aufrufschnittstelle](../../openspec/specs/konsolen-basisbibliothek/spec.md#L11) | Grundpfad belegt |
| [Host-Abstraktion für Konsolen-E/A](../../openspec/specs/konsolen-basisbibliothek/spec.md#L21) | Grundpfad belegt |
| [PRINT-Formatierung](../../openspec/specs/konsolen-basisbibliothek/spec.md#L47) | Grundpfad belegt |
| [Vollständige Stringbibliothek](../../openspec/specs/konsolen-basisbibliothek/spec.md#L65) | Grundpfad belegt |
| [PRINT USING und FORMAT$](../../openspec/specs/konsolen-basisbibliothek/spec.md#L92) | Grundpfad belegt |
| [Datums- und Zeitbibliothek](../../openspec/specs/konsolen-basisbibliothek/spec.md#L119) | Grundpfad belegt |
| [Kompatibler Zufallszahlengenerator](../../openspec/specs/konsolen-basisbibliothek/spec.md#L140) | Grundpfad belegt |
| [Mathematikbibliothek mit Überlaufverhalten](../../openspec/specs/konsolen-basisbibliothek/spec.md#L158) | Grundpfad belegt |
| [Finanzmathematische Funktionen](../../openspec/specs/konsolen-basisbibliothek/spec.md#L179) | Grundpfad belegt |
| [System- und Umgebungsanweisungen](../../openspec/specs/konsolen-basisbibliothek/spec.md#L208) | Grundpfad belegt |
| [Zeitfunktionen liefern Ortszeit](../../openspec/specs/konsolen-basisbibliothek/spec.md#L234) | Grundpfad belegt |
| [Zonenermittlung mit Rückfallebene](../../openspec/specs/konsolen-basisbibliothek/spec.md#L260) | F19 |
| [Programmversatz wirkt auf die Ortszeit](../../openspec/specs/konsolen-basisbibliothek/spec.md#L276) | Grundpfad belegt |
### laufzeitfehler
Implementierungs-/Testpfade: [crates/tb-runtime/src/errors.rs:1](../../crates/tb-runtime/src/errors.rs#L1).
| Requirement | Ergebnis |
|---|---|
| [Klassischer Fehlerkatalog](../../openspec/specs/laufzeitfehler/spec.md#L10) | Grundpfad belegt |
| [Unbelegte Codes](../../openspec/specs/laufzeitfehler/spec.md#L26) | Grundpfad belegt |
### sprach-frontend
Implementierungs-/Testpfade: [crates/tb-frontend/src/lexer.rs:324](../../crates/tb-frontend/src/lexer.rs#L324), [crates/tb-frontend/src/parser.rs:194](../../crates/tb-frontend/src/parser.rs#L194), [crates/tb-frontend/src/sema.rs:399](../../crates/tb-frontend/src/sema.rs#L399).
| Requirement | Ergebnis |
|---|---|
| [Lexikalische Analyse nach Sprachreferenz](../../openspec/specs/sprach-frontend/spec.md#L10) | Grundpfad belegt |
| [Literal-Typisierung](../../openspec/specs/sprach-frontend/spec.md#L26) | Grundpfad belegt |
| [Vollständige Anweisungs-Grammatik](../../openspec/specs/sprach-frontend/spec.md#L38) | Grundpfad belegt |
| [Semantische Prüfung](../../openspec/specs/sprach-frontend/spec.md#L63) | Grundpfad belegt |
| [Compile-Zeit-Abweisung deklarierter Non-Features](../../openspec/specs/sprach-frontend/spec.md#L83) | F23 |
| [Diagnostik mit Vorbild-Meldungen](../../openspec/specs/sprach-frontend/spec.md#L96) | F10 |
| [Typisiertes HIR als Sema-Ausgabe](../../openspec/specs/sprach-frontend/spec.md#L106) | Grundpfad belegt |
| [Jedes dokumentierte Element besitzt eine Signatur](../../openspec/specs/sprach-frontend/spec.md#L124) | Grundpfad belegt |
| [Modulweites ON ERROR ist aus Prozeduren ansprechbar](../../openspec/specs/sprach-frontend/spec.md#L144) | Grundpfad belegt |
| [DATA-Elemente behalten ihren Rohtext](../../openspec/specs/sprach-frontend/spec.md#L161) | Grundpfad belegt |
| [ISAM-Anweisungen und -Funktionen in Grammatik und Signaturprüfung](../../openspec/specs/sprach-frontend/spec.md#L177) | Grundpfad belegt |
| [Ereignis-Traps in Grammatik und Signaturprüfung](../../openspec/specs/sprach-frontend/spec.md#L203) | Grundpfad belegt |
| [Trap-Ziele sind Sprungziele des Moduls](../../openspec/specs/sprach-frontend/spec.md#L242) | Grundpfad belegt |
| [Objektzugriffe in Grammatik und Semantik](../../openspec/specs/sprach-frontend/spec.md#L251) | F09 |
| [Bang-Operator neben dem SINGLE-Suffix](../../openspec/specs/sprach-frontend/spec.md#L278) | Grundpfad belegt |
| [Ereignisprozeduren mit festen Signaturen](../../openspec/specs/sprach-frontend/spec.md#L287) | Grundpfad belegt |
### sprachinventar
Implementierungs-/Testpfade: [docs/inventar.md:25](../../docs/inventar.md#L25), [crates/tb-frontend/tests/inventar.rs:1](../../crates/tb-frontend/tests/inventar.rs#L1).
| Requirement | Ergebnis |
|---|---|
| [Vollständiges Inventar der Original-Hilfe](../../openspec/specs/sprachinventar/spec.md#L12) | F21; vollständiger Originalquellenabgleich nicht wiederholt |
| [Festes Statusvokabular](../../openspec/specs/sprachinventar/spec.md#L40) | Grundpfad belegt |
| [Automatischer Abgleich Inventar gegen Implementierung](../../openspec/specs/sprachinventar/spec.md#L56) | F21 |
| [Keine stillen Lücken bei dokumentierten Elementen](../../openspec/specs/sprachinventar/spec.md#L79) | Grundpfad belegt |
### textbildschirm
Implementierungs-/Testpfade: [crates/tb-runtime/src/screen.rs:1](../../crates/tb-runtime/src/screen.rs#L1), [crates/tb-ui/src/screen.rs:1](../../crates/tb-ui/src/screen.rs#L1), [crates/tb-vm/tests/vm.rs:590](../../crates/tb-vm/tests/vm.rs#L590).
| Requirement | Ergebnis |
|---|---|
| [Dynamische Terminalgröße mit Mindestmaß](../../openspec/specs/textbildschirm/spec.md#L11) | Grundpfad belegt |
| [PRINT-Semantik mit Umbruch und Scrollen](../../openspec/specs/textbildschirm/spec.md#L30) | Grundpfad belegt |
| [1-basierte Cursor-API mit Bereichsprüfung](../../openspec/specs/textbildschirm/spec.md#L41) | Grundpfad belegt |
| [Klassische Farbpalette und Blink-Simulation](../../openspec/specs/textbildschirm/spec.md#L57) | Grundpfad belegt |
| [Unicode-Zellenmodell](../../openspec/specs/textbildschirm/spec.md#L68) | Grundpfad belegt |
| [Zellenpuffer ohne Terminalabhängigkeit](../../openspec/specs/textbildschirm/spec.md#L92) | F20 |
| [Bildschirmanweisungen des Dialekts](../../openspec/specs/textbildschirm/spec.md#L105) | Grundpfad belegt |
| [Bildschirm-Abfragefunktionen](../../openspec/specs/textbildschirm/spec.md#L128) | Grundpfad belegt |
| [Tastatureingabe ohne Zeilenmodell](../../openspec/specs/textbildschirm/spec.md#L144) | F15 |
| [Keine feste Bildschirmgröße im Verhalten](../../openspec/specs/textbildschirm/spec.md#L159) | Grundpfad belegt |
| [Größenänderung zur Laufzeit](../../openspec/specs/textbildschirm/spec.md#L179) | Grundpfad belegt |
### vm-ausfuehrung
Implementierungs-/Testpfade: [crates/tb-vm/src/interp.rs:708](../../crates/tb-vm/src/interp.rs#L708), [crates/tb-vm/tests/vm.rs:117](../../crates/tb-vm/tests/vm.rs#L117).
| Requirement | Ergebnis |
|---|---|
| [Zahlenkonvertierungs-Matrix](../../openspec/specs/vm-ausfuehrung/spec.md#L11) | Grundpfad belegt |
| [Kontrollfluss](../../openspec/specs/vm-ausfuehrung/spec.md#L34) | Grundpfad belegt |
| [GOSUB/RETURN neben Prozeduraufrufen](../../openspec/specs/vm-ausfuehrung/spec.md#L49) | Grundpfad belegt |
| [Prozeduraufrufe mit BYREF-Semantik](../../openspec/specs/vm-ausfuehrung/spec.md#L59) | Grundpfad belegt |
| [DATA/READ/RESTORE](../../openspec/specs/vm-ausfuehrung/spec.md#L77) | Grundpfad belegt |
| [Unterbrechbare step()-Ausführung](../../openspec/specs/vm-ausfuehrung/spec.md#L89) | F10 |
| [Programmende im Runner](../../openspec/specs/vm-ausfuehrung/spec.md#L106) | Grundpfad belegt |
| [Ereigniszustellung an Anweisungsgrenzen](../../openspec/specs/vm-ausfuehrung/spec.md#L118) | F08 |
| [Jede Schleife trägt eine Anweisungsgrenze im Kreis](../../openspec/specs/vm-ausfuehrung/spec.md#L135) | Grundpfad belegt |
| [DOEVENTS gibt die Kontrolle ab](../../openspec/specs/vm-ausfuehrung/spec.md#L150) | Grundpfad belegt |
### vm-fehlerbehandlung
Implementierungs-/Testpfade: [crates/tb-vm/src/interp.rs:870](../../crates/tb-vm/src/interp.rs#L870), [crates/tb-vm/tests/vm.rs:348](../../crates/tb-vm/tests/vm.rs#L348).
| Requirement | Ergebnis |
|---|---|
| [Handler-Scoping nach Vorbild](../../openspec/specs/vm-fehlerbehandlung/spec.md#L11) | F10 |
| [ERR und ERL](../../openspec/specs/vm-fehlerbehandlung/spec.md#L33) | Grundpfad belegt |
| [RESUME-Semantik](../../openspec/specs/vm-fehlerbehandlung/spec.md#L48) | Grundpfad belegt |
| [Fehler im Handler ist fatal](../../openspec/specs/vm-fehlerbehandlung/spec.md#L64) | Grundpfad belegt |
## Bewusst erlaubte Abweichungen
Unicode/UTF-32, LPRINT nach LPT1.TXT, dokumentiertes LOCK/UNLOCK-Ersatzverhalten, FILEATTR ohne OS-Handle, CHDRIVE ohne Laufwerksbuchstaben und die dokumentierten Hardware-Non-Features wurden nicht pauschal als fehlende Implementierung gezählt. Die noch nicht implementierte IDE ist kein eigenständiger Sollumfang der 15 vorliegenden Hauptspecs.