Commit Graph

58 Commits

Author SHA1 Message Date
Adminator 96a73e22b2 Lizenz-Vertrieb: Chargen-Vergabe, Storno, Verlaengerung, Mail, Einloeselink
Erweitert das Lizenzmodul um eine Vertriebs-/Vergabe-Schicht ueber dem
bestehenden Einloese-Flow (non-breaking, alle Alt-Codes + generate/redeem
/assign unveraendert).

Schema (Migration 2026-08-26-lizenz-vertrieb.sql, additiv):
- license_customers (Besteller: Kundennummer/Email/Name)
- license_batches (Bestellung/Charge: externe Bestellnummer, Typ, Menge,
  Gueltigkeit, Sammel-Einloesetoken, Storno)
- licenses += batch_id, issued_at, valid_from/until (pro Code -> Verlaengerung),
  canceled_at/reason; code auf VARCHAR(32) (laengere Codes)
- license_mails (Mail-Archiv, unabh. vom IMAP), license_redeem_attempts
  (Brute-Force-Schutz), license_events (Audit-Log)

Backend (php/api/licenses.php):
- issue_batch: N frische 100-Bit-Codes in Transaktion, sofort vergeben,
  an Kunde/Bestellung/Gueltigkeit gebunden; sticky Default Gueltig-bis
- Uebersicht (view=batches mit Aggregat ausgegeben/storniert/netto/eingeloest
  /abgelaufen), batch_detail, Kunden-Autocomplete, sales_default
- cancel_batch/cancel_license, extend_batch/extend_license
- send_batch_mail (Server-Treiber via Mailer, archiviert, Anhang bei >40)
- redeem_charge (Sammel-Einloeselink)
- Brute-Force-Bremse + Audit + Storno-Ablehnung im redeem/redeem_batch

UI (admin-licenses.html): Ausgabe-Formular (Bestaetigung bei Grossmengen),
Ergebnis mit Copy/Download(txt+csv)/Mail-Composer/Sammellink, Bestellungs-
Uebersicht mit Filtern + Detail-Modal (Storno/Verlaengern/Verlauf/Mails).

Einloese-Landingpage (einloesen.html + pages/einloesen.php): ?charge=Token
(alle auf einmal) und ?code=CODE, mit Lehrer-Login-Gate.

Lib: Database Transaktionen; Mailer sendWithAttachments + renderPlainBody.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-26 01:39:14 +02:00
Adminator 539f6b012e leistung_pct-Fundament (Teacher+Backend bevorzugen) + Tempo-Button-Zustaende
- teacher.html _leistungPct: von der Sim geliefertes s.leistung_pct hat
  Vorrang, sonst zentrale Ableitung (Fallback).
- live.php extractScore: leistung_pct (0-100) hat Vorrang vor score/Sterne.
- admin-styleguide.html: Tempo-Button zeigt IMMER den Stand (1x/2x/8x Auto/
  Pause); Toggle-Verhalten (Panel bleibt offen bis erneutem Klick) beschrieben.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-25 12:31:23 +02:00
Adminator 7de71b0e83 Energiemanager: Blackouts fuer Lehrer sichtbar machen
- game.html: bei Blackout sofort action:'blackout' an /progress feuern
  (setId/Tag/Block/Frequenz/Ursache, score:0) — Fehlversuch bleibt auch
  bei Set-Abbruch sichtbar, kein player_progress/Sterne.
- progress.php: neuer action:'blackout' -> eigene assessments-Zeile,
  KEIN XP/plays/best_stars.
- live.php: Blackout-Flag (event:'blackout') durch die Tag-Summary reichen
  (blackout/blackoutCount pro Session).
- teacher.html: needsHelp energiemanager (>=2 Blackouts oder Tag <4/8);
  Blackout-Spalte + '🔌 neu planen'-Status in Aktuell; Tag-Balken als
  🔌 Blackout kennzeichnen; Run-Karte: eigenes Blackout-Kaertchen +
  '🔌 N Blackouts'-Badge im fertigen Set.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-24 13:19:21 +02:00
Adminator b77f4ed912 Tag-Ansicht: student_results einbeziehen + Datum/Zoom-Verhalten
- live.php summary: fertige Laeufe aus student_results ergaenzt (dedupliziert gegen assessment/
  live) -> JEDER heutige Durchgang erscheint als Balken, egal ueber welchen Submit-Pfad.
- teacher.html: Ergebnisse-Tab/Menuewechsel setzt Datum auf HEUTE + Regler auf Auto zurueck;
  Datumswahl/Heute setzt Regler auf Auto; Auto-Zoom jetzt +/-1 h um die Aktivitaet.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-24 09:33:32 +02:00
Adminator f7bf0f0901 Fix: alle heutigen Leistungen zaehlen (Ben) + Live-Session started_at bei Modulwechsel (Clara)
- live.php: ON DUPLICATE KEY UPDATE-Reihenfolge korrigiert (started_at VOR module_id), sonst
  wird der Modulwechsel nie erkannt -> Balken behielt alten Startzeitpunkt (Clara EU-Werkstatt seit 14:30).
- results.php view=today: liefert todayScores (Pro-Schueler-Aggregat aus student_results, zuverlaessig).
- teacher.html HEUTE-Triage: fertige Laeufe aus student_results + laufende aus Summary zusammengefuehrt;
  Totalversagen heute (<40) -> Foerdern. Ben (klima 36) erscheint jetzt korrekt in Foerdern.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 15:21:04 +02:00
