# OpenSpec-Abschlussabgleich vom 06.09.2026 **Aktueller Nachprüfungsstand:** V01–V03 sind vollständig behoben. Der [abschließende Change-Review](../../openspec/changes/archive/2026-09-06-spezifikationsabgleich-und-regressionsnachweise/review.md) verzeichnet keine offenen Befunde; der erste Review bleibt separat erhalten. Grundlage: Arbeitsbaum auf `c8b92f06190d77714865e0018b090348f372d77e`, nach Integration der fünf Korrektur-Changes und Umsetzung von `spezifikationsabgleich-und-regressionsnachweise`. Der [Review vom 05.09.2026](2026-09-05-openspec-code-review.md) bleibt die historische Bestandsaufnahme. Dieser Bericht gleicht alle dortigen F01–F25 erneut ab. **Ergebnis: F01–F25 sind durch Umsetzung oder präzisierten Vertrag geschlossen.** Die unten genannten Regressionen bestehen im aktuellen Arbeitsbaum. Die vier Delta-Specs wurden am 06.09.2026 in die Hauptspecs synchronisiert und der Change wurde anschließend archiviert. ## Befundmatrix | ID | Ergebnis und heutiger Nachweis | |---|---| | F01 | ISAM-OPEN verwendet den gemeinsamen Writer einer laufenden Transaktion. [CLI-Test](../../crates/tb-cli/tests/compat.rs) `tbc_isam_open_in_transaktion_hat_eine_harte_frist`; [isamopen.bas](../../tests/compat/isamopen.bas), einschließlich Prozessfrist. | | F02 | SAVEPOINT/ROLLBACK stellt Satz-, Index- und Tabellenstruktur wieder her. [ISAM-Tests](../../crates/tb-runtime/src/isam/tests.rs) `savepoints_nehmen_index_und_tabellenstrukturen_zurueck`, `neue_tabellen_und_aktive_indizes_verschwinden_bei_ruecknahme`; [isamstruktur.bas](../../tests/compat/isamstruktur.bas). | | F03 | FREEFILE und normale/ISAM-Bindungen teilen den Nummernraum. [isamdateinummern.bas](../../tests/compat/isamdateinummern.bas) prüft Lücken, Wiederbelegung, CLOSE und RESET. | | F04 | Beide Signale erreichen ihre registrierten Traps. [events.rs](../../crates/tb-vm/tests/events.rs) `beide_signale_werden_zugestellt_und_beginnen_in_quellreihenfolge`. | | F05 | KEY STOP erhält lesbare Eingabe und merkt den Handler einmal. [events.rs](../../crates/tb-vm/tests/events.rs) `key_on_off_stop_gelten_fuer_alle_konsoleneingaben`; zusätzlich F1 in [trap-masken.bas](../../tests/compat/trap-masken.bas). | | F06 | Eingaben und Handler behalten ihre Reihenfolge. [events.rs](../../crates/tb-vm/tests/events.rs) `taste_maus_und_trap_behalten_die_annahmereihenfolge`, `fokus_handler_laufen_geordnet_bis_zur_rueckkehr`, `doevents_verhindert_rekursion_derselben_forms_prozedur`. | | F07 | Das offene Menü sperrt Traps und Forms-Timer auch bei SLEEP und Eingabe. [events.rs](../../crates/tb-vm/tests/events.rs) `offenes_menu_sperrt_traps_und_wartende_forms_timer_an_allen_zustellpunkten`, `review_menu_schliessen_stellt_pending_trap_vor_erneutem_warten_zu`. | | F08 | Zeit und Warten kommen vom Host. [events.rs](../../crates/tb-vm/tests/events.rs) `ohne_zeitbedarf_keine_uhrabfrage_und_keine_mausansammlung`, `sleep_folgt_nur_der_hostfrist_und_forms_timer_beendet_es`; [Ausführungsmodell](../tbvm-design.md). | | F09 | Controls werden im jeweiligen Formular aufgelöst. [project.rs](../../crates/tb-vm/tests/project.rs) `zwei_formulare_mit_gleichen_controls_und_arrays_laufen_aus_dem_kompilat`; der neue FRM-Test erhält zusätzlich unterschiedliche Eltern von Elementen desselben Arrays. | | F10 | Quellen, Module, Fehlerorte und Debuggerziele bleiben getrennt. [project.rs](../../crates/tb-vm/tests/project.rs) `module_includes_erl_breakpoints_und_inspektion_behalten_ihren_ursprung`, `initialisierungen_def_fn_und_modulhandler_haben_eigene_quellorte`; [CLI-Quellorttest](../../crates/tb-cli/tests/project.rs). | | F11 | TBC 4 erhält Forms-Anfangswerte und Designarrays. [CLI-Test](../../crates/tb-cli/tests/project.rs) `projekt_und_formular_laufen_nach_entfernen_saemtlicher_quellen`; [VM-Projekttest](../../crates/tb-vm/tests/project.rs) für zwei Formulare. | | F12 | ListIndex = −1 und Auswahländerungen sind konsistent. [Forms-Tests](../../crates/tb-ui/src/forms.rs) `listenauswahl_bleibt_beim_einfuegen_und_entfernen_konsistent`, `sorted_wechsel_erhaelt_auch_die_auswahl_zwischen_duplikaten`. | | F13 | Timerphasen beginnen bei ihrer Aktivierung. [Forms-Tests](../../crates/tb-ui/src/forms.rs) `timerarrays_holen_nur_aktive_zeit_nach_und_sortieren_nach_name_und_index`; [events.rs](../../crates/tb-vm/tests/events.rs) `spaete_timeraktivierung_nutzt_hostzeit_auch_ueber_control_parameter`, `intervallaenderung_im_handler_verwirft_bereits_faellige_altintervalle`. | | F14 | INPUT # bewahrt Feldfortschritt und unterscheidet leeres von fehlendem Feld. [vm.rs](../../crates/tb-vm/tests/vm.rs) `input_datei_bewahrt_felder_und_unterscheidet_leer_von_fehlend`. | | F15 | INPUT$ zählt Zeichen, erhält Sondertastenreste und meldet vorzeitiges EOF. [vm.rs](../../crates/tb-vm/tests/vm.rs) `input_datei_alle_lesearten_teilen_utf8_cursor_und_seek`, `input_s_teilt_sondertasten_und_bewahrt_rest_fuer_inkey`, `unicode_puffergrenzen_und_binaere_records_bleiben_getrennt`. | | F16 | Alle fünf CV-Funktionen verlangen exakte Bytezeichenbreite. [vm.rs](../../crates/tb-vm/tests/vm.rs) `alle_mk_cv_paare_verlangen_exakte_bytezeichenbreite`. | | F17 | Fehlende Datei und fehlender Elternpfad ergeben unterschiedliche Fehler. [vm.rs](../../crates/tb-vm/tests/vm.rs) `datei_und_elternpfadfehler_sind_am_sprachzugang_unterscheidbar`. | | F18 | BackTab wird als Tab mit Shift weitergegeben. Terminal-Mapper `backtab_ist_tab_mit_shift_auch_ohne_modifier`; [formular-access-backtab.frm](../../tests/compat/formular-access-backtab.frm) prüft den BASIC-Fokuspfad. | | F19 | TIMEZONEKNOWN liefert den gegenwärtigen Status, einschließlich Ausfall und Erholung. [vm.rs](../../crates/tb-vm/tests/vm.rs) `timezoneknown_hat_integer_signatur_und_zeigt_aktuellen_status`; [Runtime-Test](../../crates/tb-runtime/src/builtins.rs) `zonenquelle_ausfall_und_erholung_gelten_fuer_alle_zeitfunktionen`. | | F20 | VM-/Forms-Einbettung benötigt kein Terminalbackend. Separater Resolver [tests/terminalfrei](../../tests/terminalfrei/Cargo.toml), erneut ohne GUI ausgeführt: `Terminalfreier FRM-/VM-Lauf: KM`. | | F21 | Alle 845 Inventareinträge werden mit kompilierten BASIC-Proben bis HIR/Runtime-Ziel geprüft. [inventar.rs](../../crates/tb-cli/tests/inventar.rs) vergleicht unabhängige Sollziele mit der konkreten Absenkung und erkennt falsche Statuswerte, Unsupported, fehlende/vertauschte Builtin-Bindungen, entfernte Absenkung und falsche Forms-Member/Typselektoren; [events.rs](../../crates/tb-vm/tests/events.rs) führt alle 133 registrierten Ereignisse bis zum BASIC-Handler und erkennt eine künstlich entfernte Ereignisbindung. | | F22 | [trap-masken.bas](../../tests/compat/trap-masken.bas) ergänzt KEY/UEVENT ON/OFF/STOP und EVENT OFF; [formular-access-backtab.frm](../../tests/compat/formular-access-backtab.frm) ergänzt gewöhnlichen Control-Access-Key und Rückwärtstab mit `Click;LostFocus;GotFocus;`. Der Harness prüft jedes Programm zweimal. Sieben öffentliche Programme bestehen den gesonderten Bediennachweis unten. | | F23 | SCREEN 0–13, LINE, PAINT und VIEW sind ausdrücklich erlaubt; übrige Non-Features bleiben ausgeschlossen. [Sprachreferenz](../sprachreferenz.md), [Delta](../../openspec/changes/archive/2026-09-06-spezifikationsabgleich-und-regressionsnachweise/specs/sprach-frontend/spec.md); [CLI-Test](../../crates/tb-cli/tests/project.rs) prüft alle 14 SCREEN-Modi und benannte Abweisungen. | | F24 | [VM-Design](../tbvm-design.md) und [Hauptspec](../../openspec/specs/bytecode-kompilat/spec.md) beschreiben TBC 4 mit neun Abschnitten und dem aktuellen Opcode-Vertrag. Loader-Rundlauf, Versionsablehnung und beschädigte Referenzen sind in [project.rs](../../crates/tb-vm/tests/project.rs) bzw. den CLI-Projekttests abgesichert. Dieser Change führt keine neue Formatversion ein. | | F25 | [Dateiformate](../dateiformate.md) und [Delta](../../openspec/changes/archive/2026-09-06-spezifikationsabgleich-und-regressionsnachweise/specs/forms-dateiformat/spec.md) unterscheiden Originalerhalt und kanonisches Schreiben. [FRM-Tests](../../crates/tb-ui/src/frm.rs) prüfen CRLF und explizite Defaults bytegleich sowie Default-Auslassung nach Änderung. Index 0 bleibt als Array-Strukturangabe erhalten. | ## Zusätzlich im Abgleich gefundene und behobene Ursachen - Die Signatur für die SHELL-Funktion fehlte; IRR erwartete die Argumente in umgekehrter Reihenfolge. Eine VM-Probe prüft jetzt SHELL → Exitcode 7 und IRR für −100/+110 → 0,1, neben den 845 Kompilierproben. - Koordinatenformen von CIRCLE/WINDOW und IOCTL # brachen vor der benannten Non-Feature-Diagnose ab. Parser und Semantik nennen nun das ausgeschlossene Element; POKE und PEEK sind ausdrücklich per CLI geprüft. - Form_KeyPress/KeyUp, Form-Fokus/Paint/Resize, Label.Change, PictureBox.Paint, ComboBox.DropDown und die getrennten Dateilistenereignisse hatten fehlende oder falsche Quellen. Die 133 Ereignisproben verwenden Tastatur, Maus, Hostzeit oder echte Modell-/BASIC-Operationen statt direkter Ereignisqueue-Einträge. - Der VM-Ereignisdispatch setzte auch ohne Handler den aktiven Control-Zustand. Er ignoriert jetzt fehlende Bindungen ohne diese Nebenwirkung; reine Zustandsmeldungen und nicht fokussierbare Objekte übernehmen keinen Fokus. - Binäre FRM-Records enthielten auch bei Einzelcontrols einen Index-Slot. Der Import berücksichtigt das tatsächliche Array-Flag. Eingebettete Includes werden als Herkunftskommentar ausgegeben, nicht ein zweites Mal geöffnet. - Arrayelemente unter unterschiedlichen Containern behalten ihre Eltern über vorhandene PARENT-Anfangswerte. Die Suche bleibt auf das jeweilige Formular begrenzt; der bestehende Mehrformular-/TBC-Test schützt diese Grenze. - Kanonisches Weglassen von Index 0 hätte ein einzelnes Arrayelement in ein Einzelcontrol verwandelt. Der Writer erhält diese Strukturangabe; der präzisierte Delta-Vertrag und der Rundlauftest benennen sie ausdrücklich. ## Öffentlicher Fremdprogrammbestand Bestand: `cout/vbdos`, Revision `1cdd2b32b829fe1721d0b6aecc433abc47a96fb6`. Der Test erstellt für jeden Lauf per `git archive` eine neue Kopie dieses Commits, baut den unveränderten Programmeinstieg mit `tbc build`, lädt das Kompilat und bedient die VM über CaptureHost bei 100×30 Zellen. Die lokale Prüfbasis war `/tmp/terminalbasic-vbdos-evidence`. Kein Emulator oder interaktives Terminal. | Einstieg | Deklarierte Eingabe | Geprüftes Ergebnis, in beiden Läufen | |---|---|---| | `graphics/graphics.mak` | Alt+X | Formular entladen | | `microsoft/check.mak` | Alt+F, X | Menü zunächst sichtbar, danach geschlossen und Formular entladen | | `microsoft/qlbview.mak` | Esc | Cancel-Pfad entlädt das Formular | | `microsoft/seek.mak` | Alt+X | Formular entladen | | `microsoft/spindemo.mak` | Tab, Tab, Pfeil auf | VSpin_Custom ändert Text1 von `0` auf ` 1`; Bildschirmänderung durch Pfeiltaste | | `microsoft/notepad.frm` | Alt+F, X, N im Speicherdialog | Menü öffnet, Save-Dialog wird angezeigt, N beantwortet ihn und Formular wird entladen | | `misc/mentors/mentors.frm` | Alt+F, X | Menü zunächst sichtbar, danach geschlossen und Formular entladen | Alle sieben Programme: diagnosefreie Übersetzung und zwei gleiche Folgen von sichtbaren Formular-/Menüzuständen und Bildschirm-Snapshots. Keine fehlende externe Voraussetzung und keine angepassten Fremdprogrammquellen. Das belegt diese sieben Einstiege und Sequenzen, keine vollständige VBDOS-Kompatibilität. Reproduktion mit vorhandenem Checkout der genannten Revision: ```sh TB_VBDOS_REPO=/pfad/zu/vbdos cargo test -p tb-cli --test foreign oeffentliche -- --ignored --nocapture ``` Der [Test](../../crates/tb-cli/tests/foreign.rs) ist im normalen Workspace-Lauf explizit ignoriert, weil der öffentliche Checkout keine Repository-Abhängigkeit ist. Der gesonderte Aufruf oben wurde für diese Abnahme erfolgreich ausgeführt; ohne Umgebungsvariable oder bei abweichender Revision schlägt er fehl. ## Abnahme und Sollbilder - `cargo test --workspace`: **481 bestanden, 0 fehlgeschlagen, 2 ignoriert**. Ignoriert sind der Golden-Generator und der separat ausgeführte Fremdtest. - Fremdtest: **1 bestanden**, sieben Programme jeweils zweimal. - `cargo run --manifest-path tests/terminalfrei/Cargo.toml --offline`: bestanden. - Clippy für Workspace, alle Targets/Features, `-D warnings`: bestanden. - `cargo fmt --all -- --check` und `git diff --check`: bestanden. - `openspec validate --all --strict`: **16 bestanden**, 15 Hauptspecs und der aktive Change, keine Fehler. Bestehende Hinweise zu langen Requirement-Texten sind rein informativ. Die beiden neuen Sollausgaben wurden aus den erwarteten Zuständen festgelegt. `EVENT OFF` verwirft eingetretene Ereignisse; es wird ausdrücklich kein Nachholen beim erneuten ON erwartet. Der bestehende `formular.out` wurde fachlich geprüft: Nur die zehn Attributzellen der OK-Schaltfläche in Zeile 4, Spalten 24–33 wechseln auf Vordergrund 15/Hintergrund 1 (`f1`), weil sie den Eingabefokus behält. Die Zeichenebene und alle übrigen Zellen bleiben bytegleich. Der Golden-Generator wurde nicht ausgeführt. ## Abschluss der Reviewkorrekturen - **V01:** Parent-Schlüssel enthalten den Arrayindex. Geometrie, Optionsgruppen, Menüzuordnung und Formular-Traversierung nutzen dieselbe Referenz. Container liegen bei Zeichnung und Trefferprüfung hinter ihren Kindern. Die ergänzte Gegenprobe traf vor der letzten Korrektur fälschlich `Group(1)` statt `Other`; danach sind Treffer und sichtbare Beschriftung korrekt. TBC4 bleibt unverändert, ungültige Parent-Zyklen und fehlende Arrayinstanzen werden abgewiesen. - **V02:** Die 291 festen Vorlagen enthalten unabhängige Sollziele; Forms werden gegen den abgesenkten Klassenmember geprüft. Der Inventartest liegt in `tb-cli`, damit `$INCLUDE` durch den echten Projektlader läuft. Falsche gültige Bindungen, falsche Konverterselektoren/Forms-Member sowie entfernte Absenkungen werden namentlich erkannt. - **V03:** Die gemeinsame Anweisungsauflösung weist auch Koordinaten mit Farbe/STEP, WINDOW SCREEN und PALETTE USING namentlich ab, nachdem mögliche Variablenzuweisungen erkannt wurden. Gleichnamige Arrays und SCREEN 0–13/LINE/PAINT/VIEW bleiben verfügbar. - **Ergänzende Prüfung:** ComboBox-Ausklapplisten schließen bei Fokuswechsel und Ausblenden; der neue Regressionstest besteht. Alle fünf ursprünglichen Soll-Gegenproben bestehen. Der Golden-Generator wurde nicht ausgeführt; bei den Reviewkorrekturen wurden keine weiteren Sollbilder verändert.