14 KiB
OpenSpec-Abschlussabgleich vom 06.09.2026
Aktueller Nachprüfungsstand: V01–V03 sind vollständig behoben. Der abschließende Change-Review 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 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 tbc_isam_open_in_transaktion_hat_eine_harte_frist; isamopen.bas, einschließlich Prozessfrist. |
| F02 | SAVEPOINT/ROLLBACK stellt Satz-, Index- und Tabellenstruktur wieder her. ISAM-Tests savepoints_nehmen_index_und_tabellenstrukturen_zurueck, neue_tabellen_und_aktive_indizes_verschwinden_bei_ruecknahme; isamstruktur.bas. |
| F03 | FREEFILE und normale/ISAM-Bindungen teilen den Nummernraum. isamdateinummern.bas prüft Lücken, Wiederbelegung, CLOSE und RESET. |
| F04 | Beide Signale erreichen ihre registrierten Traps. events.rs beide_signale_werden_zugestellt_und_beginnen_in_quellreihenfolge. |
| F05 | KEY STOP erhält lesbare Eingabe und merkt den Handler einmal. events.rs key_on_off_stop_gelten_fuer_alle_konsoleneingaben; zusätzlich F1 in trap-masken.bas. |
| F06 | Eingaben und Handler behalten ihre Reihenfolge. 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 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 ohne_zeitbedarf_keine_uhrabfrage_und_keine_mausansammlung, sleep_folgt_nur_der_hostfrist_und_forms_timer_beendet_es; Ausführungsmodell. |
| F09 | Controls werden im jeweiligen Formular aufgelöst. 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 module_includes_erl_breakpoints_und_inspektion_behalten_ihren_ursprung, initialisierungen_def_fn_und_modulhandler_haben_eigene_quellorte; CLI-Quellorttest. |
| F11 | TBC 4 erhält Forms-Anfangswerte und Designarrays. CLI-Test projekt_und_formular_laufen_nach_entfernen_saemtlicher_quellen; VM-Projekttest für zwei Formulare. |
| F12 | ListIndex = −1 und Auswahländerungen sind konsistent. Forms-Tests listenauswahl_bleibt_beim_einfuegen_und_entfernen_konsistent, sorted_wechsel_erhaelt_auch_die_auswahl_zwischen_duplikaten. |
| F13 | Timerphasen beginnen bei ihrer Aktivierung. Forms-Tests timerarrays_holen_nur_aktive_zeit_nach_und_sortieren_nach_name_und_index; 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 input_datei_bewahrt_felder_und_unterscheidet_leer_von_fehlend. |
| F15 | INPUT$ zählt Zeichen, erhält Sondertastenreste und meldet vorzeitiges EOF. 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 alle_mk_cv_paare_verlangen_exakte_bytezeichenbreite. |
| F17 | Fehlende Datei und fehlender Elternpfad ergeben unterschiedliche Fehler. 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 prüft den BASIC-Fokuspfad. |
| F19 | TIMEZONEKNOWN liefert den gegenwärtigen Status, einschließlich Ausfall und Erholung. vm.rs timezoneknown_hat_integer_signatur_und_zeigt_aktuellen_status; Runtime-Test zonenquelle_ausfall_und_erholung_gelten_fuer_alle_zeitfunktionen. |
| F20 | VM-/Forms-Einbettung benötigt kein Terminalbackend. Separater Resolver tests/terminalfrei, 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 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 führt alle 133 registrierten Ereignisse bis zum BASIC-Handler und erkennt eine künstlich entfernte Ereignisbindung. |
| F22 | trap-masken.bas ergänzt KEY/UEVENT ON/OFF/STOP und EVENT OFF; 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, Delta; CLI-Test prüft alle 14 SCREEN-Modi und benannte Abweisungen. |
| F24 | VM-Design und Hauptspec beschreiben TBC 4 mit neun Abschnitten und dem aktuellen Opcode-Vertrag. Loader-Rundlauf, Versionsablehnung und beschädigte Referenzen sind in project.rs bzw. den CLI-Projekttests abgesichert. Dieser Change führt keine neue Formatversion ein. |
| F25 | Dateiformate und Delta unterscheiden Originalerhalt und kanonisches Schreiben. FRM-Tests 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:
TB_VBDOS_REPO=/pfad/zu/vbdos cargo test -p tb-cli --test foreign oeffentliche -- --ignored --nocapture
Der Test 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 -- --checkundgit 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)stattOther; 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$INCLUDEdurch 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.