Spezifikationsabgleich und Regressionsnachweise abschließen

This commit is contained in:
2026-09-06 10:31:16 +02:00
parent c8b92f0619
commit 024336e29c
39 changed files with 2485 additions and 120 deletions

View File

@@ -12,7 +12,7 @@ pruefe_forms erwartet jede Klasseneigenschaft und jedes Ereignis pauschal als im
### D1 — Vorhandenen Inventartest erweitern
Inventareinträge weiterhin aus der Markdowntabelle lesen, aber für implementiert mindestens erzeugbare Frontend-/HIR-Pfade ohne Unsupported und auflösbare Runtime-Ziele prüfen. Syntaxformen mit expliziten kleinen Programmvorlagen abdecken; Forms-Probequellen aus Klassen-/Signaturmetadaten erzeugen. Klassentabellen allein gelten nicht als Laufzeitnachweis. Für Ereignisse reale Auslöser bis zum BASIC-Handler prüfen; die konkret fehlenden Form-KeyPress/KeyUp ergänzen, nicht den Status auf offen setzen.
Inventareinträge weiterhin aus der Markdowntabelle lesen, aber für implementiert mindestens erzeugbare Frontend-/HIR-Pfade ohne Unsupported und auflösbare Runtime-Ziele prüfen. Syntaxformen mit expliziten kleinen Programmvorlagen abdecken; Forms-Probequellen aus Klassen-/Signaturmetadaten erzeugen. Der Inventartest liegt im CLI-Testpaket, damit auch `$INCLUDE` den echten Projektlader durchläuft. Unabhängige Sollziele aus Runtime-ABI, Instruktionsvertrag und Modulmetadaten müssen in der tatsächlichen Absenkung vorkommen; Forms-Dispatch muss den konkreten Klassenmember erreichen. Gegenproben ersetzen gültige Bindungen, Forms-Member und Typselektoren oder entfernen die Absenkung. Klassentabellen allein gelten nicht als Laufzeitnachweis. Für Ereignisse reale Auslöser bis zum BASIC-Handler prüfen; die konkret fehlenden Form-KeyPress/KeyUp ergänzen, nicht den Status auf offen setzen.
### D2 — Korpusfälle nach fehlender Bedingung hinzufügen
@@ -20,7 +20,7 @@ Bestehenden CaptureHost/Harness wiederverwenden; jede Maskierungsquelle in ON/OF
### D3 — Bestehende Produktentscheidungen synchronisieren
Nur LINE/PAINT/VIEW/SCREEN 013 aus der pauschalen Grafikablehnung ausnehmen; verbleibende Non-Features behalten. FRM: unverändertes Lesen/Schreiben erhält die Originalbytes; neues/geändertes kanonisches Schreiben lässt Defaults aus. Keine Änderung des funktionierenden Erhaltungsmodus nötig.
Nur LINE/PAINT/VIEW/SCREEN 013 aus der pauschalen Grafikablehnung ausnehmen; verbleibende Non-Features behalten. FRM: unverändertes Lesen/Schreiben erhält die Originalbytes; neues/geändertes kanonisches Schreiben lässt Defaults aus. Keine Änderung des funktionierenden Erhaltungsmodus nötig. Explizite Control-Array-Indizes bleiben als Strukturangaben auch bei Index 0 erhalten. Elternreferenzen behalten ihren Arrayindex im bestehenden PARENT-Anfangswert (TBC4). Alle Containerpfade nutzen diese Referenz; Zeichnung und Trefferprüfung ordnen Container vor ihren Kindern ein. Die TBC-Validierung weist fehlende Elterninstanzen und Zyklen ab.
### D4 — Abschließender Review als Befundnachweis
@@ -29,7 +29,7 @@ Nach den fünf Korrektur-Changes jede F-ID mit konkretem Regressionstest/Prüfer
## Risks / Trade-offs
- Generierte Tests spiegeln wieder nur Implementierungsmetadaten → erwartete Ergebnisse für kritische Ereignisse und negative Markerfälle unabhängig in kleinen Quellen festhalten.
- Überlappung mit funktionalen Korrekturen → diese zuerst integrieren und nur die hier benannten verbleibenden Eventquellen ändern.
- Überlappung mit funktionalen Korrekturen → diese zuerst integrieren und die im vollständigen Ereignis- und Fremdprogrammlauf nachgewiesenen fehlenden Quellen bzw. Importpfade an ihrem gemeinsamen Ursprung korrigieren.
- Fremdprogramme können Hardware-Non-Features außerhalb des akzeptierten Bestands enthalten → dokumentierten Prüfbestand/Revision festhalten, keine globale Kompatibilitätszusage daraus ableiten.
## Migration Plan

View File

@@ -1,6 +1,6 @@
## Why
Der aktuelle Inventarabgleich bestätigt überwiegend Tabellen gegen dieselben Tabellen, während konkrete Formularereignisse fehlen. Korpusabdeckung und Hauptspecs sind nach den jüngsten Features nicht vollständig nachgezogen (F21F23/F25). Siehe [Review vom 05.09.2026](../../../docs/reviews/2026-09-05-openspec-code-review.md).
Der aktuelle Inventarabgleich bestätigt überwiegend Tabellen gegen dieselben Tabellen, während konkrete Formularereignisse fehlen. Korpusabdeckung und Hauptspecs sind nach den jüngsten Features nicht vollständig nachgezogen (F21F23/F25). Siehe [Review vom 05.09.2026](../../../../docs/reviews/2026-09-05-openspec-code-review.md).
## What Changes

