Files
geograsim/.dontDeploy/test-protokoll-2026-05-30.md
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

40 KiB
Raw Permalink Blame History

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):

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 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_sessionsstudents (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.
  • 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 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"
  • 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)