146 lines
7.2 KiB
Markdown
146 lines
7.2 KiB
Markdown
# Verifikation vom 06.09.2026
|
||
|
||
Historischer Befundstand vor der Korrektur; der Inventartest liegt inzwischen in tb-cli.
|
||
|
||
Change: `spezifikationsabgleich-und-regressionsnachweise`.
|
||
Geprüft wurde der aktuelle Arbeitsbaum auf `c8b92f06190d77714865e0018b090348f372d77e`:
|
||
Proposal, Design, sieben Tasks, vier Delta-Specs mit sechs Requirements und
|
||
18 Szenarien, betroffene Hauptverträge, Code, Tests und Abschlussreport.
|
||
|
||
**Ergebnis: drei offene Befunde. Die vorherige Aussage „keine offenen
|
||
Befunde“ ist durch diese Nachprüfung überholt.**
|
||
|
||
| Dimension | Ergebnis |
|
||
|---|---|
|
||
| Vollständigkeit | 7/7 Tasks formal abgehakt; die inhaltliche Abnahme ist wegen V01–V03 noch offen |
|
||
| Korrektheit | Bestehende Suite grün, fünf unabhängige Soll-Gegenproben schlagen fehl |
|
||
| Kohärenz | Bestehende Architektur und TBC-Version erhalten; Inventarnachweis und Import-Erhaltungszusage sind noch zu weitgehend |
|
||
| Befunde | 0 CRITICAL, 3 WARNING; davon V01 mit hoher, V02/V03 mit mittlerer Auswirkung |
|
||
|
||
## V01 — Index des Elterncontainers geht beim FRM-Import verloren (hoch)
|
||
|
||
**Fundstellen:** [frm.rs:87](../../../../crates/tb-ui/src/frm.rs#L87),
|
||
[frm.rs:122](../../../../crates/tb-ui/src/frm.rs#L122),
|
||
[frm.rs:131](../../../../crates/tb-ui/src/frm.rs#L131),
|
||
[forms.rs:269](../../../../crates/tb-ui/src/forms.rs#L269),
|
||
[forms.rs:531](../../../../crates/tb-ui/src/forms.rs#L531).
|
||
|
||
Der neue PARENT-Anfangswert erhält nur die Objekt-ID. Die Rekursion übergibt
|
||
ebenfalls nur `Some(object)`; `set_initial_at` verwirft einen vorhandenen Index,
|
||
und der Getter ergänzt grundsätzlich `None`. Ein Kind von `Group(1)` bekommt
|
||
damit `Group(0)` als Parent. Die neue Regression prüft unterschiedliche
|
||
unindizierte Frames, aber kein Kind innerhalb eines Frame-Arrays.
|
||
|
||
**Reproduktion:** FRM mit `Frame Group, Index = 0` und einem zweiten
|
||
`Frame Group, Index = 1`, darin `TextBox Probe`. Anschließend:
|
||
|
||
```basic
|
||
DIM p AS CONTROL
|
||
p = Probe.Parent
|
||
Form1.Hide
|
||
PRINT p.Index
|
||
END
|
||
```
|
||
|
||
Soll: `1`. Ist: `0`. Derselbe Fehler tritt nach `tbc build` und Löschen der
|
||
FRM-Quelle beim Ausführen der TBC-Datei auf. Beide Gegenproben schlagen fehl.
|
||
Das ist auch für den akzeptierten Fremdbestand relevant: `graphics.frm`
|
||
enthält indizierte Frames mit untergeordneten Controls.
|
||
|
||
**Vertrag:** Forms-Steuerelement-Arrays, vollständige Forms-Anfangsbeschreibungen
|
||
im TBC sowie Task 2.4; der aktuelle Abschlussreport behauptet außerdem den
|
||
Erhalt der Array-Eltern. Die neue PARENT-Unterstützung erfüllt diesen Erhalt
|
||
noch nicht vollständig.
|
||
|
||
**Behebung:** Eltern als vollständige Objektreferenz einschließlich Arrayindex
|
||
über Import, Anfangswerte, PARENT-Zugriff und davon abhängige Containerpfade
|
||
führen. Einen indizierten Elterncontainer im Quell- und TBC-Rundlauf prüfen;
|
||
den bestehenden Test mit gleichen Control-Namen in zwei Formularen erhalten.
|
||
|
||
## V02 — Inventarprüfung akzeptiert ein falsches Laufzeitziel (mittel)
|
||
|
||
**Fundstelle:** [inventar.rs:725](../../../../crates/tb-cli/tests/inventar.rs#L725).
|
||
|
||
`pruefe_kompilat` prüft lediglich, ob die im Kompilat vorkommenden Builtin-IDs
|
||
irgendwelche vorhandenen Bindungen haben und die Tabellenreferenzen gültig
|
||
sind. Es prüft nicht, ob das erzeugte Ziel dem untersuchten Inventareintrag
|
||
entspricht. Damit kann ein falsch abgesenktes Element weiterhin als
|
||
implementiert bestätigt werden.
|
||
|
||
**Reproduktion:** Die normale Probe `PRINT TIMEZONEKNOWN` wird kompiliert.
|
||
Anschließend ersetzt die Gegenprobe ausschließlich den erzeugten CallBuiltin
|
||
von TIMEZONEKNOWN (156) durch TIMER (54); beide haben null Argumente und eine
|
||
vorhandene Runtime-Bindung. Der bestehende Prüfer liefert weiterhin `Ok(())`.
|
||
Die Soll-Assertion, dass er diese Divergenz melden muss, schlägt fehl.
|
||
|
||
**Vertrag:** Delta `sprachinventar`, Requirement „Automatischer Abgleich
|
||
Inventar gegen Implementierung“, Task 2.1 und Design D1. Der Nachweis soll den
|
||
tatsächlichen Implementierungspfad des jeweiligen Elements prüfen, nicht nur
|
||
die Existenz eines beliebigen ausführbaren Ziels.
|
||
|
||
**Behebung:** Die erwartete Absenkung bzw. das beobachtbare Verhalten mit dem
|
||
konkreten Inventareintrag verbinden. Neben Unsupported und fehlender Bindung
|
||
auch eine gültige, aber falsche Zielbindung sowie eine verschwundene Absenkung
|
||
negativ prüfen. Das betrifft auch Forms-Methoden/-Eigenschaften, deren bloßes
|
||
Vorhandensein in gültigem Bytecode noch keinen passenden Dispatch beweist.
|
||
|
||
## V03 — Weitere gültige Non-Feature-Syntaxformen liefern nur Syntaxfehler (mittel)
|
||
|
||
**Fundstellen:** [parser.rs:199](../../../../crates/tb-frontend/src/parser.rs#L199),
|
||
[inventar-quellen.tsv:148](../../../../tests/support/inventar-quellen.tsv#L148),
|
||
[inventar-quellen.tsv:153](../../../../tests/support/inventar-quellen.tsv#L153).
|
||
|
||
Der neue Parserpfad behandelt CIRCLE, WINDOW und IOCTL. Andere ausdrücklich
|
||
verbotene Grafikformen erreichen weiterhin nicht die vorgeschriebene
|
||
Feature-unavailable-Diagnose. Die festen Inventarvorlagen erfassen davon nur
|
||
Syntaxvarianten, die der allgemeine Aufrufparser bereits versteht.
|
||
|
||
**Reproduktionen mit `tbc check`:**
|
||
|
||
- `PSET (1,1),2` → `Syntax error` in Spalte 11.
|
||
- `DIM a%(15)` gefolgt von `PALETTE USING a%(0)` → `Expected: expression`
|
||
in Zeile 2, Spalte 9.
|
||
|
||
Beide sind gültige Syntaxformen ausgeschlossener Funktionen. Erwartet wird
|
||
jeweils die benannte Compile-Diagnose `Feature unavailable`, nicht ein
|
||
allgemeiner Syntaxfehler. Beide Soll-Gegenproben schlagen fehl.
|
||
|
||
**Vertrag:** Delta `sprach-frontend`, Requirement „Compile-Zeit-Abweisung
|
||
deklarierter Non-Features“ verlangt diese Diagnose für jede Verwendung;
|
||
Task 1.1 verlangt die benannte Abweisung weiterhin verbotener Formen.
|
||
|
||
**Behebung:** Die besondere Syntax der verbleibenden ausgeschlossenen Formen
|
||
vor dem allgemeinen Aufrufparser erkennen oder bis zur Non-Feature-Diagnose
|
||
parsen. Die CLI-/Inventarproben um Koordinaten mit Farbargument und PALETTE
|
||
USING ergänzen; die erlaubte Grafikuntermenge weiter positiv prüfen.
|
||
|
||
## Ausgeführte Prüfungen
|
||
|
||
- `cargo test --workspace`: **476 bestanden, 0 fehlgeschlagen, 2 ignoriert**.
|
||
- Gesonderter Fremdtest mit dem dokumentierten Checkout und Commit:
|
||
**bestanden**, sieben Einstiege jeweils zweimal, mit den festgelegten
|
||
Menü-, Exit-, Dialog- und Spin-Zuständen.
|
||
- `openspec validate --all --strict`: **16 bestanden, 0 Fehler**;
|
||
vorhandene Hinweise zu Textlängen sind informativ.
|
||
- `git diff --check`: bestanden.
|
||
- Neue unabhängige Soll-Gegenproben: **fünf fehlgeschlagen**, zugeordnet zu den
|
||
drei Befunden oben. Produktcode, bestehende Tests und Sollbilder wurden
|
||
während dieses Reviews nicht geändert.
|
||
|
||
Die [Gegenproben](review-probes.py) sind reproduzierbar und erzeugen Dateien
|
||
nur in einem temporären Verzeichnis. Sie bauen die CLI, prüfen die vier
|
||
CLI-Fälle und kompilieren für die Zielmutation eine temporäre Kopie des
|
||
bestehenden Inventarprüfers:
|
||
|
||
```sh
|
||
python3 openspec/changes/archive/2026-09-06-spezifikationsabgleich-und-regressionsnachweise/review-probes.py
|
||
```
|
||
|
||
Der Aufruf liefert derzeit Status 1. Keine GUI, kein Emulator und kein
|
||
Netzwerkzugriff sind erforderlich. Keine Verifikationsdimension wurde
|
||
übersprungen. Die grünen bestehenden Tests und die sieben engen
|
||
Fremdprogrammsequenzen widerlegen die zusätzlich reproduzierten Fehler nicht.
|
||
|
||
**Abnahme:** Noch nicht vollständig spezifikationskonform. V01–V03 vor der
|
||
abschließenden Synchronisierung und Archivierung beheben und nachprüfen.
|