fix: Fachwort Fluss nicht mehr aus eigenen Prompts; englische Zahlen und Teilfragen

- Routing-Prompt verlangt bei Dijkstra Restriktionsnamen in der Sprache der Aufgabe
  statt Flusserhaltung; Solver-Prompt ohne Fachwort (löste Korrekturrunden aus)
- JARGON_EVERYDAY: beeinflusst/Einfluss/Überfluss zählen weder als Vorkommen noch als
  Erklärung eines Fachbegriffs
- normalize_number liest eindeutige englische Zahlen (1,234.56; 12,345,678) richtig
- QUESTION_PATTERN erkennt Part/Question/Task N

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-09-17 16:38:45 +02:00
commit 0582737b22

View file

@ -446,3 +446,26 @@ def test_objective_label_is_still_stripped():
from checks.model_checks import _objective_without_label
assert _objective_without_label("Z = 12 x").strip() == "12 x"
assert _objective_without_label("\\sum_{i=0}^{2} c_i x_i").startswith("\\sum")
def test_everyday_words_neither_trigger_nor_explain_jargon():
from checks.model_checks import unexplained_jargon
# beobachtet: „beeinflusst“ in der Zusammenfassung galt als Erklärung von „Flusserhaltung“
assert unexplained_jargon("Flusserhaltung", "Die Bestellmenge beeinflusst die Lagerkosten.") == ["Fluss"]
assert unexplained_jargon("Der Einfluss des Preises", "Zusammenfassung") == []
assert unexplained_jargon("Flusserhaltung", "Der Fluss durch einen Knoten bleibt erhalten.") == []
def test_unambiguous_english_numbers_are_read_correctly():
from checks.model_checks import normalize_number
assert normalize_number("1,234.56") == "1234.56" # vorher 1.23456
assert normalize_number("12,345,678") == "12345678"
assert normalize_number("1,500") == "1.5" # mehrdeutig: bleibt deutsch gelesen
assert normalize_number("1.234,56") == "1234.56" # deutsch unverändert
def test_english_sub_question_markers_are_recognised():
from checks.model_checks import QUESTION_PATTERN
for zeile in ("Part 2: Solve the model", "* **Question 1: How many units**", "- Task 3: Compare"):
assert QUESTION_PATTERN.search(zeile), zeile
assert not QUESTION_PATTERN.search("In part 2 of the text we see") # Fließtext bleibt Fließtext