View File

@@ -0,0 +1,145 @@
# 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 V01V03 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. V01V03 vor der
abschließenden Synchronisierung und Archivierung beheben und nachprüfen.

View File

@@ -0,0 +1,113 @@
#!/usr/bin/env python3
"""Unabhängige Soll-Gegenproben; Produktcode und bestehende Tests bleiben unverändert."""
from pathlib import Path
import os
import subprocess
import tempfile
ROOT = next(p for p in Path(__file__).resolve().parents
if (p / "Cargo.toml").is_file() and (p / "openspec").is_dir())
TBC = ROOT / "target/debug/tbc"
def run(*args, **kwargs):
return subprocess.run(args, capture_output=True, text=True, timeout=60, **kwargs)
def main():
subprocess.run(["cargo", "build", "-p", "tb-cli"], cwd=ROOT, check=True)
failed = []
def check(name, ok, evidence):
print(f"{'PASS' if ok else 'FAIL'} {name}: {evidence}")
if not ok:
failed.append(name)
with tempfile.TemporaryDirectory(prefix="tb-review-") as tmp:
tmp = Path(tmp)
for name, source in [("PSET", "PSET (1,1),2"),
("PALETTE", "DIM a%(15)\nPALETTE USING a%(0)")]:
path = tmp / "graphics.bas"
path.write_text(source + "\n")
out = run(str(TBC), "check", str(path))
check(name + " Non-Feature", out.returncode != 0 and
"Feature unavailable" in out.stderr and name in out.stderr,
out.stderr.strip())
path = tmp / "parent.frm"
path.write_text('''VERSION 1.00
Begin Form Form1
Begin Frame Group
Index = 0
End
Begin Frame Group
Index = 1
Begin TextBox Probe
End
End
End
DIM p AS CONTROL
p=Probe.Parent
Form1.Hide
PRINT p.Index
END
''')
out = run(str(TBC), "run", str(path))
check("Indizierter Parent aus FRM", out.returncode == 0 and out.stdout.strip() == "1",
f"Soll=1, Ist={out.stdout!r}, {out.stderr}")
build = run(str(TBC), "build", str(path))
assert build.returncode == 0, build.stderr
path.unlink()
out = run(str(TBC), "run", str(path.with_suffix(".tbc")))
check("Indizierter Parent aus TBC ohne Quelle", out.returncode == 0 and out.stdout.strip() == "1",
f"Soll=1, Ist={out.stdout!r}, {out.stderr}")
# Kopie im Temp-Verzeichnis erlaubt Zugriff auf den privaten Prüfer.
# Einzige Mutation: TIMEZONEKNOWN zeigt auf die gültige TIMER-Bindung.
source = (ROOT / "crates/tb-cli/tests/inventar.rs").read_text()
source = source.replace('include_str!("../../../tests/support/inventar-quellen.tsv")',
f'include_str!("{ROOT}/tests/support/inventar-quellen.tsv")')
source += r'''
#[test]
fn review_falsches_laufzeitziel_muss_abgewiesen_werden() {
let e=inventar().into_iter().find(|e|e.name=="TIMEZONEKNOWN").unwrap();
let (src,catalog)=probe_source(&e);
let mut module=tb_vm::compile_source_with_forms("FORM1",&src,&catalog).unwrap();
let mut changed=false;
for i in module.procs.iter_mut().flat_map(|p|&mut p.code) {
if let tb_vm::bytecode::Instr::CallBuiltin(id,_) = i {
if *id==tb_runtime::builtins::ids::TIMEZONEKNOWN {
*id=tb_runtime::builtins::ids::TIMER;
changed=true;
}
}
}
assert!(changed);
let result=pruefe_kompilat(&e,Ok(module),|id|tb_runtime::builtins::builtin_table().get(id as usize).is_some());
assert!(result.is_err(),"TIMEZONEKNOWN mit TIMER-Ziel wird akzeptiert: {result:?}");
}
'''
probe = tmp / "inventar.rs"
probe.write_text(source)
# Cargo resolves a coherent dependency graph; selecting rlibs by mtime
# can mix feature variants after a workspace test run.
source = source.replace('env!("CARGO_MANIFEST_DIR")', f'"{ROOT}/crates/tb-cli"')
probe.write_text(source)
manifest = '[package]\nname = "tb-review-probes"\nversion = "0.0.0"\nedition = "2021"\n[workspace]\n'
manifest += '[[test]]\nname = "inventar"\npath = "inventar.rs"\n[dependencies]\n'
for name in ["tb-vm", "tb-frontend", "tb-runtime"]:
manifest += f'{name} = {{ path = "{ROOT}/crates/{name}" }}\n'
(tmp / "Cargo.toml").write_text(manifest)
env = os.environ.copy()
env["CARGO_BIN_EXE_tbc"] = str(TBC)
out = run("cargo", "test", "--manifest-path", str(tmp / "Cargo.toml"),
"--offline", "--target-dir", str(ROOT / "target/review-probes"),
"--test", "inventar", "review_falsches", "--", "--nocapture", env=env)
check("Inventar erkennt falsches Laufzeitziel", out.returncode == 0,
out.stdout + out.stderr)
print(f"{len(failed)} fehlgeschlagene Soll-Gegenproben")
return bool(failed)
if __name__ == "__main__":
raise SystemExit(main())

View File

