Spezifikationsabgleich und Regressionsnachweise abschließen
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-09-05
|
||||
@@ -0,0 +1,37 @@
|
||||
## Context
|
||||
|
||||
pruefe_forms erwartet jede Klasseneigenschaft und jedes Ereignis pauschal als implementiert. Der Formularfallback in handle_key erzeugt nur KEYDOWN, während FORM_KEYPRESS/FORM_KEYUP implementiert heißen. traps.bas und formular.frm fehlen die genannten Kombinationen. write_text besitzt bereits einen Erhaltungsmodus. Siehe proposal.md und die Delta-Specs.
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
**Goals:** Grüne Prüfungen an beobachtbares Sollverhalten binden und veraltete Normtexte gezielt berichtigen.
|
||||
|
||||
**Non-Goals:** Kein erneutes allgemeines Refactoring, kein ungezieltes Testframework, kein Aufweichen der übrigen Spezifikationen, keine Änderung des Bytecode-Vertrags dieses Changes (Eigentum projektmodule-und-kompilat).
|
||||
|
||||
## Decisions
|
||||
|
||||
### 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. 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
|
||||
|
||||
Bestehenden CaptureHost/Harness wiederverwenden; jede Maskierungsquelle in ON/OFF/STOP, EVENT OFF, Control-Alt-Key, Shift-Tab und Fokusreihenfolge mit deklarierter Ereignis-/Zeitfolge prüfen. Sollbilder werden aus erwarteter Semantik festgelegt und bei Änderung fachlich geprüft.
|
||||
|
||||
### D3 — Bestehende Produktentscheidungen synchronisieren
|
||||
|
||||
Nur LINE/PAINT/VIEW/SCREEN 0–13 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
|
||||
|
||||
Nach den fünf Korrektur-Changes jede F-ID mit konkretem Regressionstest/Prüfergebnis versehen. Den Bericht von 05.09. als historischen Ausgangsstand erhalten und eine eigene Ergebnisdatei anlegen. Den vorhandenen öffentlichen Fremdprogrammbestand mit seiner dokumentierten Revision verwenden; bei fehlendem Bestand Nachweis ausdrücklich offenlassen statt eine erfolgreiche Bedienung zu behaupten.
|
||||
|
||||
## 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 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
|
||||
|
||||
Abschließende Gesamtabnahme nach allen fünf anderen Changes. Die Grafik-/FRM-Textpräzisierungen können vorher überprüft werden; Archivierung und Gesamtabschluss erst nach deren Regressionen. Bestehende Spec-/Codeverträge erst nach erfolgreicher Umsetzung synchronisieren und archivieren. Bis dahin bleiben alle Tasks offen. Änderungen als zusammenhängenden Commit je Change integrieren; bei Fehlschlag auf den vorherigen Code zurückgehen und neue Datenformatversionen nicht mit alten Lesern öffnen.
|
||||
@@ -0,0 +1,30 @@
|
||||
## 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 (F21–F23/F25). Siehe [Review vom 05.09.2026](../../../../docs/reviews/2026-09-05-openspec-code-review.md).
|
||||
|
||||
## What Changes
|
||||
|
||||
- Inventarabgleich auf tatsächlich erreichbare Frontend-/Laufzeitpfade und benannte negative Nachweise stützen; fehlende deklarierte Form_KeyPress/Form_KeyUp-Pfade ergänzen.
|
||||
- Explizite Korpusfälle für KEY/UEVENT-Maskierung, Control-Access-Key, Rückwärtstab und geordnete Formularereignisse ergänzen.
|
||||
- Grafik-Non-Features mit der bereits dokumentierten implementierten Untermenge abgleichen.
|
||||
- FRM-Schreibvertrag in Erhaltung unveränderter Quelldateien und kanonische Ausgabe präzisieren.
|
||||
- Den Review nach Umsetzung der fünf Korrektur-Changes erneut gegen jeden Befund abgleichen.
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
Keine neuen Capability-Pfade.
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
- `sprachinventar`: Inventarstatus mit unabhängigem Frontend-/Laufzeitnachweis absichern.
|
||||
- `kompat-testkorpus`: Verlangte Ereigniskombinationen und Fremdprogramm-Nachweise systematisch erreichbar machen.
|
||||
- `sprach-frontend`: Grafik-Ausnahmen zur Non-Feature-Abweisung korrekt beschreiben.
|
||||
- `forms-dateiformat`: Byteerhalt und kanonisches Weglassen von Defaultwerten klar unterscheiden.
|
||||
|
||||
## Impact
|
||||
|
||||
Inventar-/Korpustests, konkrete Formular-Eventquellen, docs/inventar.md, Sprach-/Forms-/Dateiformatreferenzen. Keine pauschale Statusherabsetzung, keine automatische Erzeugung neuer Golden Files.
|
||||
|
||||
Abschließende Gesamtabnahme nach allen fünf anderen Changes. Die Grafik-/FRM-Textpräzisierungen können vorher überprüft werden; Archivierung und Gesamtabschluss erst nach deren Regressionen.
|
||||
@@ -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 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.
|
||||
@@ -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())
|
||||
@@ -0,0 +1,51 @@
|
||||
# Abschließende Verifikation vom 06.09.2026
|
||||
|
||||
Change: `spezifikationsabgleich-und-regressionsnachweise`.
|
||||
Grundlage: aktueller Arbeitsbaum auf `c8b92f06190d77714865e0018b090348f372d77e`.
|
||||
Geprüft: Proposal, Design D1–D4, 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 V01–V03](review-initial.md) bleibt als historischer
|
||||
Ausgangsbefund erhalten. Die vollständige Szenarienmatrix steht in
|
||||
[verification.md](verification.md), der Abgleich F01–F25 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 0–13/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.
|
||||
@@ -0,0 +1,28 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: Schreiben ist die Umkehrung des Lesens
|
||||
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** 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
|
||||
@@ -0,0 +1,64 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: Korpusabdeckung der Ereignis-Traps
|
||||
Der Testkorpus SHALL die Ereignissteuerung mit Programmen abdecken, die
|
||||
ohne echte Wartezeit und mit reproduzierbarer Ausgabe laufen: Zeit-Trap,
|
||||
Tasten-Trap einschließlich der Frage, ob die Taste im Eingabestrom
|
||||
verbleibt, benutzerdefiniertes Ereignis, die drei Maskierungszustände je
|
||||
Quelle, der Hauptschalter `EVENT` sowie Rückkehr und Nicht-Wiedereintritt
|
||||
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
|
||||
|
||||
#### Scenario: Fehlende Zeitdeklaration
|
||||
- **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)
|
||||
SHALL im Programmkopf deklariert und vom Harness eingespeist werden,
|
||||
sodass ein Lauf ohne Terminal und ohne Wartezeit auskommt und zweimal
|
||||
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
|
||||
|
||||
#### Scenario: Wiederholbarkeit
|
||||
- **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
|
||||
@@ -0,0 +1,22 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: Compile-Zeit-Abweisung deklarierter Non-Features
|
||||
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`, 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 0–13, 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
|
||||
@@ -0,0 +1,30 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: Automatischer Abgleich Inventar gegen Implementierung
|
||||
Ein automatischer Test SHALL das Inventar gegen den tatsächlichen
|
||||
Implementierungsstand prüfen und bei jeder Divergenz fehlschlagen. Als
|
||||
`implementiert` markierte Elemente MUST im Frontend eine Signatur besitzen
|
||||
und MUST NOT auf einen „nicht verfügbar"-Marker absenken; als `offen`
|
||||
markierte Elemente MUST auf einen solchen Marker absenken oder ohne
|
||||
Signatur sein; als `Non-Feature` markierte Elemente MUST zur Compile-Zeit
|
||||
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"
|
||||
|
||||
#### Scenario: Inventar behauptet zu viel
|
||||
- **WHEN** ein Eintrag `implementiert` trägt, das Element aber weiterhin auf den „nicht verfügbar"-Marker absenkt
|
||||
- **THEN** schlägt der Abgleich fehl und nennt das Element
|
||||
|
||||
#### Scenario: Abdeckungsstand ist abrufbar
|
||||
- **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
|
||||
@@ -0,0 +1,22 @@
|
||||
## 1. Normtexte
|
||||
|
||||
- [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
|
||||
|
||||
- [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
|
||||
|
||||
- [x] 3.1 Alle F01–F25 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.
|
||||
@@ -0,0 +1,72 @@
|
||||
# Implementierungs- und Verifikationsnachweis
|
||||
|
||||
**Nachprüfung abgeschlossen:** V01–V03 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 D1–D4, 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 0–13/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 24–33, 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.
|
||||
Reference in New Issue
Block a user