feat: Report-Aufbau neu – Inhaltsverzeichnis, Aufgabe gerendert, Ergebnis nach dem Modell

Reihenfolge (Nutzerentscheidung): Titel → Laufdaten → Warnkasten → klickbares
Inhaltsverzeichnis (HTML, H2+H3) → Aufgabe → beigelegte Daten → Was in der Aufgabe
steht → Einordnung → „Wie das Modell die Aufgabe sieht“ (eigene H2) → Mathematisches
Modell → Ergebnis → Prüfbericht → Solver-Programm.

- Aufgabe als Markdown mit gerenderten Formeln (markdown-it-py, html=False,
  breaks=True; Formeln vorher durch Platzhalter geschützt); Formelsatz in reinem Text
  (nur_formeln.md) bleibt <pre>.
- „$0$“ gilt als Formel, „$5 und $7“ weiter als Geldbetrag (_is_money).
- markdown-it-py ausdrücklich in requirements.txt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-09-18 17:44:26 +02:00
commit 29d058d8f1

View file

@ -123,10 +123,10 @@ def test_report_shows_prominent_warning_for_unreliable_result():
session = FakeSession(specs=[HALLUCINATED] * 3, reviews=[MISMATCH] * 3)
result = run_pipeline("Aufgabe", session=session, max_revisions=2, max_restarts=0)
doc = build_document(result)
assert doc[1][0] == "warn" # direkt unter der Überschrift
assert [b[0] for b in doc[:4]] == ["h1", "list", "warn", "toc"] # Titel → Laufdaten → Warnkasten → Inhalt
assert '<div class="warn">⚠ Ergebnis unzuverlässig' in to_html(doc)
assert "> **⚠ Ergebnis unzuverlässig" in to_markdown(doc)
assert "Der Solver wurde nicht gestartet." in doc[1][1]
assert "Der Solver wurde nicht gestartet." in doc[2][1]
def test_report_shows_the_rejected_reading_of_each_assumption():