feat: fehlende Werte und simulierte Daten müssen ausgewiesen und genannt werden

- check_generated_data: nennt extracted_values einen Wert als fehlend („nicht genannt“,
  „unbekannt“, „offener Parameter“; Werte aus beigelegten Dateien ausgenommen) und
  data_assumptions ist leer -> undeclared_data (Reparatur, sonst unzuverlässig).
  An 211 gespeicherten Läufen 8 Treffer, alle echt.
- check_answers_disclose_assumptions: bei selbst erzeugten Daten muss Antwortsatz oder
  eine Antwort das sagen -> Reparatur, sonst Warnung. 1 Treffer, echt.
- Summenprüfung: bleibt nach Abzug der Summenzeilen keine Zeile, ist nur die
  Schlusszeile die Summe (Fehlalarm „Summe (0)“ kostete zwei Reparaturen).

Nachlauf 20260918-140124: ehrlich_fehlende_kursdaten und ehrlich_fehlender_bedarf 2/2.
Ändert die Prompt-Kennung (Solver-Prompt.txt).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-09-18 14:05:39 +02:00
commit 20ac3f14d7

View file

@ -805,3 +805,18 @@ def test_expected_rejection_has_no_routing_to_score(monkeypatch):
erwartet = benchmark.run_case({"name": "g", "task": "-", "expected": {"behavior": ["rejected"]}}, "fake", 1)
falsch = benchmark.run_case({"name": "lp", "task": "-", "expected": {"objective_value": 9, "tolerance": 1e-6}}, "fake", 1)
assert erwartet["class_ok"] is None and falsch["class_ok"] is False # eine unerwartete Ablehnung bleibt ein Fehler
def test_missing_value_without_declared_assumption_is_repaired_or_unreliable():
# ehrlich_fehlender_bedarf: fehlender Wert still eingesetzt ⇒ Reparatur; bleibt es ⇒ unzuverlässig
from core.model_schema import ParameterDefinition
fehlend = GOOD.model_copy(update={"parameters": GOOD.parameters + [ParameterDefinition(
symbol="d_3", dimension="Skalar", unit="Kisten", description="Bedarf G3",
extracted_values="im Text nicht genannt")]})
ausgewiesen = SolverCode(code=STRUCTURED_CODE, data_assumptions=["d_3 = 0 Kisten angenommen, im Text nicht genannt"])
session = FakeSession([fehlend], [OK], [SolverCode(code=STRUCTURED_CODE), ausgewiesen])
result = run_pipeline("Aufgabe", session=session, max_revisions=0, max_restarts=0)
assert session.steps.count("Solver-Reparatur") == 1 and result.reliable
session = FakeSession([fehlend], [OK], [SolverCode(code=STRUCTURED_CODE)] * 3)
result = run_pipeline("Aufgabe", session=session, max_revisions=0, max_restarts=0)
assert not result.reliable and any(i.startswith("Datenherkunft") for i in result.reliability_issues)