@@ -0,0 +1,51 @@
# Abschließende Verifikation vom 06.09.2026
Change: `spezifikationsabgleich-und-regressionsnachweise`.
Grundlage: aktueller Arbeitsbaum auf `c8b92f06190d77714865e0018b090348f372d77e`.
Geprüft: Proposal, Design D1D4, elf Tasks, vier Delta-Specs mit sechs
Requirements und 18 Szenarien sowie die betroffenen Hauptverträge und Codepfade.
**Ergebnis: keine offenen Befunde.**
| Dimension | Ergebnis |
|---|---|
| Vollständigkeit | 11/11 Tasks, 6/6 Requirements, 18/18 Szenarien abgedeckt |
| Korrektheit | Gesamtsuite, fünf ursprüngliche Soll-Gegenproben und zusätzliche Regressionen bestanden |
| Kohärenz | Gemeinsame Compiler-/VM-/Forms-Pfade; vorhandener TextScreen; keine neue Abhängigkeit oder TBC-Version |
| Befunde | 0 CRITICAL, 0 WARNING, 0 SUGGESTION |
Die [erste Nachprüfung mit V01V03](review-initial.md) bleibt als historischer
Ausgangsbefund erhalten. Die vollständige Szenarienmatrix steht in
[verification.md](verification.md), der Abgleich F01F25 im
[Abschlussreport](../../../../docs/reviews/2026-09-06-openspec-abschlussreview.md).
## Nachweis der Behebung
| Befund | Korrektur und Gegenprobe |
|---|---|
| V01 indizierte Elterncontainer | [frm.rs](../../../../crates/tb-ui/src/frm.rs) übergibt vollständige Parent-Schlüssel. [forms.rs](../../../../crates/tb-ui/src/forms.rs) bewahrt diese in den vorhandenen PARENT-Eigenschaften; Getter, Root-Traversierung, Geometrie, Optionsgruppen und Menüpfade verwenden dieselbe Referenz. Die ursprünglichen CLI-Gegenproben liefern `1` sowohl aus FRM als auch aus TBC nach Löschen der Quelle. |
| V01 ergänzend geprüfte Darstellung und Maus | `indexed_containers_preserve_parent_geometry_and_option_groups` prüft die Elterninstanz, absolute Position, unabhängige Optionsgruppen, sichtbare Beschriftung und Trefferziel. Vor der letzten Korrektur fing `Group(1)` den Klick auf sein Kind `Other` ab. `form_controls` stellt jetzt den Container vor seine Kinder; Zeichnung und umgekehrte Trefferprüfung nutzen dieselbe Reihenfolge. Die neue Gegenprobe besteht. |
| V01 TBC-Grenze | [bytecode.rs](../../../../crates/tb-vm/src/bytecode.rs) validiert die effektiven Parent-Referenzen einschließlich Arrayinstanzen und Zyklen. `beschaedigte_container_werden_vor_der_ausfuehrung_abgewiesen` enthält beide Mutationen. Bestehender Mehrformular-/Array-Test bleibt grün. |
| V02 falsches Laufzeitziel | [inventar.rs](../../../../crates/tb-cli/tests/inventar.rs) vergleicht unabhängige Sollziele in den 291 festen Vorlagen mit dem erzeugten Kompilat. Builtin-IDs und Konverterselektoren, konkrete Forms-Member, VM-Instruktionen und Deklarationsmetadaten werden geprüft. `$INCLUDE` durchläuft den echten CLI-Projektlader. Die ursprüngliche TIMEZONEKNOWN→TIMER-Mutation wird mit Name und Status abgewiesen. |
| V02 weitere Mutationen | `falsche_gueltige_builtinbindung_und_entfernte_absenkung_fallen_durch`, `forms_absenkung_muss_den_richtigen_member_erreichen` und `gemeinsam_dispatchte_konverter_brauchen_den_richtigen_typselektor` bestehen; bestehende Status-/Unsupported-/fehlende-Bindung-Proben ebenfalls. Alle 845 Inventareinträge werden geprüft; 795 implementiert, 50 Non-Features, 0 offen. Ereignisse werden zusätzlich über 133 reale Auslösepfade bis zum BASIC-Handler geprüft. |
| V03 weitere Non-Feature-Syntax | [parser.rs](../../../../crates/tb-frontend/src/parser.rs) erkennt zuerst mögliche Zuweisungen und weist danach ausgeschlossene Anweisungen vor der allgemeinen Argumentauflösung namentlich ab. CLI-Test prüft PSET/PRESET mit Farbe und STEP, CIRCLE STEP, WINDOW SCREEN und PALETTE USING einschließlich IF. Gleichnamige Arrays sowie SCREEN 013/LINE/PAINT/VIEW bleiben gültig. Beide ursprünglichen Grafik-Gegenproben bestehen. |
| Ergänzende Kohärenzprüfung | ComboBox-Ausklappzustand wird bei Fokuswechsel und Ausblenden zurückgesetzt; `combobox_dropdown_closes_on_focus_change_and_hide` besteht. |
## Abschlussprüfungen
- `cargo test --workspace`: **481 bestanden, 0 fehlgeschlagen, 2 ignoriert**.
- `python3 openspec/changes/archive/2026-09-06-spezifikationsabgleich-und-regressionsnachweise/review-probes.py`: **5/5 Gegenproben bestanden**. Die Soll-Assertions bleiben erhalten; nur Testpfad und Cargo-Auflösung wurden an den verschobenen Inventartest angepasst.
- `TB_VBDOS_REPO=/tmp/terminalbasic-vbdos-evidence cargo test -p tb-cli --test foreign oeffentliche -- --ignored --nocapture`: **bestanden**, sieben öffentliche Programme jeweils zweimal; Revision `1cdd2b32b829fe1721d0b6aecc433abc47a96fb6`.
- `cargo run --manifest-path tests/terminalfrei/Cargo.toml --offline`: **bestanden**, `Terminalfreier FRM-/VM-Lauf: KM`.
- `cargo clippy --workspace --all-targets --all-features -- -D warnings`: **bestanden**.
- `openspec validate --all --strict`: **16/16 Einträge gültig**.
- `cargo fmt --all -- --check` und `git diff --check`: **bestanden**, neue Dateien zusätzlich geprüft.
Der Golden-Generator wurde nicht ausgeführt. Bei diesen Reviewkorrekturen
wurden keine weiteren Golden Files verändert. Kein Prüfschritt wurde wegen
fehlender Voraussetzungen ausgelassen; der normalerweise ignorierte
Fremdprogrammlauf wurde ausdrücklich ausgeführt.
Die Umsetzung ist verifiziert. Am 06.09.2026 wurden alle vier Delta-Specs
in die Hauptspecs synchronisiert und dieser Change mit 11/11 erledigten Tasks
archiviert. Die 15 Hauptspecs bestehen die Validierung nach der Archivierung.

