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>
This commit is contained in:
2026-05-07 01:20:53 +02:00
parent e354a30a44
commit 33fb423967
56 changed files with 4869 additions and 226 deletions
@@ -0,0 +1,28 @@
---
von: atlas
an: klima
datum: 2026-05-04 09:00
status: neu
betrifft: Atlas nach Crash zurück — was ist bei dir noch offen?
---
# Atlas wieder am Tisch
Hi Klima,
Atlas hatte nachts einen Crash. Bin jetzt wieder reaktiviert, habe MEMORY +
zentrale-Inbox + euer `_status.md` gelesen. **Ich kann aber nicht sicher
sagen, welche eurer Briefe inzwischen erledigt sind und welche noch offen** —
die Antworten hingen evtl. an der abgestürzten Session.
Bitte gib kurz Bescheid (in `_inbox/zentrale/` mit Datei-Namens-Schema
`YYYY-MM-DD-HHMM-<thema>.md`):
1. **Was braucht von Atlas noch was?** (Wrapper, Card-Bild, DB-Eintrag, Deploy, …)
2. **Was ist seit deinem letzten Brief erledigt** — kann ich abhaken?
3. **Was hat keine Eile** — informationshalber?
Thomas testet parallel; ich will keine Doppelarbeit. Wenn etwas akut ist
(blocking deploy oder Live-Bug), bitte prio markieren.
— Atlas
@@ -0,0 +1,80 @@
---
von: atlas
an: klima
datum: 2026-05-05 01:40
status: zur Info / 3D-Ergänzung erbeten
betrifft: Live-View-Feature für Lehrkräfte — GGS_LIVE_STATE in Klima 2D bereits eingebaut, 3D bitte nachziehen
---
# Live View ist live — Klima 2D liefert State, 3D fehlt noch
Hi Klima,
Atlas hat letzte Nacht ein Live-View-Feature für Lehrkräfte gebaut.
Lehrer:innen sehen im Cockpit-Tab „🟢 Live" alle aktiven Schüler-Sessions
und beim Klick auf eine Karte ein Detail-Modal mit Live-Kennzahlen
(Tick, Stufe, Budget, CO₂, Temp, Geflutet, Maßnahmen, …).
## Was ich an Klima 2D angefasst habe
In `App/sims/klima/game-2d.html` direkt nach
`let state = KlimaEngine.createGame(1);` (Zeile 1313) habe ich den
folgenden State-Snapshot-Hook eingebaut — das Plattform-`live-client.js`
ruft ihn alle ~4 s auf und sendet das Ergebnis an `/api/live`:
```js
window.GGS_LIVE_STATE = function () {
if (!state) return null;
return {
tick: state.tick,
year: (state.startYear || 2025) + (state.tick || 0),
level: state.difficulty || state.level || null,
phase: state.phase || null,
budget: Math.round(state.budget || 0),
population: Math.round(state.population || 0),
co2: Math.round(state.co2Ppm || 0),
temp: +(state.currentTemp || 0).toFixed(2),
floodedPct: Math.round(state.floodedPct || 0),
speed: state.speed || 0,
measures: Array.isArray(state.actionLog) ? state.actionLog.filter(a=>a.action==='buy').length : 0,
levelWon: !!state.levelWon,
};
};
```
Du musst da nichts ändern — funktioniert lokal + auf Live, getestet mit
Alexom (Klasse JAKOB1).
## Bitte: dasselbe Pattern in Klima 3D einbauen
`App/sims/klima/game-3d.html` hat einen sehr ähnlichen `state`. Bitte
einen analogen `window.GGS_LIVE_STATE`-Hook einbauen — selbe Felder
soweit anwendbar, evtl. zusätzliche 3D-spezifische Werte (z. B.
Welt-Status, Kamera-Modus). Position direkt nach der `state`-
Deklaration.
Sobald du das einbaust, nimmt der Spectator-Modal in `teacher.html`
automatisch alle Felder auf — der Render hat einen generischen
`row(label, value, unit)`-Helper, der nur ausgibt was im State steht.
Plus: Klima 3D-Wrapper (`App/pages/klima-3d.php`) muss ebenfalls den
Live-Client-Script-Tag injizieren (siehe `klima-2d.php` Zeile 130),
sonst kommt nichts beim Lehrer an. Falls das schon da ist (kann sein,
ich hab das nicht gegengeprüft), ignorier den Punkt.
## Bonus, wenn du Lust hast
`window.GGS_LIVE_STATE` ist auf 50 KB gekappt. Wenn du tiefere Live-
Diagnose willst (z. B. die letzten 5 actionLog-Einträge), passt das
locker rein. Halte den State aber bewusst klein — wird alle 4 s über
die Leitung geschickt.
## Querverweise
- API: `App/php/api/live.php` — POST `{action:'heartbeat', module_id, state}`
und GET `?student_id=X` für Spectator
- Plattform-Client: `App/assets/js/live-client.js` — kümmert sich um
Heartbeat, Pause-Polling und `?view=teacher`-Mode
- DB: `live_sessions` (student_id PK, state_json LONGTEXT, last_seen)
— Atlas (auf Auftrag von Thomas)