HANDOVER: Stand 2026-07-03 — Nordstern 2/3/4/5 gelandet, Schnitt-UI-Anbindung offen

This commit is contained in:
2026-07-03 18:18:52 +02:00
parent 8a79f6cbaa
commit 4a62dbf83c
+83 -29
View File
@@ -41,38 +41,92 @@ Code/Doku noch in der Git-Historie.
vor dem Edit frisch lesen (der „modified since read"-Guard verhindert blindes vor dem Edit frisch lesen (der „modified since read"-Guard verhindert blindes
Überschreiben). Überschreiben).
## >>> STAND 2026-07-03 (Nordstern-Session) — ZUERST LESEN <<< ## >>> STAND 2026-07-03 Abend (Nordstern-Session, Übergabe an neue Instanz) — ZUERST LESEN <<<
Ein Master-Branch (alle Feature-/Worktree-Branches konsolidiert und gelöscht), alles auf Ein Master-Branch (alle Feature-/Worktree-Branches konsolidiert und gelöscht), alles auf
origin/master gepusht. Heute gelandet (jeweils eigene Commits, Reihenfolge = Historie): origin/master gepusht, Working Tree sauber bis auf eine vorbestehende, unabhängige
- **7ca5197** Resource Manager: Materialien-Tab (PBR-Kugel-Vorschau via geteiltem Offscreen- Materials-Library-WIP (`.gitignore`, `public/assets/materials/manifest.json`,
Renderer, Suche + Kategorie-Chips, lazy per IntersectionObserver). `src/materials/library.ts`, `scripts/fetch-materials.mjs` — NICHT anfassen/reverten, ist
- **c8a4188** render3d als WASM/WebGPU-Viewport in der App (`?engine=wasm` bzw. localStorage fremde in Arbeit befindliche Sache, nicht Teil der Engine-Session). Heute gelandet, acht
`cad.rendererMode`; three.js bleibt Default). Geteilter wgpu-22-Shim in Commits in dieser Reihenfolge:
src/engine/requestDeviceShim.ts. Probe: scripts/probe-engine3d.mjs (HEADFUL=1 nötig —
headless Chromium präsentiert keine WebGPU-Frames, gilt auch für render2d).
- **54211b1 + 76029db** render3d/src/section.rs: Schnittebene → Cut-Polygone + sichtbare/
verdeckte projizierte Kanten, inkl. Öffnungen (Brüstung/Sturz-Teilrechtecke, Durchblick).
29 Tests, Beweis-SVG docs/welle-c-hlr-spike/section-engine-proof.svg, Doku
docs/design/engine-section-pipeline.md. Eigen-Engine-Ersatz für den OCCT-Pfad (66 MB WASM).
- **ce6bd26** 2D-Engine-Parität: WASM-Pfad deckungsgleich zum SVG-Referenzpfad (?gl=0!).
Fixes: text_scale entkoppelt, glyphon ColorMode::Web, z-basierte Maler-Reihenfolge
(draw_sequence), CSS-Klassenfarben in toRenderScene, greyed 0.3, Dämmwellen-Bézier +
userSpaceOnUse-Anker + widthScreen-Schraffurbreite. Probe: scripts/probe-engine-parity.mjs.
- **4b02e40** render2d Headless: Feature `headless`, HeadlessRenderer ohne Surface (Vulkan),
CLI-Bin render_png, Golden-Test (bit-exakt auf dieser Maschine) tests/golden/demo.png,
Doku docs/design/engine-headless.md.
**Bei Abbruch dieser Session evtl. noch unfertig im Working Tree** (Agents liefen noch): 1. **7ca5197** Resource Manager: Materialien-Tab (PBR-Kugel-Vorschau via geteiltem Offscreen-
(a) Vektor-PDF aus der RenderScene: src/export/sceneToPrintSvg.ts (neu) + exportPdf.ts- Renderer, Suche + Kategorie-Chips, lazy per IntersectionObserver).
Umstellung — Ziel: PDF aus derselben Szene wie der Viewport (Nordstern 2). (b) wgpu-Upgrade 2. **c8a4188** render3d als WASM/WebGPU-Viewport in der App (`?engine=wasm` bzw. localStorage
22→aktuell in render2d+render3d inkl. glyphon-Mithub und Ausbau von requestDeviceShim.ts. `cad.rendererMode`; three.js bleibt Default). Probe: scripts/probe-engine3d.mjs (HEADFUL=1
Gates für beide: tsc/build/vitest bzw. cargo check/test nativ+wasm32, Proben probe-pdf.mjs / nötig — headless Chromium präsentiert keine WebGPU-Frames, gilt auch für render2d).
probe-engine-parity.mjs / probe-engine3d.mjs. Wenn die Diffs sauber und Gates grün: committen 3. **54211b1 + 76029db** render3d/src/section.rs: Schnittebene → Cut-Polygone + sichtbare/
(Regeln oben beachten). Danach als Nächstes: Schnitt-Pipeline an UI/TS anbinden (SectionOutput verdeckte projizierte Kanten, inkl. Öffnungen (Brüstung/Sturz-Teilrechtecke, Durchblick).
→ Plan-Primitive, Schnitt-Views statt Stubs), src-tauri/-Ordner umbenennen/entflechten (User 29 Tests, Beweis-SVG docs/welle-c-hlr-spike/section-engine-proof.svg, Doku
will keine Tauri-Reste im Namensraum; Electron ist die Shell), mesh.rs-Öffnungen, docs/design/engine-section-pipeline.md. Eigen-Engine-Ersatz für den OCCT-Pfad (66 MB WASM).
Nordstern 1 (mm-Strichbreiten-Audit). Nicht-Engine-Backlog weiter unten. **mesh.rs (3D-Vollkörper-Extrusion) berücksichtigt Öffnungen weiterhin NICHT** — dokumentierte,
bewusst offene Lücke (Cut/Ansicht-Pipeline und 3D-Solid-Mesh sind bis dahin inkonsistent).
4. **ce6bd26** 2D-Engine-Parität: WASM-Pfad deckungsgleich zum SVG-Referenzpfad (**Referenz ist
`?gl=0`**, nicht der Default!). Fixes: text_scale entkoppelt, glyphon ColorMode::Web,
z-basierte Maler-Reihenfolge (draw_sequence), CSS-Klassenfarben in toRenderScene, greyed 0.3,
Dämmwellen-Bézier + userSpaceOnUse-Anker + widthScreen-Schraffurbreite. Probe:
scripts/probe-engine-parity.mjs.
5. **4b02e40** render2d Headless: Feature `headless`, HeadlessRenderer ohne Surface (Vulkan),
CLI-Bin render_png, Golden-Test (bit-exakt) tests/golden/demo.png, Doku
docs/design/engine-headless.md.
6. **382771b** Vektor-PDF aus der RenderScene (**Nordstern 2 abgeschlossen**): exportPdf baut
jetzt `planToRenderScene(plan)` — derselbe Aufruf wie der Viewport — und serialisiert über
den neuen `src/export/sceneToPrintSvg.ts` nach Papier-mm (PEN_STEPS-Quantisierung wie bisher,
widthScreen-Schraffurbreiten korrekt in mm umgerechnet, Texte jetzt als echte Vektor-Texte —
der alte Pfad liess sie komplett weg). `planToPrintSvg.ts` bleibt nur als Referenz stehen
(Kopfkommentar markiert sie als abgelöst). Verifiziert per `pdftoppm`: 53.51×43.69mm vs.
erwartet 53.45×43.45mm bei 1:100. **Bekannte Alt-Lücke, nicht neu:** Zeilenabstand
mehrzeiliger Stempeltexte in `toRenderScene.ts` ist nur bei Massstab 1:100 exakt (STAMP_REF_N),
bei anderen Export-Massstäben proportional leicht daneben — betrifft Viewport identisch, nicht
PDF-spezifisch, absichtlich nicht mitgefixt (out of scope für den additiven Umbau).
7. **b4c4a2c** wgpu 22 → 29, glyphon 0.6 → 0.11 (glyphon pinnt `^29`, obwohl wgpu 30 existiert).
`src/engine/requestDeviceShim.ts` komplett entfernt (das 22er-Limit
`maxInterStageShaderComponents` wird von 29 nicht mehr gesendet). Verifiziert: cargo check
nativ (render2d/render3d/src-tauri), cargo test render2d 17/17 + Golden weiterhin bit-exakt,
render3d 29/29, wasm32 --features web für beide, tsc + npm build — alles grün.
**Damit sind Nordstern 2, 3, 4 (Kern) und 5 gelandet.** Verifiziert per Screenshot: App läuft im
Electron-Fenster (`env -u ELECTRON_RUN_AS_NODE npm run electron`), 3D-Perspektive rendert das
echte Modell über den Engine-Renderer (Umschalter unten rechts: WebGL2/Engine).
**WICHTIG — was NICHT fertig ist (User hat das selbst am Screenshot bemerkt):** Die
Zeichnungsebenen vom Typ „Schnitt"/„Ansicht" (z.B. „Schnitt A", „Ansicht Süd" in der
Ebenen-Liste rechts) sind weiterhin **Stubs** — sie zeigen KEINEN echten Inhalt. Das
render3d-Schnitt-Modul (section.rs, Commits 54211b1/76029db) liefert das Rohmaterial
(SectionOutput: cut_polygons + visible_edges/hidden_edges), ist aber **noch nicht an
App.tsx/das Dokumentmodell angebunden** — es gibt noch keinen Code-Pfad, der beim Öffnen
einer Schnitt-/Ansichts-Zeichnungsebene das render3d-Modell durchschneidet und das Ergebnis
in Plan-Primitive für PlanView/render2d übersetzt. Das ist der wichtigste nächste Schritt
(Nordstern 4b, siehe Liste unten).
**Nächste Schritte, priorisiert:**
1. **[Nordstern 4b] Schnitt-Pipeline an UI anbinden** — grösster Brocken: SectionOutput
(Rust/render3d) → TS-Seite (WASM-Aufruf analog `toWalls3d.ts`/`nativeSync.ts`) → neue
Plan-Primitive-Kind(e) für Cut-Polygone + sichtbare/gestrichelte Kanten → generatePlan.ts
bindet das für DrawingLevel vom Typ Schnitt/Ansicht ein, statt des aktuellen Stub-Verhaltens.
PlanView.tsx rendert es wie normale Primitive (Parität-Infrastruktur aus ce6bd26 gilt 1:1).
2. **mesh.rs: Öffnungen im 3D-Vollkörper** — 3D-Ansicht zeigt Öffnungen zwar korrekt (das war
schon vorher so, per Mesh-Aussparung), aber das Schnitt-Modul rechnet gegen dieselben
Prismen — sobald 4b. steht, hier gegenprüfen ob mesh.rs nachgezogen werden muss oder ob es
getrennte Datenwege bleiben.
3. **Aufräumen:** `src-tauri/`-Ordner umbenennen/entflechten — User will keine Tauri-Reste im
Namensraum, Electron ist die Shell. render2d/render3d/geometry sind eigenständige Workspaces
ohne Tauri-Abhängigkeit, könnten z.B. nach `engine/` oder `crates/` wandern. Toten Tauri-Host
(`cad-tauri`, tauri.conf.json, native.rs/native2d/native3d) explizit mit dem User klären:
behalten (Beweis für späteren All-Native-Schritt) oder entfernen.
4. **[Nordstern 1]** Papier-mm-exakte Strichbreiten-Audit über den gesamten Engine-Pfad
(Screen bei jedem Zoom/Massstab = Druck) — nach 2/3/4/5 jetzt der einzige verbliebene
unbearbeitete Nordstern-Punkt.
5. Nicht-Engine-CAD-Backlog (Wand-Referenzlinien, Editier-Welle, nahtfreie Verschneidung,
Overrides/Multi-Page-Layouts) — weiter unten in diesem Dokument, nachrangig zur Engine-Arbeit.
**Arbeitsweise dieser Session (fortführen):** Pipeline aus bis zu 2 parallelen Sonnet-Subagents
(User-Regel: immer 2 am Laufen halten, nachfüllen sobald einer fertig ist). Jeder Agent bekommt
explizit zugewiesenes Terrain (Dateipfade), damit sich parallele Agents nicht überschreiben.
Ergebnisse werden von der Hauptinstanz verifiziert (Screenshots ansehen, Gates laufen lassen)
und committet — Agents committen nie selbst. Nach Prozessabstürzen (kam heute zweimal vor)
lässt sich ein Agent per SendMessage mit seiner agentId aus dem Transcript fortsetzen, sein
Working-Tree-Zwischenstand bleibt erhalten.
## >>> ENGINE-NORDSTERN (User-Direktive 2026-07-02): die volle Engine-Vision <<< ## >>> ENGINE-NORDSTERN (User-Direktive 2026-07-02): die volle Engine-Vision <<<