View File

@@ -7,7 +7,9 @@ geschriebener Vorgabewerte. Beim kanonischen Schreiben einer neuen oder
geänderten Beschreibung SHALL nur geschrieben werden, was vom
Vorgabewert abweicht. Für diese kanonische Ausgabe SHALL Reihenfolge
und Einrückung festgelegt und dokumentiert sein, damit zwei Läufe
dieselbe Datei erzeugen.
dieselbe Datei erzeugen. Ein expliziter Control-Array-Index SHALL auch bei
`Index = 0` erhalten bleiben; er ist eine Strukturangabe und kein auslassbarer
Eigenschaftsdefault.
#### Scenario: Rundlauf
- **WHEN** eine Formulardatei gelesen und unverändert wieder geschrieben wird
@@ -20,3 +22,7 @@ dieselbe Datei erzeugen.
#### Scenario: Expliziter Default im unveränderten Original
- **WHEN** eine gelesene Datei einen Vorgabewert ausdrücklich enthält und unverändert geschrieben wird
- **THEN** bleibt auch diese Eigenschaftszeile bytegleich erhalten
#### Scenario: Arrayelement mit Index null
- **WHEN** ein Formular mit einem einzigen Control-Arrayelement `Index = 0` kanonisch geschrieben und erneut gelesen wird
- **THEN** bleibt das Control ein Array und seine Indexangabe erhalten

View File

@@ -1,15 +1,22 @@
## 1. Normtexte
- [ ] 1.1 Grafik-Abweisung und FRM-Schreibmodi gemäß Delta präzisieren; verifizieren mit tbc check für erlaubte Grafik, benannter Ablehnung weiterhin verbotener Formen und bytegleichem FRM-Rundlauf mit explizitem Default.
- [x] 1.1 Grafik-Abweisung und FRM-Schreibmodi gemäß Delta präzisieren; verifizieren mit tbc check für erlaubte Grafik, benannter Ablehnung weiterhin verbotener Formen und bytegleichem FRM-Rundlauf mit explizitem Default.
## 2. Nachweise
- [ ] 2.1 Inventarprüfung gegen erreichbare HIR-/Dispatch-Pfade erweitern; verifizieren mit künstlich offen/implementiert/verboten gesetzten Einträgen und einer fehlenden Runtime-Bindung, jeweils mit Namen und Status im Fehler.
- [ ] 2.2 Fehlende FORM_KEYPRESS/FORM_KEYUP-Auslöser ergänzen und registrierte Form-Ereignisse auf realen Quellenpfad prüfen; verifizieren durch BASIC-Handler nach Hosteingabe, nicht durch direktes queue_form_event allein.
- [ ] 2.3 Maskierungs- und Formular-Korpus ergänzen; verifizieren mit KEY/UEVENT in ON/OFF/STOP, normal lesbarer STOP-Taste, Control-Access-Key, BackTab, Fokusreihenfolge und zweimal identischer Ausgabe.
- [ ] 2.4 Öffentlichen Fremdprogrammbestand in dokumentierter Revision prüfen; verifizieren durch diagnosefreie Übersetzung und reproduzierbare deklarierte Eingabesequenzen bis zu sichtbaren Zustandsänderungen. Nicht vorhandene externe Voraussetzungen im Ergebnisbericht benennen, nicht abhaken.
- [x] 2.1 Inventarprüfung gegen erreichbare HIR-/Dispatch-Pfade erweitern; verifizieren mit künstlich offen/implementiert/verboten gesetzten Einträgen und einer fehlenden Runtime-Bindung, jeweils mit Namen und Status im Fehler.
- [x] 2.2 Fehlende FORM_KEYPRESS/FORM_KEYUP-Auslöser ergänzen und registrierte Form-Ereignisse auf realen Quellenpfad prüfen; verifizieren durch BASIC-Handler nach Hosteingabe, nicht durch direktes queue_form_event allein.
- [x] 2.3 Maskierungs- und Formular-Korpus ergänzen; verifizieren mit KEY/UEVENT in ON/OFF/STOP, normal lesbarer STOP-Taste, Control-Access-Key, BackTab, Fokusreihenfolge und zweimal identischer Ausgabe.
- [x] 2.4 Öffentlichen Fremdprogrammbestand in dokumentierter Revision prüfen; verifizieren durch diagnosefreie Übersetzung und reproduzierbare deklarierte Eingabesequenzen bis zu sichtbaren Zustandsänderungen. Nicht vorhandene externe Voraussetzungen im Ergebnisbericht benennen, nicht abhaken.
## 3. Gesamtabnahme
- [ ] 3.1 Alle F01F25 nach Integration der Korrektur-Changes mit Regressionstest oder geklärtem Normtext abgleichen; verifizieren durch separaten Ergebnisreport mit Fundstellen pro F-ID.
- [ ] 3.2 Gesamten Korpus und Spec-Validierung ausführen; verifizieren mit cargo test --workspace, openspec validate --all --strict und git diff --check; Golden Files nicht ungeprüft neu aufzeichnen.
- [x] 3.1 Alle F01F25 nach Integration der Korrektur-Changes mit Regressionstest oder geklärtem Normtext abgleichen; verifizieren durch separaten Ergebnisreport mit Fundstellen pro F-ID.
- [x] 3.2 Gesamten Korpus und Spec-Validierung ausführen; verifizieren mit cargo test --workspace, openspec validate --all --strict und git diff --check; Golden Files nicht ungeprüft neu aufzeichnen.
## 4. Reviewkorrekturen
- [x] 4.1 V01: Indizierte Parent-Referenzen durch Import, Runtime und Kompilat erhalten; Positionierung, Gruppierung und ungültige Referenzen prüfen.
- [x] 4.2 V02: Inventarelemente gegen unabhängige konkrete Absenkungsziele prüfen; falsche gültige Bindungen und entfernte Absenkung müssen scheitern.
- [x] 4.3 V03: Ausgeschlossene Grafikvarianten durchgehend namentlich abweisen; erlaubte Grafik weiter übersetzen.
- [x] 4.4 Unabhängige Gegenproben, vollständige Verifizierung und Ergebnisberichte ohne offene Befunde abschließen.

