# Verifizierung: phase-6-01-kompatibilitaet-und-leistungsabnahme

Stand: 2026-09-07. Geprüft wurden Proposal, Design, Tasks, Delta-Spec und
Implementierung im Arbeitsbaum auf Basis von
`54ee427c1c676170450068c5436e5875c84c9dce`.

## Ergebnis

| Dimension | Ergebnis |
| --- | --- |
| Vollständigkeit | 9/9 Aufgaben umgesetzt; 4/4 Requirements nachgewiesen |
| Korrektheit | 4/4 Szenarien geprüft; alle gefundenen Abweichungen behoben |
| Kohärenz | Bestehende Harnesses, Inventare und Benchmarks weiterverwendet; keine neue Abhängigkeit |
| Offene Befunde | 0 CRITICAL, 0 WARNING, 0 SUGGESTION |

Alle Prüfungen dieses Changes bestanden. Keine Prüfdimension übersprungen.
Die [Abnahmematrix](abnahmematrix.md) enthält konkrete Fallnamen, Eingaben,
Sollzustände, Aufrufe und Voraussetzungen für die weitere Phase 6.

## Requirements und Szenarien

| Requirement / Szenario | Implementierung und Nachweis |
| --- | --- |
| Deterministischer Abnahmesatz / Wiederholter Formularlauf | `tests/compat/release-formular.frm` verbindet Fokus, Maus, Menü und Resize mit Unicode und Farbe. `crates/tb-cli/tests/compat.rs`: `release_formular_vergleicht_zeichen_und_attribute_unabhaengig` prüft zwei Läufe und absichtlich falsche Text-/Farberwartungen. Das Soll wurde aus Handlerfolge, COLOR und LOCATE geschrieben. Der bestehende Korpus prüft fehlende Sollwerte als Fehler. |
| Deterministischer Abnahmesatz: Projekte, Includes, Fehler, Dateien | `crates/tb-cli/tests/project.rs`: `release_projekt_prueft_anfangsdateien_dateieffekte_und_include_fehler` prüft zwei Quell- und zwei quellfreie TBC-Läufe, Anfangsdateien, exakte Ergebnisbytes, Exitcode 2, physischen Include-Ort 8:5 und Aufräumen. Die Matrix ordnet die übrigen bestehenden Verhaltensgruppen zu. |
| Expliziter Fremdprogrammnachweis / Referenzbestand fehlt | `crates/tb-cli/tests/foreign.rs`: `pruefe_bestand` erzwingt Revision und lesbares Repository; Gegenprobe prüft fehlende Variable, ungültigen Pfad und falsche Revision. `tests/support/release-abnahme.py` aktiviert den Fremdtest ausdrücklich vor allen weiteren Gates. Der vollständige Lauf mit sieben Einstiegen, jeweils zweimal, bestand. |
| Begründete Leistungsentscheidung / Kein Optimierungsbedarf | Unveränderte Compile-/VM-Benchmarks auf identischer Hardware vor und nach der Änderung; Messwerte und Einordnung unten. Compile-Budgets bestanden. Keine Performance-Optimierung durchgeführt; die einzige VM-Änderung behebt einen funktionalen Dialog-EOF-Fehler. |
| Nachvollziehbare Befundbehandlung / Snapshot weicht ab | Vergleichs-Gegenproben nennen erste Text-/Farbabweichung mit Soll/Ist. Befunde und Korrekturen unten; vorhandene Golden-Dateien und Inventare unverändert. Regressionstests und vollständige erneute Abnahme bestanden. |

## Behobene Befunde

### 1. Fehlerhafte Attributdiagnose im Korpusvergleich

Sollquelle: `kompat-testkorpus`, Requirement zum Sollvergleich mit erster
Abweichung; `textbildschirm`, Unicode-/Attributdarstellung. Zuständig:
`crates/tb-cli/tests/compat.rs`, `assert_output_matches`.

Ist: Eine verkürzte Attributzeile mit gleichem Präfix führte zu Spalte 0 und
anschließendem Integer-Unterlauf. Nach einem breiten Unicode-Zeichen wurde
die logische Zeichenposition als Bildschirmspalte gemeldet.

Korrektur: Der Vergleich berechnet zunächst den Attributindex, auch bei
unterschiedlicher Länge, und daraus die physische Spalte mit der bereits
verfügbaren Textbreitenfunktion. Die Regression prüft verkürzte Attribute
und `中a`: Eine Farbabweichung bei `a` muss Spalte 3 nennen. Die separate
Formularprobe weist sowohl falsche Zeichen als auch ausschließlich falsche
Farben zurück. Bestehende Sollausgaben wurden nicht angepasst.

### 2. Unvollständige Dialogeingaben im öffentlichen Pflichtnachweis

