diff --git a/backend/generator.py b/backend/generator.py
index 870197e..0774bf0 100644
--- a/backend/generator.py
+++ b/backend/generator.py
@@ -688,6 +688,8 @@ async def _generate_onepager(
def is_cancelled() -> bool:
return guide_id in _cancelled
+ PFLICHT_KARTEN = ("was ist", "welches problem", "wann nehmen", "einordnung", "so sieht", "fakten", "erste schritte")
+
def karten_schema(data):
if not isinstance(data, dict):
return None
@@ -700,7 +702,14 @@ async def _generate_onepager(
for k in karten:
if not isinstance(k, dict) or not isinstance(k.get("titel"), str) or not isinstance(k.get("merksatz"), str):
return None
- out.append({"titel": k["titel"].strip(), "merksatz": k["merksatz"].strip()})
+ titel, merksatz = k["titel"].strip(), k["merksatz"].strip()
+ if len(merksatz) < 5: # abgebrochene/leere Karten ("Per") sind ungültig
+ return None
+ out.append({"titel": titel, "merksatz": merksatz})
+ vorhanden = [k["titel"].lower() for k in out]
+ for pflicht in PFLICHT_KARTEN:
+ if not any(t.startswith(pflicht) for t in vorhanden):
+ return None
return out
# Schritt 1: Recherche — eigene Faktenbasis, unabhängig von den Bausteinen
diff --git a/templates/Format/Section.md b/templates/Format/Section.md
index 7228a75..c6c62e6 100644
--- a/templates/Format/Section.md
+++ b/templates/Format/Section.md
@@ -2,10 +2,10 @@ SECTION-AUFBAU
Jeder Baustein wird GENAU eine Section mit:
1. Titel — der Baustein-Titel (kommt aus dem Marker, nicht in den Body schreiben)
-2. Beschreibung — was es ist, wozu es dient, worauf man achten muss
-3. Beispiele — kurze, realistische Code-/Anwendungsbeispiele mit je 1 Satz Einordnung. Ein Beispiel pro relevanter Variante des Bausteins: simple Bausteine haben eines, variantenreiche mehrere. Geordnet vom Üblichen zum Speziellen — Nischenfälle zuletzt. Weglassen, wenn ohne Mehrwert.
+2. Beschreibung — was es ist und wozu: MAXIMAL 1–2 Sätze
+3. Beispiele — KURZ und SIMPEL: wenige Zeilen Code, das Minimalbeispiel, keine Realwelt-Komplexität. Höchstens 1 knapper Satz Einordnung dazu. Ein Beispiel pro relevanter Variante: simple Bausteine eines, variantenreiche mehrere. Geordnet vom Üblichen zum Speziellen. Weglassen, wenn ohne Mehrwert.
-Umfang: so kurz wie möglich, so lang wie nötig — das entscheidet der Baustein, nicht eine Vorgabe. Ein simples Konzept = 2–3 Sätze, ein komplexes darf länger sein.
+Umfang: kurz. Die Länge einer Section kommt aus der ZAHL der Beispiele (Varianten), nie aus langen Texten.
Tonalität: klares Deutsch, direkt, praxisorientiert. Fachbegriffe beim ersten Auftreten kurz erklären. Keine Füllsätze, keine Einleitungsfloskeln.
diff --git a/templates/Prompt/Bausteine-Sortierung.md b/templates/Prompt/Bausteine-Sortierung.md
index 22f4853..90d36e5 100644
--- a/templates/Prompt/Bausteine-Sortierung.md
+++ b/templates/Prompt/Bausteine-Sortierung.md
@@ -3,12 +3,15 @@ Sortiere die Bausteine des Themas "{topic}" in EINE Gesamtreihenfolge für einen
BAUSTEINE:
{bausteine}
-Kriterium — Lernstufen:
-1. ANFÄNGER zuerst: was man als Einsteiger zuerst braucht und versteht.
-2. Dann FORTGESCHRITTEN: was in der echten Praxis dazukommt.
-3. Dann EXPERTE: was Profis brauchen.
-4. NISCHE immer ans Ende — unabhängig vom Niveau (Spezialfälle, Randthemen, selten Gebrauchtes).
-5. Querregel: Voraussetzungen stehen vor dem, was auf ihnen aufbaut.
+Kriterium — bewerte jeden Baustein mit zwei Fragen: Ist er WICHTIG (braucht ihn fast jeder Anwender)? Ist er EINFACH (ohne viel Vorwissen verständlich)? Daraus folgt die Reihenfolge:
+1. wichtig + einfach
+2. wichtig + komplex
+3. unwichtig + einfach
+4. unwichtig + komplex
+
+Querregeln:
+- Voraussetzungen stehen vor dem, was auf ihnen aufbaut.
+- Sortiere NICHT nach Dokument- oder Themenstruktur. Ein seltener Baustein gehört nach hinten, auch wenn er thematisch zu frühen Bausteinen gehört (Beispiel HTML: `` ist ein head-Element wie `
`, aber unwichtig → weit hinten).
Regeln:
- ALLE Bausteine genau einmal, keine neuen erfinden.
diff --git a/templates/Prompt/OnePager-Bauen.md b/templates/Prompt/OnePager-Bauen.md
index c83f7dc..6e3dec2 100644
--- a/templates/Prompt/OnePager-Bauen.md
+++ b/templates/Prompt/OnePager-Bauen.md
@@ -1,16 +1,21 @@
-Baue aus der Faktenbasis einen OnePager zum Thema "{topic}" — die wichtigsten Informationen, die auf eine Seite passen.
+Baue aus der Faktenbasis einen OnePager zum Thema "{topic}" — ein Einordnungs- und Entscheidungsdokument auf einer Seite. Danach muss der Leser verstehen, was das Thema ist, wo es hingehört und ob es das ist, was er sucht.
FAKTENBASIS (alleinige Quelle, nichts hinzuerfinden):
{recherche}
-Regeln:
-- Wähle die wichtigsten Punkte aus — was man über "{topic}" wissen MUSS. Eine Bildschirmseite, also etwa 10–18 Karten.
-- Pro Karte GENAU ein prägnanter Merksatz: maximal ~15 Wörter, `inline-code` wo es hilft.
-- Titel und Merksätze auf DEUTSCH (Code-Bezeichner bleiben original).
-- Reihenfolge: vom Grundlegenden zum Speziellen.
+Erstelle GENAU diese 7 Karten (Titel exakt so):
+1. "Was ist {topic}?" — Definition in 1–2 Sätzen
+2. "Welches Problem löst es?" — der Schmerzpunkt, für den es gebaut wurde
+3. "Wann nehmen — wann nicht?" — konkrete Entscheidungshilfe in 2–4 Stichpunkten
+4. "Einordnung & Alternativen" — die wichtigsten Nachbarn und der Unterschied
+5. "So sieht es aus" — EIN minimales, typisches Codebeispiel (Markdown-Codeblock)
+6. "Fakten" — Version, Reife, Lizenz/Kosten, Verbreitung
+7. "Erste Schritte" — wie man anfängt, in 1–2 Zeilen
+
+Inhalt pro Karte kompakt (1–4 Sätze bzw. Stichpunkte, Markdown erlaubt), auf DEUTSCH, alles aus der Faktenbasis belegbar.
Schreibe NUR die JSON-Datei nach: {out_path}
Format:
-{{"karten": [{{"titel": "…", "merksatz": "…"}}]}}
+{{"karten": [{{"titel": "Was ist {topic}?", "merksatz": "…"}}]}}
{extra}
\ No newline at end of file
diff --git a/templates/Prompt/OnePager-Recherche.md b/templates/Prompt/OnePager-Recherche.md
index fe81c7c..7fc8c2b 100644
--- a/templates/Prompt/OnePager-Recherche.md
+++ b/templates/Prompt/OnePager-Recherche.md
@@ -1,8 +1,17 @@
-Sammle die Faktenbasis für einen OnePager — die kompakteste Übersicht — zum Thema "{topic}".
+Sammle die Faktenbasis für einen OnePager — ein Einordnungs- und Entscheidungsdokument — zum Thema "{topic}".
{source}
+Recherchiere gezielt diese Dimensionen:
+1. Definition: Was ist "{topic}" in 1–2 Sätzen?
+2. Problem: Welches Problem löst es, wer braucht es?
+3. Abgrenzung: Wofür ist es geeignet, wofür ausdrücklich nicht?
+4. Einordnung: Die wichtigsten Alternativen/Nachbarn und wie sich "{topic}" davon unterscheidet.
+5. Anschauung: Ein minimales, typisches Code-/Anwendungsbeispiel.
+6. Fakten: Aktuelle Version, Reife/Alter, Lizenz/Kosten, Verbreitung.
+7. Einstieg: Wie fängt man an (Installation/erster Schritt)?
+
Schreibe NUR die Markdown-Datei nach: {out_path}
-Inhalt der Datei: die wichtigsten Punkte des Themas (Kernkonzepte, zentrale Fakten, Versionen, typische Anwendung) — kompakt, faktenorientiert, mit Quelle (URL bzw. Dateipfad) pro Punkt. Keine Fließtexte, keine Einleitung. Die Datei ist die alleinige Faktenbasis für den OnePager.
+Kompakt, faktenorientiert, mit Quelle (URL bzw. Dateipfad) pro Punkt. Die Datei ist die alleinige Faktenbasis für den OnePager.
{extra}
\ No newline at end of file
diff --git a/templates/Prompt/OnePager-Verifikation.md b/templates/Prompt/OnePager-Verifikation.md
index 7dd8490..d5a6dd3 100644
--- a/templates/Prompt/OnePager-Verifikation.md
+++ b/templates/Prompt/OnePager-Verifikation.md
@@ -7,9 +7,9 @@ ONEPAGER-KARTEN:
{karten}
Prüfe:
-1. Stimmen alle Aussagen mit der Faktenbasis überein? Nichts Erfundenes?
-2. Fehlt ein Punkt, der für "{topic}" unverzichtbar ist und in der Faktenbasis steht?
-3. Sind die Merksätze prägnant (max. ~15 Wörter), deutsch und vom Grundlegenden zum Speziellen geordnet?
+1. Sind alle 7 Pflicht-Karten vorhanden und vollständig ausgefüllt (keine abgebrochenen oder leeren Inhalte)? — "Was ist {topic}?", "Welches Problem löst es?", "Wann nehmen — wann nicht?", "Einordnung & Alternativen", "So sieht es aus", "Fakten", "Erste Schritte"
+2. Stimmen alle Aussagen mit der Faktenbasis überein? Nichts Erfundenes?
+3. Beantwortet der OnePager die Leserfrage „Ist das das, was ich suche?" — ist die Abgrenzung konkret genug?
Schreibe NUR die JSON-Datei nach: {out_path}