View File

@@ -0,0 +1,72 @@
# Implementierungs- und Verifikationsnachweis
**Nachprüfung abgeschlossen:** V01V03 und die ergänzend geprüfte Container-Z-Reihenfolge sind behoben. Der aktuelle [Review](review.md) enthält die Abschlussprüfung; der [erste Review](review-initial.md) bleibt als Ausgangsbefund erhalten.
Change: `spezifikationsabgleich-und-regressionsnachweise`, 06.09.2026.
Grundlage: Arbeitsbaum auf `c8b92f06190d77714865e0018b090348f372d77e`.
Proposal, Design D1D4, Tasks und alle vier Delta-Specs wurden abgeglichen.
| Dimension | Ergebnis |
|---|---|
| Vollständigkeit | 11/11 Tasks, 6/6 Requirements, 18/18 Szenarien |
| Korrektheit | Regressionssuite, Korpus und gesonderter Fremdprogrammlauf bestanden |
| Kohärenz | Vorhandene Compiler-/VM-/CaptureHost-Pfade erweitert; keine neue Abhängigkeit oder TBC-Version |
| Offene Befunde im Change | 0 CRITICAL, 0 WARNING, 0 SUGGESTION |
## Umsetzung und Nachweis je Task
| Task | Umsetzung / Nachweis |
|---|---|
| 1.1 | Grafik-Ausnahmen und verbleibende Non-Features in Sprachreferenz und Delta; CLI prüft SCREEN 013/LINE/PAINT/VIEW sowie benannte POKE/PEEK/CIRCLE/WINDOW/IOCTL-Abweisung. FRM-Erhaltung, Default-Auslassung und strukturelles Index 0 sind durch Writer-Tests und Normtext getrennt. |
| 2.1 | Inventartest liegt wegen der Prüfung des erzeugten Bytecodes jetzt in tb-cli. 291 feste BASIC-Vorlagen plus Forms-Proben prüfen 845 Einträge; Statusmutation, Unsupported, fehlende oder vertauschte Bindungen, falsche Forms-Member/Typselektoren und entfernte Absenkung erzeugen benannte Fehler. Die vierte TSV-Spalte enthält die unabhängigen Sollziele; `$INCLUDE` wird vom CLI aufgelöst. 795 implementiert, 50 Non-Features, 0 offen. |
| 2.2 | Alle 133 registrierten Form-/Control-Ereignisse erreichen aus ihren Quellen den BASIC-Handler. Die Matrix entdeckt fehlende Quellen; eine künstlich entfernte Event-Bindung bestätigt den Fehlerpfad. Keine dieser Nachweisproben verwendet queue_form_event. |
| 2.3 | trap-masken.bas und formular-access-backtab.frm ergänzen die fehlenden Kombinationen. F1 unter STOP bleibt lesbar und löst nach ON genau einen Handler aus. Alt+O und Shift+Tab ergeben Click;LostFocus;GotFocus;. Jeder Korpuslauf wird wiederholt und gegen sein Sollbild verglichen. |
| 2.4 | Sieben öffentliche Programme aus cout/vbdos im Commit 1cdd2b32b829fe1721d0b6aecc433abc47a96fb6, jeweils zweimal frisch exportiert, diagnosefrei gebaut und mit festen Eingaben bedient. Keine fehlende Voraussetzung. Der gesonderte Test ist bewusst unabhängig vom normalen Workspace-Lauf aufrufbar. |
| 3.1 | [Abschlussreport](../../../../docs/reviews/2026-09-06-openspec-abschlussreview.md) enthält eine eigene Zeile mit aktuellem Beleg für jede F-ID sowie die sieben reproduzierbaren Fremdprogrammsequenzen. Historischer Bericht bleibt erhalten. |
| 3.2 | 481 Workspace-Tests und gesonderter Fremdtest bestanden; separater terminalfreier Resolver erfolgreich. Strikte Spec-Validierung, Clippy, Format- und Diff-Prüfung bestanden. Golden-Generator nicht ausgeführt. |
| 4.1 | Vollständige Parent-Schlüssel im Import, Getter, Container-Traversierung, Geometrie, Optionsgruppen und Menüzuordnung. `indexed_containers_preserve_parent_geometry_and_option_groups` prüft zusätzlich sichtbare Kinder und korrekte Mausziele. TBC prüft Zyklen und fehlende indizierte Eltern; Quell-/TBC-Gegenprobe gibt jeweils 1 aus. |
| 4.2 | `falsche_gueltige_builtinbindung_und_entfernte_absenkung_fallen_durch`, `forms_absenkung_muss_den_richtigen_member_erreichen`, `gemeinsam_dispatchte_konverter_brauchen_den_richtigen_typselektor`; ursprüngliche TIMEZONEKNOWN→TIMER-Gegenprobe schlägt korrekt beim Prüfer fehl. |
| 4.3 | CLI-Proben für PSET/PRESET mit Farbe und STEP, CIRCLE STEP, WINDOW SCREEN und PALETTE USING einschließlich IF; gleichnamige Variablen/Arrays und erlaubte Grafik bleiben gültig. |
| 4.4 | Gesamtabnahme und erneute Gegenproben bestanden; zusätzlicher Test `combobox_dropdown_closes_on_focus_change_and_hide` verhindert veralteten Ausklappzustand. |
## Szenarien
Testnamen stehen in den verlinkten Testdateien. Die Ereignismatrix umfasst
16 Form-Ereignisse und 117 Control-Ereignisse.
| Requirement / Szenario | Ausführbarer Nachweis |
|---|---|
| FRM: Rundlauf | [frm.rs](../../../../crates/tb-ui/src/frm.rs): reads_nested_form_and_preserves_source_exactly |
| FRM: Vorgabewerte nicht geschrieben | writes_no_properties_for_default_only_control; explicit_default_is_preserved_until_canonical_write prüft zusätzlich die geänderte Beschreibung |
| FRM: expliziter Default im Original | explicit_default_is_preserved_until_canonical_write, mit CRLF und Enabled = 1 |
| FRM: einzelnes Arrayelement Index 0 | canonical_index_zero_remains_an_array_and_array_parents_are_preserved |
| Inventar: offen trotz Implementierung | [inventar.rs](../../../../crates/tb-cli/tests/inventar.rs): falscher_status_und_fehlende_runtimebindung_werden_namentlich_erkannt |
| Inventar: implementiert trotz Unsupported | implementiert_mit_unsupported_marker_faellt_durch |
| Inventar: Abdeckungsstand | abdeckungsstand_wird_ausgewiesen; jeder_inventareintrag_erreicht_hir_und_laufzeitziel |
| Inventar: Ereignis ohne Auslöser | [events.rs](../../../../crates/tb-vm/tests/events.rs): fehlender_ereignispfad_wird_namentlich_erkannt; registrierte_form_ereignisse_erreichen_basic_aus_realen_quellen und entsprechende Control-Matrix |
| Traps: Zeit-Trap | [traps.bas](../../../../tests/compat/traps.bas), Hostuhr im Programmkopf |
| Traps: fehlende Zeitdeklaration | [compat.rs](../../../../crates/tb-cli/tests/compat.rs): Test mit should_panic auf fehlenden Zeitverlauf |
| Traps: KEY STOP | [trap-masken.bas](../../../../tests/compat/trap-masken.bas), F1 lesbar und nach ON genau einmal |
| Forms: Formularprogramm | [formular.frm](../../../../tests/compat/formular.frm): Maus, Liste, Timer, Menü, modaler Dialog |
| Forms: Wiederholbarkeit | korpus_laeuft_mit_korrekter_ausgabe führt jedes Programm zweimal aus |
| Forms: Control-Access-Key/Rückwärtstab | [formular-access-backtab.frm](../../../../tests/compat/formular-access-backtab.frm) |
| Fremdprogramm: diagnosefrei und bedienbar | [foreign.rs](../../../../crates/tb-cli/tests/foreign.rs): oeffentliche_formularprogramme_sind_reproduzierbar_bedienbar |
| Fremdprogramm: wiederholbare Zustände | Derselbe Test: zwei isolierte Läufe pro Einstieg, Vergleich aller Bildschirm-/Formular-/Menüzustände, zusätzlich explizite Endzustände und Spin-Wert |
| Non-Features: Hardware-Zugriff | [project.rs](../../../../crates/tb-cli/tests/project.rs): erlaubte_grafik_und_benannte_nonfeatures_werden_per_cli_geprueft |
| Non-Features: erlaubte Grafik | Derselbe CLI-Test prüft alle 14 SCREEN-Modi mit LINE, PAINT und VIEW |
## Review der während der Umsetzung entdeckten Ursachen
Der Abschlussreport dokumentiert Signaturen, benannte Non-Feature-Diagnosen,
fehlende Ereignisquellen, Fokus-Nebenwirkungen, FRM-Array-Flag, eingebettete
Includes und Array-Eltern. Alle sind korrigiert und durch die obigen Tests
oder den gesonderten Fremdprogrammlauf abgedeckt. Der Mehrformular-Test wurde
nach Anpassung der Importauflösung erneut erfolgreich ausgeführt.
Die einzige Änderung an einem bestehenden Sollbild ist ausdrücklich geprüft:
formular.out, Zeile 4, Spalten 2433, zehn Fokusattribute auf f1. Zeichenebene
und übrige Zellen sind unverändert. Zwei neue Sollbilder wurden semantisch
festgelegt und zweimal bestätigt. Kein automatisches Neuaufzeichnen.
Die Verifikation wurde vollständig durchgeführt. Am 06.09.2026 wurden die
Hauptspecs synchronisiert und der Change archiviert.