Sollquelle: `release-kompatibilitaet`, explizite Eingabefolge und sichtbares
Resultat des fixierten Bestands. Zuständig: `crates/tb-cli/tests/foreign.rs`.

Ist: Der ausdrücklich aktivierte Lauf erreichte bei `check.mak` den
Save-Dialog ohne Antwort und überschritt seine Prozessfrist. Auch Mentors
benötigt eine Save-Antwort. Der Testhost lieferte vorbereitete Antworten
bisher nur bei blockierenden Hostaufrufen; kooperatives Polling verwendet
nichtblockierende Aufrufe.

Korrektur: Die Eingabefolge für Check und Mentors enthält ausdrücklich N.
Der Host liefert die Antwort erst nach Darstellung des erwarteten Dialogs;
für Check/Mentors `Save these records?`, für Notepad `Save changes to`.
Dialoganzeige, Verbrauch der Antwort, sichtbare Menüwirkung und Entladen
werden weiter geprüft. Alle sieben bisherigen Einstiege bleiben erhalten;
beide Läufe jedes Einstiegs stimmen überein.

### 3. Dialog-EOF wurde in der Formularpumpe verschluckt

Sollquelle: `release-kompatibilitaet`, nachvollziehbare Fachkorrektur;
bestehender kooperativer Ausführungs-/EOF-Vertrag der VM-Ereignispumpe.
Zuständig: `crates/tb-vm/src/interp.rs`, `poll_visible_forms`.

Ist: EOF während eines MSGBOX in einem modellosen Formularhandler ließ
`poll` enden. Die Formularpumpe wandelte dies wie ein normales Modulende
in Yield um und konnte endlos weiterlaufen. Dies wurde unabhängig vom
Fremdhost mit einem begrenzten Regressionstest reproduziert.

Korrektur: Die gemeinsame Formularpumpe gibt bei aktivem Dialog und EOF
Ended zurück. CLI und IDE benutzen diesen Pfad. Der neue Test
`eof_im_dialog_eines_formularhandlers_beendet_die_ereignispumpe` scheiterte
vor der Korrektur mit „Dialog-EOF wurde als Yield verschluckt“ und besteht
danach. Er prüft auch, dass nach dem Dialog kein BASIC-Code ausgeführt wird.
Der bestehende Test für bereits angenommene Eingaben vor EOF bleibt grün;
33 Ereignis- und 7 kooperative Tests bestanden zusammen.

## Ausgeführte Gates

Gesamtabnahme:

```sh
python3 tests/support/release-abnahme.py --vbdos-repo /tmp/terminalbasic-vbdos-evidence
openspec validate --all --strict
git diff --check
```

| Prüfung | Ergebnis |
| --- | --- |
| Expliziter Fremdtest mit `--include-ignored` | 3 Tests bestanden, darin 7 Einstiege × 2 Läufe; Revision `1cdd2b32b829fe1721d0b6aecc433abc47a96fb6` |
| `cargo test --locked --workspace` | 609 Tests sowie 1 Offline-Kindprozesstest bestanden; 0 fehlgeschlagen |
| Absichtlich ignorierte Entwicklertests | 2: Golden-Erzeugung und optionaler Fremdtest; Fremdtest separat verpflichtend bestanden, Golden-Erzeugung nicht ausgeführt |
| Korpus | 38 BAS + 7 FRM, 46 größenbezogene Sollausgaben, jeder Fall zweimal; zusätzliche Vergleichs-Gegenproben |
| Inventarbericht | 845 Einträge, siehe getrennte Statusgruppen unten |
| `cargo fmt --all -- --check` | Bestanden |
| `cargo clippy --locked --workspace --all-targets -- -D warnings` | Bestanden |
| Compile-/VM-Benchmarks | Bestanden, beide Compile-Budgets eingehalten |
| OpenSpec, alle Specs und Changes, strikt | 30 bestanden, 0 fehlgeschlagen; vorhandene INFO-Hinweise zu Textlängen sind keine Validierungsfehler |
| `git diff --check` | Bestanden |

Zusätzliche Gegenproben des tatsächlichen Release-Aufrufs: Ohne
`--vbdos-repo` Exit 2 mit Benennung des Pflichtarguments; mit falschem
Repository Exit 101 und „falsche Revision“; mit nicht vorhandenem Pfad
Exit 101 und fehlendem/ungültigem Git-Bestand. Letzterer Aufruf erfolgte
außerhalb des Checkouts über den absoluten Skriptpfad. Kein Fehlfall wurde
als erfolgreicher Release-Nachweis gewertet.

## Inventar

