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

44 KiB
Raw Permalink Blame History

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.

Abschließender Abgleich vom 06.09.2026

Alle F01F25 sind im separaten Abschlussreport mit aktuellen Regressions- bzw. Vertragsnachweisen abgeglichen. Dieser Bericht und seine historischen Fundstellen dokumentieren weiterhin den Ausgangsstand; der Inventartest liegt inzwischen unter crates/tb-vm/tests/inventar.rs.

Umsetzungsstand: Ereigniszustellung und Hostgrenzen

F04, F05, F06, F07, F08, F18 und F20 sind im archivierten Change ereigniszustellung-und-hostgrenzen implementiert. Die fünf Restfehler der anschließenden Verifikation sind behoben: 419 Workspace-Tests und alle sechs ursprünglichen Review-Proben bestehen. Die konkreten Implementierungs- und aktuellen Abnahmenachweise stehen in 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 implementiert. Listenauswahl und Timerphasen sind durch Modell-, VM- und Korpustests abgesichert: 207 Tests bestanden, 1 bewusst ignoriert. Details stehen im Implementierungsnachweis. Die anschließende Verifikation 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 umgesetzt. Die zunächst sechs offenen Reviewbefunde und alle bei der Nachprüfung zusätzlich reproduzierten Abweichungen sind behoben. Die abschließende Verifikation 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. Die folgenden Befundtexte bleiben die historische Bestandsaufnahme.

Umsetzungsstand: Laufzeit-Eingabe und Systemstatus

F14, F15, F16, F17 und F19 sind im archivierten Change laufzeit-eingabe-und-systemstatus umgesetzt. Der Abschlussabgleich hat keine offenen Befunde im Change: 463 Workspace-Tests, Clippy, Format- und Spec-Prüfung bestehen. Alle sechs Tasks sind abgeschlossen; die bestehenden Sollausgaben bleiben unverändert. Szenarien und Randfälle stehen im Implementierungsnachweis. Die vier Hauptspecs wurden am 06.09.2026 synchronisiert, alle 15 Hauptspecs streng validiert und der Change archiviert. Die Befundtexte unten 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. Vertrag: openspec/specs/isam-datenbank/spec.md:11, openspec/specs/isam-datenbank/spec.md:146.

Umsetzung: isam-transaktionen-und-dateinummern.

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. Vertrag: openspec/specs/isam-datenbank/spec.md:43, openspec/specs/isam-datenbank/spec.md:146.

Umsetzung: isam-transaktionen-und-dateinummern.

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. Vertrag: openspec/specs/datei-eio/spec.md:12.

Umsetzung: isam-transaktionen-und-dateinummern.

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. Vertrag: openspec/specs/ereignissteuerung/spec.md:186.

Umsetzung: ereigniszustellung-und-hostgrenzen.

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. Vertrag: openspec/specs/ereignissteuerung/spec.md:81, openspec/specs/ereignissteuerung/spec.md:143.

Umsetzung: ereigniszustellung-und-hostgrenzen.

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. Vertrag: openspec/specs/ereignissteuerung/spec.md:32, openspec/specs/forms-steuerelemente/spec.md:30, openspec/specs/forms-objektmodell/spec.md:106.

Umsetzung: ereigniszustellung-und-hostgrenzen.

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. Vertrag: openspec/specs/forms-steuerelemente/spec.md:102, openspec/specs/ereignissteuerung/spec.md:59.

Umsetzung: ereigniszustellung-und-hostgrenzen.

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. Vertrag: openspec/specs/vm-ausfuehrung/spec.md:118, openspec/specs/ereignissteuerung/spec.md:15, openspec/specs/ereignissteuerung/spec.md:59, openspec/specs/forms-objektmodell/spec.md:106.

Umsetzung: ereigniszustellung-und-hostgrenzen.

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. Vertrag: openspec/specs/forms-objektmodell/spec.md:14, openspec/specs/forms-objektmodell/spec.md:36, openspec/specs/sprach-frontend/spec.md:251.

Umsetzung: projektmodule-und-kompilat.

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. Vertrag: openspec/specs/bytecode-kompilat/spec.md:46, openspec/specs/sprach-frontend/spec.md:96, openspec/specs/vm-ausfuehrung/spec.md:89, openspec/specs/vm-fehlerbehandlung/spec.md:11.

Umsetzung: projektmodule-und-kompilat.

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. Vertrag: openspec/specs/bytecode-kompilat/spec.md:28.

Umsetzung: projektmodule-und-kompilat.

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. Vertrag: openspec/specs/forms-steuerelemente/spec.md:72.