Adminator 0d9481cae2 Tag-Ansicht: pausierte Zeiten bleiben als Verlauf stehen (verschwinden nicht mehr)
live-client loggt Pausen-Spannen (__pauseSpans: {s,e}), live.php reicht sie durch,
renderLiveSummary zeichnet jede als bleibendes halbhohes Segment im Tag-Balken
(offene/laufende Pause blinkt). Fallback fuer Sim-Pause via phase bleibt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:53:07 +02:00
Adminator 3c28794012 Tag-Ansicht: pausierte Laeufe als halbhoher weiterlaufender Balken
live.php meldet paused (Idle-Pause/Sim-Pause/phase=paused) + activeUntilMs (letzte
Interaktion). renderLiveSummary: Hauptbalken volle Hoehe bis Pausenbeginn, danach
halbhoher gedaempfter "Pausen-Schwanz" der mit der Zeit weiterwaechst. Legende + tz.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-23 12:02:27 +02:00
Adminator 2160a99896 Lehrer-Live: laufende Klima-Balken farbig (Ampel) + "Heute bereits erledigt" zeigt alle heutigen Durchgaenge
- klima game-2d/3d: GGS_LIVE_STATE liefert laufenden Punktestand (score, gleiche Formel wie Endbewertung)
- live.php summary: laufende Sessions jeder Sim bekommen Ampel-Score (nicht mehr nur Farmer) -> Tag-Ansicht faerbt laufende Balken statt grau
- teacher.html _renderInactiveToday: zeigt jetzt ALLE heute abgeschlossenen Laeufe (auch von gerade aktiven Schueler:innen); nur das laufende Spiel bleibt oben. Titel -> "Heute bereits erledigt"

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 23:19:23 +02:00
Adminator 64a9a62157 Gesamt/Fleiss: laufende Sessions als blinkende Saeule im aktuellen Bucket
Statt separatem Top-Streifen (rueckgebaut): results.php view=fleiss spielt
laufende live_sessions in den aktuellen Bucket (Stunde/Wochentag/Tag/Monat) ein,
markiert ihn `live`. renderFleiss laesst diese Saeule blinken (roter Rahmen).
So sieht man Bens laufendes Spiel direkt bei "Fleiss pro Schueler*in".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 15:02:19 +02:00
Adminator 4e38b27c64 Tag-Ansicht: echte Spieldauer + Ampelfarbe nach Erfolg + Sim-Symbol
Bug: fertig gespielte Laeufe (Farmer-Endbericht = 1 Assessment) erschienen als
kurzer "Abbruch"-Balken (Dauer 0). Fix:
- live.php summary: nutzt duration_ms -> Balken decken die echte Spielzeit ab und
  fluchten am Start; kein Falsch-Abbruch mehr. Neues Feld `score` (0-100) je
  Session (Score/Sterne); laufende Farmer-Sessions bekommen hit_rate als Live-Score.
- teacher.html Tag-Balken: einheitliche Hoehe (Hoehe raus), Farbe = Ampel nach
  Erfolg (gruen->rot), App-Farbe ersetzt durch Sim-Symbol; Klick = Details.
  Legende angepasst.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 12:56:47 +02:00
Adminator 85ee58c56d Farmer: "Braucht Hilfe" auch bei schlechter Trefferquote (nicht nur cash<0)
Ben spielt bewusst schlecht (hit_rate ~10%), Konto aber wieder im Plus -> blinkte
nicht. needsHelp (teacher.html client + live.php server) jetzt: cash<0 ODER
(attempts>=6 UND hit_rate<30). Faengt dauerhaft falsche Boden/Klima-Wahl; Clara
(hit 75, 3 Krankheiten) bleibt bewusst ruhig.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 12:41:39 +02:00
Adminator a68c58ac9e Weltkueche Teil A: Land pro Lehrer persistent (teachers.country) + Sim-Verdrahtung
- profil.html: Länderauswahl (AT/DE/CH/LI) im Lehrer-Profil, lädt/zeigt aktuelles Land.
- profile.php: speichert country in teachers.country; gibt country zurück.
- weltkueche.php: injiziert window.WK_COUNTRY = Country::current() (Kaskade Schüler→Klasse→Lehrer→AT) — Fundament für die konsumentenland-basierte Herkunft (Teil B).
Spalte teachers.country existierte bereits, keine Migration nötig.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-21 12:13:27 +02:00
Adminator 5d3cd1bdcf Fix: BASE_URL folgt dem echten Host (Glossar-Fetch auf v3) + Weltkueche „Nachbarland"-Wortlaut
- app.php: BASE_URL fuer *.geograsim.at war hart 'https://geograsim.at' -> auf
  v3.geograsim.at lud die Glossar-API cross-origin -> CORS/NetworkError
  ("Glossar konnte nicht geladen werden"). Jetzt BASE_URL='https://'.$host
  (same-origin auf jeder Umgebung; prod-neutral, geograsim.at bleibt gleich).
- weltkueche/game.html: Zweit-Lieferant hiess pauschal „Nachbarland" — Frankreich
  ist aber kein Nachbar Oesterreichs. Jetzt „europaeisches Land in unserer Naehe".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 16:30:59 +02:00
Adminator c950f954d1 Admin-ToDo/Review-Seite + Staging-Self-Service-Admin-Login
- admin-todo.html: mobile-freundliche ToDo/Review-Liste (Prioritaeten, Haekchen +
  Notizfelder je Punkt, localStorage, Notizen-Export), admin-gated, noindex. In
  admin-licenses.html Nav + Backend-Werkzeuge verlinkt.
- admin.php: devPin auch bei STAGING=1 (v3, Mail bewusst tot) -> Self-Service-
  Admin-Login ohne Mailversand. Prod unveraendert (STAGING dort nie definiert,
  2FA-Mail-Pflicht bleibt).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 11:31:02 +02:00