View File

@@ -29,19 +29,32 @@ abgewiesen werden.
- **THEN** wird sie abgewiesen und die Meldung nennt `3.00`
### Requirement: Schreiben ist die Umkehrung des Lesens
Das Schreiben einer gelesenen Formularbeschreibung SHALL dieselbe Datei
ergeben. Geschrieben SHALL nur werden, was vom Vorgabewert abweicht;
Reihenfolge und Einrückung SHALL festgelegt und dokumentiert sein, damit
zwei Läufe dieselbe Datei erzeugen.
Das unveränderte Schreiben einer gelesenen Formularbeschreibung SHALL
die Originaldatei bytegleich erhalten, einschließlich explizit
geschriebener Vorgabewerte. Beim kanonischen Schreiben einer neuen oder
geänderten Beschreibung SHALL nur geschrieben werden, was vom
Vorgabewert abweicht. Für diese kanonische Ausgabe SHALL Reihenfolge
und Einrückung festgelegt und dokumentiert sein, damit zwei Läufe
dieselbe Datei erzeugen. Ein expliziter Control-Array-Index SHALL auch bei
`Index = 0` erhalten bleiben; er ist eine Strukturangabe und kein auslassbarer
Eigenschaftsdefault.
#### Scenario: Rundlauf
- **WHEN** eine Formulardatei gelesen und unverändert wieder geschrieben wird
- **THEN** ist die geschriebene Datei byte-gleich zur gelesenen
#### Scenario: Vorgabewerte werden nicht geschrieben
- **WHEN** ein Steuerelement nur Vorgabewerte trägt
- **WHEN** eine neue oder geänderte Beschreibung kanonisch geschrieben wird und ein Steuerelement nur Vorgabewerte trägt
- **THEN** enthält sein Block außer `Begin`/`End` keine Eigenschaftszeile
#### Scenario: Expliziter Default im unveränderten Original
- **WHEN** eine gelesene Datei einen Vorgabewert ausdrücklich enthält und unverändert geschrieben wird
- **THEN** bleibt auch diese Eigenschaftszeile bytegleich erhalten
#### Scenario: Arrayelement mit Index null
- **WHEN** ein Formular mit einem einzigen Control-Arrayelement `Index = 0` kanonisch geschrieben und erneut gelesen wird
- **THEN** bleibt das Control ein Array und seine Indexangabe erhalten
### Requirement: Fehlerhafte Dateien werden benannt
Eine unbekannte Klasse, eine für die Klasse unbekannte Eigenschaft, ein
Wert außerhalb des Wertebereichs und ein unausgeglichener Block MUST je

