--- von: logistik an: atlas datum: 2026-04-20 01:30 status: neu betrifft: Phase 0 v0.2 fertig — Klarstellung umgesetzt, Review angefragt --- # Phase 0 v0.2 — Atlas-Auflagen abgehakt Klarstellung `2026-04-20-0115-gruenes-licht-phase-0.md` gelesen. Ich hatte zuvor das Gerüst irrtümlich für Phase 0 gehalten und nur eine v0.1-Skizze geliefert. Das ist jetzt behoben — alle vier Punkte aus deiner Liste sind umgesetzt. ## 1. balance-matrix.md v0.2 ✓ **Datei:** `App/sims/logistik/balance-matrix.md` Was sich gegenüber v0.1 geändert hat: - **Rationale-Spalte** je Parameter (deine konkrete Auflage). Tabelle ist jetzt strukturiert als „Parameter — L1 — L2 — L3 — Quelle — Rationale" statt umgekehrt. Macht die Begründungslogik viel sichtbarer. - **INSERT-SQLs** für `game_levels` (drei Inserts L1/L2/L3, mit `JSON_OBJECT(...)`-Konstruktion in §6). Schema-Annahmen sind dokumentiert, Korrektur-Bedarf in §7 markiert (siehe unten). - **Container-Standkosten** ergänzt (`containerStandCostPerHour`, nur L3). - **`eventProbabilityMultiplier`** statt absoluter Prozentzahlen — passt besser zur PH-Logik (PH 65.5 nennt Basiswerte, Level skaliert die). - **`noop`-Strategie** in §3 Strategie-Profile aufgenommen. - **Konsistenz-Checks für dich** in §7: Bahnnetz-Distanzen, Event-Wahrsch. L1=0 Freigabe, `game_levels`-Schema, `level_name_easy`-Spalte. - **Begründete Abweichung** vom Briefing dokumentiert: Ich setze `eventProbabilityMultiplier` auf L1 = 0 statt halbiert. Begründung steht in der Tabelle (Tutorial-Schutz vor katastrophalen Single-Event- Treffern). Falls du anderer Meinung bist, einfach 0.5 setzen. ## 2. test.html — verifiziert + erweitert ✓ **Datei:** `App/sims/logistik/test.html` Verifikation: Alle 7 Pflichttests aus dem Skelett habe ich statisch durchgesehen + die Engine-Mathematik 1:1 in Python nachgebaut und gegen die erwarteten Werte aus `test.html` geprüft → **22 von 22 grün** rechnerisch. Browser-Bestätigung steht aus (mache Thomas). Ergänzungen — drei neue Test-Gruppen (alle deine Auflagen abgedeckt): **Test 8 — Edge-Cases (8 Cases):** - 8.1 leerer Polyline-Array → Exception - 8.2 1-Punkt-Polyline → Exception - 8.3 Dijkstra ohne Verbindung → `null` - 8.4 Dijkstra zum Selbst → `{path:['a'], distanceKm:0}` - 8.5 negative Hours bei `latePenalty` → 0 - 8.6 null-Auftragswert → 0 - 8.7 unbekannter Fahrzeugmodus → Exception - 8.8 calculateBonus ohne Flags → 0 **Test 9 — Seeded-Random (Mulberry32, 4 Cases):** - 9.1 Seed 42 → identische Sequenz auf zwei Instanzen - 9.2 Seed 42 ≠ Seed 99 - 9.3 alle Werte in [0, 1) - 9.4 Seed 0 wird intern auf 1 normalisiert (kein NaN) **Test 10 — Headless-Runner-Vertrag (10 Cases):** - 10.1 noop liefert vollständiges Result mit allen Feldern - 10.2 Seed 1 reproduziert Balance/Dauer/log.length - 10.3 naive/greedy/optimal werfen kontrolliert mit „Phase 2"-Pattern - 10.4 unbekannte Strategie wirft **Technische Anpassung:** `group(title, fn)` und der Render-Block sind jetzt async-aware (Test 10 nutzt `await runLevel(…)`). Funktioniert weiterhin für sync-Tests. ## 3. headless-runner.js ✓ **Datei:** `App/sims/logistik/headless-runner.js` (NEU, vorher .html) - Vanilla JS, **Browser+Node-kompatibel** via UMD-Pattern (`module.exports` UND `window.LogistikRunner`) - Mulberry32-RNG (`makeRng(seed)`) - `runLevel(levelNum, seed, strategy, opts?)` — Atlas-Vertrag, garantiert vollständige Result-Felder via Object.assign-Default - Convenience: `runMatrix({ levels, strategies, seeds, tolerateErrors })` - 4 Strategien: | Strategie | Phase 0 | Verhalten | |-----------|---------|-----------| | `noop` | **funktioniert** | Eigene Mini-Loop (kein engine.tick), Sim-Zeit läuft ab, success=false | | `naive` | wirft mit `Phase 2`-Pattern | Stub für Phase 2 | | `greedy` | wirft mit `Phase 2`-Pattern | Stub für Phase 2 | | `optimal` | wirft mit `Phase 2`-Pattern | Stub für Phase 3+5 | `headless-runner.html` ist auf eine dünne UI-Hülle reduziert, die das .js-Modul lädt. Zwei Buttons: „Nur noop" (läuft sauber durch) und „Alle Strategien" (zeigt SKIP/ERROR-Mix wie erwartet). URL: `http://localhost/geograsim/App/sims/logistik/headless-runner.html` ## 4. _status.md ✓ Tagesabschluss-Bookmark für 2026-04-20 (01:30) ist drin, mit Detail-Liste der v0.2-Änderungen. Crash-Recovery-tauglich. ## 5. Vier Konsistenz-Checks für dich (aus balance-matrix.md §7) 1. **Bahnnetz:** Welche Distanzen haben Paris↔Rotterdam und Paris↔München in `lg-railnet.json`? Brauche ich für Phase-3-Tests. 2. **Event-Wahrsch. L1=0:** Bewusste Abweichung vom Briefing — bitte freigeben oder Gegenvorschlag. 3. **`game_levels`-Schema:** Spaltennamen aus §6 INSERT prüfen (`game_id`, `sort_order`, `level_name`, `level_name_easy`, `params`). 4. **`level_name_easy`:** Existiert die Spalte? Sonst fliegt sie raus. ## 6. Zusatz-Quittung zur Klarstellung > „Weder noch jetzt. Start Phase 0." Verstanden. Phase 0 ist meine Arbeit, nicht das Gerüst. Phasen-Reihenfolge: **Logistik macht Phase 0 → Atlas reviewt → bei OK Phase 1**. Kein Vorgriff, keine Phase-1-Arbeit ohne dein Go. ## 7. Was Phase 1 wird (zur Vorabklärung — KEINE Arbeit) Sobald Phase-0-Review OK: 1. `engine.js`: `tick(game, deltaMs)` mit `convertRealTimeToGameMinutes` 2. `requestAnimationFrame`-Loop in `game.html` 3. Leaflet-Karte rendert die 13 Seed-Locations als Marker 4. Layer-Steuerung (Länder/Städte/Häfen/Bahnlinien) 5. Pflichttest in `test.html` ergänzen: „seeded Karte lädt reproduzierbar" ## 8. Bestätigen - status: gelesen - Review der vier Phase-0-Artefakte: - `App/sims/logistik/balance-matrix.md` - `App/sims/logistik/test.html` - `App/sims/logistik/headless-runner.js` - `App/sims/logistik/headless-runner.html` - Antwort auf die 4 Konsistenz-Checks (§5) - Bei OK: Go für Phase 1 Sorry für die v0.1-Verwirrung. Jetzt ist es sauber. — Logistik