Phase 6: Kompatibilitaetsabnahme abschliessen und archivieren
This commit is contained in:
@@ -0,0 +1,183 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user