Anpassungen, Architektur und Entwicklungsphasen
| Projekt | C:\Daten\Projects\quiz |
| Lokal | http://localhost:4174/ |
| Online | https://weberding.de/quiz/ |
| Publish | .\publish-to-weberding.ps1 |
Eigenständige, rein statische Web-Anwendung ohne externe Abhängigkeiten. Kein Build-Schritt, kein Framework – läuft direkt im Browser aus dem lokalen Dateisystem oder über einen einfachen HTTP-Server.
| Eigenschaft | Wert |
|---|---|
| Einstiegspunkt | index.html |
| Lokaler Server | python -m http.server 4174 |
| Technologie | HTML · CSS · JavaScript (vanilla) |
| Veröffentlichung | .\publish-to-weberding.ps1 → weberding\quiz |
Duo
Richtig/Falsch-Modus. Eine Aussage wird angezeigt, der Spieler entscheidet
„Richtig" oder „Falsch". Themendateien: td_[thema].htm.
Quattro
Multiple-Choice-Modus. Eine Frage mit vier Antwortmöglichkeiten A–D,
nur eine korrekt. Themendateien: tq_[thema].htm.
SKILL.md
| /quiz duo [thema] create | 100 Richtig/Falsch-Fragen erstellen |
| /quiz quattro [thema] create | 100 Multiple-Choice-Fragen erstellen |
| /quiz [duo|quattro] [thema] check | Strukturelle Validierung |
| /quiz [duo|quattro] [thema] check count:nnn | Validierung mit Mindestanzahl |
| /quiz all check | Alle Kataloge prüfen |
| /quiz [duo|quattro] [thema] check-lang | Sprachprüfung (Rechtschreibung, Grammatik, Interpunktion) |
| /quiz all check-lang | Alle Kataloge sprachlich prüfen |
| /quiz publish | App nach weberding\quiz synchronisieren |
| /quiz ? | Hilfe anzeigen |
agents/openai.yaml
Identische Funktionen unter dem Präfix $quiz. Fallback-Lösung,
wenn das Claude-Token-Kontingent überschritten ist.
.claude/skills/quiz-anpassungen/SKILL.md
Pflegt diese Dokumentation: fügt neue Entwicklungsphasen chronologisch ein
und hält Anpassungen.md und Anpassungen.html synchron.
Alle Themendateien sind vollständige HTML-Seiten mit einem eingebetteten
<div id="question_data">-Block als JSON-Array.
Die index.html lädt die gewählte Themendatei per fetch()
und parst den Block.
| Datei | Modus | Thema |
|---|---|---|
td_auswahlverfahren.htm | Duo | Beamten-Auswahlverfahren (LPA Bayern) |
td_bayern.htm | Duo | Bayern allgemein |
td_deutsch.htm | Duo | Deutsche Sprache |
td_geschichte.htm | Duo | Deutsche Geschichte |
td_pflanzen.htm | Duo | Pflanzen |
td_poolbillard.htm | Duo | Pool-Billard |
td_society.htm | Duo | Gesellschaft & Kultur |
td_tiere.htm | Duo | Tiere |
tq_auswahlverfahren.htm | Quattro | Beamten-Auswahlverfahren (LPA Bayern) |
tq_poolbillard.htm | Quattro | Pool-Billard |
td_[thema].htm<div id="question_data">
[
{
"aussage": "Eine klare, faktisch prüfbare Aussage.",
"antwort": true,
"grad": "leicht"
}
]
</div>
| Feld | Typ | Beschreibung |
|---|---|---|
aussage | String | Aussagesatz, endet mit . oder ! |
antwort | Boolean | true = korrekt, false = falsch |
grad | String | "leicht", "mittel" oder "schwer" |
tq_[thema].htm<div id="question_data">
[
{
"frage": "Welche Antwort ist richtig?",
"antworten": ["Antwort A", "Antwort B", "Antwort C", "Antwort D"],
"richtig": 0,
"grad": "leicht"
}
]
</div>
| Feld | Typ | Beschreibung |
|---|---|---|
frage | String | Fragesatz, endet mit ? |
antworten | Array[4] | Genau vier eindeutige, nichtleere Optionen |
richtig | Integer | Index 0–3 der korrekten Antwort |
grad | String | "leicht", "mittel" oder "schwer" |
quiz_tool.pypython -B scripts\quiz_tool.py all check # strukturell
python -B scripts\quiz_tool.py all check --lint # + Sprachlint
Der Sprachlint (--lint) prüft zusätzlich:
. oder !, nicht mit ??[...], XXX, TODO)Auslagerung der Quiz-Komponente aus dem Weberding-Hauptprojekt in einen eigenständigen Projektordner mit eigenem Git-Repository.
Dateien: index.html, scripts/quiz_tool.py,
SKILL.md, agents/openai.yaml,
publish-to-weberding.ps1, .gitignore, README.md
Acht Duo-Themendateien (t_*.htm) aus dem Weberding-Projekt übernommen.
Sounddateien für Richtig/Falsch-Feedback kopiert.
Erstes Validierungsskript: JSON-Extraktion, Pflichtfelder, Datentypen, Duplikaterkennung, Antwortbalance-Prüfung (40–60 % true).
publish-to-weberding.ps1 synchronisiert per robocopy nach
C:\Daten\Projects\weberding\quiz (ohne .git und __pycache__).
Einführung des zweiten Quiz-Modus: Quattro (Multiple-Choice mit vier Antworten A–D). Umbenennung aller Themendateien auf das neue Präfixschema.
Alle bisherigen t_*.htm umbenannt in td_*.htm (Duo).
Zwei neue Quattro-Dateien erstellt: tq_auswahlverfahren.htm,
tq_poolbillardregeln.htm.
Neue Moduswahl Duo/Quattro in der Oberfläche. Separate Darstellung für Quattro-Antworten (A–D-Buttons statt zwei großer Schaltflächen).
Validator für beide Modi (validate_duo, validate_quattro)
mit gemeinsamer validate()-Dispatcher-Funktion. Automatische
Modus-Erkennung anhand des Dateinamenpräfixes.
Behebung korrumpierter Umlaute in den Quattro-Katalogen und Layout-Korrektur der Antwort-Buttons.
Dateien: tq_auswahlverfahren.htm, tq_poolbillardregeln.htm
Alle durch ? ersetzten Umlaute (ä, ö, ü, ß etc.) wiederhergestellt.
Datei: index.html
CSS-Anpassung .btn_quattro: justify-content: flex-start und
padding-inline ergänzt, damit A–D-Labels linksbündig erscheinen.
Einheitliche Schreibweise „Quattro" (zuvor teils „Quattro") und konsistente Darstellung der A–D-Kreissymbole.
Datei: index.html
Alle Vorkommen von „Quattro"/„quattro" in CSS-Klassen, JS-Variablen, HTML-Option und Anzeigetext auf „Quattro"/„quattro" korrigiert.
Explizites font-size: 1.15rem und flex-shrink: 0 für die
Buchstaben-Kreise, damit alle vier Symbole identische Größe haben.
Antworttext mit flex: 1 linksbündig ausgerichtet. Kleinere
font-size für längere Antworttexte im Quattro-Modus.
Bereinigung der Quizfragen: Alle Verweise auf LPA-Quellen aus den Fragetexten entfernt, da diese in einem Quiz-Kontext irrelevant und irreführend sind.
Datei: tq_auswahlverfahren.htm
22 Vorkommen von „laut LPA", „laut FAQ", „laut LPA-FAQ", „nach den LPA-FAQ" und „steht in den FAQ" entfernt. Wo der Verweis das Hauptprädikat war (Frage 92), wurde die Frage zu „ist korrekt?" umformuliert.
Vollständige Überarbeitung des Quiz-Skills: Sprachlint im Python-Tool,
neuer check-lang-Befehl, publish-Befehl, vollständige
ChatGPT-Codex-Implementierung und diese Anpassungs-Dokumentation.
Neue Funktion lint_text() mit heuristischen Sprachprüfungen.
Neues Flag --lint für den check-Befehl.
create aktiviert Lint automatisch.
./!, Fragen ?)Neuer Befehl /quiz check-lang: zweistufige Sprachprüfung –
heuristischer Lint via Python-Tool, dann Claude-Sprachprüfung mit direkter Korrektur.
Neuer Befehl /quiz publish: ruft publish-to-weberding.ps1 auf.
Von 4 Zeilen auf vollständige Instruktionen erweitert: alle Befehle
($quiz-Präfix), Datenstrukturen, Workflows für create/check/check-lang/publish.
Fallback für ChatGPT Codex bei überschrittenem Claude-Token-Kontingent.
Anpassungen.md und Anpassungen.html erstellt.
Skill /quiz-anpassungen für die chronologische Fortschreibung.
Anbindung der externen Fragedatenbank „Open Trivia DB" als zweite Fragequelle
sowie Einführung eines zweistufigen Publish-Workflows über einen out/-Zwischenordner.
Datei: index.html
Neue Quellenauswahl im Control Dock: Dropdown „Quelle" mit den Optionen Lokal (bisheriger Betrieb) und Open Trivia DB (externe API).
Bei OTDB-Modus wird das Thema-Dropdown ausgeblendet und durch ein Kategorie-Dropdown ersetzt, das Kategorien der OTDB dynamisch lädt. Das Control Dock Grid wurde auf 6 Spalten erweitert.
Neue Funktionen:
quelle_geaendert() – schaltet zwischen lokalem und OTDB-Modus umotdb_token_holen() – Session-Token holen, via sessionStorage gecachtlade_otdb_kategorien() – füllt das Kategorie-Dropdown per APIlade_otdb_fragen() – ruft Fragen ab und übersetzt ins interne FormathtmlDecode() – dekodiert HTML-Entities in OTDB-Antworttextenshuffle() – mischt Antwortoptionen zufälligTTS-Sprache wird pro Quelle gewählt: Englisch (en-US) für OTDB,
Deutsch (de-DE) für lokale Fragen.
Datei: scripts/quiz_tool.py
Neuer Befehl publish: befüllt den out/-Unterordner mit allen
webserver-relevanten Dateien (index.html, Anpassungen.html,
td_*.htm, tq_*.htm, Sounddateien, media/).
Entwicklungs-Artefakte verbleiben im Projektstamm.
Aufruf: python -B scripts\quiz_tool.py publish
Datei: publish-to-weberding.ps1
Publish-Quelle ist jetzt der out/-Unterordner statt des Projektstamms.
Das Script bricht ab, wenn out/ fehlt. Zweistufiger Ablauf:
python -B scripts\quiz_tool.py publish → befüllt out/.\publish-to-weberding.ps1 → kopiert nach weberding\quizDatei: README.md
Tippfehler „Quatro" in zwei Überschriften und einem Befehlsbeispiel durch die korrekte Schreibweise „Quattro" ersetzt.
Ausgewählte Duo-Fragen wurden von true auf false umgestellt,
um eine bessere Balance zwischen korrekten und falschen Aussagen zu erreichen.
Die Quattro-Falschantworten im Auswahlverfahren-Katalog wurden inhaltlich überarbeitet.
Dateien: td_deutsch.htm, td_geschichte.htm,
td_society.htm, td_auswahlverfahren.htm
Bei zuvor wahren Aussagen wurde der Aussagetext verfälscht und
"antwort" auf false gesetzt.
| Datei | Umgestellte Fragen |
|---|---|
td_deutsch.htm | 8 (Schreibung ß/ss, Wortarten, Satzanfang) |
td_geschichte.htm | 6 (Ritter, Burgen, Mittelalter, Martin Luther) |
td_society.htm | 6 (Begrüßung, Familie, Rathaus, Post, Demokratie) |
td_auswahlverfahren.htm | 5 (Schulnoten, Auswahlprüfung, Verfahren, Vorstellungsgespräch, Mathematik) |
Datei: tq_auswahlverfahren.htm
Bei 4 Quattro-Fragen wurden Falschantworten durch realistischere Alternativen ersetzt, die näher am tatsächlichen LPA-Verfahren formuliert sind und damit schwerer durch Ausschlussverfahren zu erkennen sind. Eine Frageformulierung wurde präzisiert.
Vollständige Sprachprüfung (/quiz all check-lang) aller Kataloge: alle acht
Duo-Kataloge ohne Befund, zwei Quattro-Kataloge mit insgesamt sechs Fehlern behoben.
Datei: tq_auswahlverfahren.htm
| Frage | Feld | Fehler | Korrektur |
|---|---|---|---|
| 7 | antwort[1] | „Eine gültigen Reisepass" | „Einen gültigen Reisepass" |
| 11 | antwort[0] | „über 30 Prozent" | „Über 30 Prozent" |
| 11 | antwort[1] | „ca. 10 bis 20 Prozent" | „Etwa 10 bis 20 Prozent" |
| 17 | antwort[1] | „Nach Auslösen den Senden-Buttons ist automatisch angemeldet." | „Nach Auslösen des Senden-Buttons ist man automatisch angemeldet." |
| 19 | frage | überflüssiges „die Bewerbung" | entfernt |
Datei: tq_poolbillardregeln.htm
Frage 3, antwort[2] enthielt Meta-Text aus dem Erstellungsprozess („Es gibt nur wahre und falsche Antworten."), der nie durch eine echte Falschantwort ersetzt wurde. Ersetzt durch: „Das Spiel endet, wenn zuerst die 9 versenkt wird."
Erweiterung des Publish-Workflows um einen GitHub-Schritt sowie Pflege
der .gitignore.
Datei: SKILL.md
Der publish-Abschnitt hat jetzt drei statt zwei Schritte.
Schritt 3 stagt alle Quelldateien (ohne out/ und .claude/),
leitet eine kontextbasierte Commit-Message aus dem Konversationsverlauf ab
und pusht auf origin master →
https://github.com/chrisgitti/quiz.
Datei: .gitignore
out/ als Build-Artefakt ergänzt, damit das befüllte
Publish-Verzeichnis nicht versehentlich ins Repository gelangt.
Realisierung des geplanten Echtzeit-Mehrspieler-Modus. Neues GitHub-Projekt
quiz-server mit Node.js-WebSocket-Server sowie vollständige
Integration in index.html.
Verzeichnis: C:\Daten\Projects\quiz-server
Neues Projekt mit server.js, package.json, .gitignore.
Dependencies: express ^4.19.2, socket.io ^4.7.5.
Deployment-Ziel: Render.com Free-Tier.
Socket.IO-Ereignisse (Client → Server):
| Event | Payload | Beschreibung |
|---|---|---|
raum_erstellen | { modus, name } | Host erstellt Raum, erhält 6-stelligen Code |
raum_beitreten | { code, name } | Gast tritt bei |
spiel_starten | { fragen } | Host sendet Fragen (max. 50), Spiel beginnt |
antwort_senden | { antwort_index } | Antwort eines Spielers |
Socket.IO-Ereignisse (Server → Client):
| Event | Payload | Beschreibung |
|---|---|---|
raum_erstellt | { code } | Bestätigung Raumcode |
raum_beigetreten | { code, modus } | Bestätigung Beitritt |
spieler_liste | Array | Live-Spielerliste bei jeder Änderung |
frage | { index, total, text, antworten, modus } | Nächste Frage synchron an alle |
countdown | { sekunden } | Sekundenweise Countdown (15 s pro Frage) |
antwort_bestaetigt | { korrekt, antwort_index } | Antwort-Rückmeldung an Einzelspieler |
aufloesung | { richtig_index, scores } | Richtige Antwort + Zwischenstand |
spiel_ende | { rangliste } | Endrangliste, Raum wird gelöscht |
raum_geschlossen | { meldung } | Host hat verlassen |
fehler | { meldung } | Fehlermeldung |
Spielmechanik:
weberding.de und localhostDatei: index.html
Dritte Quellenoption „Online" im Quelle-Dropdown. Beim Auswählen öffnet sich
ein modales Overlay (position:fixed, backdrop-filter:blur)
mit sechs Panels:
| Panel-ID | Beschreibung |
|---|---|
op_start | Wahl: Raum erstellen oder beitreten |
op_host_erstellen | Name eingeben, aktuelles Thema anzeigen, Raum erstellen |
op_host_warten | Raumcode (groß, cyan), Live-Spielerliste, „Spiel starten"-Button |
op_gast_beitreten | Code + Name eingeben, Beitreten-Button |
op_gast_warten | Warteraum mit Live-Spielerliste |
op_rangliste | Endrangliste mit Medaillen-Emojis 🥇🥈🥉 |
Neue HTML-Elemente: timer_row (Countdown-Balken in
hero_quiz), live_score_panel (Zwischenstand nach jeder Frage),
online_overlay (modales Overlay).
Neue JS-Funktionen: online_verbinden(),
registriere_socket_events(), op_host_erstellen(),
op_gast_beitreten(), op_spiel_starten(),
starte_online_timer(), stoppe_online_timer(),
online_beenden(), online_zeige_fehler().
Geänderte JS-Funktionen: starte_quiz(),
quelle_geaendert(), pruefe_user_antwort().
Server-URL (ONLINE_SERVER_URL):
localhost → http://localhost:3010;
Produktion → https://quiz-server.onrender.com (nach Deployment anpassen).
Mehrere Verbesserungen am Online-Spielmodus (UI, Punkte-Transparenz, Neustart) sowie ein Bugfix beim Verlassen und Artikelkorrekturen im Duo-Katalog Auswahlverfahren.
Datei: index.html
Nach dem Senden einer Antwort im Online-Modus wurde der gewählte Button nicht hervorgehoben. Der antwort_bestaetigt-Event enthält jetzt antwort_index; der Client markiert den geklickten Button mit selected-right (grün) bzw. selected-wrong (rot) – identisch zum lokalen Modus.
Datei: index.html
Unterhalb der Antwort-Buttons wurde ein neuer online_verlassen_bar mit „✕ Verlassen"-Button ergänzt. Er erscheint beim ersten frage-Event und ist für Host und Gast gleichermaßen sichtbar.
Datei: index.html
Wenn der Host das Spiel verließ, blieb sel_quelle auf „online" – erneutes Anklicken feuerte kein onchange-Event. Fix: online_beenden_still() setzt den Selektor jetzt immer auf 'lokal' zurück.
Dateien: index.html, quiz-server/server.js
Der Server sendet punkte im antwort_bestaetigt-Event mit. Der Client zeigt nach richtiger Antwort z. B. „Richtig! +1.347 Pkt." im Feedback-Bereich. Im Endergebnis steht der Hinweis: „1.000 Basispunkte + bis zu 500 Schnelligkeitsbonus".
Datei: index.html
Das Score-Pill wechselt beim Spielstart das Label von „Richtig" auf „Punkte" und zeigt den eigenen akkumulierten Gesamtpunktestand live. Bei Spielende wird es zurückgesetzt.
Datei: index.html
Unterhalb des Countdown-Balkens wurde eine dreistufige Skala ergänzt: 1.000 Pkt. (links, Zeit abgelaufen) – 1.250 Pkt. (Mitte) – 1.500 Pkt. (rechts, volle Zeit). Nur im Online-Modus sichtbar.
Dateien: index.html, quiz-server/server.js
Im Endergebnis-Panel erscheint neben „Beenden" ein „Nochmal"-Button. Der Server löscht den Raum nach Spielende nicht mehr, sondern setzt ihn in den Wartezustand zurück. Host und Gast kehren in ihre jeweiligen Warteräume zurück – gleicher Raumcode, Scores genullt.
Datei: td_auswahlverfahren.htm
„LPA" ist maskulin (der LPA). Sechs Stellen mit falschem Artikel wurden korrigiert:
| Vorher | Nachher |
|---|---|
| „Das LPA erstellt …" | „Der LPA erstellt …" |
| „Das LPA stellt … ein." | „Der LPA stellt … ein." |
| „… entscheidet … das LPA." | „… entscheidet … der LPA." |
| „Das LPA führt …" | „Der LPA führt …" |
| „… über das LPA an." | „… über den LPA an." |
| „Das LPA ist …" | „Der LPA ist …" |
Komposita wie „das LPA-Auswahlverfahren" (Genus von „Auswahlverfahren" = sächlich) bleiben unverändert.
Die beiden Poolbillard-Kataloge wurden umbenannt und mit allgemeinen Billardfragen aus einer externen Quelldatei ergänzt.
Dateien: td_poolbillardregeln.htm → td_poolbillard.htm, tq_poolbillardregeln.htm → tq_poolbillard.htm
Umbenennung per git mv für klarere, kürzere Bezeichnung ohne redundantes „-regeln".
Dateien: td_poolbillard.htm, tq_poolbillard.htm
17 allgemeine Billardfragen (Queue-Bezeichnung, Tischlänge, Kugelfarben und -nummern, Shot-Typen, Spieltechniken usw.) wurden in beide Kataloge integriert.
| Katalog | Vorher | Nachher | Neue Einträge |
|---|---|---|---|
tq_poolbillard.htm | 30 Fragen | 47 Fragen | +17 Quattro-Fragen |
td_poolbillard.htm | 100 Fragen | 134 Fragen | +34 Duo-Aussagen |
Für den Duo-Katalog wurde pro Quattro-Frage je eine wahre Aussage (korrekte Antwort) und eine falsche Aussage (eine der Fehlantworten) erzeugt.
chrisgitti/quiz-server angelegt und gepushthttps://quiz-server-rjv7.onrender.comONLINE_SERVER_URL in index.html auf Render-URL gesetzt/quiz publish + GitHub-Push abgeschlossenRender.com Workspace Pro ($25/Monat) wurde gebucht, um den Timeout-on-first-Request der Billard-App zu vermeiden. Für den Quiz-Server (zweiter Webservice) wird noch ein Service-Plan gewählt ($0 Free / $7 Starter / $25 Standard).
Empfehlung: Starter ($7/Monat) pro Service, Hobby-Workspace (kostenlos) – ergibt $14/Monat statt $39/Monat. Prüfen ob Pro-Workspace wirklich benötigt wird.