Umsetzung: forms-zustand-und-bedienung.

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. Vertrag: openspec/specs/forms-steuerelemente/spec.md:87.

Umsetzung: forms-zustand-und-bedienung.

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. Vertrag: openspec/specs/datei-eio/spec.md:35.

Umsetzung: laufzeit-eingabe-und-systemstatus.

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. Vertrag: openspec/specs/textbildschirm/spec.md:144.

Umsetzung: laufzeit-eingabe-und-systemstatus.

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. Vertrag: openspec/specs/datei-eio/spec.md:68.

Umsetzung: laufzeit-eingabe-und-systemstatus.

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. Vertrag: openspec/specs/datei-eio/spec.md:135.

Umsetzung: laufzeit-eingabe-und-systemstatus.

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. Vertrag: openspec/specs/forms-steuerelemente/spec.md:30.

Umsetzung: ereigniszustellung-und-hostgrenzen.

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. Vertrag: openspec/specs/konsolen-basisbibliothek/spec.md:260.

Umsetzung: laufzeit-eingabe-und-systemstatus.

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. Vertrag: openspec/specs/textbildschirm/spec.md:92.

Umsetzung: ereigniszustellung-und-hostgrenzen.

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. Vertrag: openspec/specs/sprachinventar/spec.md:12, openspec/specs/sprachinventar/spec.md:56, openspec/specs/forms-objektmodell/spec.md:106.

Umsetzung: spezifikationsabgleich-und-regressionsnachweise.

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. Vertrag: openspec/specs/kompat-testkorpus/spec.md:114, openspec/specs/kompat-testkorpus/spec.md:132, openspec/specs/kompat-testkorpus/spec.md:149.

Umsetzung: spezifikationsabgleich-und-regressionsnachweise.

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. Vertrag: openspec/specs/sprach-frontend/spec.md:83.

Umsetzung: spezifikationsabgleich-und-regressionsnachweise.

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. Vertrag: openspec/specs/bytecode-kompilat/spec.md:12, openspec/specs/bytecode-kompilat/spec.md:28.

Umsetzung: projektmodule-und-kompilat.

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. Vertrag: openspec/specs/forms-dateiformat/spec.md:31.

Umsetzung: spezifikationsabgleich-und-regressionsnachweise.

Gebündelte Changes und Reihenfolge

Reihenfolge Change Befunde Abhängigkeit
1 isam-transaktionen-und-dateinummern F01, F02, F03 Eigenständig; bei gemeinsamen Dateien sequenziell integrieren
2 ereigniszustellung-und-hostgrenzen F04, F05, F06, F07, F08, F18, F20 Eigenständig; bei gemeinsamen Dateien sequenziell integrieren
3 forms-zustand-und-bedienung F12, F13 Nach Ereigniszustellung
4 projektmodule-und-kompilat F09, F10, F11, F24 Eigenständig; bei gemeinsamen Dateien sequenziell integrieren
5 laufzeit-eingabe-und-systemstatus F14, F15, F16, F17, F19 Eigenständig; bei gemeinsamen Dateien sequenziell integrieren
6 spezifikationsabgleich-und-regressionsnachweise 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/bytecode.rs:1, crates/tb-vm/benches/compile.rs:1.

Requirement Ergebnis
Monomorpher Opcode-Satz F24
.tbc-Containerformat F11, F24
Zeilentabelle für Fehlerortung F10
Instant-Compile-Budget Grundpfad belegt

datei-eio

Implementierungs-/Testpfade: crates/tb-runtime/src/fileio.rs:1, crates/tb-runtime/src/builtins.rs:1260, crates/tb-vm/src/interp.rs:2343.

Requirement Ergebnis
Dateinummern und Öffnen in drei Zugriffsarten F03
Sequenzielle Datenübertragung F14
Wahlfreier Zugriff mit Record-Puffern Grundpfad belegt
Record-Konvertierungsfunktionen F16
Festtextfelder als UTF-32 mit fester Recordlänge Grundpfad belegt
Binärzugriff auf Byteebene Grundpfad belegt
Positions- und Statusfunktionen Grundpfad belegt
Satzsperren Grundpfad belegt
Dateisystem-Anweisungen mit plattformübergreifender Pfadsemantik F17
LPRINT als Druckausgabe Grundpfad belegt

ereignissteuerung

Implementierungs-/Testpfade: crates/tb-runtime/src/traps.rs:1, crates/tb-runtime/src/builtins.rs:105, crates/tb-vm/src/interp.rs:592.

