Files
geograsim/.dontDeploy/test-protokoll-2026-05-30.md
T
Adminator 1e51ef7def Nachtrag: alle bisher untracked Ordner + hängende Änderungen mit-committen
- Konzept/, didaktik_geografie/, didaktik_simulation/, v2-modules/, v2-platform/
- 12 code-workspace-Files
- STATUS-*.md
- viele M/D/R-Änderungen an bereits getrackten Files
- .gitignore verstärkt: **/.humaninput/, **/secret_keys.txt

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-08 02:27:02 +02:00

558 lines
40 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.
# Test-Protokoll Session 2026-05-30 (Post-Compact)
**Status:** Alle Änderungen LOKAL — KEIN Production-Deploy ohne Thomas-OK.
**Regel:** Wir testen lokal gemeinsam. Erst bei explizitem „deployment to TEST"-Befehl von Thomas wird auf Production geschoben. Danach gehen wir dieses Protokoll als Test-Skript durch.
---
## 1) Modul Sonnensystem — observations.json + game.html
### 1.1 JSON-Bug behoben
- **Was:** Kaputtes `"` (U+0022) statt deutsches `"` (U+201C) in observations.json Z.84 hat den simHint-String der Erdjahr-Aufgabe vorzeitig beendet → komplettes JSON-Parse-Fehler → „obs] load failed".
- **Fix:** `Viertel-Tag"``Viertel-Tag"`
- **Test:** Modul lädt, alle 19 Aufgaben sichtbar im Aufgaben-Tab.
### 1.2 Polish-Review (4 von 4 Aufgaben)
- **#7 Vollmond:** Antwort #2 von „auf der sonnenabgewandten Seite (aber leicht über oder unter der Linie SonneErde, sonst wäre es Mondfinsternis)" gekürzt auf „auf der sonnenabgewandten Seite der Erde steht". Klammer-Detail bleibt in der Erklärung.
- **#11 Mondtilt-Aufgabe entfernt:** Aufgabe `obs-mondtilt` aus tasks-Array raus. Mondbahn-Tilt-Slider bleibt im UI als Sandbox.
- **#13 Ohne Achsneigung:** Neue `phases`-Sequenz mit Wechsel 23,5° ↔ 0° am 21. Juni (Seitenansicht, je 6 s, pausiert). Polartag verschwindet sichtbar im What-If. Implementiert: neues `axisTilt`-Property in obsApplyState, Default-Reset auf 23,5°.
- **#15 Sommer vs Winter:** war schon mit phases umgesetzt (21.6. ↔ 21.12., je 5 s).
- **Achievement-Texte:** „20 Aufgaben" → „19 Aufgaben" in `half_done` und `all_done`.
**Test #7:**
- Öffne Aufgabe „Vollmond — wie entsteht er?", prüfe ob Antwort-Option 2 kurz lesbar ist.
**Test #11 (entfernt):**
- Aufgaben-Anzeige zeigt 19 statt 20. Mondtilt-Aufgabe nirgends mehr. Slider „Mondbahn-Tilt" funktioniert in Sandbox weiterhin.
**Test #13:**
- Aufgabe „Was wäre ohne Achsneigung?" → Schau-Phase startet → wechselt im Sekunden-Takt zwischen 23,5° und 0°. Bei 0° sind beide Halbkugeln gleichmäßig beleuchtet, kein Polartag.
**Test #15:**
- Aufgabe „Sommer vs. Winter in Wien" → Wechsel 21.6./21.12. funktioniert, Wien-Inset zeigt unterschiedliche Sonnenstände.
### 1.3 UI: Jetzt-Button + „Besondere Tage für heuer"
- **Was:** Button-Reihenfolge `⏰ Jetzt | 🎆 Neujahr | 🐰 Ostern | 🎄 Weihn.` (Jetzt zuerst).
- **Label:** „Feiertage / Schul-Termine (für 2026)" → „Besondere Tage für heuer".
- **Ostern dynamisch:** via Gauss-Computus pro aktuelles Jahr berechnet, Tooltip zeigt echtes Datum.
**Test:**
- Datum-Bereich aufklappen. Button-Reihenfolge richtig. Label heißt „Besondere Tage für heuer". Klick auf „⏰ Jetzt" springt zur aktuellen Uhrzeit. Klick auf „🐰 Ostern" springt auf echten Ostersonntag.
### 1.4 Komplett dynamisches Jahr
- **EPOCH:** Statt fix `new Date(2026, 0, 1)` jetzt `new Date(new Date().getFullYear(), 0, 1)`. Tag 0 = 1.1. heuer.
- **Mondphasen-Anker:** Real-Vollmond 3.1.2026 als Referenz, `MOON_EPOCH_OFFSET_DAYS` rechnet Offset zum aktuellen Jahr. Phasen stimmen auch in Folgejahren.
- **obsApplyState:** Ersetzt Jahr in observations-Daten (`"2026-06-21"``"<heuer>-06-21"`) — JSON-Daten dürfen weiter mit fixen Jahren stehen.
- **Datum-Inputs:** Default = `1.1. heuer 12:00` (statt fix 2026-01-01).
- **Hilfetexte:** „Tag 0 = 1. Januar 2026" → „… des aktuellen Jahres".
- **Date-Banner:** „📆 1. Jan 2026" → „📆 1. Jan" (Banner wird via formatDate dynamisch geschrieben).
- **observations.json Erdjahr-intro:** „1.1.2026 00:00" → „1. Januar, kurz nach Mitternacht in Wien".
**Test (Browser-Konsole):**
```js
CURRENT_YEAR // muss 2026 zurückgeben (oder das jeweilige Jahr)
EPOCH // 1.1.<heuer>
```
- Datum-Buttons (Frühling, Sommer, Ostern, Jetzt) springen alle ins aktuelle Jahr.
- Sonnensystem-Aufgaben mit fixen Datumstrings (z.B. „Polartag am 21. Juni") starten im aktuellen Jahr, nicht in 2026.
### 1.5 Photon-Reflexion physikalisch korrekt
- **Was vorher:** Photon flog von Sonne durch den Mond-Mittelpunkt zur Erde — die zweite Phase startet von der NACHT-Seite des Mondes, was physikalisch falsch ist (Nacht-Seite reflektiert nichts).
- **Was jetzt:** Reflexionspunkt = sonnen-zugewandte Mond-Oberfläche (`_photonMoonPos - normalize(_photonMoonPos) × MOON_RADIUS`). Zweite Phase startet dort, fliegt von der Tag-Seite zur Erde.
- Gilt für beide Modi: statische Linien (Fast-Mode) + Pulse-Animation (Slow-Mode).
**Test:**
- Photon-Toggle einschalten. Bei langsamer Geschwindigkeit (🐢 1×): Photon trifft auf Mond-Tag-Seite (nahe Sonne), nicht durch den Mond hindurch.
- Bei schneller Geschwindigkeit: die gelbe Linie Sonne-Mond endet an der sonnen-zugewandten Mond-Oberfläche.
### 1.6 Erdjahr-Aufgabe stopAtDay-Feature
- **Was:** Neues Property `stopAtDay` in observations.json — Sim pausiert exakt bei `timeDays >= stopAtDay`, speed-unabhängig sim-genau.
- **Erdjahr-Aufgabe:** `stopAtDay: 365.25` → Wien-Fahne genau 90° vom Startpunkt versetzt = der ¼-Tag-Drift didaktisch sauber visualisiert.
- **TDZ-Fix:** animate() verwendet `window.__obsStopAtCheck` statt direkter obsState-Referenz (TDZ-Bug bei `const obsState`).
**Test:**
- Aufgabe „Erdjahr und Schaltjahr" starten → Sim läuft → stoppt automatisch nach ~31 s → Wien-Fahne steht ~90° vom Startpunkt (Ghost-Erde) versetzt = sichtbarer Vierteldrehung-Drift.
---
## 2) Glossar
### 2.1 Watt-Eintrag erweitert (PS + Historie)
- **SQL-Migration:** `App/Don_t_Deploy/2026-05-30-watt-ps-erweiterung.sql` (idempotent, SET NAMES utf8mb4).
- **Inhalt:**
- Neuer Abschnitt „Pferdestärke (PS) — der historische Vergleich"
- Umrechnung 1 PS = 735,5 W, 1 kW = 1,36 PS, 100 PS ≈ 73,5 kW, 1.000 PS ≈ 735 kW
- James Watt selbst hat PS erfunden (für Dampfmaschinen-Verkauf an Brauereien/Bergwerke)
- Heute in EU offiziell kW seit 1978, in USA HP (745,7 W)
- Auch in `text_easy` (Leichte Sprache): kurze Erklärung „Bei Autos liest man oft PS …"
- **Lokal:** angewendet.
- **Production:** noch NICHT (steht zum „deployment to TEST").
**Test:**
- Glossar öffnen, „Watt" anklicken. Im Detail-Modal muss der PS-Abschnitt sichtbar sein. Beide Varianten (Fachsprache + Leichte Sprache) prüfen.
### 2.2 Thumbnail-System für Glossar-Cards
- **Problem vorher:** Cards luden die Originale (13 MB pro PNG, 134 Stück = 330 MB). Ewige Ladezeit.
- **Lösung:** WebP-Thumbnails 480×270 unter `assets/img/glossar/thumbs/<slug>.webp`.
- **Build-Skript:** `App/Don_t_Deploy/build-glossar-thumbs.ps1` (idempotent, nutzt ImageMagick `magick`).
- **Ergebnis:** 132 Thumbs generiert, **329,7 MB → 2,6 MB (99,2 % Ersparnis)**.
- **PHP-Code:** Neue `fmtThumb(path)`-Funktion in glossar.php. `renderCard` lädt jetzt thumb, mit `onerror`-Fallback auf Original wenn Thumb fehlt. Detail-View (`renderDetail`) zeigt weiterhin das Original.
**Test:**
- Glossar öffnen → Cards sollten messbar schneller laden (Network-Tab im Browser checken — Card-Bilder sind jetzt webp, ~20 KB statt 2,5 MB).
- Auf eine Card klicken → Detail-Modal zeigt das große Original-Bild scharf.
- Thumb-Fehler-Fallback: Lösche temporär einen Thumb → Card lädt automatisch das Original.
### 2.3 Korruptes Bild — Aufmerksamkeit
- `residuallast.png` ist defekt (48 KB statt 13 MB, vorzeitiges EOF).
- Thumb konnte nicht generiert werden.
- **Aktion offen:** Bild neu generieren (DALL-E aktuell down, siehe 2.4).
### 2.4 Turbinen-Bild — Bild-Refresh BLOCKIERT
- **Ziel:** Aktuelles `turbine.png` zeigt absurd übergroße Turbine (höher als Berge) → soll durch sinnvolle Querschnitts-/Person-für-Skala-Variante ersetzt werden.
- **Status:** Bild-Refresh-Agent ist gelaufen, aber API blockiert:
- DALL-E 3 ist im Anthropic OpenAI-Account NICHT mehr verfügbar (Modell entfernt).
- Verfügbar wären: `gpt-image-1`, `gpt-image-1-mini`, `gpt-image-1.5`, `gpt-image-2`
- Aber: **Billing-Hard-Limit erreicht** — keine Generierung möglich.
- **Aktion offen für Thomas:**
- OpenAI-Billing-Hard-Limit anheben (Settings → Limits)
- Entscheidung: Migrieren wir alle Bild-Generierungs-Skripte (`App/sims/logistik/scripts/generate-splash-images.sh` etc.) von `dall-e-3` auf `gpt-image-1`? Modelle haben unterschiedliche Parameter — das ist ein eigener Refactor.
- Asset bleibt unverändert (Backup-Mechanismus hat das alte Bild zurückgestellt).
---
## 3) Vor dem nächsten Production-Deployment
**Was muss noch passieren bevor wir auf Production gehen:**
1. Lokales Durchtesten aller Punkte oben (Thomas + Atlas gemeinsam).
2. Falls Bild-Refresh-Block durchbrochen: Turbine + residuallast neu generieren.
3. Online-Test-Plan: dieser File als Checkliste verwenden, jeden Punkt am Production-Server prüfen.
**Beim Deployment to TEST mit Thomas zu beachten:**
- SQL-Migration `2026-05-30-watt-ps-erweiterung.sql` auf Production-DB anwenden (mit `--default-character-set=utf8mb4`)
- Build-Skript `build-glossar-thumbs.ps1` lokal laufen lassen, Thumbs via deploy.sh hochziehen
- `sonnensystem/data/observations.json` + `sonnensystem/game.html` deployen
- `App/pages/glossar.php` deployen
- Apache-OPcache nach Deploy reset
**Online-Test-Skript (post-deploy):**
- [ ] geograsim.at/sonnensystem → Aufgabe „Erdjahr und Schaltjahr" — stoppt nach ~31 s, Wien 90° versetzt
- [ ] Erdjahr: Ghost-Erde liegt EXAKT am Startpunkt (JAN), nicht irgendwo dazwischen
- [ ] Aufgabe „Was wäre ohne Achsneigung?" — Phases-Wechsel 23,5°↔0°
- [ ] Aufgabe „Vollmond — wie entsteht er?" — Antwort #2 kurz
- [ ] Aufgaben-Liste zeigt 19 Stück (vorher 20)
- [ ] Aufgabe „Erddrehung" (= erste): Kamera SEHR nah an der Erde, Wien-Fähnchen zeigt RICHTUNG SONNE (Mittag)
- [ ] Datum-Buttons: ⏰ Jetzt zuerst, Label „Besondere Tage für heuer", Ostern auf echtem Datum
- [ ] Photon-Toggle: reflektiert an Mond-Tag-Seite
- [ ] Aufgaben-Modal Button „↻ Aufgaben abbrechen und neu starten" (statt nur „Neu starten")
- [ ] Aufgaben-Modal Button „← Zurück zur letzten Übung" (bei Aufgabe 1 ausgegraut)
- [ ] geograsim.at/glossar → „Watt" anklicken → PS-Abschnitt sichtbar
- [ ] Glossar-Cards laden spürbar schneller (Network-Tab: kleine webp statt große png)
- [ ] Detail-Modal zeigt großes Original-Bild
- [ ] Glossar im Sonnensystem-Modul lädt Begriffe (kein 404 mehr)
---
## 4) Folge-Iteration nach erstem Test-Lauf (alle nach der ersten Antwort-Runde)
### 4.1 404 Glossar-API für Sonnensystem
- **Was:** `sonnensystem.php` setzte `window.SONNENSYSTEM_API_BASE = '/geograsim/App/api'` — lokal existiert dieser Pfad nicht (richtig wäre `/geograsim/App/php/api`). Production hat Aliasing, lokal nicht. Klima nutzt schon den korrekten Pfad.
- **Fix:** `sonnensystem.php` jetzt `BASE_PATH . '/php/api'` (Linie 116).
- **Test:** Glossar-Klick in der Sim lädt Inhalte, keine 404-Fehler in der Konsole.
### 4.2 Buttons in den Aufgaben
- „Neu starten" → „↻ Aufgaben abbrechen und neu starten"
- Neuer Button „← Zurück zur letzten Übung" rechts daneben. Bei Aufgabe 1 ausgegraut (disabled).
- **Test:** Bei mehreren Aufgaben durchklicken, „Zurück"-Button funktioniert. Bei der 1. Aufgabe ist er ausgegraut.
### 4.3 Erddrehung-Aufgabe (= erste Aufgabe) Setup neu
- Neuer Camera-Mode `earth-very-close` (Distanz 1.8× Erdradius statt 3×). Erde füllt knapp halben Bildschirm.
- StartState: `date: "2026-01-01T12:00:00"` (= Wien-Mittag, Fähnchen zeigt zur Sonne) — vorher 2026-03-21.
- Intro-Text ergänzt: „Am Start ist in Wien Mittag — das rote Fähnchen zeigt direkt zur Sonne."
- **Test:** Aufgabe „Erddrehung" → Kamera sehr nah an der Erde, Wien-Fähnchen rotiert Richtung Sonne sichtbar in/aus dem Tageslicht.
### 4.4 Ghost-Erde Race-Condition + Zeitzone-Bug
- **Bug 1 (Matrix-Race):** `setTimeout(showGhostEarthAtCurrentPosition, 0)` las `earthPivot.getWorldPosition()`, bevor die animate-Loop die Matrix für das neue timeDays aktualisiert hatte → Ghost saß an der Position der LETZTEN Sequenz.
- **Bug 2 (Zeitzone):** `new Date("2026-01-01")` parst ECMAScript-konform als UTC-Midnight. EPOCH = `new Date(2026,0,1)` = lokale Zeit. In CET = 1h Versatz → timeDays ≈ 0.042 statt 0 → Ghost-Erde 0.04° vom Startpunkt entfernt (klein, aber falsch).
- **Fix:**
- `showGhostEarthAtCurrentPosition` rotiert earthOrbit/earthTilt manuell + `updateMatrixWorld(true)` BEVOR getWorldPosition → garantiert frische Matrix.
- In `obsApplyState`: Datums-String per Regex in Komponenten parsen (`Y, M, D, h, m, s`) und mit `new Date(y, m-1, d, h, m, s)` als lokale Zeit konstruieren → keine UTC-Falle.
- **Test:** Aufgabe „Erdjahr und Schaltjahr" mehrfach starten — Ghost-Erde liegt jedes Mal an derselben Stelle (JAN-Marker).
### 4.5 Thumbnail-Build erfolgreich
- 132 Thumbs in `assets/img/glossar/thumbs/` (WebP 480×270, ~20 KB jeweils).
- 329,7 MB → 2,6 MB (99,2 % Ersparnis).
- Build-Skript `App/Don_t_Deploy/build-glossar-thumbs.ps1` (idempotent).
- Defekt erkannt: `residuallast.png` (48 KB, vorzeitiges EOF) — Thumb fehlt für diesen Eintrag, Card lädt via onerror-Fallback das defekte Original.
---
## 7) Busfahrt — Ereigniskarten + Glossar + Lehrplan + Submit-Hook
### 7.1 Ereigniskarten-System (10 Events, evidenzbasiert)
- **Daten:** `App/sims/busfahrt/assets/data/events.json` — 10 Karten:
1. **ev-late-passenger** — Fahrgast nach Pause verspätet (Pauschalreisegesetz)
2. **ev-grenzkontrolle** — EU-Außengrenze, Quiz zu Zoll-Vorschriften + CITES
3. **ev-reifenpanne** — Reifenpanne (TÜV-Statistik: 35% aller Bus-Pannen)
4. **ev-heisse-bremsen** — Alpen-Bergabfahrt, Bremsfading-Risiko
5. **ev-lenkzeit** — EU-Verordnung 561/2006, Tachograph, max. 9h Lenkzeit/Tag
6. **ev-tunnelstau** — Brenner-Korridor-Stau, Umweg vs warten
7. **ev-vignette** — GO-Box vs Vignette, Maut-Systeme Europa
8. **ev-schneeketten** — Schneekettenpflicht-Schild, Winter-Trigger
9. **ev-diebstahl-raststaette** — Frankreich-spezifische Autobahn-Diebstahl-Statistik
10. **ev-notfall-bord** — Reisekrankheit/Kinetose, Erste Hilfe
- **Engine:** `pickEventForOrder(game)` mit Realismus-Filter (Schengen-Außengrenze / Alpenpass-Länder / Winter / probability). Wird zwischen settleOrder und loadNextOrder gerufen. `applyEventChoice` bucht Geld + protokolliert in `game.eventLog`.
- **UI:** neues Modal `event-overlay` mit SVG-Icon (im Stil) + Sachinfo-Box (ausklappbar) + Glossar-Klick-Links + Lehrplan-Hinweis.
- **SVG-Icons:** 10 Inline-SVGs im offiziellen Bildstil (Forest-Green-Gradient-Hintergrund + weiße Linien-Icons). DALL-E ist aktuell blockiert — SVG hält die App visuell trotzdem stimmig.
**Test (lokal):**
- L3-Tour starten → öfter Ereigniskarten erleben (Wahrscheinlichkeiten höher als L1).
- Beim Quiz „Grenzkontrolle" Antworten prüfen → korrekt = +50€, falsch = +45min.
- Sachinfo-Box ausklappen → Lehrplan-Hinweis sichtbar, Glossar-Links anklickbar.
### 7.2 Glossar erweitert (20 neue Begriffe)
- **Datei:** `App/Don_t_Deploy/2026-05-30-glossar-busfahrt-events.sql` (idempotent, SET NAMES utf8mb4)
- **Begriffe:** zoll, schengen, cites, vignette, go-box, tachograph, lenkzeit, schneekettenpflicht, bremsfading, motorbremse, pauschalreise, kinetose, alpenpass, maut, asfinag, warndreieck, panne, beförderungsvertrag, eu-aussengrenze, brennerkorridor
- **Lokal eingespielt.** Bei Production-Deployment: SQL erneut mit `mysql --default-character-set=utf8mb4` ausführen.
### 7.3 Lehrplan-Dokumentation
- **Datei:** `App/sims/busfahrt/LEHRPLAN.md` — vollständiges Mapping nach österreichischem Lehrplan GW Sek I (Lehrplan 2023).
- Themen: Geographie, Wirtschaft, Politische Bildung, Verkehrserziehung, Mathematik, Biologie, Physik, Sprachen.
- Pro Event ein klares Themen-Mapping inkl. Glossar-Querverweise.
### 7.4 Submit-Hook für Busfahrt (Bug-Fix vom Atlas-Bericht 2026-05-05)
- **Was vorher:** Busfahrt rief KEINEN Plattform-API-Endpoint — Schüler*innen-Ergebnisse verschwanden ins Nichts.
- **Was jetzt:** `submitBusfahrtTour()` schickt am Tour-Ende ein `submit_assessment` an `/php/api/progress.php` mit: level, stars, score, duration_ms, results.budget/earnings/wonOrders/totalOrders/quizFirstTry/eventCount.
- **Aktualisiert auch GGS_LIVE_STATE-Felder:** levelId/orderIndex/totalOrders/budget/wonOrders/lastCityTitle/lastMargin/quizFirstTry — passend zum neuen `LIVE_PRIMARY_FIELDS.busfahrt`-Schema in teacher.html.
**Test:**
- Tour zu Ende spielen → assessments-Tabelle in DB enthält neuen Eintrag mit sim_id='busfahrt'.
- Lehrer-Cockpit → Tab „Ergebnisse" → Klasse → Busfahrt zeigt den Run als Karte.
---
## 8) Fluggesellschaft — Neues Modul V1 funktional
### 8.1 Daten + Pool
- **Migration:** `App/sims/fluggesellschaft/scripts/migrate-from-busfahrt.py` — kopiert 53 L4-Aufträge aus Busfahrt + 16 Asien-Aufträge.
- **Asien-Lücke gefüllt:** 7 neue Städte (Tokio, Peking, Delhi, Bangkok, Singapur, Seoul, Jakarta) inkl. infoText DE+Easy, Zeitzone, Kontinent.
- **Hub:** Frankfurt (FRA) hinzugefügt als Heimat-Stadt.
- **Quiz-Fragen:** Generator erweitert auf 2 Frage-Typen (Land + Kontinent), pro Auftrag alterniert deterministisch.
- **Endstand:** 69 Aufträge (L1=18, L2=29, L3=22), 44 Städte.
### 8.2 Engine
- `App/sims/fluggesellschaft/engine.js` — Großkreis-Routing (`greatCirclePoints`), Quiz mit 2 Typen, ECON pro Level (Tap-Toleranz 250/200/150 km, Nachtflug-Quote 15/30/60%, Quiz-Geld ±100/150/200 €), CO₂-Bilanz (0.18 kg/Pax/km × 180 Pax).
- Submit-Hook + GGS_LIVE_STATE inline in `game.html`.
### 8.3 UI
- `App/sims/fluggesellschaft/game.html` — Leaflet-Karte mit 3 Tile-Layern:
- **ESRI World Imagery** (Satellite, Default) — empfohlen für Welt-Sicht
- **OpenStreetMap** — bekannte Strukturen, Beschriftungen
- **CARTO Dark** — Nachtflug-Atmosphäre
- Toggle-Button 🛰️ in Topbar wechselt durch
- Großkreis-Polyline orange-gestrichelt, Flugzeug-Animation (✈) entlang der Route
- Buchhaltungs-Tabelle mit Quiz-Bonus/Strafe + CO₂-Zeile
- Endscreen: Quiz-Stats + Gesamt-CO₂ in Tonnen + Hektar-Wald-Äquivalent
### 8.4 Plattform-Integration
- **PHP-Wrapper:** `App/pages/fluggesellschaft.php` (analog busfahrt.php — Mode-Check, Locked-Page, Asset-Path-Rewrite, Cockpit-Link)
- **module_info DB-Eintrag** angelegt (status='beta', icon='✈', page_url='fluggesellschaft')
- **LIVE_PRIMARY_FIELDS.fluggesellschaft** in `teacher.html`: 8 Spalten (level, flug, budget, flüge ✓, CO₂, letztes Ziel, zeitzone, quiz auf anhieb)
- **`renderFluggesellschaftRun`** in `teacher.html` für Lehrer-Drilldown
- **`renderFluggesellschaftOwnRun`** in `schueler.html` für Schüler-eigene-Verlauf-Ansicht
### 8.5 Glossar + Lehrplan
- **9 neue Glossar-Begriffe** (SQL: `App/Don_t_Deploy/2026-05-30-module-fluggesellschaft.sql`):
großkreis · zeitzone · datumsgrenze · klimazone · co2-flugverkehr · kontinent · hub-flughafen · jetstream · cockpit-air-traffic
- **Lehrplan-Mapping:** `App/sims/fluggesellschaft/LEHRPLAN.md` — Welt-Geographie, Mathematik (Großkreis), Physik (Jetstream, Atmosphäre), Politische Bildung (Zeitzonen, ICAO), Umwelt (CO₂)
### 8.6 Bekannte Lücken
- **Asien-Stadtbilder fehlen** (DALL-E blockiert) — onerror-Fallback aktiv, Bild unsichtbar
- **Splash-Image fehlt** (gleicher Grund)
- **Keine Events-Karten** (analog Busfahrt) — für spätere Iteration vorgemerkt
**Test lokal (gemeinsam mit Thomas):**
- `localhost/geograsim/App/fluggesellschaft` aufrufen → Welcome → Quiz → Karten-Tap → Resolution mit Großkreis-Animation → InfoCard mit Zeitzone + CO₂ → Endscreen mit Bilanz.
- Levelwechsel (Forced-Level über Lehrer-Cockpit) durchtesten.
- Lehrer-Cockpit → Live-View → Flug-Schüler*in startet → Felder erscheinen mit korrekten Werten.
**Online-Test-Skript (post-deployment to TEST):**
- [ ] geograsim.at/fluggesellschaft lädt ohne 404
- [ ] L1 → 10 Flüge, L2 → 14, L3 → 18 Flüge in der Tour
- [ ] Karten-Tile-Toggle 🛰️ wechselt Esri → OSM → Dark
- [ ] Großkreis-Linie sichtbar zwischen Frankfurt und Ziel
- [ ] Quiz wechselt zwischen „In welchem Land?" und „Auf welchem Kontinent?"
- [ ] CO₂-Bilanz in InfoCard + Endscreen + Topbar
- [ ] Zeitzone-Hinweis in InfoCard („Tokio ist 8h voraus")
- [ ] Submit am Tour-Ende → assessments-Eintrag in DB
- [ ] Lehrer-Cockpit Live-View zeigt Flug-Schüler*in mit allen Spalten
- [ ] Detail-Drilldown zeigt Flug-Run-Karte mit CO₂-Stat
---
---
## 11) Iteration 2026-05-31 — Profil-Polish + Avatar-Generierung + Lehrer-Cockpit
### 11.1 Profil-Seite: Schüler-Navi + Lehrer-Navi + Hash-Routing
- **Schüler-Tabs** in profil.html: Meine Module / Meine Erfolge / Profil — Klick führt zurück zu schueler.html mit Hash (`#achievements`, `#profile`).
- **Lehrer-Tabs** in profil.html: Übersicht / Modulfreigabe / Klasse / Live / Ergebnisse / Lizenzen / Profil — analog mit Hash.
- **Hash-Listener** in schueler.html UND teacher.html: liest `location.hash` beim Laden + `hashchange`-Event und schaltet `switchTab()` automatisch.
- Sichtbarkeit der Tab-Bar wird per role (`student`/`teacher`) gesteuert.
### 11.2 Sonnensystem-Eigen-Verlauf umgebaut auf Sessions
- **Problem:** task_solved-Submits (eine pro gelöster Aufgabe, Live-Heartbeat) wurden im Schüler-Eigen-Verlauf als 20+ einzelne Karten gezeigt.
- **Fix:** `groupSonnensystemSessions()` clustert task_solved + set_complete zu Tour-Sessions (1h-Gap oder set_complete schließt ab).
- **Orange linker Rand** = halbfertig (kein set_complete)
- **Grün** = abgeschlossen
- Aufklappbare Details: Zeitraum, gelöste Aufgaben, Mehrfachversuche, neue Achievements.
- **Lehrer-Drilldown** in teacher.html bekommt dieselbe Logik (`groupSonnensystemSessionsTeacher` + `renderSonnensystemSessionTeacher`).
### 11.3 Energiemanager Onboarding + Netzfrequenz erweitert
- **Onboarding** (4 Schritte) komplett umgeschrieben — von Stichpunkten zu erzählenden vollständigen Sätzen.
- **Netzfrequenz-Glossar** (DB + Sim-Fallback) startet jetzt mit Wechselstrom-Grundlage: „In unseren Steckdosen fließt kein Gleichstrom wie aus einer Batterie, sondern Wechselstrom..." + Chor-Metapher + Pulsschlag + EU-weite Synchronisation PortugalPolen.
- **Scope-Bug** behoben: `setSummaryClose()` und `setSummaryNext()` waren im IIFE versteckt → ReferenceError beim Schließen-Klick. Beide nun `window.X = X`.
### 11.4 Avatar-System: 6 × 12 = 72 Avatare mit Namen + 3 neue Gruppen
- **Datenstruktur** in profil.html: `AVATAR_GROUPS = [{name, color, items: [{slug, name, emoji}]}]`
- **3 neue Gruppen:**
- **Aliens erforschen die Welt** (12) — Zorblax/Aquana/Tempest/Urbanix/Faunor/Floranth/Magmara/Glacium/Solara/Veridia/Altimos/Marinus (im Comic-Stil)
- **Berühmte Forschungsmaschinen** (12) — Trieste, Graf Zeppelin, Charlière, Fram, HMS Beagle, Halleysche Tauchglocke, Voyager 1, Vostok-Eisbohrer, Curiosity, Landsat, FS Meteor, Meteosat
- **Berühmte Forscher*innen** (12) — Humboldt, Mercator, Cook, Marco Polo, Ibn Battuta, Nansen, Piccard, Amundsen, Earhart, Sylvia Earle, Anning, Carson
- **3 bestehende Gruppen** je um 2 ergänzt: Ozeanographin/Tropenbiologe, Skaterin/DJ, Tundra-Wolf/Tiefsee-Krake.
- **Emoji-Fallback** statt Initial-Buchstabe wenn PNG fehlt: stilkonformer farbiger Kreis mit passendem Emoji.
### 11.5 Avatar-Bilder via OpenRouter+Gemini-2.5-Flash-Image
- **OpenAI-Org blockiert** wegen fehlender Org-Verification (`billing_hard_limit_reached` auf allen `gpt-image-*` Modellen, beide Accounts geprüft).
- **Workaround:** OpenRouter mit Gemini 2.5 Flash Image — generiert PNG-Avatare im offiziellen Bildstil.
- **Generator-Skript:** `App/assets/img/avatars/scripts/generate-via-openrouter.py` (Python, nutzt curl wegen Inkscape-Python-SSL-Cert-Issue).
- **Ergebnis:** 42 neue PNGs erzeugt (Aliens im Comic-Stil mit großen Augen + warmem Lächeln + kindgerechten Proportionen, Maschinen + historische Persönlichkeiten als Portraits).
- **Thumb-Build:** `App/Don_t_Deploy/build-avatar-thumbs.ps1` (ImageMagick `magick.exe`, fester Pfad bei Bedarf). 72 PNGs (71,6 MB) → 72 WebP-Thumbs 256×256 (589 KB, Faktor 120× kleiner).
- **UI-Anpassung:** `profil.html`, `schueler.html`, `teacher.html` laden alle Avatare aus `assets/img/avatars/thumbs/avatar-X.webp`. Originale bleiben als hochauflösender Fallback.
### 11.6 Lehrer-Cockpit Avatar-Sichtbarkeit + Save-Bug
- **Bug 1:** `GET /api/profile` für Lehrer hat das Feld `emoji_avatar` nie geliefert → Reload zeigte immer Default-👩‍🏫 → wirkte wie „nicht gespeichert".
- **Fix:** [`profile.php:18`](App/php/api/profile.php#L18) SELECT erweitert um `emoji_avatar`.
- **Bug 2:** `selectAvatar()` aktualisierte nur den Profil-Button, nicht die Topbar-Pille.
- **Fix:** `selectAvatar()` in profil.html sucht jetzt drei Selektoren parallel (`#user-emoji`, `#user-pill .emoji`, `.user-pill .emoji`), nutzt Cache-Buster (`?v=Date.now()`) damit Browser frisches Image lädt. Funktioniert für Schüler*innen + Lehrkräfte.
### 11.7 Fleißmessung Toggle: Klasse-gesamt ↔ pro Schüler*in
- **Backend** (`results.php` Endpoint `view=activity`): neuer Parameter `groupBy=module|student`. Pro-Student-Modus joined `student_sessions``students` (Verknüpfung über `class_id + display_name`, weil assessments nur `session_id` hat).
- **Frontend:** Toggle-Button neben Tag/Woche/Monat/Jahr. Card-Überschrift wechselt mit. Tooltip in der Bar zeigt korrekten Namen.
- **Bug-Fix dabei:** Mein erster Wurf hatte `a.user_id` — die Spalte gibt's nicht in assessments → HTML-PHP-Warning statt JSON → SyntaxError im Frontend. Korrekter Join über `student_sessions`.
### 11.8 Sonnensystem Lehrer-Drilldown — Detail-Verbesserung
- In teacher.html `openStudentRuns()`: bei `_modDetail.moduleId === 'sonnensystem'` werden jetzt Sessions geclustert (analog Schüler-Eigen-Verlauf).
- Jede Session als eigene Karte mit orange/grün-Border, aufklappbar.
### 11.9 Avatar-URL-Refactor (alle 4 HTML-Files)
- `avatarUrl(slug)` → liefert Thumb-Pfad (`thumbs/avatar-X.webp`), `avatarFullUrl(slug)` → liefert Original-Pfad.
- `schueler.html`, `teacher.html`, `profil.html`: hardcoded `assets/img/avatars/avatar-X.png` global ersetzt durch `assets/img/avatars/thumbs/avatar-X.webp`.
- `.png``.webp` für 8 Stellen in teacher.html (Live-View, Drilldown, Ergebnisse-Tab, Lizenzen-Tab, Klassen-Tab).
**Test-Skript Ergänzungen (post-deployment to TEST):**
- [ ] geograsim.at/profil → 6 Gruppen × 12 Avatare sichtbar, mit Namen als Label.
- [ ] Klick auf Avatar → Pille rechts oben aktualisiert sofort (auch beim Lehrer).
- [ ] Reload nach Avatar-Wahl: Lehrer behält den gewählten Avatar.
- [ ] Schüler → Profil-Tab → Sonnensystem-Karte: pro Session statt 20 Karten, orange/grün-Border, klick öffnet Details.
- [ ] Lehrer → Ergebnisse-Tab → Schüler-Drilldown auf Sonnensystem: gleiche Session-Logik.
- [ ] Lehrer → Ergebnisse → Fleißmessung: Toggle „Nach Modul" / „Nach Schüler*in" funktioniert.
- [ ] Energiemanager → Onboarding: 4 erzählende Schritte, kein Stichpunkt-Stil.
- [ ] Energiemanager → ⚡-Tachometer klick: Wechselstrom-Erklärung sichtbar.
- [ ] Energiemanager → Set-Ende: Modal lässt sich mit „Schließen" UND „Weiter" klicken (war ReferenceError).
- [ ] profil.html als Lehrer: Tab-Bar oben sichtbar mit 7 Cockpit-Tabs.
---
## 9) Folge-Fixes aus lokalem Test (Thomas-Reports)
### 9.1 Bug: Stadt wiederholt sich innerhalb einer Tour
- **Beobachtung:** Lissabon zweimal kurz hintereinander in einer Tour.
- **Ursache:** Im Pool gibt es pro Stadt mehrere Auftragstypen (A/B/C/D) mit derselben `cityId`. Der alte Filter blockierte nur DIREKTE Wiederholung — Lissabon → Porto → Lissabon war erlaubt.
- **Fix (Bus + Flug Engine):** Dreistufiger Filter — bevorzugt Städte, die noch GAR NICHT in der Tour sind. Bei 16 Tour-Aufträgen aus 42+ unique Städten ist das problemlos erfüllbar.
**Test:**
- L1-Tour spielen → jede Stadt taucht maximal einmal als Ziel auf.
- Mit kleinem Pool (z.B. wenn nur 1 Stadt übrig) greift Fallback auf alten Filter.
### 9.5 Glossar-Link 404 — falscher Pfad
- **Beobachtung:** Glossar-Links in Event-Sachinfo zeigten auf `../../glossar.html?slug=X` → Browser löst von URL `/busfahrt` auf `/glossar.html` → 404. Plus: Parameter heißt `term`, nicht `slug`.
- **Fix:** Neuer Helper `glossarHref(slug)` baut Pfad aus `window.BUSFAHRT_BASE`, nutzt extension-less Route + korrekten Parameter `?term=`. Funktioniert lokal (`/geograsim/App/glossar`) + production (`/glossar`).
### 9.6 Realismus-Bug: keine Fähren/Tunnel/Sondermaut
- **Beobachtung:** München → Manchester ohne Eurotunnel-Kosten. Reykjavik → Amsterdam ohne Fähre.
- **Fix:** Neue Funktion `computeCrossingFee(fromCountry, toCountry)` in der Engine deckt 7 typische europäische Übergänge ab:
- **UK ↔ Festland** (Kanaltunnel / Fähre Calais-Dover, ~320 €)
- **Italien ↔ Frankreich** (Mont-Blanc-Tunnel, ~280 €)
- **Österreich ↔ Italien** (Brenner-Sondermaut, ~45 €)
- **Schweden ↔ Dänemark** (Öresundbrücke, ~250 €)
- **Frankreich ↔ Schweiz** (CH-Zoll-Stichprobe + LSVA, ~40 €)
- **Island ↔ Festland** (Norröna-Fähre Hirtshals-Tórshavn-Seyðisfjörður, ~520 €)
- **Irland ↔ UK / Festland** (Stena Line ~150 € / Direktfähre ~290 €)
- **Norwegen ↔ Festland-EU** (EFTA-Stichprobe + Bompenger, ~35 €)
- **Report-Felder erweitert:** `crossingFee`, `crossingLabel`, `crossingSachinfo`, `crossingGlossar`. In `settleOrder` direkt von der Marge abgezogen.
- **UI:** Neue Crossing-Box in der InfoCard (`bf-crossing`, blau hervorgehoben, beim ersten Mal aufgeklappt) zeigt Label, Sachinfo-Text und Glossar-Link. In Buchhaltung als eigene Zeile mit Betrag.
- **Glossar:** 4 neue Einträge: `norroena-faehre`, `kanaltunnel`, `mont-blanc-tunnel`, `oeresundbruecke`.
### 9.7 UK-Hinweis im Quiz-Feedback
- **Beobachtung:** Schüler*innen kennen „Großbritannien" — UK / „Vereinigtes Königreich" verwirrt.
- **Fix:** Beim Quiz-Erfolg mit Antwort „Großbritannien" wird zusätzlich erklärt: „Das Land heißt offiziell auch Vereinigtes Königreich' (UK = United Kingdom). Großbritannien' ist eigentlich nur die Insel mit England, Schottland und Wales — Nordirland gehört auch zum UK, ist aber auf der anderen Insel."
### 9.2 Inhalts-Korrektur: „Vereinigtes Königreich" → „Großbritannien"
- **Beobachtung:** Quiz „In welchem Land liegt Manchester?" → Antwort „Vereinigtes Königreich". Korrekt, aber für Sek I-Schüler*innen ungewohnt.
- **Hintergrund:** „Vereinigtes Königreich" (UK = Großbritannien + Nordirland) ist politisch präzise. „Großbritannien" ist im Schulalltag vertrauter.
- **Fix:** `country: "Vereinigtes Königreich"``"Großbritannien"` in cities.json (Bus 2 Städte: London + Manchester, Flug 0 Städte). Alle Quiz-Choices (auch Distraktoren in anderen Stadt-Fragen) wurden mit-gepatcht.
- **Bewusste Ausnahme:** Glossar-Eintrag `eu-aussengrenze` behält „Vereinigtes Königreich (UK, seit Brexit 2021)" — dort ist der politische Kontext relevant.
**Test:**
- Quiz zu London/Manchester → Choices zeigen „Großbritannien"
- Andere Fragen mit UK als Distraktor → ebenfalls „Großbritannien"
---
---
## 10) Folgeiteration 2026-05-31 (UI/Onboarding)
### 10.1 Profil-Seite: Schüler-Navigation
- profil.html bekommt Tab-Bar (Module / Erfolge / Profil), nur sichtbar für Schüler*innen.
- „Meine Erfolge"-Link → `schueler.html#achievements`; Hash-Listener in schueler.html aktiviert den Tab.
### 10.2 Sonnensystem-Eigen-Verlauf: Sessions statt 20 Karten
- Bug: jeder gelöste Task war eine eigene Karte → 20+ Karten pro Tour.
- Fix: `groupSonnensystemSessions(runs)` clustert task_solved + set_complete zu Tour-Sessions (1h-Gap oder set_complete schließt ab).
- **Orange linke Seitenleiste** = Teil-Durchlauf (abgebrochen), **grün** = abgeschlossen.
- Aufklappbare Details: Zeitraum, Liste gelöster Aufgaben + Mehrfachversuche, neue Achievements.
- CSS: `.ownruns-card--complete` (grün), `.ownruns-card--partial` (orange).
### 10.3 Profil-Avatare: 72 Avatare (6 × 12) + Namen + 3 neue Gruppen
- **Gruppen erweitert von 3×10 = 30 auf 6×12 = 72:**
- Geo-Welt (12, internationale Nationen): + Ozeanographin (Linnea, NO), Tropenbiologe (Kwame, GH)
- Cool & lustig (12): + Skaterin (Reni), DJ (Kofi)
- Tier-Begleiter (12): + Tundra-Wolf (Yuki), Tiefsee-Krake (Otto)
- **NEU Aliens erforschen die Welt** (12): Zorblax, Aquana, Tempest, Urbanix, Faunor, Floranth, Magmara, Glacium, Solara, Veridia, Altimos, Marinus
- **NEU Berühmte Forschungsmaschinen** (12): Trieste (Piccard-Tauchboot), Graf Zeppelin, Charlière (1783), Fram, HMS Beagle, Halleysche Tauchglocke, Voyager 1, Vostok-Eisbohrer, Curiosity, Landsat, FS Meteor, Meteosat
- **NEU Berühmte Forscher*innen** (12): Humboldt, Mercator, Cook, Marco Polo, Ibn Battuta, Nansen, Auguste Piccard, Amundsen, Earhart, Sylvia Earle, Mary Anning, Rachel Carson
- **Datenmodell:** `AVATAR_GROUPS = [{name, color, items: [{slug, name}]}]`.
- **Picker UI:** Bild + Name als Label darunter + Tooltip. Sektion-Header in Gruppen-Farbe.
- **Fallback** bei fehlendem PNG: SVG-Initial-Kreis in Gruppen-Farbe (`makeAvatarFallback`).
- **Memory:** [`reference_avatar_slugs.md`](file:///C:/Users/herr_/.claude/projects/c--xampp-htdocs-geograsim/memory/reference_avatar_slugs.md) komplett überarbeitet.
**Wichtig:** 42 PNGs fehlen noch (DALL-E-Account-Limit). Bis dahin zeigt der Initial-Fallback. Sobald OpenAI wieder Generierung erlaubt → Skript-Stub anlegen mit den Prompts aus der Memory.
### 10.4 Energiemanager-Onboarding: Anwaltsbrief → erzählend
- 4 Onboarding-Schritte komplett umgeschrieben — vollständige Sätze, vor allem Schritt 4 baut explizit auf dem Wechselstrom-Konzept auf.
- Glossar-Links bleiben in den Texten verankert.
### 10.5 Energiemanager-Netzfrequenz-Info: Wechselstrom-Hintergrund
- Glossar-Eintrag `netzfrequenz` (DB + lokales Fallback in game.html) komplett überarbeitet.
- Erklärt: Wechselstrom + 50Hz + Chor-Metapher + Zusammenhang Erzeugung/Verbrauch + Toleranzbereich + automatische Schutzmaßnahmen + EU-weite Synchronisation PortugalPolen.
- Klick auf den Tachometer-Header öffnet jetzt diese ausführliche Erklärung statt des Drei-Satz-Stubs.
**Test:**
- Profil-Seite → Tab-Bar oben sichtbar, „Meine Erfolge" springt nach schueler.html zum richtigen Tab.
- Profil → Avatar ändern → 6 Gruppen × 12 Avatare sichtbar, Namen als Label, fehlende PNGs zeigen Initial-Kreis (nicht kaputtes Bild).
- Sonnensystem → Meine Erfolge → Karten pro Session statt pro Einzelaufgabe; orange für abgebrochene Tours, grün für abgeschlossene; Klick öffnet Details.
- Energiemanager neu öffnen → Onboarding erzählerisch, ⚡-Tachometer klick öffnet Wechselstrom-Erklärung.
---
### 4.6 Bekannte Blocker (ALT, jetzt veraltet — siehe 7/8)
- **Turbinen-Bild + residuallast-Bild Refresh:** DALL-E-3 weg, Account hat nur noch `gpt-image-*`-Familie + Billing-Hard-Limit erreicht. Erst lösbar nach OpenAI-Account-Anpassung durch Thomas. Beide Originale bleiben vorerst wie sie sind.
---
## 5) Modul Busfahrt — Zwischenfragen + Geld-Effekt + 2 Bugs
### 5.1 Zwischenfragen-Refactor: Frage bei JEDER Fahrt + Geld-Effekt
- **Was vorher:** Nur Typ-B-Aufträge (~15 % der Tour) hatten eine Hauptstadt-Multiple-Choice — ohne Geld-Effekt, nur als „Filter" für den Karten-Tap.
- **Was jetzt:** Bei JEDEM Auftrag ein Quiz VOR dem Karten-Tap.
- Typ B unverändert (Hauptstadt-Frage, Stadtnamen als Choices).
- Typ A/C/D: generierte Land-Frage „In welchem Land liegt X?" aus `cities.json`.
- **Geld-Effekt** (neue ECON-Werte):
- Richtig beim 1. Versuch → **+50 € Bonus**
- Jede falsche Antwort → **50 € Strafe** (endlos probierbar, wird teuer)
- **Buchhaltung:** Quiz-Bonus / -Strafe wird in der InfoCard-Tabelle separat ausgewiesen, ist Teil der angezeigten Tour-Marge.
- **Endscreen:** neue Zeilen „Quiz richtig auf 1. Versuch: X / N" und „Quiz-Bonus / -Strafe". Fahrtenbuch zeigt 🧠-Badge pro Tour.
- **Daten:** Generator `App/sims/busfahrt/scripts/generate-city-questions.py` legt pro Stadt eine `question` an. Re-runnable, überschreibt nicht.
- **Files:** `engine.js` (neue Funktion `evaluateQuestion`, erweiterte `nextOrder` + `settleOrder`), `game.html` (showChoiceModal generischer, neue Quiz-Logik), `cities.json` (+144 question-Einträge).
**Test:**
- Tour starten → erste Frage erscheint (egal welcher Auftragstyp).
- Bei richtiger 1.-Antwort: Topbar-Budget +50 €, Feedback „+50 € Bonus".
- Bei falscher Antwort: Topbar 50 €, Feedback „−50 € Strafe", weiter probieren.
- Auftrag abschließen → InfoCard zeigt Quiz-Zeile in Buchhaltung.
- Tour-Ende → Endscreen zeigt „Quiz richtig auf 1. Versuch: X / N" + Bonus/Strafe-Summe.
### 5.2 Salzburg-Text Korrektur
- War: „im Westen Österreichs an der Salzach"
- Jetzt: „in der Mitte Österreichs an der Salzach, nahe der deutschen Grenze und am Rand der Alpen"
### 5.3 Schüler-Link 404 Bug
- War: `href="/schueler"` → lokal 404 (lokaler BASE_PATH ist `/geograsim/App`).
- Jetzt: `href="../../schueler.html"` (relativer Pfad, funktioniert lokal + Production).
- Zwei Stellen: Topbar-🏠-Button + End-Overlay-„Zur Übersicht"-Button.
### 5.4 Bekannte Schwäche (TODO F1 in busfahrt/TODO.md)
- Generator-Distraktoren sind **zufällig** aus 98 Ländern gewählt → didaktisch oft zu leicht (z.B. „Wien: Japan / Malaysia / Österreich").
- Plan F1: plausiblere Distraktoren (Nachbar-/Kontinent-Logik).
- Plan F2: für ~2030 Sensationsstädte eine zusätzliche kuratierte Frage (Fluss, Berg, Wahrzeichen).
- Plan F3: Easy-Sprache der Fragen separat formulieren.
- Plan G1: Reykjavik / Island-Anreise didaktisch ausschmücken (Norröna-Fähre).
**Online-Test-Skript Ergänzungen (post-deployment to TEST):**
- [ ] geograsim.at/busfahrt → Tour starten → bei JEDEM Auftrag Quiz vor Karten-Tap
- [ ] Quiz-Bonus / -Strafe in Topbar und Buchhaltung sichtbar
- [ ] Endscreen zeigt Quiz-Summen + 🧠-Badges im Fahrtenbuch
- [ ] 🏠 Schülerseiten-Button funktioniert (kein 404)
- [ ] End-Screen Button „Zur Übersicht" landet auf schueler.html (kein 404)
- [ ] Salzburg im InfoCard sagt „in der Mitte Österreichs"
---
## 6) Busfahrt 3-Level-Refactor + Fluggesellschaft-Skelett
### 6.1 L3-Aufträge umgelabelt auf L4 (53 Stück)
- **Migrations-Skript:** `App/sims/busfahrt/scripts/relabel-l3-to-l4.py` (idempotent).
- **Vor:** 53 außereuropäische Aufträge (USA 6, Brasilien 6, Kanada 5, Australien 4, Südafrika 5, Marokko 3, Ägypten 3, …) liefen als L3 im Bus-Pool.
- **Nach:** Alle als `level: "l4"` markiert. Im Busfahrt-`filterPoolByLevel` explizit ausgeschlossen — L3 nutzt jetzt nur den kumulierten L1+L2-Pool (106 europäische Aufträge).
- **Reservat-Zweck:** Daten bleiben in `busfahrt/orders.json` als Reservat für das neue Fluggesellschaft-Modul.
### 6.2 Busfahrt Engine: ECON pro Level
- `tapToleranceKm`, `nightFirst`, `nightChanceAfter`, `quizBonusFirstTryEur`, `quizPenaltyPerWrongEur` sind jetzt pro-Level-Objekte `{l1, l2, l3}`.
- Neue Helper-Funktion `econ(key, levelId)` löst auf, mit Fallback auf l1.
- Werte:
| | L1 | L2 | L3 |
|---|---|---|---|
| Tap-Toleranz | 10 km | 10 km | **5 km** |
| Nachtfahrt-Start (0-basiert) | ab #6 | ab #4 | **ab #2** |
| Nachtfahrt-Chance danach | 20 % | 30 % | **90 %** |
| Quiz-Bonus richtig 1. Versuch | 50 € | 75 € | 100 € |
| Quiz-Strafe pro Fehlversuch | 50 € | 75 € | 100 € |
| Tour-Länge | 16 | 20 | 24 |
| Tour-Ziel | 8.000 € | 20.000 € | 35.000 € |
**Begründung L3 = „Erfahrene:r Buslenker*in":** 90 % Nacht (kein Navi) + halbe Tap-Toleranz + Quiz teuer. Pool bleibt L1+L2 — keine neuen Daten nötig, keine neue Mechanik.
**Test:**
- L1 starten: 16 Aufträge, mild, ab #6 Nacht.
- L2 starten: 20 Aufträge, schon ab #4 Nacht, mehr Quiz-Geld.
- L3 starten: 24 Aufträge, ab #2 fast nur Nacht, 5-km-Toleranz, 100-€-Quiz.
### 6.3 Fluggesellschaft-App — Skelett gegründet
- **Pfad:** `App/sims/fluggesellschaft/` (README + leerer `assets/data/`)
- **Inbox:** `App/sims/_inbox/fluggesellschaft/_status.md`
- **Memory:** `project_fluggesellschaft_state.md` (Index in MEMORY.md ergänzt)
- **Status:** Konzept-Phase. Kein Code, nur Doku.
- **README enthält:** Begründung warum eigenes Modul, Mechanik-Tabelle (Bus vs. Flug), Wiederverwendungs-Liste aus Busfahrt, Asien-Lücke als TODO.
**Hier ist nichts zu testen** — neuer Ordner, leer.
**Folgeschritte (nächste Iteration):**
1. L4-Aufträge aus busfahrt/orders.json migrieren → fluggesellschaft/orders.json
2. Engine-Stub: Großkreis-Routing statt OSRM
3. UI-Stub: game.html minimal-Klon
4. Asien-Daten ergänzen (Tokio, Peking, Delhi, Bangkok, Singapur, Seoul, Jakarta)
5. Splash-Bild via DALL-E (BLOCKIERT durch OpenAI-Limit)