View File

@@ -121,6 +121,8 @@ eines Handlers. Ein Korpusprogramm mit Zeitbezug SHALL seinen
Zeitverlauf im Programmkopf deklarieren; ohne Deklaration MUST der
Harness den Lauf abweisen statt auf die Systemuhr auszuweichen.
Die drei Zustände SHALL für KEY und UEVENT ebenso ausdrücklich im Korpus vorkommen wie für TIMER, einschließlich der Lesbarkeit einer unter KEY STOP gemerkten Taste.
#### Scenario: Zeit-Trap im Korpus
- **WHEN** ein Korpusprogramm mit deklariertem Zeitverlauf und `ON TIMER` ausgeführt wird
- **THEN** entspricht der Bildschirminhalt byte-genau der Sollausgabe und der Lauf benötigt keine messbare Wartezeit
@@ -129,6 +131,10 @@ Harness den Lauf abweisen statt auf die Systemuhr auszuweichen.
- **WHEN** ein Korpusprogramm zeitgesteuerte Traps nutzt, aber keinen Zeitverlauf deklariert
- **THEN** schlägt der Harness mit einer Meldung fehl, die die fehlende Deklaration nennt
#### Scenario: KEY STOP im Korpus
- **WHEN** der Korpus einen F1-Druck unter KEY STOP und ein späteres ON ausführt
- **THEN** prüft seine Sollausgabe sowohl die normal lesbare Taste als auch genau eine spätere Handlerausführung
### Requirement: Korpusabdeckung der Formularprogramme
Der Testkorpus SHALL Formularprogramme mit byte-genauer
Bildschirm-Sollausgabe führen. Ihre Ereignisfolge (Tasten, Maus, Zeit)
@@ -138,6 +144,8 @@ dasselbe Ergebnis liefert. Abgedeckt SHALL sein: Fokus- und
Tabreihenfolge, Access-Key, Klick über die Maus, Menüauswahl, ein
Listen-Steuerelement, ein Timer und ein modaler Dialog.
Der Access-Key-Nachweis SHALL mindestens ein gewöhnliches Control betreffen und MUST NOT allein durch einen Menü-Access-Key ersetzt werden. Rückwärtstab und die beobachtbare Reihenfolge LostFocus vor GotFocus SHALL enthalten sein.
#### Scenario: Formularprogramm im Korpus
- **WHEN** ein Formular-Korpusprogramm mit deklarierter Ereignisfolge ausgeführt wird
- **THEN** entspricht der Bildschirminhalt byte-genau der Sollausgabe
@@ -146,12 +154,22 @@ Listen-Steuerelement, ein Timer und ein modaler Dialog.
- **WHEN** dasselbe Programm zweimal ausgeführt wird
- **THEN** ist die Ausgabe beide Male identisch
#### Scenario: Control-Access-Key und Rückwärtstab
- **WHEN** ein Formular-Korpus Alt+O für eine OK-Schaltfläche und anschließend Rückwärtstab deklariert
- **THEN** weist die Sollausgabe den Click und den Fokuswechsel in korrekter Reihenfolge nach
### Requirement: Kompatibilitätsnachweis an Fremdprogrammen
Die Formularprogramme aus dem öffentlichen Bestand des Vorbilds SHALL
sich ohne Diagnosen oder Non-Features übersetzen lassen und bedienbar
sein. Jeder entdeckte fehlende Sprach-, Projekt-, Formular- oder
Laufzeitpfad MUST implementiert und als Befund festgehalten werden.
Der Nachweis SHALL den verwendeten öffentlichen Bestand mit Revision und Programmeinstiegen benennen sowie reproduzierbare Eingabesequenzen und sichtbare Zustandsänderungen führen. Ein bloß erfolgreiches Starten MUST NOT als Bediennachweis gelten.
#### Scenario: Fremdprogramm übersetzt
- **WHEN** ein Formularprogramm des öffentlichen Bestands übersetzt wird
- **THEN** entstehen keine Diagnosen und das Programm ist bedienbar
#### Scenario: Bediennachweis ist wiederholbar
- **WHEN** ein dokumentiertes Fremdprogramm erneut mit seiner Prüfsequenz ausgeführt wird
- **THEN** werden dieselben relevanten Formularzustände beziehungsweise Abschlussereignisse erreicht

