# TODO: VF-Linienzug ohne GUI/Konsole - Stufe 2 (Funktionstrennung) **Stand:** 2026-10-26 ยท **Prioritaet:** niedrig - bringt Architektur, keine neue Funktion. Herausgeloester Arbeitsauftrag aus dem Gesamtplan [plan-vf-interactive.md](plan-vf-interactive.md) (Teil 5 "Stufe 2: echte Funktionstrennung"). Dort stehen die ausfuehrliche Begruendung, die Knotenform und die Risikoliste; diese Datei ist die Abarbeitungsliste. ## Ausgangslage (Stufe 1, fertig) Linienzug-Ketten lassen sich bereits ohne Dialog bauen (`VF_SPEC_BAU`, [vf_spec.lsp](../../Lisp/vf_spec.lsp)) - allerdings ueber einen Umweg: 1. Die **Spec** (Kette in Domaenenwerten) wird von `vsp-journal` in ein Eingabe-Journal uebersetzt - also in die Antworten, die ein Anwender gegeben haette. 2. `vsp-bau-journal` startet per `vfl-journal-replay-start` den ganz normalen interaktiven Bau `vf-linienzug-modus` ([vf_linienzug.lsp](../../Lisp/vf_linienzug.lsp)). 3. Jede Frage wird aus der Replay-Queue beantwortet. Das funktioniert und ist per `TEST_HUNDM05` im CAD verifiziert - der Bau selbst "weiss" aber nichts von Daten, er fragt weiter, nur antwortet die Queue. ## Ziel (Stufe 2) Die Funktionen in `vf_linienzug.lsp` mischen **Fragen** und **Geometrie bauen**. Stufe 2 trennt das: - **reiner Bauteil** (Suffix `-bauen` bzw. `-setzen`): nimmt Parameter, baut Geometrie, fragt nichts; - die **Frage-Schale** behaelt den bisherigen Namen und ruft den Bauteil auf - dadurch aendert sich keine Aufrufstelle in Modus 1/2/3. Am Ende ruft `vfl-spec-ausfuehren` die Bauteile direkt mit den Spec-Werten auf, ohne Journal-Replay. ## Stand der Schritte Zeilennummern Stand 2026-10-26 (die `:NNNN`-Angaben im Gesamtplan sind veraltet). | Schritt | Inhalt | Stand | |---|---|---| | 0 | `vfl-ziel-report` (vf_linienzug.lsp:7864) aus zwei identischen Bloecken gezogen | erledigt | | 1 | Winkelwahl `vfl-winkel-gueltige` (:3071) / `vfl-winkel-nach-index` + Kanal `*vfl-winkel-idx-vorgabe*` | erledigt | | 2 | `vfl-es-masse-setzen` (:7557) | erledigt | | 3 | `vfl-hor-koerper-bauen` (:5989), Schale `vfl-baue-horizontal-koerper` (:6152) | erledigt | | 4 | `vfl-body-abschluss-bauen` (:6502) | erledigt | | 5a/5b | VF-Einheit Eingang/Ausgang: `vfl-vf-eingang-bauen` (:6728), `vfl-vf-ausgang-bauen` (:6742) | erledigt | | **5c** | Schleifenrumpf von `vfl-vf-einheit` (:6772) - die Sub-Stuecke der VF-Einheit als Bauteil | **offen** | | **6** | Daten-Executor fuer die VF-Einheit (baut sie direkt aus Daten) | **offen** | | 7 | Spec + Serializer + Assertion: `vsp-journal-diff` (vf_spec.lsp:900) prueft Spec-Journal gegen das beim Bau aufgezeichnete Token fuer Token | Assertion erledigt | | **8** | Einheit-Abschluss: `vfl-vf-einheit-abschluss` (:7889) | **offen** | | **9** | Kettenebene, ein Glied-Zweig pro Commit: GF-Bogen -> ES -> Horizontal-VF -> Linie-GF -> Linie-VF -> Linie | **offen** | | **10** | `vfl-spec-ausfuehren` - der direkte Daten-Pfad (existiert noch nicht) | **offen** | | 11 | Dasselbe fuer Modus 2 | **Vorbedingung erfuellt 2026-10-27**: zwei echte Modus-2-Journale liegen als `tests/testdata/linienzug_modus2_{variokurve,gfbogen}.json` vor, abgespielt von `c:TEST_LINIENZUG_MODUS2`. Der Schritt selbst ist noch offen | ## Warum es heikel ist Bei den offenen Schritten ist die **Reihenfolge selbst Geometrie** (Gesamtplan, Abschnitt "Wo Geometrie still kippen kann"), u.a.: - die dL-Subtraktionskette ist je Schritt mit `(max *vfk-restlaenge-min-clamp* ...)` geklammert, also reihenfolgeabhaengig; - die `vfl-acc-*`-Aufrufe muessen an derselben Stelle in derselben Reihenfolge bleiben, sonst vertauschen sich `L_VF_m`/`L_GF_m`/`GF_WINKEL` - in der Zeichnung unsichtbar, im Sivas-Export falsch; - `*vfl-as-winkel*`/`*vfl-es-winkel*` werden lazy von den Blocknamen-Bauern gelesen - spaeter gesetzt heisst falscher Block; - `ziel-gf2` vs. `L_GF2-bau` im Ausgang - geht es verloren, entsteht still die falsche GF2 hinter dem Motor. Ausdruecklich nicht anfassen: siehe Gesamtplan, Abschnitt "Ausdruecklich nicht anfassen" (u.a. alle Journal-Konsumenten, `vfl-in-*`-Wrapper, Wizard-Schicht, Abbruch-Pfad). ## Ablauf je Schritt 1. Umbauen (Frage-Schale behaelt Namen, Bauteil wortwoertlich umziehen, keine Umsortierung). 2. CAD-Lauf: `TEST_HUNDM05` (save dxf), `TEST_VF_SPEC`, `TEST_LINIENZUG`. 3. `pytest tests/test_vf_geometrie.py` gegen `tests/reference/hundm05_attribute.json` - nennt bei Abweichung Kette und Feld. Referenz nur nach geprueftem Lauf auffrischen (`lib/dxf_vf_abbild.py --schreibe-referenz`). 4. Nach Geometrie-Schritten (5c, 9) zusaetzlich DXF-Diff und Sivas-Export-Vergleich. 5. Ein Schritt pro Commit - sonst ist ein Fehler keinem Schritt mehr zuzuordnen. ## Wann angehen Erst bei konkretem Bedarf: einzelne Bauteile ohne Journal aufrufen, oder der Replay-Umweg wird zu langsam bzw. zu fehleranfaellig. Bis dahin genuegt Stufe 1.