https://github.com/kqc-real/streamlit
MC-Tests in deutscher Sprache
https://github.com/kqc-real/streamlit
agiles-projektmanagement data-science deep-learning mathematische-grundlagen
Last synced: 5 months ago
JSON representation
MC-Tests in deutscher Sprache
- Host: GitHub
- URL: https://github.com/kqc-real/streamlit
- Owner: kqc-real
- License: mit
- Created: 2025-09-25T18:35:43.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2026-01-15T16:00:10.000Z (6 months ago)
- Last Synced: 2026-01-15T19:30:36.707Z (6 months ago)
- Topics: agiles-projektmanagement, data-science, deep-learning, mathematische-grundlagen
- Language: Python
- Homepage: https://mc-test.streamlit.app/
- Size: 451 MB
- Stars: 6
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Audit: audit_log.py
- Security: SECURITY_ANALYSIS_ADMIN_AUTH.md
- Agents: AGENTS.md
Awesome Lists containing this project
README
# đ MC-Test Streamlit App
[](https://github.com/kqc-real/streamlit/actions/workflows/ci.yml)
Interaktive Multiple-Choice-App mit schnellem Feedback, Pseudonym-Login, Itemanalyse und PDF-Exports. 40+ Fragensets (JSON + Learning-Objectives) sind enthalten; weitere lassen sich hochladen oder per KI-Generator erstellen.
## Inhalt
- [Schnellstart](#-schnellstart)
- [Ăbersicht](#-ĂŒbersicht)
- [Hauptfunktionen](#-hauptfunktionen-stand-2026-01)
- [Fragenset-Schema](#-fragenset-schema)
- [Sicherheitsfeatures](#-security-features)
- [Voraussetzungen](#-voraussetzungen)
- [Installation & Start](#-installation-und-start)
- [Konfiguration](#-konfiguration)
---
## đ Schnellstart
Installationsguides: [Mac](INSTALLATION_MAC_ANLEITUNG.md) · [Windows](INSTALLATION_WINDOWS_ANLEITUNG.md) · [VS Code SSH](INSTALLATION_VS-CODE_SSH-AUTHENTIFIZIERUNG.md)
Admin-Panel testen: [đ Anleitung](ADMIN_PANEL_ANLEITUNG.md)
---
## đ Ăbersicht
- Pseudonym-Login, zufÀllige Fragenreihenfolge, Gewichtung pro Frage.
- Schnellsuche (Titel/Slug/Meta), Sprachenhinweis aus `meta.language`, 40+ Fragensets + Upload temporÀrer User-Sets.
- Scoring: Nur-Plus oder Plus/Minus; Zeitlimit optional pro Set oder via `MC_TEST_DURATION_MINUTES` (Default 60, leer/0 = kein Limit).
- Navigation: Markieren, Ăberspringen, Seitenleiste; Panic Mode schaltet alle Cooldowns sofort ab.
- Feedback/ErklÀrungen, Mini-Glossare, erweiterte ErklÀrungen; Item- & Distraktor-Analyse, Leaderboard.
- Exporte: PDF (LaTeX, Glossar, Bookmarks), CSV aller Antworten, DB-Dump; Admin-Panel fĂŒr Analytics, Feedback, KI-Generator.
## â Fragenset-Schema
Die App lÀdt Fragensets aus JSON-Dateien im `data/questions_*.json`-Format. Erwartet wird ein Objekt mit:
- `questions`: Liste von Fragen
- `meta`: Objekt mit Basis-Metadaten (erforderlich, mindestens `language`)
### Pflichtfelder je Frage
- `question`: String (nicht leer)
- `options`: Liste mit **3â5** Strings
- `answer`: Ganzzahl, 0-basierter Index in `options`
- `explanation`: String (nicht leer)
- `topic`: String (nicht leer)
- `weight`: Ganzzahl 1, 2 oder 3 (empfohlen, abweichende Werte erzeugen Warnungen)
### Optionale Felder je Frage
- `concept`: String (klares Lernziel/Konzept)
- `cognitive_level`: String (z.âŻB. âReproductionâ, âApplicationâ, âAnalysisâ)
- `mini_glossary`: Objekt oder Liste mit Begriff/Definition; empfohlen **2â6** EintrĂ€ge, max. 10 (App-Features nutzen das Glossar intensiv)
- `extended_explanation`: erlaubt; Schema siehe `KI_PROMPT.md` und `GLOSSARY_SCHEMA.md`
### Meta (erforderlich)
- `language` (ISO-639-1, z.âŻB. `de`) â Pflicht
- Empfohlen: `title`, `question_count` (wird auf Konsistenz geprĂŒft), `difficulty_profile` (easy/medium/hard), `test_duration_minutes`, `time_per_weight_minutes`, `additional_buffer_minutes`, `created`/`modified`
### Minimales Beispiel
```json
{
"meta": {
"language": "de",
"question_count": 1,
"difficulty_profile": {"easy": 0, "medium": 1, "hard": 0}
},
"questions": [
{
"question": "1. Was ist die BFS-Besuchreihenfolge ab Knoten A?",
"options": ["A B C D", "A C B D", "A D B C"],
"answer": 0,
"explanation": "BFS besucht erst alle direkten Nachbarn in EinfĂŒgereihenfolge.",
"weight": 2,
"topic": "Graph Traversal",
"concept": "BFS visitation order"
}
]
}
```
### Empfehlungen fĂŒr Contributors/Admins
1. **Konsistente Terminologie** fĂŒr `topic`/`concept`/`cognitive_level`, damit Exporte und Analytics sauber gruppieren.
2. **Meta pflegen:** `language` ist Pflicht; `question_count`/`difficulty_profile` sollten mit der tatsĂ€chlichen Anzahl/Verteilung ĂŒbereinstimmen.
3. **Plausible Distraktoren:** 3â5 Optionen Ă€hnlicher LĂ€nge; kein âAlle/Keine der oben genanntenâ.
4. **Mini-Glossar pflegen:** 2â6 relevante Begriffe pro Frage, keine FĂŒllwörter.
5. **Validierung:** `python validate_sets.py` ausfĂŒhren, bevor ein Fragenset committet wird; prĂŒft Pflichtfelder, OptionslĂ€nge, Answer-Index, GlossargröĂe, Gewichtungen u.âŻa.
6. **LaTeX/Markdown:** Keine LaTeX-AusdrĂŒcke in Backticks; bei Bedarf korrekt escapen (`\\`).
Hinweis: Ăltere Fragensets können unvollstĂ€ndige Meta-Daten haben (z.âŻB. kein Datum) und erscheinen dann ohne Datum im AuswahlmenĂŒ. Neue Fragensets sollten alle Meta-Felder sauber pflegen (`language`, `question_count`, `difficulty_profile`, ggf. `created`/`modified`), damit UI und Exporte korrekt funktionieren.
### Aktuelle ErgÀnzungen
- Musterlösung (PDF) inkl. Mini-Glossar, Hervorhebung korrekter Optionen, LaTeX-Rendering mit Parallelisierung/Timeouts.
- Schnellsuche auf der Startseite (Titel/Slug/Meta) inkl. Sprachenhinweis; temporÀre User-Fragensets werden beim Laden bereinigt (Cleanup konfigurierbar).
- Panic Mode: Sobald verbleibende Zeit < Fragen * Schwellenwert, sind Cooldowns fĂŒr Antworten/NĂ€chste-Frage deaktiviert.
- KI-Generator/Prompts im Admin-Panel; Upload/JSON-Paste fĂŒr eigene Fragensets mit Validierung und Zeitlimit-Cleanup.
### Formel-Cache (Disk) & automatische Eviction
Die App cached gerenderte LaTeX-Formel-Bilder als PNG-Dateien auf der lokalen Festplatte, um Netzwerkaufrufe zur Remote-Render-API zu reduzieren und Exporte zu beschleunigen. Damit der Cache auf Hosts mit begrenztem oder ephemerem Speicher (z. B. Streamlit Community Cloud) nicht unkontrolliert wÀchst, gibt es automatische Eviction-Mechanismen.
Konfigurierbare Umgebungsvariablen:
- FORMULA_CACHE_DIR: Pfad zum Cache-Verzeichnis (Standard: ./var/formula_cache)
- FORMULA_RENDER_PARALLEL: Anzahl paralleler Render-Jobs fĂŒr Formeln (Standard: 6)
- FORMULA_CACHE_MAX_FILES: Maximale Anzahl Dateien im Cache (Standard: 100)
- FORMULA_CACHE_MAX_MB: Maximale GesamtgröĂe des Caches in MiB (Standard: 50)
- FORMULA_CACHE_TTL_DAYS: Lebensdauer von Cache-Dateien in Tagen (Standard: 7)
Verhalten:
- Vor jedem Schreiben einer neuen Formeldatei wird die Eviction-Routine ausgefĂŒhrt: Dateien Ă€lter als TTL werden zuerst entfernt; danach werden die Ă€ltesten Dateien gelöscht, bis sowohl Dateianzahl als auch GesamtgröĂe innerhalb der Grenzwerte liegen.
- Auf schreibgeschĂŒtzten oder nicht verfĂŒgbaren Dateisystemen werden Schreibfehler ignoriert und die In-Memory-Fallback-Strategie verwendet. Das verhindert AbstĂŒrze auf restriktiven Plattformen.
Empfehlung: Setze konservative Limits fĂŒr Cloud-Deploys (z. B. FORMULA_CACHE_MAX_MB=50, FORMULA_CACHE_MAX_FILES=100) und ĂŒberwache die Nutzung in Logs.
---
## đ Security Features
Die MC-Test-App setzt auf folgende SicherheitsmaĂnahmen (Versionen werden hier bewusst nicht aufgelistet):
- Kryptographische Session-Tokens (`secrets.token_urlsafe(32)`) mit serverseitigem SHA-256-Hashing (user_id + admin_key + token) statt Klartext im Session-State; Re-Auth vor kritischen Aktionen.
- Session-Handling mit InaktivitĂ€ts-Timeout (2 Stunden) und Threading-Locks fĂŒr sicheren Concurrent Access.
- Rate-Limiting fĂŒr Login/Wiederherstellung (z.âŻB. 3 Fehlversuche â temporĂ€re Sperre, Reset nach Erfolg).
- SQLite-basiertes Audit-Logging aller Admin-Aktionen inkl. Erfolg/Fehlschlag, CSV-Export und Dashboard-Statistiken.
- DSGVO-orientierte Aufbewahrung via Cleanup-Tool (empfohlen: 90 Tage) und optionales Client-IP-Tracking.
- Warnungen bei leerem/unsicherem Admin-Key.
**Security Level:** đĄïž **VERY HIGH (Enterprise-Grade)**
**Dokumentation:**
- đ [SECURITY_PHASE3_SUMMARY.md](SECURITY_PHASE3_SUMMARY.md) - Technische Details
- đ [CHANGELOG_SECURITY_PHASE3.md](CHANGELOG_SECURITY_PHASE3.md) - VollstĂ€ndiger Changelog
- đ [PHASE3_ABSCHLUSS.md](PHASE3_ABSCHLUSS.md) - User-Guide
---
## đ Voraussetzungen
- **Python:** 3.10â3.12 (empfohlen 3.12).
- **AbhÀngigkeiten:** Installiere via `pip install -r requirements.txt`.
---
## đ ïž Installation und Start
### Lokaler Start
1. Klone das Repository.
2. Installiere die AbhÀngigkeiten:
```bash
pip install -r requirements.txt
```
3. Starte die App:
```bash
streamlit run app.py
```
4. Ăffne [http://localhost:8501](http://localhost:8501) im Browser.
### Deployment (z. B. Streamlit Cloud)
1. Verbinde dein GitHub-Repository mit deinem Streamlit-Cloud-Konto.
2. Deploye die App.
3. Konfiguriere die Secrets (siehe nÀchster Abschnitt) im Dashboard deiner Streamlit-Cloud-App.
---
## âïž Konfiguration
### Umgebungsvariablen / Secrets
Die App wird ĂŒber Umgebungsvariablen (fĂŒr sensible Daten) und eine Konfigurationsdatei (fĂŒr nicht-sensible Daten) konfiguriert.
FĂŒr die lokale Entwicklung kannst du eine `.env`-Datei erstellen. FĂŒr das Deployment auf Streamlit Cloud mĂŒssen diese Variablen als "Secrets" im Dashboard der App hinterlegt werden.
```env
# Beispiel fĂŒr .env oder Streamlit Cloud Secrets
MC_TEST_ADMIN_USER="dein_admin_user"
MC_TEST_ADMIN_KEY="dein_geheimes_passwort"
APP_URL="https://ihre-streamlit-app.streamlit.app"
```
- **`MC_TEST_ADMIN_USER`**: Benutzername fĂŒr den Admin-Login.
- **`MC_TEST_ADMIN_KEY`**: Passwort fĂŒr den Admin-Login.
- **`MC_NEXT_COOLDOWN_NORMALIZATION_FACTOR`**: Optionaler Skalierungsfaktor fĂŒr die Wartezeit beim Klick auf âNĂ€chste Frageâ nach dem Lesen von ErklĂ€rungen. Standard: `0.3` (reduziert die Extras); Werte < 1.0 verkĂŒrzen die Cooldowns weiter.
- **`APP_URL`**: URL der Streamlit-App fĂŒr den QR-Code im PDF-Export. (Default: `https://mc-test-amalea.streamlit.app`)
ZusÀtzliche Secrets / Umgebungsvariablen (kurz erklÀrt):
- **`MC_TEST_DURATION_MINUTES`**: Optionaler Default fĂŒr die Testdauer (in Minuten) wenn nicht im Fragenset-Meta angegeben. (Default: `60`; leer/0 = kein Zeitlimit)
- **`MC_USER_QSET_CLEANUP_HOURS`**: Wie viele Stunden temporÀre, von Nutzern hochgeladene Fragensets als "stale" gelten und automatisch beim Laden der Startseite entfernt werden können. (Default: `24`)
- **`MC_USER_QSET_RESERVED_RETENTION_DAYS`**: Aufbewahrungsdauer (Tage) fĂŒr temporĂ€re Sets reservierter Pseudonyme. (Default: `14`)
- **`MC_AUTO_RELEASE_PSEUDONYMS`**: Bei `1/true` werden unreservierte Pseudonyme nach InaktivitÀt automatisch freigegeben. (Default: aktiviert)
- **`MC_RATE_LIMIT_ATTEMPTS`**: Anzahl erlaubter fehlgeschlagener Login-/Wiederherstellungs-Versuche bevor Rate-Limiting greift. (Default: `3`)
- **`MC_RATE_LIMIT_WINDOW_MINUTES`**: FenstergröĂe in Minuten fĂŒr das Rate-Limit. (Default: `5`)
- **`MC_RECOVERY_MIN_LENGTH`**: Minimale LĂ€nge fĂŒr ein Wiederherstellungs-Geheimwort (Default: `6`).
- **`MC_RECOVERY_ALLOW_SHORT`**: Falls gesetzt auf `1`/`true`, werden kĂŒrzere Wiederherstellungs-Geheimwörter erlaubt.
- **`EXPORT_COOLDOWN_SECONDS`**: Wartezeit nach einem Export im Admin-Panel (Default: `300` Sekunden).
- **`EXPORT_JOB_WORKERS`**: Anzahl paralleler Export-Worker im Export-Job-Skript (Default: `2`).
- **`EXPORTS_DIR`**: Zielverzeichnis fĂŒr Exporte im Export-Job-Skript (Default: `./exports`).
- **`ARSNOVA_MAX_OPTION_LENGTH`**: Max. AntwortlĂ€nge fĂŒr ARSnova-Export (Default: `120` Zeichen).
- **`BENCH_EXPORTS_N`**: Anzahl PDF-Exporte im Benchmark-Skript (Default: `5`).
Hinweis: Du kannst diese Werte lokal in einer `.env` Datei setzen (z.B. fĂŒr die Entwicklung) oder als Secrets in deiner Deployment-Umgebung (z. B. Streamlit Cloud). Die App liest zuerst Streamlit-Secrets, dann Umgebungsvariablen und schlieĂlich die lokale JSON-Konfiguration `mc_test_config.json`.
`mc_test_config.json` (nicht-sensitiv, wird zuletzt ausgewertet) kann u.âŻa. folgende Felder enthalten: `scoring_mode`, `show_top5_public`, `test_duration_minutes`, `recovery_min_length`, `recovery_allow_short`, `rate_limit_attempts`, `rate_limit_window_minutes`, `next_cooldown_normalization_factor`, `user_qset_cleanup_hours`, `user_qset_reserved_retention_days`.
### đ Sprache / Locale
- Die App liest die Sprache nicht aus URL-Query-Parametern (z. B. `?lang=de`).
- Sprache wird ausschlieĂlich ĂŒber den UI-Sprachselektor gesteuert und in der Session gespeichert.
- Möchtest du das Standardverhalten Àndern, passe den Default in `i18n/__init__.py` (`_DEFAULT_LOCALE`) an.
Kurzes Beispiel: Setzen des Cleanup-Timeouts
Lokale Shell (temporĂ€r fĂŒr die laufende Shell):
```bash
export MC_USER_QSET_CLEANUP_HOURS=1 # TemporÀre Fragensets Àlter als 1 Stunde gelten als stale
streamlit run app.py
```
Beispiel: Setzen des Normalisierungsfaktors in der Shell (temporÀr):
```bash
export MC_NEXT_COOLDOWN_NORMALIZATION_FACTOR=0.5
streamlit run app.py
```
Als Streamlit-Cloud-Secret (im Secrets-Editor):
```yaml
# Im Secrets-Editor der Streamlit-App hinzufĂŒgen
MC_NEXT_COOLDOWN_NORMALIZATION_FACTOR: "0.5"
```
Als Streamlit-Cloud-Secret (YAML / UI):
```yaml
# Im Secrets-Editor der Streamlit-App hinzufĂŒgen
MC_USER_QSET_CLEANUP_HOURS: "1"
```
Hinweis: Die App priorisiert Werte in dieser Reihenfolge: Streamlit-Secrets â Umgebungsvariablen â `mc_test_config.json`.
---
## đ Projektstruktur
```
.
âââ .github/ # CI/CD Workflows
âââ .streamlit/ # Streamlit-Themes/Config
âââ artifacts/ # Export-Artefakte & Beispiel-SVGs
âââ data/ # Fragensets (JSON), Pseudonyme, Glossare
âââ data-user/ # TemporĂ€re User-Uploads (bereinigbar)
âââ db/ # SQLite-Datenbank(en) + Test-WALs
âââ docs/ # Slides, Handouts, Feasibility-Studien
âââ examples/ # Beispiel-Configs/Prompts
âââ exporters/ # Export-Logik (Anki, CSV, PDF-Helfer)
âââ helpers/ # Hilfsfunktionen (PDF, Caching, Validierung)
âââ i18n/ # Sprachdateien und Defaults
âââ orga/ # Orga-Dokumente & KI-Nutzungsguides
âââ scripts/ # Build/CI-Helper (z.B. Key-Extraktion)
âââ teams/ # Team-/Stakeholder-Material
âââ tests/ # Pytest-Suite
âââ tools/ # Lokale Dev-Skripte (Bench, Cache, Export)
âââ var/ # Cache-Verzeichnisse (z.B. Formel-Cache)
âââ .env.example # Beispiel-Env (nicht eingecheckter .env)
âââ mc_test_config.json # Nicht-sensitive Default-Konfiguration
âââ anki_serif.apkg # Beispiel-Anki-Deck
âââ logo.jpg # Logo der App
âââ admin_panel.py # Admin-Panel inkl. Audit/Ratelimit
âââ app.py # Streamlit-Einstiegspunkt
âââ auth.py # Authentifizierung & Session-Management
âââ components.py # Wiederverwendbare UI-Komponenten
âââ config.py # Laden der Konfiguration und Fragensets
âââ database.py # SQLite-Interaktionen
âââ logic.py # Kernlogik (Scoring, Navigation, Status)
âââ main_view.py # UI-Logik fĂŒr die Hauptansichten
âââ pdf_export.py # PDF-Report-Generierung mit LaTeX & Glossar
âââ pacing_helper.py # Pace-/Cooldown-Helfer
âââ session_manager.py # Session-State-Verwaltung
âââ question_set_validation.py# Validierung von Fragensets
âââ validate_sets.py # CLI-Validator fĂŒr Fragensets
âââ requirements.txt # Python-AbhĂ€ngigkeiten
âââ AI_QUESTION_GENERATOR_PLAN.md # Plan fĂŒr KI-basierte Fragenset-Generierung
âââ DEPLOYMENT_FEASIBILITY_STUDY.md # Infrastruktur & Kostenanalyse
âââ GLOSSARY_SCHEMA.md # Mini-Glossar-Schema
âââ VISION_RELEASE_2.0.md # Strategische Vision & Roadmap
âââ README.md # Diese Dokumentation
```
---
## đ Repository-GröĂe & Statistiken
**Wie groĂ ist dieses Repository?**
| Metrik | Wert |
|---------------------------|---------------------|
| đŠ GesamtgröĂe | ~535 MB |
| đ Git-Historie | ~513 MB |
| đ Dateien gesamt | 313 Dateien |
| đ Python-Dateien | 100 Dateien |
| đ Markdown-Dokumentation | 107 Dateien |
| đïž JSON-Dateien | 60 Dateien |
| đ» Python-Codezeilen | ~33 200 Zeilen |
| đ Hauptverzeichnisse | 17 Verzeichnisse |
**Hinweis:** Messung: tracked Dateien (~21 MB) plus `.git` (~513 MB) â ~535 MB GesamtgröĂe; lokale `.venv`-/Cache-Ordner sind nicht berĂŒcksichtigt. Die Statistiken können sich mit der Weiterentwicklung des Projekts Ă€ndern.
---
## đ§° Developer tools (local)
Es gibt kleine Hilfs-Skripte zum Testen und Benchmarking im Ordner `tools/`:
- `tools/test_evict.py` â Erzeugt Dummy-Dateien im Cache (`var/formula_cache`) und testet die Eviction-Routine.
- `tools/run_export_test.py` â FĂŒhrt einen einzelnen Musterlösungs-Export durch und schreibt das PDF nach `exports/`.
- `tools/benchmark_exports.py` â FĂŒhre N Exporte hintereinander aus (Standard N=5) und schreibe eine `exports/benchmark_summary.txt`.
- `tools/check_export_stems.py` â PrĂŒft die Dateinamen-Generierung fĂŒr Exporte (Slug-Logik wie in der App).
- `tools/print_cooldowns.py` â Druckt alle Cooldown-Varianten pro Gewichtung/Tempo mit aktuellem Normalisierungsfaktor.
Beispiele:
```bash
# Eviction smoke test
PYTHONPATH=. python3 tools/test_evict.py
# Single export (shows progress)
PYTHONPATH=. python3 tools/run_export_test.py
# Benchmark with 5 runs
BENCH_EXPORTS_N=5 PYTHONPATH=. python3 tools/benchmark_exports.py
# Check export filename stems (slug logic)
PYTHONPATH=. python3 tools/check_export_stems.py
# Inspect cooldown table with current normalization
PYTHONPATH=. python3 tools/print_cooldowns.py
```
---
## đ§ Hinweise zum Prompting (fĂŒr AI / TextâGenerierung)
- Folge strikt dem 5âSchritte-Konfig-Flow aus `KI_PROMPT.md`: 1) Thema, 2) Zielgruppe, 3) Fragenanzahl + Verteilung Gewichte 1â3, 4) Optionsanzahl (A/B/C), 5) Kontextmaterial. Immer nur eine Frage stellen, Unklarheiten zuerst klĂ€ren.
- Vor der Generierung: Zusammenfassung der 5 Konfigs in Nutzersprache anzeigen und explizit BestĂ€tigung abwarten (âja/yesâ). Keinen JSON ausgeben, bevor bestĂ€tigt wurde.
- Sprache: Nutzer*innen-Sprache fĂŒr Inhalte, JSON-SchlĂŒssel bleiben Englisch. Gewichte â kognitive Stufen zwingend: 1=Reproduction, 2=Application, 3=Analysis; `answer` ist 0-basiert.
- Blueprinting vor JSON: `` mit Planung (Verteilung, Themen, Optionenzahl bei C, Dauerberechnung). Danach genau ein ```json```-Block, kein weiterer Text.
- Schema-Pflicht: Fragen mit fĂŒhrender Nummer `"1. "`, Optionsanzahl gemÀà A/B/C, `difficulty_profile` = Summe der Gewichte, `test_duration_minutes` aus `time_per_weight_minutes` (Standard: 0.5/0.75/1.0) + Buffer 5.
- QualitĂ€tsregeln: Distraktoren plausibel und Ă€hnlich lang, kein âAll/None of the aboveâ. Mini-Glossar pro Frage (6â10 sinnvolle Terme). `extended_explanation`: `null` bei Gewicht 1, Objekt mit 2â6 Schritten bei Gewicht 2/3.
- Code/LaTeX: Code immer mit ```lang``` und Zeilennummern innerhalb des JSON-Strings (`\n` nutzen); LaTeX doppelt escapen (`\\det`), Inline-Math `$...$`. Echte Leerzeilen statt des Literal-Strings `"\\n"`.
- Artefakte landen in `exports/` und sind `.gitignore`-geschĂŒtzt.
---
## đ ïž Administration & Wartung
### Admin-Bereich
- **Zugang:**
1. WĂ€hle auf der Startseite das in den Secrets (`MC_TEST_ADMIN_USER`) definierte Admin-Pseudonym aus.
2. Nach dem Start des Tests erscheint in der Seitenleiste der Bereich "đ Admin Panel".
3. Gib dort das Admin-Passwort (`MC_TEST_ADMIN_KEY`) ein, um vollen Zugriff zu erhalten.
- **Funktionen:** Das Panel bietet detaillierte Analysen (Item- & Distraktoranalyse), eine Ăbersicht und Verwaltung fĂŒr gemeldetes Feedback, Datenexport (CSV, SQL-Dump, **PDF-Export**) und Systemeinstellungen (Scoring-Modus, ZurĂŒcksetzen der Testdaten).
### Tests ausfĂŒhren
```bash
pip install -r requirements.txt
PYTHONPATH=. pytest
```
---
## đ Troubleshooting
- **App startet nicht:** Stelle sicher, dass alle AbhÀngigkeiten aus `requirements.txt` installiert sind.
---
## đ€ Contributing
BeitrÀge sind willkommen! Forke das Repository, erstelle einen Branch und öffne einen Pull Request.
---