# Release-Grundabnahme: Fälle und Voraussetzungen

Basis: `54ee427c1c676170450068c5436e5875c84c9dce`, lokale Änderungen dieses
Changes. Alle folgenden Tests sind headless. Keine DOS-/GUI-Emulatoren.

## Ausführbare Aufrufe

Vom Repository aus; `--locked` bewahrt die Abhängigkeitsrevisionen:

```sh
# K: gesamter Korpus einschließlich Vergleichs-Gegenproben
cargo test --locked -p tb-cli --test compat
# P: Projekte, Includes, TBC, Diagnosen und Dateieffekte
cargo test --locked -p tb-cli --test project
# I: Inventar, Sollquellen, Absenkungsziele und Statusgruppen
cargo test --locked -p tb-cli --test inventar -- --nocapture
# E: tatsächliche Ereignisauslöser bis BASIC
cargo test --locked -p tb-vm --test events
# A: IDE-Projektablauf, CLI-/TBC-Parität und Befehlsmatrix
cargo test --locked -p tb-cli --bin tbc ide_acceptance::
# F: Pflichtnachweis des fixierten öffentlichen Bestands
TB_VBDOS_REPO=/absoluter/pfad/zu/vbdos cargo test --locked -p tb-cli --test foreign -- --include-ignored --nocapture
# G: zusammenhängende Grundabnahme, zuerst F, dann Workspace/Inventar/Gates/Benchmarks
python3 tests/support/release-abnahme.py --vbdos-repo /absoluter/pfad/zu/vbdos
```

Unter Windows wird TB_VBDOS_REPO als Prozessumgebungsvariable gesetzt;
G übernimmt dies plattformunabhängig. Alle Aufrufe liefern bei Fehler einen
von null verschiedenen Exitcode. Die reale Windows-/Linux-Prüfung folgt in
05/06, diese Matrix behauptet nur die ausgeführten lokalen Nachweise.

## Verhaltensgruppen und unabhängiges Soll

| Gruppe | Fälle | Aufruf | Soll und festgelegter Anfangszustand |
| --- | --- | --- | --- |
| Konsole/Zahlen/Steuerung | `hello`, `printzahlen`, `konvertierung`, `byref`, `kontrollfluss` | K: `korpus_laeuft_mit_korrekter_ausgabe` | Jeweilige `.out`, explizite tb-screen-Größe, keine Eingaben, Hostuhr 0; bestehende Sprach-/VM-Specs |
| Unicode/Attribute/Größe | `breitezeichen`, `bildschirm`, `groesse`, `groessenaenderung`, `release-formular` | K | COLOR/LOCATE-/Unicodevertrag; 80×25 bzw. 120×40, deklarierte Resize-Schritte; für release-formular 100×30 und Zeichen ab Spalte 90 |
| Forms/Fokus/Maus/Menü | `formular`, `formular-access-backtab`, `eingabe-maus-taste`, `eingabe-taste-maus`, `release-formular` | K | Geordnete Kopfereignisse; LostFocus vor GotFocus, genau ein Click, Menüauswahl; separate Zeichen-/Farberwartungen und zwei Läufe |
| Listen/Timer/modal | `listenauswahl`, `timer-aktivierung`, `formular` | K | Deklarierte Tasten/Maus/Zeit; bestehende `.out` mit Listenauswahl, Timertext und Dialogresultat |
| Zeit/Traps | `traps`, `trap-masken`, `datumzeit`, `timezoneknown`, `timezonefallback` | K, E | Virtuelle Uhr oder ausdrücklich gesetzte Zeit/Zone; KEY/UEVENT/TIMER-Masken und Reihenfolge. Zeitlose Invarianten bleiben als solche benannt |
| Dateien/ISAM | `dateien`, `eingabefortschritt`, alle `isam*.bas` | K | Frisches leeres Tempverzeichnis, deklarierte Bildschirmgröße, feste Dateiinhalte aus dem BASIC-Programm; `.out` prüft Lese-/Record-/Transaktionsresultate |
| Projekt-/Include-/Dateikette | `release_projekt_prueft_anfangsdateien_dateieffekte_und_include_fehler` | P | Zwei Module, verschachtelte Includes; seed.txt=`Grüße\n`, result.txt=`Start\n`; Ergebnis exakt `Start\nGrüße\n`, Quelle unverändert, Exit 2 und inner.bi Zeile 8 Spalte 5; Quell-/TBC-Lauf jeweils zweimal, Library-Quellen vor TBC-Lauf entfernt |
| Fehler/physische Orte | `fehlerbehandlung`; `cli_meldet_physische_quellorte_auch_nach_verschachtelten_includes`; `tbc_run_stop_exitcode`, `tbc_run_laufzeitfehler_exitcode` | K, P | ERR/ERL getrennt von Dateizeile; STOP=3, Runtimefehler=2; Sollstellen im jeweiligen Test, keine Systemzeitabhängigkeit |
| Quellfreie Projekte und Startdatei | `projekt_und_formular_laufen_nach_entfernen_saemtlicher_quellen`, `explicit_startup_order_and_form_selection_survive_tbc` | P | Festes Projekt/Form/Include, danach Quellen entfernt; identische Ausgabe und richtige Startformularwahl aus TBC |
| Vollständiges Inventar | `inventar_stimmt_mit_code_ueberein`, `jeder_inventareintrag_erreicht_hir_und_laufzeitziel`, `forms_inventar_stimmt_mit_der_klassentabelle_ueberein`, `abdeckungsstand_wird_ausgewiesen` | I | docs/inventar plus feste Inventar-Quellliste und unabhängige Absenkungsziele; Gegenproben für falsche Status-/Builtin-/Forms-Bindung |
| Ereignisvollständigkeit | `registrierte_form_ereignisse_erreichen_basic_aus_realen_quellen`, `registrierte_control_ereignisse_erreichen_basic_aus_realen_quellen`, `fehlender_ereignispfad_wird_namentlich_erkannt` | E | Jede registrierte Quelle löst ihren BASIC-Handler aus; künstlich fehlender Auslöser wird benannt |
| IDE/CLI/TBC | `create_save_debug_help_exports_and_reopen`, `saved_project_ide_source_cli_and_tbc_have_identical_sessions`, `reference_matrix_is_complete_and_points_to_runnable_tests` | A | Feste Tastensequenzen, Hostzeiten, Anfangsdateien und konkrete Ausgabe/Dateieffekte; bestehende 45-zeilige Phase-5-Befehlsmatrix. Native Exporterzeugung ist hier noch nicht implementiert |
| Dialog-EOF | `eof_im_dialog_eines_formularhandlers_beendet_die_ereignispumpe`, `eof_leert_angenommene_eingaben_bei_modalen_und_modellosen_forms` | E | EOF in einem Dialog beendet die Pumpe; bereits angenommene normale Formularereignisse bleiben vor EOF zustellbar |
| Vergleichsqualität | `release_formular_vergleicht_zeichen_und_attribute_unabhaengig`, `farbabweichung_nennt_zeile_spalte_soll_und_ist`, `fehlende_groessenangabe_wird_abgewiesen` | K | Vorab geschriebene Sollausgabe; gezielte Text-/Farbmutation, verkürzte Attributzeile und CJK-Spaltenposition müssen konkrete Diagnosen liefern |