Requirement Ergebnis
Ereignisquellen mit Zeit vom Host F08
Mausereignisse in Zellenkoordinaten F06
Abschließende Liste der Zustellpunkte F07, F08
Maskierung je Quelle mit drei Zuständen F05
EVENT klammert Abschnitte ohne Ereignisprüfung Grundpfad belegt
Zustellung als GOSUB ohne Wiedereintritt Grundpfad belegt
Getrappte Tasten verlassen den Eingabestrom F05
Benutzerdefiniertes Ereignis Grundpfad belegt
Reihenfolge bei mehreren fälligen Ereignissen Grundpfad belegt
Fehler in einem Handler Grundpfad belegt
Signal-Trap auf Betriebssystemsignalen F04

forms-dateiformat

Implementierungs-/Testpfade: crates/tb-ui/src/frm.rs:1, crates/tb-ui/src/frm_pcode.rs:1, crates/tb-cli/tests/convert_frm.rs:1.

Requirement Ergebnis
Aufbau des Textformats Grundpfad belegt
Schreiben ist die Umkehrung des Lesens F25
Fehlerhafte Dateien werden benannt Grundpfad belegt
Konvertierung binärer Formulardateien Grundpfad belegt

forms-objektmodell

Implementierungs-/Testpfade: crates/tb-frontend/src/forms.rs:1, crates/tb-ui/src/forms.rs:151, crates/tb-vm/tests/vm.rs:1165.

Requirement Ergebnis
Formulare und Steuerelemente als benannte Objekte F09
Container-Zugriff über den Bang-Operator F09
Lade- und Entladezyklus Grundpfad belegt
Modales und nicht-modales Anzeigen Grundpfad belegt
Steuerelement-Arrays Grundpfad belegt
Ereignisdispatch an Name_Ereignis F06, F08, F21
SCREEN-Objekt Grundpfad belegt

forms-steuerelemente

Implementierungs-/Testpfade: crates/tb-ui/src/forms.rs:848, crates/tb-ui/src/forms.rs:1780, tests/compat/formular.frm:1.

Requirement Ergebnis
Darstellung im Zellenpuffer Grundpfad belegt
Fokus, Tabreihenfolge und Access-Keys F06, F18
Maussteuerung mit Trefferprüfung Grundpfad belegt
Steuerelemente mit Listeninhalt F12
Timer-Steuerelement F13
Menüsystem F07
Vordefinierte Dialoge Grundpfad belegt

isam-datenbank

Implementierungs-/Testpfade: crates/tb-runtime/src/isam.rs:524, crates/tb-runtime/src/isam/tests.rs:1.

Requirement Ergebnis
Datenbank- und Tabellenbindung an eine Dateinummer F01
Indexverwaltung F02
Cursorbewegung in der Ordnung des aktiven Index Grundpfad belegt
Schlüsselsuche Grundpfad belegt
Satzoperationen auf dem aktuellen Satz Grundpfad belegt
Transaktionen mit Rücknahme F01, F02
Vergleichsreihenfolge für Indizes Grundpfad belegt
Pufferverwaltung mit benanntem Fehler Grundpfad belegt
Eigenes Datenbankdateiformat Grundpfad belegt

kompat-testkorpus

Implementierungs-/Testpfade: crates/tb-cli/tests/compat.rs:1, crates/tb-frontend/tests/corpus.rs:1, tests/compat/README.md:1.

Requirement Ergebnis
Korpusdateien mit byte-genauer Sollausgabe Grundpfad belegt
Frontend-Meilenstein über den Korpus Grundpfad belegt
Laufzeitvergleich über den Korpus Grundpfad belegt
Korpusabdeckung der Phase-2-Semantik Grundpfad belegt
Korpusabdeckung der Phase-3-Semantik Grundpfad belegt
Nachweis der Größenunabhängigkeit Grundpfad belegt
Korpusabdeckung der Ereignis-Traps F22
Korpusabdeckung der Formularprogramme F22
Kompatibilitätsnachweis an Fremdprogrammen F22

konsolen-basisbibliothek

Implementierungs-/Testpfade: crates/tb-runtime/src/builtins.rs:1, crates/tb-runtime/src/using.rs:1, crates/tb-runtime/src/finanz.rs:1, crates/tb-runtime/src/datetime.rs:1.

Requirement Ergebnis
Builtin-Aufrufschnittstelle Grundpfad belegt
Host-Abstraktion für Konsolen-E/A Grundpfad belegt
PRINT-Formatierung Grundpfad belegt
Vollständige Stringbibliothek Grundpfad belegt
PRINT USING und FORMAT$ Grundpfad belegt
Datums- und Zeitbibliothek Grundpfad belegt
Kompatibler Zufallszahlengenerator Grundpfad belegt
Mathematikbibliothek mit Überlaufverhalten Grundpfad belegt
Finanzmathematische Funktionen Grundpfad belegt
System- und Umgebungsanweisungen Grundpfad belegt
Zeitfunktionen liefern Ortszeit Grundpfad belegt
Zonenermittlung mit Rückfallebene F19
Programmversatz wirkt auf die Ortszeit Grundpfad belegt