| Gruppe | Implementiert | Offen | Non-Feature | Gesamt |
| --- | ---: | ---: | ---: | ---: |
| Sprache | 241 | 0 | 50 | 291 |
| Forms-Objektmodell | 554 | 0 | 0 | 554 |
| Gesamt | 795 | 0 | 50 | 845 |

Offene Einträge: keine. Quelllisten, unabhängige Absenkungsziele,
Forms-Klassentabelle und tatsächliche BASIC-Ereignisauslöser wurden geprüft.
Es wurden keine Inventareinträge entfernt oder als Non-Feature umklassifiziert.

## Leistung und Entscheidung

Hardware: Apple M5 Max, 128 GiB RAM, macOS 26.6.2 (25G83),
`aarch64-apple-darwin`. Rust 1.97.1 (`8bab26f4f`), Cargo 1.97.1,
LLVM 22.1.6. Alle Messungen auf demselben Rechner mit
`cargo bench --locked -p tb-vm --bench compile --bench vm`, optimiertem
Bench-/Release-Profil, opt-level 3, LTO und codegen-units 1.

Vergleich: sauberer Basiscommit `54ee427c1c676170450068c5436e5875c84c9dce`
vor Änderungen. Endstand: dieser Arbeitsbaum einschließlich Dialog-EOF-Fix.
Die erste Endmessung folgte dem vollständigen Abnahmelauf und Rebuild;
eine zusätzliche Messung ohne Rebuild klärte die beobachtete Streuung.

| Last | Basis | Endstand, erster Lauf | Endstand, Bestätigung |
| --- | ---: | ---: | ---: |
| Modul, 508 Zeilen, Budget < 50 ms | 0,73 ms | 1,26 ms | 0,80 ms |
| Projekt, 49.760 Zeilen / 20 Module, Budget < 1.000 ms | 93 ms | 107 ms | 91 ms |
| Inkrementell, 1 Modul | 0,77 ms | 0,79 ms | 0,73 ms |
| Inkrementell, 20 Module | 22,46 ms | 22,38 ms | 21,19 ms |
| INTEGER, 10 Mio. Iterationen | 1.217 ms | 1.251 ms | 1.184 ms |
| DOUBLE, 5 Mio. Iterationen | 572 ms | 621 ms | 557 ms |
| SUB/BYREF, 1 Mio. Aufrufe | 139 ms | 141 ms | 140 ms |
| Stringfunktionen, 200.000 Runden | 109 ms | 118 ms | 110 ms |

Verfahren unverändert: Modul als bester von zehn Läufen nach Aufwärmen;
Projekt als vollständige Übersetzung mit 335.421 Instruktionen;
inkrementell Median aus sieben Änderungen einschließlich Invalidierung
und Link, beim Projekt ein Modul neu und 19 wiederverwendet. VM-Zeiten
messen Ausführung ohne Compilation. Bestätigter VM-Durchsatz: 8,4 Mio.
INTEGER- und 9,0 Mio. DOUBLE-Iterationen/s, 7,1 Mio. Aufrufe/s sowie
1,8 Mio. Stringrunden/s.

Entscheidung: **Kein Optimierungsbedarf im gemessenen Abnahmesatz.** Beide
Compile-Budgets bestehen mit deutlichem Abstand. Die anfänglichen
VM-Abstände von ungefähr 1–9 % bestätigten sich nicht: Schleifen waren
anschließend schneller als die Basis, Aufruf-/Stringzeiten lagen jeweils
nur 1 ms darüber. Das belegt keinen belastbaren Engpass. Es wurde kein
neues VM-Zeitlimit eingeführt und kein VM-Code zur Optimierung verändert.
Der funktionale EOF-Fix wurde mit denselben Semantik- und Leistungstests
abgenommen. Die Messung behauptet keine statistisch exakte Performanceparität.

## Übergabe

Der Abnahmeaufruf benötigt Rust/Cargo, Python 3, Git, tar und den extern
bereitgestellten fixierten Fremdbestand. Er lädt nichts herunter und
erzeugt keine Golden-Dateien. Fallmatrix und Zahlen stehen im Repository;
lokale Rohprotokolle liegen ergänzend in `/tmp/tb-phase6-01-evidence/`
(`baseline-environment.txt`, `baseline-bench.log`, `release-abnahme.log`,
`bench-confirmation.log`, `dialog-eof-before.log`, `vm-regression.log`).

Changes 02–07 übernehmen diese Grundlage für tbrt, TBL/Linker, IDE-Export,
reale Zielplattformen, Gitea Actions und finale Abnahme. Windows/Linux,
native Exportartefakte und Release-Pakete sind hier nicht als abgenommen
ausgewiesen. Am 2026-09-07 wurden die vier Requirements in die Hauptspezifikation
`release-kompatibilitaet` synchronisiert, alle 24 Hauptspezifikationen strikt
validiert und der Change archiviert.
