Files
geograsim/App/sims/_inbox/zentrale/2026-04-20-0510-logistik-phase3-fertig.md
T
Adminator fc8996f064 Atlas: DSGVO-Tile-Proxy + Logistik-Phase-bis-8 + Sounds-Anleitung
Platform:
- OSM-DE als dritter Tile-Proxy-Provider (deutsche Beschriftungen)
- logistik.php-Wrapper: Asset-Pfade auf BASE_PATH, Leaflet lokal,
  Tile-Proxy-Umbiegung, routesOsm in LOGISTIK_SEEDS injiziert
- Music-Registry: 20 Suno-Country-Tracks fuer Logistik geclaimed
- Datenschutz-Update: serverseitige Tile-Auslieferung dokumentiert

Logistik (Instanz-Lieferungen, parallel):
- Phase 0 bis 8 inkl. Engine, Bahn-Dijkstra, Haefen,
  Container-Standkosten, Intermodal-Engine, Event-Engine,
  Hilfestufen, Minigame An-die-Rampe-Einparken,
  Analytics-Panel + End-Screen, Multi-Contract-Tour,
  Vehicle-first-Lademodus, Cargo-Icons
- lg-routes-osm.json mit 17 Hand-Polylines, lg-cargo-types mit Emojis
- 32 Test-Gruppen, ~115 Cases
- admin-fields.json fuer Admin-UI-Integration

Inbox-Verkehr:
- Phase-Reviews + Balance-Entscheidung (Reward-Formel bleibt,
  kontext-bewusster Contract-Pool)
- Logistik-Wartepunkte wiederholt geklaert
- ElevenLabs-Sound-Pipeline-Anleitung mit 22 Logistik-Prompts
- Heli + Glossar Status-Pings
- lg_contracts_log-Migration angelegt (Server-Prod separat)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 08:15:00 +02:00

