Kernblock je Kapitel: Frage-Antwort-Paare zum Auffrischen, KERN.md in der Montage
Jedes Kapitel endet mit „## Kern“. Die Montage sammelt alle Blöcke in buch/KERN.md, die API liefert sie unter kern.md. Stilregel, Kapitel- und Prüfprompt angepasst. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1
API.md
1
API.md
@@ -82,6 +82,7 @@ Alte Zustände ohne diese Stufe bekommen sie beim Laden nachgetragen.
|
||||
```
|
||||
|
||||
- `GET /api/themen/{slug}/v{N}/buch.md` – ganzes Buch als Markdown
|
||||
- `GET /api/themen/{slug}/v{N}/kern.md` – alle `## Kern`-Blöcke der Kapitel (Frage-Antwort-Paare) in einer Datei, zum Auffrischen
|
||||
- `GET /api/themen/{slug}/v{N}/buch.pdf` – PDF (404, solange nicht gebaut)
|
||||
|
||||
Solange ein Lauf läuft, enthält `buch` die bereits geschriebenen Kapitel (Status `geschrieben`, bis der Prüfer fertig ist).
|
||||
|
||||
@@ -168,6 +168,11 @@ async def buch_md(slug: str, n: int):
|
||||
return montage.markdown(_key(slug, n))
|
||||
|
||||
|
||||
@app.get("/api/themen/{slug}/v{n}/kern.md", response_class=PlainTextResponse)
|
||||
async def kern_md(slug: str, n: int):
|
||||
return montage.kern(_key(slug, n))
|
||||
|
||||
|
||||
@app.get("/api/themen/{slug}/v{n}/buch.pdf")
|
||||
async def buch_pdf(slug: str, n: int):
|
||||
key = _key(slug, n)
|
||||
|
||||
@@ -9,6 +9,7 @@ from . import config, gliederung, state
|
||||
|
||||
log = logging.getLogger("buchwerk")
|
||||
ABSCHNITT_RE = re.compile(r"^## (\d+\.\d+) (.+?)\s*$", re.M)
|
||||
KERN_RE = re.compile(r"^## Kern[ \t]*\n(.*?)(?=^## |\Z)", re.S | re.M)
|
||||
|
||||
|
||||
def _woerter(text: str) -> int:
|
||||
@@ -88,12 +89,24 @@ def markdown(name: str) -> str:
|
||||
return "\n".join(zeilen)
|
||||
|
||||
|
||||
def kern(name: str) -> str:
|
||||
"""Alle `## Kern`-Blöcke der Kapitel in einer Datei – zum Auffrischen eines gelesenen Buchs."""
|
||||
g = guide(name); v = state.verzeichnis(name)
|
||||
out = [f"# Kernerkenntnisse – {g['titel']}", ""]
|
||||
for k in g["kapitel"]:
|
||||
p = v / "buch" / k["datei"].split("/", 1)[1]
|
||||
m = KERN_RE.search(p.read_text()) if p.exists() else None
|
||||
if m:
|
||||
out += [f"## Kapitel {k['ord']} – {k['titel']}", "", m.group(1).strip(), ""]
|
||||
return "\n".join(out)
|
||||
|
||||
|
||||
def readme(name: str) -> str:
|
||||
g = guide(name)
|
||||
out = [f"# {g['titel']}", ""]
|
||||
if g["untertitel"]:
|
||||
out += [f"*{g['untertitel']}*", ""]
|
||||
out += ["PDF: [buch.pdf](buch.pdf) · Gesamttext: [buch.md](buch.md)", "", "## Inhalt", "", "[Vorwort](00-vorwort.md)", ""]
|
||||
out += ["PDF: [buch.pdf](buch.pdf) · Gesamttext: [buch.md](buch.md) · Kernerkenntnisse: [KERN.md](KERN.md)", "", "## Inhalt", "", "[Vorwort](00-vorwort.md)", ""]
|
||||
teil = None
|
||||
for k in g["kapitel"]:
|
||||
if k["teil"] and k["teil"] != teil:
|
||||
@@ -194,4 +207,5 @@ def bauen(name: str) -> bool:
|
||||
v = state.verzeichnis(name)
|
||||
(v / "buch" / "README.md").write_text(readme(name))
|
||||
(v / "buch" / "buch.md").write_text(markdown(name))
|
||||
(v / "buch" / "KERN.md").write_text(kern(name))
|
||||
return pdf(name)
|
||||
|
||||
@@ -6,7 +6,7 @@ Aufgabe: **Kapitel {{n}} – {{kapitel_titel}}**, Datei `buch/{{datei}}`, mit ge
|
||||
|
||||
Arbeite in diesem Loop:
|
||||
1. RECHERCHE in den lokalen Quellen (siehe QUELLEN.md): Verstehe die Sache anhand von Quellcode, Referenz, Doku bzw. Abstracts, bevor du schreibst. Online nur, wenn lokal nicht klärbar und QUELLEN.md es erlaubt.
|
||||
2. SCHREIBEN mit Write (bei Länge in mehreren Schritten, dann anhängen).
|
||||
2. SCHREIBEN mit Write (bei Länge in mehreren Schritten, dann anhängen). Am Ende des Kapitels der Block `## Kern` nach STIL.md: alle Kerneinsichten als Frage-Antwort-Paare.
|
||||
3. VERIFIZIEREN: Lies das fertige Kapitel vollständig. Prüfe JEDE Tatsachenangabe (Bezeichner, Signaturen, Versionsangaben, Namen, Jahre, Zahlen, Studienergebnisse) gegen die Quellen; führe Codebeispiele aus, wo STIL.md das verlangt – im Gerüst unter `arbeit/`, ins Buch kommt nur der Kern. Korrigiere oder entschärfe alles Unbelegte.
|
||||
4. PRÜFEN gegen STIL.md: Überschriften exakt wie in der Gliederung, keine Übungen/Merkkästen/Zusammenfassungen/Literaturlisten, Prosa statt Listenwüste, keine Verweisklammern, keine Wiederholung von Themen anderer Kapitel, Umfang, Umlaute. Überarbeite, bis alles passt.
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ Loop, bis nichts mehr zu korrigieren ist:
|
||||
1. Lies das Kapitel komplett. Extrahiere alle überprüfbaren Behauptungen: Bezeichner und Signaturen, Versionsangaben, Studien (Autoren, Jahr, Design, Stichprobe, Ergebnis, Effektgröße), Zahlen, Zitate, Verhaltensbeschreibungen („was passiert wann“), Zuschreibungen („X hat Y eingeführt“), Textdiagramme (jedes Element und jeder Pfeil gegen Quellcode/Doku) und Ausgabeblöcke (gegen den eigenen Testlauf).
|
||||
2. Verifiziere möglichst ALLE gegen die lokalen Quellen (QUELLEN.md). Priorisiere nach Fehlerwahrscheinlichkeit. Führe Codebeispiele aus bzw. teste beschriebenes Verhalten mit kleinen Skripten, wo STIL.md das vorsieht. Versionsangaben gegen Tags/Changelogs prüfen. Achte besonders auf: falsche Zuschreibungen, verdrehte Effektrichtungen, überzogene Kausalaussagen aus Korrelationsstudien, erfundene Stichprobengrößen, veraltete oder erfundene Bezeichner, Doku-Aussagen, die dem Quellcode widersprechen (dann gilt der Quellcode).
|
||||
3. Korrigiere Fehler direkt in der Datei mit Edit (minimal-invasiv, Stil beibehalten). Unbelegbares vorsichtiger formulieren oder streichen.
|
||||
4. Prüfe Form: Überschriften exakt wie GLIEDERUNG.md; keine Übungen/Merkkästen/Zusammenfassungen/Literaturlisten; keine Verweisklammern „(→ …)“ und keine Rückverweise auf frühere Abschnitte; Vorausverweise nur als Halbsatz und nur, wenn das Thema dort laut Gliederung steht; keine größeren Doppelungen mit Themen, die in andere Kapitel gehören (dann kürzen und verweisen); Rechtschreibung, Umlaute, Markdown. Satzbau: Sätze über 30 Wörter in mehrere auflösen, Inhalt unverändert; Zielschnitt unter 20 Wörter je Satz. Sätze mit drei und mehr Code-Bezeichnern entflechten: in Worten erklären, Namenslisten streichen. Verständlichkeit: Begriffe, die der Abschnitt benutzt, ohne sie bis dahin eingeführt zu haben, kurz erklären oder auf die Einführung verweisen; Interna, die kein sichtbares Verhalten erklären, streichen; Zwischenabschnitte unter 150 Wörtern mit dem Nachbarn zusammenlegen; Gedankensprünge schließen, wo zwischen zwei Sätzen oder Absätzen die Verbindung fehlt. Umfang: Abschnitte über 120 % ihres Richtwerts aus der Gliederung (`(kurz)` ≈ 800, ohne Angabe ≈ 1.300, `(lang)` ≈ 2.000 Wörter) straffen – zuerst Wiederholungen und Quellenformeln ohne Informationswert, keine Fakten oder Beispiele streichen.
|
||||
4. Prüfe Form: Überschriften exakt wie GLIEDERUNG.md, dazu am Ende `## Kern` mit Frage-Antwort-Paaren, die jeden Abschnitt abdecken und nichts enthalten, was das Kapitel nicht erklärt; keine Übungen/Merkkästen/Zusammenfassungen/Literaturlisten; keine Verweisklammern „(→ …)“ und keine Rückverweise auf frühere Abschnitte; Vorausverweise nur als Halbsatz und nur, wenn das Thema dort laut Gliederung steht; keine größeren Doppelungen mit Themen, die in andere Kapitel gehören (dann kürzen und verweisen); Rechtschreibung, Umlaute, Markdown. Satzbau: Sätze über 30 Wörter in mehrere auflösen, Inhalt unverändert; Zielschnitt unter 20 Wörter je Satz. Sätze mit drei und mehr Code-Bezeichnern entflechten: in Worten erklären, Namenslisten streichen. Verständlichkeit: Begriffe, die der Abschnitt benutzt, ohne sie bis dahin eingeführt zu haben, kurz erklären oder auf die Einführung verweisen; Interna, die kein sichtbares Verhalten erklären, streichen; Zwischenabschnitte unter 150 Wörtern mit dem Nachbarn zusammenlegen; Gedankensprünge schließen, wo zwischen zwei Sätzen oder Absätzen die Verbindung fehlt. Umfang: Abschnitte über 120 % ihres Richtwerts aus der Gliederung (`(kurz)` ≈ 800, ohne Angabe ≈ 1.300, `(lang)` ≈ 2.000 Wörter) straffen – zuerst Wiederholungen und Quellenformeln ohne Informationswert, keine Fakten oder Beispiele streichen.
|
||||
5. Wiederhole, bis du keine Fehler mehr findest.
|
||||
|
||||
Ändere nur `buch/{{datei}}`. Arbeitsdateien nur unter `arbeit/pruefung-{{n}}/`. Keine persönlichen Daten an externe Dienste senden.
|
||||
|
||||
@@ -6,7 +6,8 @@ Ein deutschsprachiges Sachbuch, das **Verständnis** vermittelt: Wie ist die Sac
|
||||
- Satzbau: Sätze meist 14–18 Wörter, selten über 25, nie über 35. Höchstens ein Nebensatz je Satz, keine Semikolon-Ketten. Ein Gedanke je Satz; Bedingung und Folge dürfen zusammenstehen. Aktiv statt Nominalstil.
|
||||
- Wortwahl: Verben statt Substantivierungen („prüfen“ statt „eine Prüfung vornehmen“, „wahrnehmen“ statt „die Wahrnehmung erfolgt“). Lange zusammengesetzte Wörter nur, wenn sie der Fachbegriff sind; sonst umschreiben oder bei der ersten Nennung erklären. Keine Füllwörter („grundsätzlich“, „im Wesentlichen“, „durchaus“).
|
||||
- Code-Bezeichner im Fließtext nur, wenn der Satz von genau diesem Bezeichner handelt. Erst in Worten erklären, was etwas tut, dann den Namen nennen. Keine Aufzählungen von Methoden-, Eigenschafts- oder Klassennamen, weder im Satz noch als Tabelle: Solche Listen weglassen. Faustregel: höchstens ein Bezeichner je Satz, selten zwei.
|
||||
- **Keine** Übungen, Selbsttests, Lernziele, Merkkästen, Checklisten, „Praxistipps“, Schritt-für-Schritt-Anleitungen als Selbstzweck, Zusammenfassungen am Kapitelende, Literaturlisten.
|
||||
- **Keine** Übungen, Selbsttests, Lernziele, Merkkästen, Checklisten, „Praxistipps“, Schritt-für-Schritt-Anleitungen als Selbstzweck, Literaturlisten.
|
||||
- Jedes Kapitel endet mit einem Block `## Kern`: alle Kerneinsichten des Kapitels als Frage-Antwort-Paare. Die Frage ist fett gesetzt und lautet so, wie ein Leser sie sich stellen würde („Warum nehmen Spieler Regeln hin, die alles umständlicher machen?“). Die Antwort sind zwei bis fünf Sätze Prosa mit dem Warum und dem konkreten Beispiel aus dem Kapitel. Jeder Abschnitt des Kapitels ist mit mindestens einer Frage vertreten, so lang wie nötig. Nichts Neues, keine Bullets, keine Begriffe, die das Kapitel nicht eingeführt hat. Der Kern zählt nicht zum Richtwert des Umfangs.
|
||||
- Überwiegend Fließtext. Listen und Tabellen nur, wo sie echte Klarheit bringen – sparsam. Eine Tabelle vergleicht Varianten mit ihren Kosten; sie zählt nie Methoden, Eigenschaften, Konstanten oder Einstellungen auf.
|
||||
- Kein Nachschlagewissen: keine Einstellungspfade (eine Projekteinstellung wird in Worten genannt, nicht als `pfad/zur/einstellung`), keine Standardwerte, Grenzwerte, Signaturen oder Parameterpositionen, die nur beim Bauen helfen. Keine Versionsnotizen („seit 4.3“, „in Godot 3 hieß“, „bis 4.2“): Das Buch beschreibt den Stand der Referenzversion, als hätte es nie einen anderen gegeben.
|
||||
- Keine Autoren als Erzählgerüst: nicht „X beschreibt“, „X hält“, „X rät“, sondern die Sache selbst erklären und begründen. Der Erfinder eines Verfahrens wird höchstens einmal genannt, wenn das Verfahren nach ihm heißt. Keine Jahreszahlen, Daten, Lebensläufe oder Anekdoten ohne Erklärwert. Keine Testberichte im Text („Im Testlauf …“, „Das Skript läuft ohne Fehler“, „Ein Versuch zeigt“): Die Ausgabe spricht für sich.
|
||||
|
||||
Reference in New Issue
Block a user