[REFACTOR] Stufe 2: VF-Eingang/-Ausgang getrennt + Regressionsnetz fuer die Geometrie

Der CAD-Lauf belegt die Schritte 0-4 jetzt auch EMPIRISCH:
results/test_hundm05.dxf entstand nach dem Umbau, das Ergebnis-JSON von
11:18 davor - fuer alle 5 Ketten sind ALLE 37 Attribute identisch,
inklusive der reihenfolgeabhaengigen Komma-Listen L_VF_m, L_GF_m, GF_WINKEL
und ANTRIEBFAHRTRICHTUNG. TEST_VF_SPEC: 28 PASS / 0 FAIL.
results/test_linienzug.dxf zeigt eine vollstaendige Kette (AS+ES, Motor,
Umlenkung, 2 Vario-Kurven, 22 Bausteine, HOEHE_VON = HOEHE_BIS = 4500 bei
DELTA_H 0).

Schritt 5a/5b - vfl-vf-eingang-bauen und vfl-vf-ausgang-bauen: beide Bloecke
(GF1 + Einlauf-Separator + Umlenkstation bzw. Motorstation + GF2) enthalten
keine Frage und sind zusammenhaengend, der Umzug ist wortwoertlich
(Zeilenvergleich: 0 Zeilen entfernt, nur zwei Koepfe, zwei Aufrufe und zwei
"frame)" neu). Die Auswahl gf2-eff (ziel-gf2 im Kettenende-Modus, sonst
L_GF2-bau) bleibt BEWUSST an der Aufrufstelle - genau dort entsteht sonst
still die falsche GF2 hinter dem Motor. Der Separator-Zaehler und die
vfl-acc-*-Aufrufe bleiben an derselben Stelle in derselben Reihenfolge.

Regressionsnetz, damit die restlichen Schritte nicht blind gemacht werden
muessen:
- lib/dxf_vf_abbild.py (neu): liest eine Testzeichnung streamend und bildet
  je Kette Attribute, Bausteinzusammensetzung und Einfuegepunkt ab. Ketten
  werden ueber den EINFUEGEPUNKT der Spec zugeordnet, nicht ueber den
  Blocknamen - die VF-Nummer beginnt in jeder neuen Zeichnung wieder bei 1.
  ID und Bezeichnung sind aus dem Vergleich heraus (pro Zeichnung neu).
  --referenz vergleicht (Exit 1 bei Abweichung), --schreibe-referenz frischt
  die Referenz nach einem GEPRUEFTEN Lauf auf.
- tests/reference/hundm05_attribute.json (neu): die Referenz, erzeugt aus dem
  geprueften Lauf - also dem Stand, der attributgleich mit dem Zustand VOR
  dem Umbau ist.
- tests/test_vf_geometrie.py (neu, 8 Tests): vergleicht automatisch, mit
  einem eigenen Test nur fuer die Komma-Listen (das einzige, was eine
  vertauschte vfl-acc-*-Reihenfolge sichtbar macht) und einer Gegenprobe,
  dass eine verfaelschte Referenz auch erkannt wird.

Das faengt, was der Ergebnis-Record NICHT sieht: er sagt "executed, kein
Prompt, Journal aufgegangen", aber nichts darueber, ob dieselbe Geometrie
herauskam. Ablauf ab jetzt pro Schritt: umbauen -> TEST_HUNDM05 (save dxf)
-> pytest tests/test_vf_geometrie.py.

Offen bleiben 5c, 6, 8, 9, 10 (Schleifenrumpf der VF-Einheit, Daten-Executor,
Einheit-Abschluss, Kettenebene je Glied, vfl-spec-ausfuehren). Die vier
haengen zusammen: 6 und 10 brauchen den aufgeteilten Schleifenrumpf. Halb
umgebaut waere der Code schlechter dran als vor oder nach dem Umbau, darum
als ein Schritt mit CAD-Lauf davor und danach.