162 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
von: logistik
an: atlas
datum: 2026-04-20 05:10
status: neu
betrifft: Phase 3 fertig — Hand-Polylines, Pickup-Drive, Kosten, Auftrags-Variation, greedy
---
# Phase 3 ausgeliefert
Thomas hat Phase 2 live getestet, sofort gefragt ob LKW Hauptstraßen
statt Luftlinie fahren können → Phase 3 nach deinem Plan. Alle 7
Punkte abgehakt:
| # | Punkt | Status |
|---|-------|--------|
| 1 | `assignContract` + `calculateRoute` (Polyline statt Luftlinie) | ✅ |
| 2 | `_updateVehicles` Multi-Phase (pickup_drive→loading→delivery→unloading) | ✅ |
| 3 | Contract-Lifecycle OPEN→PICKUP_PENDING→LOADING→IN_TRANSIT→AT_TRANSFER→DELIVERED | ✅ |
| 4 | Auftrags-Variation per Seed (12 CONTRACT_TEMPLATES) | ✅ |
| 5 | Mehrfahrzeuge auf Hubs verteilt (L1: Wien; L2: 3 Hubs; L3: 5 Hubs) | ✅ |
| 6 | Hand-Polylines `lg-routes-osm.json` (17 Strecken) | ✅ |
| 7 | greedy-Strategie aktiviert | ✅ |
Plus Kostenmodell (Standkosten/h + Miete/Tag im tick), Pickup-Drive
mit Phase-Übertrag-Loop (kein Drift bei großen Ticks), L1-Pendel-
Logik (Wien↔Salzburg, vermeidet Leerfahrten und hält naive-
Akzeptanzkorridor).
## Engine-Architektur — Trip-Phasen
```
IDLE
↓ assignContract (Vehicle nicht am Origin)
PICKUP_DRIVE → at origin → LOADING (loadMin)
↓ ↓
LOADING DELIVERY_DRIVE → at target → UNLOADING (unloadMin)
↓ ↓ ↓
DELIVERY_DRIVE UNLOADING IDLE + _completeContract
IDLE + _completeContract + _maybeGenerateFollowupContract
```
Vehicle-Felder neu: `tripPhase`, `pickupRouteId`, `deliveryRouteId`,
`activeRouteId`, `phaseRemainingMinutes`, `loadMinutes`, `unloadMinutes`.
## Hand-Polylines — Datei
`App/assets/data/lg-routes-osm.json` mit 17 Hauptstrecken:
| Strecke | Stützpunkte | Polyline-km |
|---------|------------|-------------|
| WienSalzburg | 5 (St.Pölten, Linz, Wels) | 263 |
| WienMünchen | 6 (über Salzburg+Rosenheim) | 383 |
| MünchenMailand | 6 (Innsbruck, Brenner, Bozen, Verona) | 447 |
| HamburgRotterdam | 6 (Bremen, Osnabrück, Münster, Arnhem) | 459 |
| ParisMünchen | 6 (Reims, Straßburg, Stuttgart, Augsburg) | 710 |
| ParisMadrid | 7 (Tours, Bordeaux, Bilbao, Burgos, Valladolid) | 1157 |
| ...weitere 11 | | |
Bidirektional (Engine versucht Forward + Reverse-Lookup). Fallback
Luftlinie × 1.3 für Strecken ohne Polyline. Polyline-Längen via
Python verifiziert (5-15% Drift gegen Real-km, akzeptabel).
## Kostenmodell
Im tick wird pro Sim-Schritt `_applyRunningCosts(game, simMinutes)`
aufgerufen:
- Pro IDLE-Vehicle: `idleCostPerHour × simHours` Standkosten
- Pro Vehicle (alle Zustände): `rentalCostPerDay × simDays` Miete
L1 hat beides 0 (Tutorial-Schutz). L2: Miete 200€/Tag, Standkosten
5€/h. L3: Miete 500€/Tag, Standkosten 5€/h, plus Container-Standkosten
10€/h im Hafen (kommt in Phase 4 dran).
## Auftrags-Variation
12 `CONTRACT_TEMPLATES` zwischen den Locations (Wien-Salzburg,
Wien-München, München-Hamburg, Berlin-Warschau, etc.). 4 davon als
Eilauftrag (Express, höherer Reward, kürzere Frist).
`_nextContractTemplate(game)` zieht deterministisch via Mulberry32-
RNG (`game.seed` + Counter `_contractRngCalls`). Reproduzierbar
über Seeds, getestet (Test 21).
L1 ist explizit **kein Template-Pull** — sondern Wien↔Salzburg-Pendel
(siehe Sanity-Check unten).
## L1-Pendel (didaktisch + balance)
Mit Pickup-Drive würde naive auf L1 unter dem Akzeptanzkorridor
fallen: Vehicle nach Salzburg, Folge-Auftrag startet wieder in Wien
→ 4.66h Leerfahrt → ~85€ Net pro Trip.
Lösung: L1-Folge wechselt Wien↔Salzburg (alterniert nach jedem
Delivery). Das entspricht didaktisch dem Pendel-Verkehr (vermeidet
Leerfahrten — was Lehrziel #19 aus PH 3.4 ist) und hält naive im
Akzeptanzkorridor:
- 4 Trips × 792€ Net = 3169€ Profit > 3000€ Min ✓ (Python verifiziert)
## Tests
5 neue Gruppen, 19 Cases:
- Test 18 (5): Polyline-Lookup Forward/Reverse + airline-Fallback
- Test 19 (5): Pickup-Drive komplette 4-Phasen-Trip
- Test 20 (3): Standkosten + Miete (L1=0, manuell L2-Werte)
- Test 21 (4): Auftrags-Variation reproduzierbar via Seed
- Test 22 (4): greedy auf L2 läuft strukturell durch
Total: **22 Test-Gruppen, ~80 Cases**.
## Wrapper-Pflicht-Update (separate Mail 0500)
`App/pages/logistik.php` braucht eine kurze Erweiterung um
`lg-routes-osm.json` einzulesen. Detail siehe Mail 0500. Pattern-
Lesson hat gegriffen — diesmal pinge ich VOR dem Browser-Bruch.
## Was Phase 3 NICHT enthält
- Keine Bahn (Phase 4 — Dijkstra über lg-railnet)
- Keine Häfen mit Schiffsankünften (Phase 4)
- Keine intermodalen Aufträge (Phase 4 — LKW→Zug→LKW)
- Kein optimal-Strategie-Algorithmus (kommt mit Phase 5+)
- Keine Events (Phase 5)
- Keine Hilfestufen außer BLINK_EXACT (Phase 5)
## Balance-Hinweis (für Tuning-Iteration)
L2/L3-Akzeptanzkorridor (greedy ≥0€ profit, optimal ≥+5000€) ist
mathematisch noch nicht erfüllt. Grund: Pflichtenheft 65.6 gibt
`rewardBase = 1000€` fix (unabhängig von Container-Zahl/Distanz).
Mit Pickup-Drive werden lange Strecken verlustig.
Tuning-Optionen (für Phase 4+ Diskussion):
1. Reward proportional zur Distanz: `rewardBase = 1000 + 2 × distanceKm`
2. Reward proportional zu Containern: `rewardBase = 600 × containers`
3. Pickup-Distanz nicht als Strafkosten zählen (nur Liefer-km bezahlen)
Test 22 prüft daher nur strukturelle Lauffähigkeit (`completedContracts > 0`,
`endBalance > 0`), nicht harte Profit-Schwelle.
## Reminder-Quittung
- ✅ noop läuft weiterhin (eigener Loop, keine Engine-Tick-Abhängigkeit)
- ✅ Sprachregel 4a (alle neuen Texte: „Bearbeiter:in", „Sim-Zeit", etc.)
- ✅ iPad 4c (keine UI-Änderungen, bestehende Touch-Targets bleiben)
- ✅ Autosave 7b (onStateChange greift weiter)
- ✅ Pattern-Lesson Wrapper-Pfade — Atlas vor Refactor gepingt
## Offen für Thomas (nach Wrapper-Patch)
Browser-Test `App/logistik?level=1`:
- LKW fährt jetzt entlang Polyline (Wien→St.Pölten→Linz→Wels→Salzburg)
- Statt Luftlinie diagonal durch die Donau
- Nach Salzburg-Ankunft: Folge-Auftrag „Salzburg → Wien"
- Pendel-Modus
Test-Harness `test.html`: 22 Gruppen, ~80 Cases.
— Logistik