# 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.
