From 3402e6ac96ecc12c4f7389902aa9512f18ae2963 Mon Sep 17 00:00:00 2001 From: Karim Date: Fri, 3 Jul 2026 18:18:52 +0200 Subject: [PATCH] =?UTF-8?q?HANDOVER:=20=C3=9Cbergabe=20an=20neue=20Instanz?= =?UTF-8?q?=20=E2=80=94=20Nordstern=202/3/4/5=20gelandet,=20Schnitt-UI-Anb?= =?UTF-8?q?indung=20offen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HANDOVER.md | 112 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 83 insertions(+), 29 deletions(-) diff --git a/HANDOVER.md b/HANDOVER.md index 52812b3..c4b64cd 100644 --- a/HANDOVER.md +++ b/HANDOVER.md @@ -41,38 +41,92 @@ Code/Doku noch in der Git-Historie. vor dem Edit frisch lesen (der „modified since read"-Guard verhindert blindes Ü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 -origin/master gepusht. Heute gelandet (jeweils eigene Commits, Reihenfolge = Historie): -- **7ca5197** Resource Manager: Materialien-Tab (PBR-Kugel-Vorschau via geteiltem Offscreen- - Renderer, Suche + Kategorie-Chips, lazy per IntersectionObserver). -- **c8a4188** render3d als WASM/WebGPU-Viewport in der App (`?engine=wasm` bzw. localStorage - `cad.rendererMode`; three.js bleibt Default). Geteilter wgpu-22-Shim in - 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. +origin/master gepusht, Working Tree sauber bis auf eine vorbestehende, unabhängige +Materials-Library-WIP (`.gitignore`, `public/assets/materials/manifest.json`, +`src/materials/library.ts`, `scripts/fetch-materials.mjs` — NICHT anfassen/reverten, ist +fremde in Arbeit befindliche Sache, nicht Teil der Engine-Session). Heute gelandet, acht +Commits in dieser Reihenfolge: -**Bei Abbruch dieser Session evtl. noch unfertig im Working Tree** (Agents liefen noch): -(a) Vektor-PDF aus der RenderScene: src/export/sceneToPrintSvg.ts (neu) + exportPdf.ts- -Umstellung — Ziel: PDF aus derselben Szene wie der Viewport (Nordstern 2). (b) wgpu-Upgrade -22→aktuell in render2d+render3d inkl. glyphon-Mithub und Ausbau von requestDeviceShim.ts. -Gates für beide: tsc/build/vitest bzw. cargo check/test nativ+wasm32, Proben probe-pdf.mjs / -probe-engine-parity.mjs / probe-engine3d.mjs. Wenn die Diffs sauber und Gates grün: committen -(Regeln oben beachten). Danach als Nächstes: Schnitt-Pipeline an UI/TS anbinden (SectionOutput -→ Plan-Primitive, Schnitt-Views statt Stubs), src-tauri/-Ordner umbenennen/entflechten (User -will keine Tauri-Reste im Namensraum; Electron ist die Shell), mesh.rs-Öffnungen, -Nordstern 1 (mm-Strichbreiten-Audit). Nicht-Engine-Backlog weiter unten. +1. **7ca5197** Resource Manager: Materialien-Tab (PBR-Kugel-Vorschau via geteiltem Offscreen- + Renderer, Suche + Kategorie-Chips, lazy per IntersectionObserver). +2. **c8a4188** render3d als WASM/WebGPU-Viewport in der App (`?engine=wasm` bzw. localStorage + `cad.rendererMode`; three.js bleibt Default). Probe: scripts/probe-engine3d.mjs (HEADFUL=1 + nötig — headless Chromium präsentiert keine WebGPU-Frames, gilt auch für render2d). +3. **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). + **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 <<<