View File

@@ -84,15 +84,23 @@ Sprungziele („Label not defined") sowie Prozedur- und Builtin-Signaturen
Die Semantik MUST jede Verwendung der in docs/sprachreferenz.md
(„Abweichungen") deklarierten Non-Features — Hardware-Nähe (`PEEK`,
`POKE`, `INP`, `OUT`, `WAIT`, `BLOAD`/`BSAVE`, `VARPTR`-Familie, `CALL
ABSOLUTE`/`INTERRUPT`, `IOCTL`), `CHAIN`, Grafik-Anweisungen, `SOUND`/
ABSOLUTE`/`INTERRUPT`, `IOCTL`), `CHAIN`, die weiterhin ausgeschlossenen Grafik-Anweisungen (`PSET`,
`PRESET`, `CIRCLE`, `DRAW`, Grafik-`GET`/`PUT`, `PALETTE`, `WINDOW`,
`PMAP`, `PCOPY`, `POINT`), `SOUND`/
`PLAY` und die Event-Geräte `COM`/`PEN`/`PLAY`/`STRIG` — zur Compile-Zeit
mit der Meldung „Feature unavailable" abweisen. Dokumentierte Features
außerhalb dieser Liste MUST NOT abgewiesen werden (Guiding Principle).
Die dokumentierte Zellenpuffer-Untermenge SCREEN 013, LINE, PAINT und VIEW SHALL verfügbar bleiben.
#### Scenario: Hardware-Zugriff
- **WHEN** `POKE 100, 1` oder `x = PEEK(100)` kompiliert wird
- **THEN** erscheint die Compile-Diagnose „Feature unavailable"
#### Scenario: Erlaubte Grafikuntermenge
- **WHEN** ein Programm SCREEN 1, LINE, PAINT und VIEW in gültiger Syntax verwendet
- **THEN** wird es ohne Feature-unavailable-Diagnose übersetzt
### Requirement: Diagnostik mit Vorbild-Meldungen
Diagnosen SHALL exakte 1-basierte Quelltextpositionen (Zeile, Spalte)
tragen; die Meldungstexte SHALL dem Katalog des Vorbilds folgen, wo eine

View File

@@ -64,6 +64,8 @@ mit „Feature unavailable" abgewiesen werden. Der Test MUST das
divergierende Element, seinen Inventarstatus und den vorgefundenen
Zustand benennen.
Klassentabellen oder deklarierte Signaturnamen allein MUST NOT als Laufzeitnachweis gelten. Für implementierte Elemente SHALL ein erreichbarer Frontend-/Absenkungspfad und ein ausführbares Laufzeitziel geprüft werden. Für deklarierte Ereignisse SHALL ein Test den Auslöser bis zum BASIC-Handler führen.
#### Scenario: Inventar hinkt der Implementierung hinterher
- **WHEN** `LOCATE` implementiert wurde, im Inventar aber noch `offen` steht
- **THEN** schlägt der Abgleich fehl und nennt `LOCATE`, Status `offen` und den Befund „implementiert"
@@ -76,6 +78,10 @@ Zustand benennen.
- **WHEN** der Abgleich läuft
- **THEN** nennt er die Zahl der Einträge je Status als Abdeckungsstand
#### Scenario: Deklariertes Ereignis ohne Auslöser
- **WHEN** ein als implementiert geführtes Formularereignis bei seiner dokumentierten Hosteingabe keinen Handler ausführt
- **THEN** schlägt der Abgleich mit Name, Status und fehlendem Auslösepfad fehl
### Requirement: Keine stillen Lücken bei dokumentierten Elementen
Ein Element mit Status `offen` MUST bei Verwendung eine benannte
Ablehnung erzeugen — entweder eine Compile-Diagnose oder den Laufzeitfehler