fix: Umlaute im Code erlaubt, Lesertexte still berichtigt

Ursache der Umschreibungen ist kein Encoding-Problem: das LLM schreibt
im erzeugten Python-Code ASCII (Portfolio Nr. 2: Code-Strings 0 echte
gegen 60 umschriebene Umlaute, Spezifikation 128 echte). Die
Prompt-Regel wurde ignoriert, die Warnung stand in fast jedem Lauf.

- Solver-Prompt: Umschreibungen in Bezeichnern, DATA-Schluesseln,
  Restriktionsnamen und Kommentaren erlaubt; echte Umlaute nur in
  Lesertexten, Regel direkt bei den report()-Argumenten.
- check_text_quality meldet keine Umlaute mehr (Fachbegriffe bleiben).
- umlaut_map baut je Lauf ein Woerterbuch aus Aufgabe und Spezifikation;
  repair_texts wendet es vor UMLAUT_STEMS an. ASCII-Formen aus dem
  Aufgabentext (Namen) bleiben, Restriktions-/Variablennamen unberuehrt.

An vier gespeicherten Laeufen: alle Umschreibungen in Lesertexten
berichtigt, 11 Ersetzungen, keine falsch. Prompt-Kennung 694c3eb3d59a.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-09-17 13:28:43 +02:00
commit 0d9b5d718f

View file

@ -59,6 +59,7 @@ Geldbeträge und Rundung:
Ergebnisausgabe:
- Die Funktion `report(status, objective_value, solution, tables, headline, constraints, variables, sensitivity, relaxation_bound, multistart, graph, answers, scenarios)` ist bereits vordefiniert (sie gibt das Ergebnis lesbar und maschinenlesbar aus). Definiere sie NICHT selbst und importiere nichts dafür.
- Schreibweise: Bezeichner, `DATA`-Schlüssel, Restriktionsnamen und Kommentare dürfen Umlaute umschreiben (`Kapazitaet_M1`) – das wird nicht beanstandet. **Lesertexte** dagegen erscheinen im Report und stehen in echtem Deutsch mit ä, ö, ü, ß: `headline`, `answers`, Tabellen (`title`, `columns`, Textzellen, `note`), `scenarios` (`name`, `description`) und `graph` (`node_meaning`, `arc_meaning`). Die Datei ist UTF-8. [→ repair_texts]
- Rufe `report(...)` genau einmal auf, innerhalb von `main()`:
- status: "optimal", "feasible", "infeasible", "unbounded" oder "error"
- objective_value: Wert der Zielfunktion der Spezifikation (im ursprünglichen Sinn/Maßstab) als float, oder None
@ -122,5 +123,4 @@ Ergebnisausgabe:
3. "Bindende Restriktionen": welche Grenzen die Lösung ausreizt, mit Spalten ["Restriktion", "Wert", "Grenze", "bindend"] und Werten aus der Lösung (z. B. "Höchstgewicht A02" | "30,00 %" | "30,00 %" | "ja"). Nur Tatsachen aus der Lösung, keine Bewertung; ohne objective_column.
Zahlen in der objective_column immer im Maßstab von objective_value (nicht in Prozent umrechnen); Datenspalten dagegen in lesbaren Einheiten als Text ("1,63 %", "0,74 %", "36 h").
- Weitere print-Ausgaben sind erlaubt, aber nicht nötig.
- Alle Texte auf Deutsch mit echten Umlauten (ä, ö, ü, ß), nie 'ae'/'oe'/'ue'; die Dateien sind UTF-8. [→ check_text_quality]
- Liefere im Feld code nur den reinen Python-Code ohne Markdown-Codeblock.