184 lines
11 KiB
Markdown
184 lines
11 KiB
Markdown
# 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.
|