laufzeitfehler

Implementierungs-/Testpfade: crates/tb-runtime/src/errors.rs:1.

Requirement Ergebnis
Klassischer Fehlerkatalog Grundpfad belegt
Unbelegte Codes Grundpfad belegt

sprach-frontend

Implementierungs-/Testpfade: crates/tb-frontend/src/lexer.rs:324, crates/tb-frontend/src/parser.rs:194, crates/tb-frontend/src/sema.rs:399.

Requirement Ergebnis
Lexikalische Analyse nach Sprachreferenz Grundpfad belegt
Literal-Typisierung Grundpfad belegt
Vollständige Anweisungs-Grammatik Grundpfad belegt
Semantische Prüfung Grundpfad belegt
Compile-Zeit-Abweisung deklarierter Non-Features F23
Diagnostik mit Vorbild-Meldungen F10
Typisiertes HIR als Sema-Ausgabe Grundpfad belegt
Jedes dokumentierte Element besitzt eine Signatur Grundpfad belegt
Modulweites ON ERROR ist aus Prozeduren ansprechbar Grundpfad belegt
DATA-Elemente behalten ihren Rohtext Grundpfad belegt
ISAM-Anweisungen und -Funktionen in Grammatik und Signaturprüfung Grundpfad belegt
Ereignis-Traps in Grammatik und Signaturprüfung Grundpfad belegt
Trap-Ziele sind Sprungziele des Moduls Grundpfad belegt
Objektzugriffe in Grammatik und Semantik F09
Bang-Operator neben dem SINGLE-Suffix Grundpfad belegt
Ereignisprozeduren mit festen Signaturen Grundpfad belegt

sprachinventar

Implementierungs-/Testpfade: docs/inventar.md:25, crates/tb-frontend/tests/inventar.rs:1.

Requirement Ergebnis
Vollständiges Inventar der Original-Hilfe F21; vollständiger Originalquellenabgleich nicht wiederholt
Festes Statusvokabular Grundpfad belegt
Automatischer Abgleich Inventar gegen Implementierung F21
Keine stillen Lücken bei dokumentierten Elementen Grundpfad belegt

textbildschirm

Implementierungs-/Testpfade: crates/tb-runtime/src/screen.rs:1, crates/tb-ui/src/screen.rs:1, crates/tb-vm/tests/vm.rs:590.

Requirement Ergebnis
Dynamische Terminalgröße mit Mindestmaß Grundpfad belegt
PRINT-Semantik mit Umbruch und Scrollen Grundpfad belegt
1-basierte Cursor-API mit Bereichsprüfung Grundpfad belegt
Klassische Farbpalette und Blink-Simulation Grundpfad belegt
Unicode-Zellenmodell Grundpfad belegt
Zellenpuffer ohne Terminalabhängigkeit F20
Bildschirmanweisungen des Dialekts Grundpfad belegt
Bildschirm-Abfragefunktionen Grundpfad belegt
Tastatureingabe ohne Zeilenmodell F15
Keine feste Bildschirmgröße im Verhalten Grundpfad belegt
Größenänderung zur Laufzeit Grundpfad belegt

vm-ausfuehrung

Implementierungs-/Testpfade: crates/tb-vm/src/interp.rs:708, crates/tb-vm/tests/vm.rs:117.

Requirement Ergebnis
Zahlenkonvertierungs-Matrix Grundpfad belegt
Kontrollfluss Grundpfad belegt
GOSUB/RETURN neben Prozeduraufrufen Grundpfad belegt
Prozeduraufrufe mit BYREF-Semantik Grundpfad belegt
DATA/READ/RESTORE Grundpfad belegt
Unterbrechbare step()-Ausführung F10
Programmende im Runner Grundpfad belegt
Ereigniszustellung an Anweisungsgrenzen F08
Jede Schleife trägt eine Anweisungsgrenze im Kreis Grundpfad belegt
DOEVENTS gibt die Kontrolle ab Grundpfad belegt

vm-fehlerbehandlung

Implementierungs-/Testpfade: crates/tb-vm/src/interp.rs:870, crates/tb-vm/tests/vm.rs:348.

Requirement Ergebnis
Handler-Scoping nach Vorbild F10
ERR und ERL Grundpfad belegt
RESUME-Semantik Grundpfad belegt
Fehler im Handler ist fatal 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.