[REFACTOR] Stufe 2, Schritte 0-4: Frage-Schale und reinen Bauteil trennen
Alle Aenderungen sind verhaltensgleich: die Frage-Schalen behalten ihre Namen, keine Aufrufstelle in Modus 1/2/3 wurde angefasst. Schritt 0 - vfl-ziel-report: der Soll-Ist-Vergleich am Kettenende stand zweimal WORTGLEICH in vfl-vf-einheit-abschluss (einmal fuer "Kettenende ohne ES", einmal "mit ES"); die Faelle unterscheiden sich nur darin, wann sie melden, nicht was. Schritt 1 - Winkelwahl aufgeteilt: vfl-winkel-gueltige (Kandidaten filtern) und vfl-winkel-nach-index (Kandidat waehlen) sind rein; die Frage-Schale vfl-waehle-winkel setzt sie zusammen. Neuer Vorgabe-Kanal *vfl-winkel-idx-vorgabe*: ist er gesetzt, wird nicht gefragt. Kanal statt Parameter, weil vfl-waehle-winkel aus vier Solvern gerufen wird (vfl-vf-winkel, vfl-vf-entscheidung, vfl-body-zerlegung, vfl-segment-entscheidung) - ein Parameter wuerde vier Signaturen und alle deren Aufrufer aendern. Default nil, also heute ohne Wirkung. Schritt 2 - vfl-es-masse-setzen: reines Globals-Setzen (ES-Winkel merken + vf-set-es-masse) aus vfl-frage-es-seite gezogen. *vfl-es-winkel* wird LAZY von den Blocknamen-Bauern gelesen und muss vor dem ersten ES-Insert stehen. Schritt 3 - vfl-hor-koerper-bauen: die drei Fragen (Separator vor/nach, Endpunkt) haengen an keinem berechneten Wert und stehen jetzt alle vor dem Bau. Journal-Reihenfolge UND Entity-Reihenfolge bleiben identisch; nur interaktiv erscheint der auf_3-Uebergangsblock erst nach den drei Fragen statt zwischen Frage 1 und 2. Die dL-Subtraktionskette wurde Zeile fuer Zeile uebernommen - jeder Schritt ist mit (max *vfk-restlaenge-min-clamp* ...) geklammert, also nicht kommutativ, und der auf_3-Insert sitzt bewusst zwischen Subtraktion 1 und 2 (sein Fussabdruck wird GEMESSEN). Nachweis: Zeilenvergleich alt/neu, dieselben 15 geometrie-relevanten Zeilen in derselben Reihenfolge. Schritt 4 - vfl-body-abschluss-bauen: hier laesst sich NICHT alles vorab fragen (vfl-neue-linie-messen braucht den Frame nach vfl-nach-3grad, die Hoehenvorschlaege brauchen dL und die Kettenhoehe). Die Schale macht darum 3-Grad-Abschluss -> messen -> Vorschlaege -> Zielhoehe fragen, der reine Teil beginnt bei der Zerlegung. Nachweis: Multiset-Vergleich der Zeilen, ausser Kopf, Klammer und Aufruf ist keine Zeile veraendert. Schritt 7 (Assertion-Teil) - vsp-journal-diff in Lisp/vf_spec.lsp: stellt das aus der Spec erzeugte Journal Token fuer Token gegen das beim Bau neu aufgezeichnete. Schaerfster Desync-Detektor - offene Queue-Werte und die Glied-Folge zeigen nur grobe Abweichungen, ein einzelner Wert, der an der falschen Stelle verbraucht wird, kann beide passieren lassen und trotzdem andere Geometrie erzeugen. Neues Record-Feld journal_diff, neuer Test test_journal_token_gleich. Zwei bewusste Abweichungen von der Planung (begruendet in doc/TODO-plan-vf-interactive.md, Abschnitt "Umsetzungsstand Stufe 2"): vfl-hor-koerper-bauen behaelt ziel-modus als eigenen Parameter neben ende-code (ende-code darf nil sein, die Separator-Subtraktionen haengen aber allein am Ziel-Modus); vfl-body-abschluss-bauen braucht letzt-hz und es-gewuenscht nicht. Offen: Schritte 5, 6, 8, 9, 10. Das sind die, bei denen die Reihenfolge selbst Geometrie ist - der Fahrplan verlangt nach jedem einen CAD-Lauf (TEST_HUNDM05 + TEST_VF_SPEC + TEST_LINIENZUG), nach den Geometrie-Schritten zusaetzlich DXF-Diff und Sivas-Export-Vergleich. Ohne Lauf zwischen den Schritten waere ein Fehler nicht mehr einem Schritt zuzuordnen. Sie bringen keine neue Faehigkeit: der Bau aus Daten laeuft seit Stufe 1 und ist mit VF_SPEC_BAU belegt (5 OK, 0 Fehler). Verifiziert: 109 pytest-Tests gruen, beide .lsp lint-sauber, kein neuer alert/get*/ssget im Bau-Pfad (statischer Waechter). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
| P2 | `*vfl-headless*`: leere Replay-Queue wird zum Fehler | **erledigt** |
|
||||
| P3 | Kleinkram (`*vfl-meldungen*`-Reset, `vfl-view-refresh`) | **erledigt** |
|
||||
| S1 | Stufe 1: `Lisp/vf_spec.lsp` (Spec -> Journal -> Replay) | **Modus 1 fertig**, im CAD ungetestet |
|
||||
| S2 | Stufe 2: echte Funktionstrennung (Schritte 0-11) | offen |
|
||||
| S2 | Stufe 2: echte Funktionstrennung | **Schritte 0-4 + 7-Assertion fertig**, 5/6/8/9/10 offen, 11 zurueckgestellt |
|
||||
| PY | `lib/vf_journal_export.py`: Grammatik vervollstaendigen | **erledigt** |
|
||||
|
||||
### Was Stufe 0 konkret gebracht hat
|
||||
@@ -562,6 +562,64 @@ bei jedem Bau.
|
||||
vorliegen (`tests/testdata/hundm05.json` enthaelt ausschliesslich Modus-1-
|
||||
Ketten); sonst zurueckstellen
|
||||
|
||||
### Umsetzungsstand Stufe 2 (2026-09-03)
|
||||
|
||||
**Fertig: Schritte 0-4 und der Assertion-Teil von Schritt 7.** Alle fuenf
|
||||
sind verhaltensgleich - die Frage-Schalen behalten ihre Namen, keine
|
||||
Aufrufstelle in Modus 1/2/3 wurde angefasst.
|
||||
|
||||
| Schritt | Neu | Nachweis |
|
||||
|---|---|---|
|
||||
| 0 | `vfl-ziel-report` | zwei byte-identische Bloecke ersetzt, Diff zeigt nur die Entfernung |
|
||||
| 1 | `vfl-winkel-gueltige`, `vfl-winkel-nach-index`, Kanal `*vfl-winkel-idx-vorgabe*` | Verzweigungen 1:1; ungueltiger Index faellt wie zuvor auf den ersten Kandidaten |
|
||||
| 2 | `vfl-es-masse-setzen` | reines Globals-Setzen aus `vfl-frage-es-seite` gezogen |
|
||||
| 3 | `vfl-hor-koerper-bauen` | Zeilenvergleich alt/neu: dieselben 15 geometrie-relevanten Zeilen in derselben Reihenfolge |
|
||||
| 4 | `vfl-body-abschluss-bauen` | Multiset-Vergleich: ausser Kopf, Klammer und Aufruf keine Zeile veraendert |
|
||||
| 7 (Teil) | `vsp-journal-diff` + Record-Feld `journal_diff` | neuer Test `test_journal_token_gleich` |
|
||||
|
||||
Zu Schritt 3 im Detail: die drei Fragen (Separator vor/nach, Endpunkt)
|
||||
haengen an keinem berechneten Wert und stehen jetzt alle vor dem Bau. Die
|
||||
**Journal-Reihenfolge und die Entity-Reihenfolge bleiben identisch** - nur
|
||||
interaktiv erscheint der auf_3-Uebergangsblock erst nach den drei Fragen
|
||||
statt zwischen Frage 1 und 2. Die dL-Subtraktionskette wurde Zeile fuer
|
||||
Zeile uebernommen, mit dem auf_3-Insert an derselben Stelle dazwischen.
|
||||
|
||||
Zwei bewusste Abweichungen von der Planung:
|
||||
- `vfl-hor-koerper-bauen` behaelt `ziel-modus` als EIGENEN Parameter neben
|
||||
`ende-code` (der Fahrplan wollte ihn ersetzen). Die Separator-Subtraktionen
|
||||
haengen allein am Ziel-Modus, und `ende-code` darf nil sein (abgebrochene
|
||||
Menuefrage) - mit nur einem Parameter waere genau dieser Fall eine stille
|
||||
Verhaltensaenderung.
|
||||
- `vfl-body-abschluss-bauen` hat eine schlankere Signatur als skizziert:
|
||||
`letzt-hz` und `es-gewuenscht` braucht es nicht. `es-gewuenscht` wirkt beim
|
||||
Aufrufer (der `ein-dx`/`ein-dz` um den Aufruf herum nullt), `letzt-hz` ging
|
||||
nur in eine wirkungslose Zuweisung - beim Umzug wortwoertlich uebernommen
|
||||
und als solche markiert.
|
||||
|
||||
Schritt 7 ist nur zur Haelfte erledigt: die Spec und der Serializer stehen
|
||||
schon aus Stufe 1, neu ist die **Assertion** - `vsp-journal-diff` stellt das
|
||||
aus der Spec erzeugte Journal Token fuer Token gegen das beim Bau neu
|
||||
aufgezeichnete. Das ist der schaerfste Desync-Detektor: offene Queue-Werte
|
||||
und die Glied-Folge zeigen nur grobe Abweichungen, ein einzelner Wert, der an
|
||||
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,
|
||||
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
|
||||
Fahrplan verlangt nach jedem Schritt einen CAD-Lauf (`TEST_HUNDM05` +
|
||||
`TEST_VF_SPEC` + `TEST_LINIENZUG`), nach den Geometrie-Schritten zusaetzlich
|
||||
einen DXF-Diff und einen Sivas-Export-Vergleich. Ohne diese Laeufe zwischen
|
||||
den Schritten waere ein Fehler nicht mehr einem Schritt zuzuordnen.
|
||||
|
||||
Zur Erwartungshaltung: die Schritte 5-10 bringen **keine neue Faehigkeit**.
|
||||
Der Bau aus Daten funktioniert seit Stufe 1 (ueber den Replay) und ist mit
|
||||
`VF_SPEC_BAU` in der Praxis belegt. Was 5-10 bringen, ist der direkte
|
||||
Daten-Pfad ohne den Replay-Umweg und einzeln aufrufbare Knoten-Bauteile -
|
||||
Architektur, nicht Funktion.
|
||||
|
||||
### Wo Geometrie still kippen kann
|
||||
|
||||
- **Die dL-Subtraktionskette** in `vfl-baue-horizontal-koerper` (:2280, :2293,
|
||||
|
||||
Reference in New Issue
Block a user