Jede Korpus-Sollausgabe muss bereits existieren. Der Harness erzeugt bei
fehlendem Soll keine Ersatzdatei. Neue Ausgabe `release-formular.out` wurde
aus Handlerfolge und COLOR/LOCATE-Vorgaben geschrieben, nicht vom Istwert
übernommen. Bestehende Golden-Dateien bleiben unverändert.

## Öffentlicher Bestand

`cout/vbdos`, Revision `1cdd2b32b829fe1721d0b6aecc433abc47a96fb6`.
Lokaler Prüfbestand: `/tmp/terminalbasic-vbdos-evidence`; die Bereitstellung
ist extern und wird nicht einvendort. `git archive` liefert für jeden Lauf
frische Dateien exakt dieser Revision. Größe 100×30, virtuelle Hostuhr 0,
keine echten Wartezeiten; je Einstieg zwei Läufe mit gleichen Eingaben.

| Einstieg | Eingabe | Erwartete sichtbare Wirkung |
| --- | --- | --- |
| `graphics/graphics.mak` | Alt+X | Startformular sichtbar, danach entladen |
| `microsoft/check.mak` | Alt+F, X, N im Save-Dialog | Menü und Save-Dialog nachgewiesen, N konsumiert, Exit entlädt Formular |
| `microsoft/qlbview.mak` | Esc | Cancel entlädt Startformular |
| `microsoft/seek.mak` | Alt+X | Exit entlädt Startformular |
| `microsoft/spindemo.mak` | Tab, Tab, Pfeil hoch | Text1 wird ` 1`, sichtbarer Snapshot ändert sich |
| `microsoft/notepad.frm` | Alt+F, X, N im Save-Dialog | Menü und Save-Dialog nachgewiesen, N konsumiert, Formular entladen |
| `misc/mentors/mentors.frm` | Alt+F, X, N im Save-Dialog | Menü und Save-Dialog nachgewiesen, N konsumiert, Exit entlädt Formular |

Snapshots/Zustände müssen zwischen beiden Läufen identisch sein; die
obigen konkreten Wirkungen werden zusätzlich geprüft. Ein bloßer Vergleich
zweier gleich falscher Starts genügt nicht. Fehlendes TB_VBDOS_REPO, ein
unlesbares Repository und eine falsche HEAD-Revision scheitern mit Sollrevision
und konkreter Ursache. Temporäre Dateien werden bei Erfolg und beim Entrollen
von Assertions aufgeräumt.

## Übergabe an 02–07

G ist der wiederverwendbare lokale Abnahmeaufruf für spätere Actions; F
bleibt zwingend. 02–04 ergänzen EXE-/TBL-/IDE-Link-Parität mit diesem Sollsatz,
05 echte Terminalziele, 06 Zielpakete und Gitea-Läufe. Die finale Inventar-
und Leistungsprüfung nach deren Fachänderungen gehört in 07. Dieser Change
baut keine nativen Exportartefakte und nimmt keine fremden Plattformen ab.