Verifiziert: 117 pytest-Tests gruen, vf_linienzug.lsp lint-sauber.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-03 14:10:56 +02:00
parent 02303ad7fc
commit e91f1d00d0
7 changed files with 819 additions and 14 deletions
+42 -1
View File
@@ -605,7 +605,48 @@ der falschen Stelle verbraucht wird, kann beide passieren lassen und trotzdem
andere Geometrie erzeugen. Sitzt im Daten-Pfad (`vf_spec.lsp`), nicht als
`dbgmsg` im Bau-Pfad - dort waere er nur bei offener `.dbg`-Datei sichtbar.
**Offen: 5, 6, 8, 9, 10** (VF-Einheit aufteilen, Daten-Executor,
**Nachtrag (nach dem CAD-Lauf 12:22): Schritte 0-4 sind auch EMPIRISCH
belegt.** `results/test_hundm05.dxf` entstand nach dem Umbau, das
Ergebnis-JSON von 11:18 davor - fuer alle 5 Ketten sind **alle 37 Attribute
identisch**, inklusive der reihenfolgeabhaengigen Komma-Listen `L_VF_m`,
`L_GF_m`, `GF_WINKEL`, `ANTRIEBFAHRTRICHTUNG`. Genau der Vergleich, den
dieser Abschnitt fuer die Geometrie-Schritte verlangt.
`results/test_linienzug.dxf` zeigt eine vollstaendige Kette (AS+ES, Motor,
Umlenkung, 2 Vario-Kurven, 22 Bausteine, `HOEHE_VON` = `HOEHE_BIS` = 4500 bei
`DELTA_H` 0).
**Zusaetzlich Schritt 5a/5b**: `vfl-vf-eingang-bauen` (GF1 + Einlauf-Separator
+ Umlenkstation) und `vfl-vf-ausgang-bauen` (Motorstation + GF2) sind
herausgezogen - beide Bloecke enthalten keine Frage und sind
zusammenhaengend, der Umzug ist wortwoertlich (Zeilenvergleich: 0 Zeilen
entfernt, nur zwei Koepfe, zwei Aufrufe und zwei `frame)` neu). Die Auswahl
`gf2-eff` (`ziel-gf2` im Kettenende-Modus, sonst `L_GF2-bau`) bleibt
BEWUSST an der Aufrufstelle - genau dort entsteht sonst still die falsche
GF2 hinter dem Motor.
### Regressionsnetz fuer die restlichen Schritte
Damit 5c/6/8/9/10 nicht mehr blind gemacht werden muessen, ist der
Attribut-Vergleich jetzt ein Werkzeug plus Test:
- `lib/dxf_vf_abbild.py` liest die Testzeichnung streamend und bildet je
Kette Attribute, Bausteinzusammensetzung und Einfuegepunkt ab. Ketten
werden ueber den **Einfuegepunkt der Spec** zugeordnet, nicht ueber den
Blocknamen (die VF-Nummer beginnt in jeder Zeichnung neu bei 1). `ID` und
`Bezeichnung` sind bewusst aus dem Vergleich heraus.
- `tests/reference/hundm05_attribute.json` ist die Referenz - erzeugt aus dem
geprueften Lauf, also dem Stand, der attributgleich mit dem Zustand VOR
dem Umbau ist.
- `tests/test_vf_geometrie.py` (8 Tests) vergleicht automatisch, mit einem
eigenen Test nur fuer die Komma-Listen und einer Gegenprobe, dass eine
verfaelschte Referenz auch erkannt wird.
Ablauf ab jetzt pro Schritt: umbauen -> `TEST_HUNDM05` (save dxf) ->
`pytest tests/test_vf_geometrie.py`. Weicht ein Attribut oder ein Baustein
ab, nennt der Test Kette und Feld. Referenz nur nach geprueftem Lauf
auffrischen (`--schreibe-referenz`).
**Offen: 5c, 6, 8, 9, 10** (Schleifenrumpf der VF-Einheit, Daten-Executor,
Einheit-Abschluss, Kettenebene je Glied-Zweig, `vfl-spec-ausfuehren`).
Bewusst NICHT vorab erledigt: das sind die Schritte, bei denen laut Abschnitt
"Wo Geometrie still kippen kann" die Reihenfolge selbst Geometrie ist. Der