Adminator 182a87978e Auth-Umschalter: Session.php verzweigt auf AUTH_BACKEND (jwt = JWT-Access-Cookie + widerrufbare Redis-Session)
- teacher/admin Login/Read/Logout branchen auf AUTH_BACKEND; session-Pfad unveraendert (Live-Default, prod-sicher).
- jwt: loginTeacher/loginAdmin legen Redis-Session (SessionStore) an + setzen kurzlebiges JWT-Cookie (ggs_t/ggs_a) + langes Sid-Cookie (ggs_ts/ggs_as).
- Read: Fast-Path via signiertem JWT (zustandslos), Refresh-Path via Sid->Redis + frisches JWT; Widerruf = Redis DEL bei Logout.
- Teacher/Admin getrennte Cookies (koexistieren), typ-Check gegen Rollenverwechslung. Lazy-require von Jwt/SessionStore (jeder Einstiegspfad).
- Schueler unveraendert (UUID-Cookie + DB, schon pod-unabhaengig).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 00:15:22 +02:00
Adminator 5b91a5bf84 Admin-Login lokal: 2FA-PIN ohne Mailversand (Dev) + Mailer-Fehler abfangen
Problem: lokal konnte man sich nicht als Admin anmelden — der 2FA-PIN kam nie
an (kein SMTP), und Mailer::sendAdminPin() warf sogar eine Exception, die den
Login komplett abbrach (leere Antwort → „MFA fehlt").

- admin.php: Mailversand nur auf Prod + in try/catch (Mail-Fehler darf den
  Login NIE blocken). Lokal (!IS_PRODUCTION) wird der PIN als `devPin` in der
  Login-Antwort zurückgegeben — auf Prod NIEMALS (2FA bleibt Pflicht).
- admin.html: devPin wird lokal automatisch ins PIN-Feld vorausgefüllt + als
  Hinweis angezeigt.

Verifiziert (temp Test-Admin): login → devPin → verify → authenticated:true,
admin-weltkueche.html erreichbar. Prod unberührt (IS_PRODUCTION-Gate).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 19:13:22 +02:00
Adminator c1f90e255d Lehreransicht aufräumen: Sim-Labels + Logistik-Spalten + assessment-Skip-Fix
- SIM_LABELS: EIN Wort + eindeutiges 3-Buchstaben-Kürzel je App (zentrale
  Quelle simWord()/simCode()). Tages-Balken nutzt jetzt Kürzel (eng) → Wort
  (mittel) → Wort+Lektion (breit) statt kryptischem "Log L1".
- LIVE_PRIMARY_FIELDS['logistik'] ergänzt (Stufe · Budget · Geliefert/Gesamt ·
  Unterwegs · Offen · Verspätet · Fortschritt) — vorher Roh-Dump aller Keys.
- Aktuell-Fallback (uncurated Sims): interne __-Heartbeat-Keys + simId/
  timestamp/screen ausgeblendet, nicht mehr als Spalten.
- assessment.php: Skip-Bug gefixt — las phase aus $body['processLog']['phase'],
  gesendet wird $body['phase']. Dadurch landeten alle 'started'/'running'-Pings
  als LEERE Zeilen in assessments und verschmutzten Ergebnisse/Tag. Jetzt
  greift der Skip; nur echte 'completed'-Abschlüsse werden gespeichert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-19 15:05:42 +02:00
Adminator 37f6238d05 Auth Phase 2: Session-Zugriffe kanalisieren (verhaltensneutral)
Vorbereitung für den JWT+Redis-Umschalter: alle verstreuten
$_SESSION['teacher_id'|admin_id']-Zugriffe laufen jetzt durch Session::-Helper,
damit der Backend-Tausch später EINE Datei (Session.php) ist statt 18 Stellen.

- Session.php: neue Admin-Helper adminId()/loginAdmin()/logoutAdmin()/
  requireAdmin() (mirror der Teacher-Helper). teacherId()/adminId() starten
  die Session jetzt lazy (Aufrufer müssen Session::start() nicht mehr).
- 18 Fundstellen kanalisiert (admin.php, admin-accounts, admin-modules,
  licenses, levels, waypoints, foto-upload, admin_gate, save_map).
- Country.php + app.php cockpit_href: über Session:: mit class_exists-Fallback
  (Bootstrap/Lib-Kontext, Session evtl. nicht geladen).

Verhaltensneutral: 14/14 Lint OK, Helper-Round-Trip 6/6 PASS, Live-Smoke
(admin status/modules/accounts/licenses) weist unauth. Requests wie bisher
mit 401/403 ab. AUTH_BACKEND bleibt 'session' — Live unverändert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 16:33:14 +02:00
Adminator 5d94572569 Auth-Fundament: JWT + Redis (Phase 1, non-breaking)
Vorbereitung für pod-unabhängige Sessions (k8s-Ziel). Ändert am Live-System
NICHTS: AUTH_BACKEND='session' bleibt Default, die neuen Libs sind noch
nirgends verdrahtet.

- composer eingeführt: firebase/php-jwt ^6.11 + predis/predis ^2.4 (pure PHP,
  keine Redis-Extension nötig → läuft auf XAMPP wie im Prod-Image). vendor/
  committed (kein Composer auf dem Server).
- Jwt.php: HS256-Access-Token (issue/verify), decode() IMMER mit explizitem
  Algorithmus (mitigiert Algorithmus-Confusion). 8/8 Tests grün.
- SessionStore.php: predis-gestützter Session/Refresh-Store (sess:<sid>,
  Sliding-TTL, revoke=DEL) — die widerrufbare Session hinter dem kurzen JWT.
- app.php: vendor/autoload (guarded), Konstanten AUTH_BACKEND (Default session),
  REDIS_URL, JWT_TTL, JWT_REFRESH_TTL. JWT_SECRET bewusst ohne Default.
- docker-compose.dev.yml: Redis (+ redis-commander UI) für lokale Dev-Parität.
- .env.example um Auth-Block ergänzt.

Nächste Phasen: $_SESSION-Zugriffe (293) durch Session:: kanalisieren →
Backend-Umschalter in Session.php → doppelgleisiger Cutover → Reporting auf
student_id-FK ziehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 16:21:27 +02:00
Adminator 5655af81bf Lehrer-Observability + Weltküche-Inhalt + Wrapper-Fix + Passstraße
teacher.html: Menü „Live" → „Ergebnisse" mit Unteransichten
Tag·Aktuell·Vergleich·Gesamt (alte Ergebnisse-Ansicht ist jetzt „Gesamt").
Neue Kennzahl Qualität (grafischer richtig/falsch-Balken) in Aktuell +
Vergleich + Weltküche-Zeile, Gerichte-Zähler (Fleiß), Labels entschärft
(„Kritisch" → Stark/Solide/Viele Fehler).

Weltküche: korrekte Artikel (der/die/das) für alle 70 Zutaten in
production-matrix.json; verdrehten Herkunfts-Satz + Heimat-Banner neu und
marktbewusst (Ukraine-Distraktor ehrlich erklärt), „man"-Konstruktionen
für Singular/Plural.

_scripts.php: renderPage() injizierte Favicon per strrpos ins letzte
</head> — das lag in teacher.htmls printBatchTickets-JS-String → SyntaxError
zerschoss das ganze Inline-Script auf /teacher. Fix: strpos (erstes </head>).

tourismusregion: neue Karte passstrasse in maps-custom.json (Route bergauf
136 Punkte, 41 Bauslots) aus Editor-Export.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 13:32:24 +02:00
Adminator b9bcbf9198 Backend-Editoren admin-geschuetzt (admin_gate) + Admin-Hub auf Admin-Seite; save_map admin-oder-lehrer; foto-upload admin-bypass (PIN bleibt)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 11:54:08 +02:00
Adminator 2bdaa0f6cc Admin-Accounts-Editor (CRUD inkl. 2FA-Mail) + Regel: Lehrer-Username = E-Mail (Maske + register), Schueler frei
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 11:43:04 +02:00
Adminator 8b1088a070 Balancing: sonnensystem (Erst-Treffer-Bewertung, Loesung nicht aufdecken, Level-Badge) + energiemanager (echter Blackout an Netzfrequenz, Schwierigkeitsrampe)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-15 21:59:32 +02:00
Adminator fb44ec7afe student_id-FK-Migration Stufe 1+2: Name-Joins -> student_sessions.student_id
- student_sessions: neue Spalte student_id (+Index), backfilled aus (class_id,display_name)
- Session::createStudent setzt student_id (per Lookup, falls nicht uebergeben)
- alle Joins students<->student_sessions von display_name auf student_id umgestellt:
  Benchmark.php, live.php (5x), results.php (4x + runs), modules.php, profile.php, progress.php (answers+runs)
- verlustfrei verifiziert (alt-Join == neu-Join, class 99/102)

Robuster gegen Umbenennung/Doppelnamen, indexierbare Joins.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-15 19:16:41 +02:00
Adminator 2984d93e7e Review-Batch P0: Sicherheit + Schueler-Ergebnisse + Assessments-Aufblaehung
Sicherheit:
- progress.php: IDOR geschlossen (student_id-Zweig verlangt Lehrer-Login + Klassenbesitz)
- licenses.php: ?admin=1 und generate nur noch fuer echten Admin; Collision-Retry mit Cap
- .htaccess: .env/.sh/.sql/.bak Deny (Defense-in-Depth)

Schueler-Ergebnisse (kritisch):
- sim-metrics.js + .ivm-CSS in schueler.html; renderOwnRunCard-Fallback zeigt jetzt
  Sterne + grafische Kennzahlen fuer die 9 bisher leeren Sims
- sim-metrics.js: klima final_budget als "Mio EUR" statt "EUR" (Faktor 10^6)

Skalierung:
- assessment.php: Zwischen-Pings (phase running/started) nicht mehr persistiert
- heli: 30-s-assessmentPing entfernt (Live-Zustand laeuft ueber Heartbeat)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-15 16:21:25 +02:00
Adminator a3c5753cd7 Aufgabe beenden: class_modules zuruecksetzen (Bug: Schueler sah Aufgabe weiter)
stop setzt class_modules teacher_started -> free (paused=0, started_at=NULL),
sonst liest die Schueler-Ansicht (class_modules) die beendete Aufgabe weiter.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 02:45:35 +02:00
Adminator 405fcc2b69 Aufgabe: Ab-wann + Bis-wann mit gutem Picker; neue Klasse nur Weltkueche frei
- Modal: "Ab wann" (Sofort/Zeitpunkt) + "Bis wann" (Presets + date/time statt
  datetime-local), Live-Zusammenfassung; zukuenftiger Start => vorbereitet
- assignments.php: startsAt-Param (Default NOW()), T->Space
- modules.php: neue Klasse ohne Eintrag -> nur Weltkueche frei (_defaultMode),
  Rest gesperrt; Freigabe-Matrix bleibt (getrennt von der Aufgabe)
- schueler.html: Hinweis "Deine Lehrperson kann weitere Simulationen freischalten"

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 17:39:28 +02:00
Adminator ebdd1ce438 Live: weltkueche-Spalten kuratiert; pausierte Sessions bleiben sichtbar
- LIVE_PRIMARY_FIELDS.weltkueche: Gericht/Herkunft/Zutaten/Gerichte/Fehlklicks
  (statt Rohdaten-Dump aller State-Keys) — 5 Spalten, kein Quer-Scroll
- Idle/Pause: live.php Fenster 30s->2h (LIVE_IDLE_WINDOW_SEC); Aktuell zeigt
  laenger inaktive Sessions als "pausiert" (⏸, grau) statt sie zu verlieren;
  braucht-Hilfe + aktiv-Zaehler nur fuer wirklich aktive Sessions

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 00:43:40 +02:00
Adminator 52e9fafd92 Uebersicht: Wochengrafik mit Navigation, Triage-Cards immer, Modul-Datumsfilter
Wochen-Saeulengrafik:
- Pfeile Woche vor/zurueck (Kalenderwoche, view=activity&week_offset)
- Datum unter jedem Wochentag, halbierte + condensed Schrift
- Y-Skala links mit Anzahl, skaliert auf Max-Saeulenhoehe
- rendert auch bei leerer Woche (mit Hinweis) fuer die Navigation

Triage: alle 5 Cards immer sichtbar, leere mit "Aktuell niemand betroffen".

Module — Stand der Klasse:
- von/bis-Datumsfilter (Default bis=heute, von=Schuljahresbeginn 1. August)
- neuer view=mod_stats speist die Cards datumsgefiltert
- view=module auf student_results umgestellt (Datum+Score+JSON), from/to-Filter
  wirkt auf Tabelle, Highlights, Champions, classStats; Zeitraum im Modal-Header

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 11:43:12 +02:00
Adminator e750402799 Uebersicht: Top Performers heute + neue Abzeichen heute; Wochengrafik-Labels; Spielzeit sortierbar
- results.php view=today: heutige finale Laeufe (topToday) + vorher/nachher-Progress
  je Schueler:in x Sim (aus student_results rekonstruiert) fuer Badge-Erkennung
- teacher.html: Sektion "Top Performers heute" (heutige Wertung, Sterne + Erfolg)
  ersetzt Allzeit-Top; darunter "Neue Abzeichen heute" (badges.js, jetzt erfuellt
  aber vor heute nicht)
- Wochen-Saeulengrafik: Sim-Titel klein in die Balkenabschnitte, hoehere Grafik
- Modul-Tabelle: Spielzeit-Spalte sortierbar (Quoten-Spalten schon sortierbar)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 22:43:41 +02:00
Adminator bfc90b78de Modul-Uebersicht: relevante Kennzahlen pro App korrigiert + Quoten
Alle $MODULE_HIGHLIGHTS gegen echte Daten (Klasse 102) verifiziert und auf die
tatsaechlichen Feldnamen umgestellt (viele waren veraltet/leer, z.B. farmer,
sonnensystem, energiemanager, busfahrt, logistik, heli, tourismus*).

- kofferdetektiv NEU: Geloest-Quote, Erstversuch, Fehlversuche, Oe Hinweise
- weltkueche/fluss NEU
- fluggesellschaft NEU (aus Submit-Schema)
- Berechnete Quoten via num/den -> Prozent (Erfolgsquote statt Rohzahl):
  kofferdetektiv, weltkueche, busfahrt, logistik, energiemanager, eu-werkstatt,
  sonnensystem, tourismustal, fluggesellschaft
- heli: Planung/Start/Landung/Level; sim-metrics: Level + Oe Hinweise ergaenzt

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 21:22:50 +02:00
Adminator c83da66325 Lehrer-Drilldown: grafische Kennzahlen, Avatar-Bild, Sterne & Abzeichen
- sim-metrics.js: kuratiertes Feld-Schema pro Sim (Sterne/Prozentbalken/
  Verhältnis/Geld/Temperatur), technische Felder ausgeblendet, sauber benannt
- Drilldown zeigt Avatar als Bild (avatar:<slug>), Erfolg als Sterne,
  Parameter als grafische Kacheln, Abzeichen-Sammlung pro gespielter Sim
- live.php student_runs liefert player_progress fuer die Abzeichen

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 15:35:29 +02:00
Adminator 2db99c37ee Übersicht: Schüler-Drilldown (Klick → aktuelle Simulationsparameter, cockpit-artig)
live.php: student_runs=<id> liefert letzte Läufe (detail_json = Parameter) + Live-State
+ Recency. teacher.html: Klick auf Triage-Zeile öffnet Modal mit Erfolg/Zuletzt, Live-
Tätigkeit und den letzten Durchläufen samt geparsten Sim-Parametern (CO₂, Fehlklicks …).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 15:20:40 +02:00
Adminator 1f00d83232 Übersicht: Empfehlung nur aus AKTUELLER Leistung (Recency)
Denkfehler behoben — eine Empfehlung reagiert auf das Zuletzt-Gesehene, nicht auf
einen Allzeit-Rückblick. live.php cockpit liefert jetzt recentErfolg (Ø letzte 3
Läufe), earlyErfolg (frühere Läufe), daysSince, recentPlays. Triage rechnet darauf:
>14 Tage weg → Nachfassen; recent schwach → Fördern; recent+viel → Begleiten; recent
stark, kaum gefordert → Fordern; recent > früher → Bestätigen. Neue Spalte „Zuletzt",
Legende erklärt: Erfolg = letzte Läufe, Verlauf = nur Historie. 4b-Daten mit
kontrollierter Recency neu (jede Gruppe besetzt).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 15:11:35 +02:00
Adminator 15ac35a7ad Lehrer-Übersicht: Interventions-Block (Erfolg/Aktiv/Verlauf + Triage) live
Neuer Block oben im Übersicht-Tab: 5 Stat-Karten (Erfolg-Klassenschnitt, Aktuell
aktiv als Streifen, Verlauf-Klassenschnitt mit Skala, Schüler, Simulationen) +
Interventions-Triage (Fördern/Fordern/Begleiten/Bestätigen/Beteiligen) mit
Erfolg-Ampelbalken, blinkender Live-Aktiv-Ampel und Verlaufs-Sparkline pro Person.
Ampelfarben nur für Leistung, Triage-Karten neutral. Alte 5 Stat-Cards raus,
Top-Performer bleibt. Wochen-Cap gegen Zwischenspeicher-Log-Ausreißer.

- results.php: neue fleiss-range 'weeks' (letzte 10 ISO-Wochen)
- 2. Testklasse „3b Klasse" (3 Schüler); Klasse 99 → „4b Klasse"

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 13:17:22 +02:00
Adminator 8047778a5b Tourismusregion: Komplett-Integration (zweite neue Sim, beta)
Wellenbasierte Routen-Sim (DefensegeograSimMac) nach dem Tourismustal-
Playbook integriert: Sim nach App/sims/tourismusregion (game.html,
Sprites 47MB->9.5MB, ohne Eigen-Backend/Editor/Dashboard/Keys),
Plattform-Hooks (GGS_LIVE_STATE mit Welle/Budget/Umwelt/Sterne/Lenkung,
Submit bei Partie-Ende mit fertigem 0-100-Score, GGS_TUTORIAL, Home-
Button, Musik leise). Wrapper + Modul-Detailseite. SQL: module_info
(beta, Karte), Glossar-Kernbegriff Besucherlenkung (+Bild, Leichte
Sprache) + 12 Zuordnungen, Lehrplan-Mapping auf tourismus-
raumentwicklung (primaer) + verkehrserziehung/systemisches-denken.
LEHRPLAN.md mit Schwerpunkt Besucherlenkung & Mobilitaet. Lehrer-
Backend: Benchmark (Sim-Score direkt), Live-Cockpit-Spalten,
needsHelp, Highlights.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 01:14:12 +02:00
Adminator 55a83d5daf Tourismustal: iPad-Feedback Runde 2 (5 Punkte)
- Bau-Ablehnung erklaert jetzt immer auch die Bauregeln des Gebaeudes
  (Toast: Grund + Beschreibung, 7 s).
- Lehrer-Schalter fuer den Vorlese-Modus: class_modules.audio_info
  (Migration, Default AN) + modules-API set_audio_info + Toggle auf der
  Modul-Karte im Cockpit (Vorlesen an/aus) + Wrapper injiziert
  TT_FEATURES.audioInfo + Sim blendet den Umschalter aus und erzwingt
  Lese-Modus, wenn gesperrt.
- Bus zeigt bei Rueckfahrt sein Heck: Heckscheibe + rote Ruecklichter,
  Tuer/Spiegel richtungsabhaengig.
- Bikepark-Flowtrails: 3 Stufen hangAUFwaerts (gleiche Richtung wie
  Lift-Pisten).
- Info-Button an jedem Bauwerk im Baumenue: erklaert Wirkung, Kosten,
  Lage-Regeln und Lehrplan-Wissen VOR dem Bau.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 18:07:03 +02:00
Adminator 0a2ebf46b4 Tourismustal: Komplett-Integration (Sim + Wrapper + SQL + Lehrer-Backend)
Sim nach App/sims/tourismustal umgezogen (Source of Truth), game.html mit
Injection-Marker. Neu in der Sim: 5 Sommergebaeude (Bikepark mit Flowtrails,
Hochseilgarten, Fahrradverleih als Verstaerker, Aussichtsplattform,
Erlebnisspielplatz), Rettungsstation mit Notarzthubschrauber, Ausbau-
Bauanimation, Event-Pacing, Schulden-Notbremse (Bank-Zwangsverkauf),
Berater-Tipps (Ruecklagen), Sommer-Trend-Mechanik (Serfaus-Effekt) und
Wissens-Bausteine mit echten DACH-Tourismusdaten (QUELLEN.md).

Plattform: PHP-Wrapper mit base-Tag + Session-Mode, Modul-Detailseite,
module_info (beta) + Glossar (14 Begriffe inkl. Leichter Sprache + Quellen)
+ Lehrplan-Anker AT/DE/CH an neuer Kompetenz tourismus-raumentwicklung.
Lehrer-Backend: Benchmark-Formel, Live-Cockpit-Spalten, needsHelp-Heuristik,
Modul-Highlights. Strategie-Testharness (tests/strategien.mjs) belegt:
Panzer-Rush wird liquidiert, Ruecklagen zahlen sich aus.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 02:45:08 +02:00
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
Adminator 33fb423967 Atlas: Live-View-Feature + Submit-Bug-Fixes + Admin-Styleguide
- Neuer API-Endpoint /api/live (heartbeat / spectator) + DB-Tabelle
  live_sessions + class_modules.paused-Spalte
- Plattform-Live-Client (assets/js/live-client.js): Heartbeat,
  Pause-Overlay, Spectator-Mode bei ?view=teacher
- ggs_inject_live() in _scripts.php als Helper, in alle 11 Sim-Wrapper
  integriert
- Lehrer-Cockpit: tabellarische Klassen-Live-Ansicht pro Sim,
  Pause-Toggle, blinkender Tab-Indikator wenn aktive Sessions
- Submit-Bug erschlagen: progress.php hat jetzt submit_assessment-
  und reflection-Action; saves.php akzeptiert beide Key-Konventionen;
  alle Direkt-Pfad-API-Files mit require_once-Bootstrap
- Avatar-Default: zufaelliger DALL-E-Avatar fuer neue Schueler:innen
- Admin-Styleguide-Seite mit Bildstil, Farb-Tokens, Layout, iPad-Pattern
- Klima 2D + 3D: GGS_LIVE_STATE-Hook, Klima 2D zusaetzlich skipResume
  fuer Klassenaufgaben-Reset
- Test-Lehrer Jakob + 3 Schueler:innen lokal + auf Live angelegt
- Rundbriefe an alle Sim-Instanzen + Submit-Briefe an sonnensystem,
  busfahrt, energiemanager + Glossar-Anfrage zu Grundriess
- Status-Uebergabe in _inbox/zentrale/_status.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 01:20:53 +02:00
Adminator 306ec97cb5 Lehrplan: Farmer/Busfahrt/Energiemanager + Heli-Vertiefung
Vier Module ohne (oder mit dünnem) Lehrplan-Bezug erschlossen.

Neue Kompetenz "landwirtschaft-klimazonen" (Köppen-Geiger,
FAO-Eignungsklassen, Sek I 10-14, Kategorie natur).

13 neue kompetenz_modules:
- energiemanager: energieversorgung-speicherung primär + klima sek.
- busfahrt: raeumliche-orientierung-europa primär,
  kartenkompetenz-logistik + wirtschaft sek.
- farmer: landwirtschaft-klimazonen primär, klima + erdmechanik
  + wirtschaft sek.
- heli (Vertiefung): naturgefahren-hochwasser + verkehrserziehung-
  sicherheit + systemisches-denken alle sekundär

20 neue Anker:
- 3 für Energiemanager (Lastausgleich, Physik Leistung/Arbeit,
  Mobilität+Energie)
- 4 für Busfahrt (Hauptstädte/Staaten, Maßstab/Distanzen, Mathe,
  Interkulturelle Bildung)
- 8 für Farmer (3 Fach GW 1.8/3.6/4.10, 2 übergreifend Umwelt+Wirt,
  3 andere Fächer Bio/Chemie/Mathe)
- 5 für Heli (1 Fach Bergrettung/Naturgefahren, 2 übergreifend
  Gesundheits- + Mobilitätsbildung, 2 andere Fächer
  Bewegung+Sport / Physik Aerodynamik)

Render nach Seed:
- heli: 4 Kompetenzen, 50 Anker (vorher 1/18)
- farmer: 4 Kompetenzen, 43 Anker (vorher 0/0)
- busfahrt: 3 Kompetenzen, 16 Anker (vorher 0/0)
- energiemanager: 2 Kompetenzen, 33 Anker (vorher 0/0)

DB-Bilanz: kompetenzen 14, kompetenz_modules 39,
lehrplan_anchors 144 (vorher 12/27/124)

Quellen:
- _inbox/farmer/2026-05-03-0040-konzept-vorschlag.md
- _inbox/busfahrt/2026-05-02-2355-kickoff-briefing.md
- _inbox/energiemanager/_status.md
- BMBWF GW-Lehrplan Sek I 2023

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 01:45:36 +02:00
Adminator d9fc30103f Lehrplan: EU-Werkstatt — Glossar zentralisiert + 8 AT-Anker
Thomas: das modul-interne Glossar der EU-Werkstatt soll auf das
zentrale Glossar umgelinkt werden, doppelte Pflege ist Quatsch.

Neue Kompetenz "eu-politische-beteiligung" (EU und politische
Beteiligung), Sek I 13-16, sort_order 130.

8 AT-Anker:
- 3 Fach (GW Sek I 4.4 EU-Vielfalt / 4.5 EU-Werte und
  Grundfreiheiten / 4.6 EU-Integration)
- 3 uebergreifend (Politische Bildung Nr. 7 / Wirtschaftsbildung
  Nr. 13 / Medienbildung Nr. 6)
- 2 andere Faecher (Geschichte und politische Bildung — EU-Geschichte;
  Deutsch — Texte verstehen, argumentieren)

kompetenz_modules: 2 fuer eu-werkstatt (politische Beteiligung
primaer + raeumliche-orientierung-europa sekundaer als
Logistik-Bruecke).

12 Glossar-Begriffe aus dem internen CONCEPT-Modal von
App/sims/eu-werkstatt/game.html zentralisiert (Kategorie
'gesellschaft'):
- eu-kommission, eu-parlament, rat-der-eu, europaeischer-rat
- europaeische-buergerinitiative, eu-petition
- initiativrecht, mitentscheidung
- eu-gesetz, eu-zustaendigkeit
- lobbyismus, freiwillige-vereinbarung

Jeder Begriff: short, text (3-6 Saetze), short_easy, text_easy
(Leichte Sprache), unit. Sprachregel-Sweep ueber alle Texte.
Plus 12 glossar_modules-Verknuepfungen zu eu-werkstatt.

Neues Seed-Skript App/php/seed_glossar_eu_werkstatt.php (idempotent).

Inbox-Notiz an EU-Werkstatt-Instanz mit Mapping-Tabelle und
optionalem Code-Snippet fuer "Im Glossar nachschlagen"-Link in
den Konzept-Karten — internes Modal soll bestehen bleiben (SVGs
sind erstklassig), nur Querverlinkung.

DB-Bilanz nach Seed:
- kompetenzen 13 (vorher 12)
- kompetenz_modules 27 (vorher 25)
- lehrplan_anchors 124 (vorher 116)
- glossar 130 (vorher 118)
- glossar_modules eu-werkstatt 12 (vorher 0)

Quellen:
- App/sims/eu-werkstatt/game.html (CONCEPTS-Objekt)
- BMBWF GW-Lehrplan Sek I 2023

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 00:37:23 +02:00
Adminator 30cc844a2c Lehrplan: Sonnensystem komplett — Lehrplan + 10 Glossar-Begriffe
Neue Kompetenz "erdmechanik-klimazonen": Astronomie und Klimazonen.

8 AT-Anker:
- 2 Fach (GW Sek I 1.4/1.6: Beleuchtungszonen, Wendekreise,
  Polarkreise; 2.1/2.3: Klima im globalen System)
- 2 übergreifende Themen (Umweltbildung, Informatische Bildung)
- 4 andere Fächer (Physik: Himmelsmechanik/Licht/Skalen;
  Mathematik: Skalen/Verhältnisse/Größenordnungen; Geschichte:
  heliozentrisches Weltbild; Biologie: Tag-Nacht/Jahreszeiten)

kompetenz_modules: 3 Zuordnungen für sonnensystem (erdmechanik
primär; karten-navigation-alpen + klimawandel sekundär).

10 Glossar-Begriffe (neue Kategorie 'astronomie'):
- Achsneigung (23,5°)
- Sonnenwende (Solstitium)
- Tag-und-Nacht-Gleiche (Equinox)
- Wendekreis (23,5° N/S)
- Polarkreis (66,5° N/S)
- Ekliptik
- Mondphase
- Sonnenfinsternis
- Mondfinsternis
- Astronomische Einheit (AE)

Jeder Begriff mit short, text (3-5 Sätze), short_easy, text_easy
(Leichte Sprache) und unit. Plus 10 glossar_modules-Verknüpfungen
zu sonnensystem.

Neues Seed-Skript App/php/seed_glossar_sonnensystem.php,
idempotent. Ausnahmsweise pflegt Lehrplan direkt im Glossar
(Atlas-Konvention: Modul-Erstbestueckung ist okay, wenn die
Glossar-Instanz parallel beschäftigt ist).

DB-Bilanz nach Seed:
- kompetenzen 12 (vorher 11)
- kompetenz_modules 25 (vorher 22)
- lehrplan_anchors 116 (vorher 108)
- glossar 56 (vorher 46)
- glossar_modules sonnensystem 10 (vorher 0)

Quellen:
- _inbox/sonnensystem/2026-05-03-0022-kickoff-briefing.md
- .humanInput/sonnensystem/sonnensystem.html
- BMBWF GW-Lehrplan Sek I 2023

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 20:20:56 +02:00
Adminator 5bf27e215d Lehrplan: Klima 2D + 3D teilen Lehrplan + Glossar
- kompetenz_modules: klima-3d bekommt klimawandel primaer
  (Spiegelung von klima)
- Neuer Block 5b im Seed: glossar_modules wird via INSERT IGNORE
  gespiegelt (klima → klima-3d, 46 Begriffe). Idempotent.
- Auf modul-klima-3d sichtbar: 22 Anker, 1 Kompetenz, 46 Glossar-Chips
  — identisch zu modul-klima

DB-Bilanz: kompetenz_modules 22 (vorher 21).
Auftrag von Thomas (2026-05-03).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 20:12:58 +02:00
Adminator 23e1aee579 Lehrplan: Staustufen-Modul — neue Kompetenz + 8 AT-Anker
- Neue Kompetenz: energieversorgung-speicherung
  ("Energieversorgung und Energiespeicherung", category=klima,
   Alter 10–14, sort_order 110)
- 8 neue AT-Anker:
  - 3 Fach (GW Sek I 2.1 / 3.6+3.13 / 4.1+4.3+4.10) mit
    Original-Zitaten zu erneuerbaren Energieträgern, alpiner
    Wasserkraft als Wirtschaftsstandort und Mensch-Umwelt-Beziehung
  - 3 Übergreifende Themen: Umweltbildung (BNE), Wirtschaftsbildung
    (Wirkungsgrade, Effizienz), Informatische Bildung (Smart Grids,
    Lastausgleich-Algorithmen)
  - 2 Andere Fächer: Physik (Energieerhaltung, Höhenenergie,
    Wirkungsgrad), Mathematik (Bedarfskurven, Bilanzen, %-Füllstände)
- kompetenz_modules: staustufen primär (energie), 3 sekundär
  (klimawandel, systemisches-denken, karten-navigation-alpen);
  energiemix bekommt rückwirkend energieversorgung-speicherung primär
- modul-staustufen.php Wrapper hinzugefügt (3-Zeilen-Pattern)
- Inbox-Status: gelesen

DB-Bilanz: module_info 11, kompetenzen 11, kompetenz_modules 21,
lehrplan_anchors 108

Quelle: .humanInput/StaustufenSimulator/Pflichtenheft.txt (Pumpspeicher-
Kaskade, 5-Tage-Prognose, Sek I, 10–14 J)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 01:32:38 +02:00
Adminator c80f23a40c Lehrplan: 6 Logistik-Kompetenzen + 22 AT-Anker
- Neue kompetenzen: raeumliche-orientierung-europa, kartenkompetenz-
  logistik, wirtschaft-logistikverstaendnis, planungs-entscheidungs-
  kompetenz, verkehrserziehung-sicherheit, systemisches-denken
- kompetenz_modules: 6 Primaer-Zuordnungen zu logistik + 2 Sekundaer
  zu lieferketten (wirtschaft + systemisches-denken)
- lehrplan_anchors: 22 neue AT-Anker (13 Fach-GW-Zitate aus Lehrplan
  2023 Kompetenzen 1.3/1.6/2.6/2.8/2.3/3.6/3.13/3.14/3.17/4.4/4.6/
  4.8/4.10 + 5 uebergreifende Themen + 4 andere Faecher)
- Alle 23 Kernziele (lg-orient, lg-karte, lg-wirt, lg-plan, lg-verk,
  lg-sys) in den Anker-Titeln referenziert
- DB-Bilanz: module_info 10, kompetenzen 10, kompetenz_modules 16,
  lehrplan_anchors 100

Quelle: App/sims/logistik/kompetenzen.json (Pflichtenheft Kap 3.4),
integration-konzept.md Paragraph 7.4

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 09:18:18 +02:00
Adminator 478df47d9f Lehrplan: Sprachregel Lernarbeit durchgaengig
- CTA "Jetzt probieren" -> "Simulation starten" (modul_detail.php)
- simulationen.php: "Sofort probieren" -> "Simulation starten",
  Hero "ausprobieren" -> "direkt starten"
- Seed: Klima-Easy "Du spielst" -> "Du bist", "Das Spiel dauert" ->
  "Die Simulation geht"; Stadt long_desc "Spielmodul" ->
  "Simulationsmodul"; DB-Kommentar "Link zum Spielen" -> "Link zur
  Simulation"
- Hinweis: glossar.php hat noch "ausprobieren" (Glossar-Instanz)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:17:05 +02:00
Adminator b356c79134 Atlas: Phase A Integrations-Konzept + Cockpit + End-Screen
- Integrations-Konzept dokumentiert (App/docs/integration-konzept.md)
- Module-IDs vereinheitlicht: sim-XX -> semantische IDs (klima/heli/fluss/logistik/...)
- class_modules um current_level + quiz_enabled Spalten erweitert
- modules.php liefert dynamisch aus module_info, inkl. forcedLevel, quizEnabled,
  play_url, dueDate; neuer Filter ?module_id=X fuer einzeln
- schueler.html Cockpit: komplett API-first, teacher_started-Sektion als
  Auftrags-Block, neue IDs, Sprachregel 4a (Starten statt Spielen)
- teacher.html: Hardcoded ALL_MODS entfernt, laedt dynamisch
- Design-System: .ggs-endscreen-Komponente fuer einheitliche Modul-Abschluesse
- index.html Landing-Links gefixt: App/modul-X -> modul-X, V1-HTMLs auf
  Front-Controller-Routen (fluss, heli-game, stadt)
- 6 Inbox-Auftraege an Instanzen (Klima/Heli/Fluss/Logistik/Lehrplan/Glossar)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 11:42:19 +02:00
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
Adminator eac686ee1a Atlas: Tile-Proxy + Leaflet lokal — DSGVO-Sanierung fuer Kartendienste
- Leaflet 1.9.4 (CSS + JS + 5 Marker-Images) lokal unter
  App/assets/vendor/leaflet/ statt via unpkg.com/Cloudflare
- Neuer PHP-Endpunkt App/php/tile-proxy.php mit Disk-Cache, liefert
  OSM- und CARTO-Kacheln serverseitig aus; Browser kontaktiert keinen
  Drittanbieter mehr
- Whitelist (osm, carto), Zoom 3-18, 30 Tage Browser-Cache, ETag +
  If-Modified-Since, sauberer User-Agent fuer OSM-Policy
- Cache-Pfad: APP_ROOT/data/tiles lokal, via .env TILE_CACHE_DIR
  auf Produktions-Volume /var/www/html/geograsim/data/tiles
- Heli (heli.php + heli-game.php), Logistik (logistik.php), Routes-
  Dev-Tool und admin-levels.html alle auf Proxy umgestellt
- Datenschutzerklaerung: alter Google-AdSense-Passus (falsch, nicht
  im Einsatz) entfernt, neuer Abschnitt zur serverseitigen
  Tile-Auslieferung mit Rechtsgrundlage Art. 6 Abs. 1 lit. f DSGVO
- .gitignore: App/data/tiles ausgeschlossen
- .env.example: TILE_CACHE_DIR + OpenAI/ElevenLabs dokumentiert

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