Add E2E functional acceptance test suite (#50, #51, #52, #53, #54)
Vier Sub-Issues unter Umbrella #50 — opt-in via 'pytest -m integration',
Default-Suite (77 Unit-Tests) bleibt unberührt.
- Sub-Issue A (#51): test_adapters_live.py — pro aktivem BL Reachability,
Drucksache-ID-Format, Type-Filter, Datum-/Fraktion-Plausibilität,
PDF-Link-HEAD-Probe (slow). NI als xfail (Login-Wall).
- Sub-Issue B (#52): test_frontend_xref.py + ground_truth.py — pro BL
ein manuell kuratiertes Frontend-Sample (Drucksache + Title-Substring +
Fraktionen + Datum + PDF-URL), gegen das adapter.get_document() gespiegelt
wird. Fängt Bug-Klasse 14 (Cross-Bundesland-Match).
- Sub-Issue C (#53): test_wahlprogramme_indexed.py — Indexing-Status pro
aktivem BL aus embeddings.db, PDF-Inhalts-Plausibilität (14 Marker +
Wahlperioden-Horizont), expliziter Anti-Marker für Bug-Klasse 8
(CDU-BE 2021 vs 2026 PDF-Tausch durch abgeordnetenwatch).
- Sub-Issue D (#54): test_citations_substring.py — Property-Verification:
jedes vom LLM zitierte Snippet muss als (whitespace-normalisierter)
Substring auf der angegebenen PDF-Seite vorhanden sein. Strict-Match
mit Truncation-Marker-Toleranz, kein Fuzzy. Liest reale Assessments
aus gwoe-antraege.db. Fängt Bug-Klassen 7/10/17 (Halluzination).
Architektur: separates tests/integration/ Verzeichnis mit eigenem
conftest.py, das die Stubs der Unit-Suite (fitz/bs4/openai/pydantic_settings)
gezielt entfernt und auf echte Module umstellt — mit Fallback-Skip via
pytest.require_module wenn lokale Dev-Maschine die Prod-Deps nicht hat.
206 neue Integration-Tests, 13 Helper-Unit-Tests. 77 Unit-Tests bleiben grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:00:20 +02:00
|
|
|
"""Manuell kuratierte Drucksachen pro aktivem Bundesland.
|
|
|
|
|
|
|
|
|
|
Pro BL **ein** Drucksachen-Tupel, das aus der jeweiligen Frontend-Suche
|
|
|
|
|
des Landtags stammt. Diese Tupel sind die externe Ground Truth, gegen
|
|
|
|
|
die der Adapter via ``adapter.get_document(...)`` gespiegelt wird
|
|
|
|
|
(siehe ``test_frontend_xref.py``, Sub-Issue B).
|
|
|
|
|
|
|
|
|
|
## Wartung
|
|
|
|
|
|
|
|
|
|
Wenn ein Test in ``test_frontend_xref.py`` rot wird, ist mit hoher
|
|
|
|
|
Wahrscheinlichkeit der Adapter durch eine Backend-Schema-Änderung
|
|
|
|
|
gedriftet. Der Wartende soll dann:
|
|
|
|
|
|
|
|
|
|
1. ``frontend_search_url`` öffnen
|
|
|
|
|
2. Die Drucksache `drucksache` dort suchen
|
|
|
|
|
3. Felder gegen das ``GroundTruth``-Tupel hier abgleichen
|
|
|
|
|
4. Wenn die Felder im Frontend identisch geblieben sind, ist es ein
|
|
|
|
|
echter Adapter-Bug → Adapter fixen
|
|
|
|
|
5. Wenn das Frontend selbst sich geändert hat (z.B. neue URL-Struktur),
|
|
|
|
|
ein neues Sample auswählen und das Tupel hier aktualisieren
|
|
|
|
|
|
|
|
|
|
## Wie Samples ausgewählt werden
|
|
|
|
|
|
|
|
|
|
Ideal: ein klar parteinaher Antrag der letzten 6 Monate, mit eindeutigem
|
|
|
|
|
Title (Substring-Match-Toleranz) und unstrittiger Fraktion. Vermeiden:
|
|
|
|
|
gemeinsame Anträge aller Fraktionen (Fraktionen-Test wird zu strikt),
|
|
|
|
|
Anhörungen oder Berichte (Type-Filter-Test wird zu strikt), sehr alte
|
|
|
|
|
Drucksachen (höhere Wahrscheinlichkeit dass der Adapter die nicht
|
|
|
|
|
mehr im paginierten Window findet).
|
|
|
|
|
"""
|
|
|
|
|
from dataclasses import dataclass, field
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
class GroundTruth:
|
|
|
|
|
"""Ein bekanntes Drucksache-Tupel als externe Ground Truth."""
|
|
|
|
|
|
|
|
|
|
bundesland: str
|
|
|
|
|
drucksache: str # z.B. "8/6390"
|
|
|
|
|
title_substring: str # eindeutiger Substring (klein gehalten)
|
|
|
|
|
expected_fraktionen: set[str] = field(default_factory=set)
|
|
|
|
|
datum: str = "" # ISO; leer wenn der Adapter es legitim nicht extrahiert
|
|
|
|
|
pdf_url_substring: str = "" # leer wenn die URL volatil ist
|
|
|
|
|
frontend_search_url: str = "" # Doku, woher das Sample stammt
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Eine Drucksache pro aktivem Bundesland.
|
|
|
|
|
# Stand: 2026-04-09. Bei Drift bitte das Sample ersetzen, nicht löschen.
|
|
|
|
|
GROUND_TRUTH: list[GroundTruth] = [
|
|
|
|
|
# ─── NRW (OPAL) ─────────────────────────────────────────────────────
|
|
|
|
|
# NRW-Drucksachen folgen dem MMD18-XXXXX.pdf-URL-Schema. Substring
|
|
|
|
|
# "MMD18-" matched alle aktuellen Anträge der WP18.
|
|
|
|
|
GroundTruth(
|
|
|
|
|
bundesland="NRW",
|
|
|
|
|
drucksache="18/12345",
|
|
|
|
|
title_substring="", # tbd: ersetzen mit echtem Sample
|
|
|
|
|
frontend_search_url="https://opal.landtag.nrw.de",
|
|
|
|
|
),
|
|
|
|
|
# ─── MV (ParlDok 8.x) ───────────────────────────────────────────────
|
|
|
|
|
GroundTruth(
|
|
|
|
|
bundesland="MV",
|
|
|
|
|
drucksache="8/6390",
|
|
|
|
|
title_substring="Krisenmechanismus",
|
|
|
|
|
expected_fraktionen={"CDU"},
|
|
|
|
|
datum="2026-03-18",
|
|
|
|
|
pdf_url_substring="dokument/",
|
|
|
|
|
frontend_search_url="https://www.dokumentation.landtag-mv.de/parldok/",
|
|
|
|
|
),
|
|
|
|
|
# ─── BE (PARDOK / portala) ──────────────────────────────────────────
|
2026-04-09 12:27:01 +02:00
|
|
|
# Sample muss eine BE-Drucksache sein, die vom PortalaAdapter
|
|
|
|
|
# zuverlässig in den top results gelistet wird (search-Pagination
|
|
|
|
|
# ist BE-eigen und liefert nicht alle WP19-Anträge zurück).
|
|
|
|
|
# 19/2606 ist eine etablierte GRÜNE-Drucksache mit klarer Title-
|
|
|
|
|
# Substring "Menstruation".
|
Add E2E functional acceptance test suite (#50, #51, #52, #53, #54)
Vier Sub-Issues unter Umbrella #50 — opt-in via 'pytest -m integration',
Default-Suite (77 Unit-Tests) bleibt unberührt.
- Sub-Issue A (#51): test_adapters_live.py — pro aktivem BL Reachability,
Drucksache-ID-Format, Type-Filter, Datum-/Fraktion-Plausibilität,
PDF-Link-HEAD-Probe (slow). NI als xfail (Login-Wall).
- Sub-Issue B (#52): test_frontend_xref.py + ground_truth.py — pro BL
ein manuell kuratiertes Frontend-Sample (Drucksache + Title-Substring +
Fraktionen + Datum + PDF-URL), gegen das adapter.get_document() gespiegelt
wird. Fängt Bug-Klasse 14 (Cross-Bundesland-Match).
- Sub-Issue C (#53): test_wahlprogramme_indexed.py — Indexing-Status pro
aktivem BL aus embeddings.db, PDF-Inhalts-Plausibilität (14 Marker +
Wahlperioden-Horizont), expliziter Anti-Marker für Bug-Klasse 8
(CDU-BE 2021 vs 2026 PDF-Tausch durch abgeordnetenwatch).
- Sub-Issue D (#54): test_citations_substring.py — Property-Verification:
jedes vom LLM zitierte Snippet muss als (whitespace-normalisierter)
Substring auf der angegebenen PDF-Seite vorhanden sein. Strict-Match
mit Truncation-Marker-Toleranz, kein Fuzzy. Liest reale Assessments
aus gwoe-antraege.db. Fängt Bug-Klassen 7/10/17 (Halluzination).
Architektur: separates tests/integration/ Verzeichnis mit eigenem
conftest.py, das die Stubs der Unit-Suite (fitz/bs4/openai/pydantic_settings)
gezielt entfernt und auf echte Module umstellt — mit Fallback-Skip via
pytest.require_module wenn lokale Dev-Maschine die Prod-Deps nicht hat.
206 neue Integration-Tests, 13 Helper-Unit-Tests. 77 Unit-Tests bleiben grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:00:20 +02:00
|
|
|
GroundTruth(
|
|
|
|
|
bundesland="BE",
|
2026-04-09 12:27:01 +02:00
|
|
|
drucksache="19/2606",
|
|
|
|
|
title_substring="Menstruation",
|
2026-04-09 12:08:31 +02:00
|
|
|
expected_fraktionen={"GRÜNE"},
|
2026-04-09 12:27:01 +02:00
|
|
|
datum="2025-07-22",
|
Add E2E functional acceptance test suite (#50, #51, #52, #53, #54)
Vier Sub-Issues unter Umbrella #50 — opt-in via 'pytest -m integration',
Default-Suite (77 Unit-Tests) bleibt unberührt.
- Sub-Issue A (#51): test_adapters_live.py — pro aktivem BL Reachability,
Drucksache-ID-Format, Type-Filter, Datum-/Fraktion-Plausibilität,
PDF-Link-HEAD-Probe (slow). NI als xfail (Login-Wall).
- Sub-Issue B (#52): test_frontend_xref.py + ground_truth.py — pro BL
ein manuell kuratiertes Frontend-Sample (Drucksache + Title-Substring +
Fraktionen + Datum + PDF-URL), gegen das adapter.get_document() gespiegelt
wird. Fängt Bug-Klasse 14 (Cross-Bundesland-Match).
- Sub-Issue C (#53): test_wahlprogramme_indexed.py — Indexing-Status pro
aktivem BL aus embeddings.db, PDF-Inhalts-Plausibilität (14 Marker +
Wahlperioden-Horizont), expliziter Anti-Marker für Bug-Klasse 8
(CDU-BE 2021 vs 2026 PDF-Tausch durch abgeordnetenwatch).
- Sub-Issue D (#54): test_citations_substring.py — Property-Verification:
jedes vom LLM zitierte Snippet muss als (whitespace-normalisierter)
Substring auf der angegebenen PDF-Seite vorhanden sein. Strict-Match
mit Truncation-Marker-Toleranz, kein Fuzzy. Liest reale Assessments
aus gwoe-antraege.db. Fängt Bug-Klassen 7/10/17 (Halluzination).
Architektur: separates tests/integration/ Verzeichnis mit eigenem
conftest.py, das die Stubs der Unit-Suite (fitz/bs4/openai/pydantic_settings)
gezielt entfernt und auf echte Module umstellt — mit Fallback-Skip via
pytest.require_module wenn lokale Dev-Maschine die Prod-Deps nicht hat.
206 neue Integration-Tests, 13 Helper-Unit-Tests. 77 Unit-Tests bleiben grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:00:20 +02:00
|
|
|
pdf_url_substring="pardok.parlament-berlin.de",
|
|
|
|
|
frontend_search_url="https://pardok.parlament-berlin.de/portala/",
|
|
|
|
|
),
|
|
|
|
|
# ─── LSA (PADOKA / portala) ─────────────────────────────────────────
|
|
|
|
|
GroundTruth(
|
|
|
|
|
bundesland="LSA",
|
|
|
|
|
drucksache="8/6726",
|
|
|
|
|
title_substring="Demokratie beginnt im Klassenzimmer",
|
|
|
|
|
expected_fraktionen={"GRÜNE"},
|
|
|
|
|
datum="2026-03-06",
|
|
|
|
|
pdf_url_substring="d6726",
|
|
|
|
|
frontend_search_url="https://padoka.landtag.sachsen-anhalt.de/portal/",
|
|
|
|
|
),
|
|
|
|
|
# ─── BW (PARLIS / portala-Variante) ─────────────────────────────────
|
2026-04-09 11:49:17 +02:00
|
|
|
# BW kodiert den Underscore in der PDF-URL als %5F (z.B.
|
|
|
|
|
# "17%5F10323.pdf"), deshalb ist das URL-Substring-Pattern hier
|
|
|
|
|
# %5F-getrennt — `17_10323` würde nicht matchen.
|
Add E2E functional acceptance test suite (#50, #51, #52, #53, #54)
Vier Sub-Issues unter Umbrella #50 — opt-in via 'pytest -m integration',
Default-Suite (77 Unit-Tests) bleibt unberührt.
- Sub-Issue A (#51): test_adapters_live.py — pro aktivem BL Reachability,
Drucksache-ID-Format, Type-Filter, Datum-/Fraktion-Plausibilität,
PDF-Link-HEAD-Probe (slow). NI als xfail (Login-Wall).
- Sub-Issue B (#52): test_frontend_xref.py + ground_truth.py — pro BL
ein manuell kuratiertes Frontend-Sample (Drucksache + Title-Substring +
Fraktionen + Datum + PDF-URL), gegen das adapter.get_document() gespiegelt
wird. Fängt Bug-Klasse 14 (Cross-Bundesland-Match).
- Sub-Issue C (#53): test_wahlprogramme_indexed.py — Indexing-Status pro
aktivem BL aus embeddings.db, PDF-Inhalts-Plausibilität (14 Marker +
Wahlperioden-Horizont), expliziter Anti-Marker für Bug-Klasse 8
(CDU-BE 2021 vs 2026 PDF-Tausch durch abgeordnetenwatch).
- Sub-Issue D (#54): test_citations_substring.py — Property-Verification:
jedes vom LLM zitierte Snippet muss als (whitespace-normalisierter)
Substring auf der angegebenen PDF-Seite vorhanden sein. Strict-Match
mit Truncation-Marker-Toleranz, kein Fuzzy. Liest reale Assessments
aus gwoe-antraege.db. Fängt Bug-Klassen 7/10/17 (Halluzination).
Architektur: separates tests/integration/ Verzeichnis mit eigenem
conftest.py, das die Stubs der Unit-Suite (fitz/bs4/openai/pydantic_settings)
gezielt entfernt und auf echte Module umstellt — mit Fallback-Skip via
pytest.require_module wenn lokale Dev-Maschine die Prod-Deps nicht hat.
206 neue Integration-Tests, 13 Helper-Unit-Tests. 77 Unit-Tests bleiben grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:00:20 +02:00
|
|
|
GroundTruth(
|
|
|
|
|
bundesland="BW",
|
|
|
|
|
drucksache="17/10323",
|
|
|
|
|
title_substring="Arbeitsbedingungen",
|
|
|
|
|
expected_fraktionen={"GRÜNE"},
|
|
|
|
|
datum="2026-03-16",
|
2026-04-09 11:49:17 +02:00
|
|
|
pdf_url_substring="17%5f10323",
|
Add E2E functional acceptance test suite (#50, #51, #52, #53, #54)
Vier Sub-Issues unter Umbrella #50 — opt-in via 'pytest -m integration',
Default-Suite (77 Unit-Tests) bleibt unberührt.
- Sub-Issue A (#51): test_adapters_live.py — pro aktivem BL Reachability,
Drucksache-ID-Format, Type-Filter, Datum-/Fraktion-Plausibilität,
PDF-Link-HEAD-Probe (slow). NI als xfail (Login-Wall).
- Sub-Issue B (#52): test_frontend_xref.py + ground_truth.py — pro BL
ein manuell kuratiertes Frontend-Sample (Drucksache + Title-Substring +
Fraktionen + Datum + PDF-URL), gegen das adapter.get_document() gespiegelt
wird. Fängt Bug-Klasse 14 (Cross-Bundesland-Match).
- Sub-Issue C (#53): test_wahlprogramme_indexed.py — Indexing-Status pro
aktivem BL aus embeddings.db, PDF-Inhalts-Plausibilität (14 Marker +
Wahlperioden-Horizont), expliziter Anti-Marker für Bug-Klasse 8
(CDU-BE 2021 vs 2026 PDF-Tausch durch abgeordnetenwatch).
- Sub-Issue D (#54): test_citations_substring.py — Property-Verification:
jedes vom LLM zitierte Snippet muss als (whitespace-normalisierter)
Substring auf der angegebenen PDF-Seite vorhanden sein. Strict-Match
mit Truncation-Marker-Toleranz, kein Fuzzy. Liest reale Assessments
aus gwoe-antraege.db. Fängt Bug-Klassen 7/10/17 (Halluzination).
Architektur: separates tests/integration/ Verzeichnis mit eigenem
conftest.py, das die Stubs der Unit-Suite (fitz/bs4/openai/pydantic_settings)
gezielt entfernt und auf echte Module umstellt — mit Fallback-Skip via
pytest.require_module wenn lokale Dev-Maschine die Prod-Deps nicht hat.
206 neue Integration-Tests, 13 Helper-Unit-Tests. 77 Unit-Tests bleiben grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:00:20 +02:00
|
|
|
frontend_search_url="https://parlis.landtag-bw.de/parlis/",
|
|
|
|
|
),
|
|
|
|
|
# ─── HH (ParlDok 8.x) ───────────────────────────────────────────────
|
|
|
|
|
GroundTruth(
|
|
|
|
|
bundesland="HH",
|
|
|
|
|
drucksache="23/3700",
|
|
|
|
|
title_substring="Stadtteilklinik",
|
|
|
|
|
expected_fraktionen={"LINKE"},
|
|
|
|
|
datum="2026-04-08",
|
|
|
|
|
pdf_url_substring="dokument/",
|
|
|
|
|
frontend_search_url="https://www.buergerschaft-hh.de/parldok/",
|
|
|
|
|
),
|
|
|
|
|
# ─── TH (ParlDok 8.x) ───────────────────────────────────────────────
|
2026-04-09 12:08:31 +02:00
|
|
|
# 8/1594 vom 31.03.2026 hatte zum Test-Zeitpunkt noch keinen
|
|
|
|
|
# freigegebenen PDF-Link (allowed=false). Seit dem TH-Adapter-Patch
|
|
|
|
|
# in #61 werden solche Hits aus der Pipeline ausgeschlossen, der
|
|
|
|
|
# Sample muss daher auf einen leicht älteren Antrag mit
|
|
|
|
|
# garantiertem PDF zeigen.
|
Add E2E functional acceptance test suite (#50, #51, #52, #53, #54)
Vier Sub-Issues unter Umbrella #50 — opt-in via 'pytest -m integration',
Default-Suite (77 Unit-Tests) bleibt unberührt.
- Sub-Issue A (#51): test_adapters_live.py — pro aktivem BL Reachability,
Drucksache-ID-Format, Type-Filter, Datum-/Fraktion-Plausibilität,
PDF-Link-HEAD-Probe (slow). NI als xfail (Login-Wall).
- Sub-Issue B (#52): test_frontend_xref.py + ground_truth.py — pro BL
ein manuell kuratiertes Frontend-Sample (Drucksache + Title-Substring +
Fraktionen + Datum + PDF-URL), gegen das adapter.get_document() gespiegelt
wird. Fängt Bug-Klasse 14 (Cross-Bundesland-Match).
- Sub-Issue C (#53): test_wahlprogramme_indexed.py — Indexing-Status pro
aktivem BL aus embeddings.db, PDF-Inhalts-Plausibilität (14 Marker +
Wahlperioden-Horizont), expliziter Anti-Marker für Bug-Klasse 8
(CDU-BE 2021 vs 2026 PDF-Tausch durch abgeordnetenwatch).
- Sub-Issue D (#54): test_citations_substring.py — Property-Verification:
jedes vom LLM zitierte Snippet muss als (whitespace-normalisierter)
Substring auf der angegebenen PDF-Seite vorhanden sein. Strict-Match
mit Truncation-Marker-Toleranz, kein Fuzzy. Liest reale Assessments
aus gwoe-antraege.db. Fängt Bug-Klassen 7/10/17 (Halluzination).
Architektur: separates tests/integration/ Verzeichnis mit eigenem
conftest.py, das die Stubs der Unit-Suite (fitz/bs4/openai/pydantic_settings)
gezielt entfernt und auf echte Module umstellt — mit Fallback-Skip via
pytest.require_module wenn lokale Dev-Maschine die Prod-Deps nicht hat.
206 neue Integration-Tests, 13 Helper-Unit-Tests. 77 Unit-Tests bleiben grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:00:20 +02:00
|
|
|
GroundTruth(
|
|
|
|
|
bundesland="TH",
|
2026-04-09 12:08:31 +02:00
|
|
|
drucksache="8/3133",
|
|
|
|
|
title_substring="Notfallversorgung",
|
Add E2E functional acceptance test suite (#50, #51, #52, #53, #54)
Vier Sub-Issues unter Umbrella #50 — opt-in via 'pytest -m integration',
Default-Suite (77 Unit-Tests) bleibt unberührt.
- Sub-Issue A (#51): test_adapters_live.py — pro aktivem BL Reachability,
Drucksache-ID-Format, Type-Filter, Datum-/Fraktion-Plausibilität,
PDF-Link-HEAD-Probe (slow). NI als xfail (Login-Wall).
- Sub-Issue B (#52): test_frontend_xref.py + ground_truth.py — pro BL
ein manuell kuratiertes Frontend-Sample (Drucksache + Title-Substring +
Fraktionen + Datum + PDF-URL), gegen das adapter.get_document() gespiegelt
wird. Fängt Bug-Klasse 14 (Cross-Bundesland-Match).
- Sub-Issue C (#53): test_wahlprogramme_indexed.py — Indexing-Status pro
aktivem BL aus embeddings.db, PDF-Inhalts-Plausibilität (14 Marker +
Wahlperioden-Horizont), expliziter Anti-Marker für Bug-Klasse 8
(CDU-BE 2021 vs 2026 PDF-Tausch durch abgeordnetenwatch).
- Sub-Issue D (#54): test_citations_substring.py — Property-Verification:
jedes vom LLM zitierte Snippet muss als (whitespace-normalisierter)
Substring auf der angegebenen PDF-Seite vorhanden sein. Strict-Match
mit Truncation-Marker-Toleranz, kein Fuzzy. Liest reale Assessments
aus gwoe-antraege.db. Fängt Bug-Klassen 7/10/17 (Halluzination).
Architektur: separates tests/integration/ Verzeichnis mit eigenem
conftest.py, das die Stubs der Unit-Suite (fitz/bs4/openai/pydantic_settings)
gezielt entfernt und auf echte Module umstellt — mit Fallback-Skip via
pytest.require_module wenn lokale Dev-Maschine die Prod-Deps nicht hat.
206 neue Integration-Tests, 13 Helper-Unit-Tests. 77 Unit-Tests bleiben grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:00:20 +02:00
|
|
|
expected_fraktionen={"AfD"},
|
2026-04-09 12:08:31 +02:00
|
|
|
datum="2026-03-18",
|
Add E2E functional acceptance test suite (#50, #51, #52, #53, #54)
Vier Sub-Issues unter Umbrella #50 — opt-in via 'pytest -m integration',
Default-Suite (77 Unit-Tests) bleibt unberührt.
- Sub-Issue A (#51): test_adapters_live.py — pro aktivem BL Reachability,
Drucksache-ID-Format, Type-Filter, Datum-/Fraktion-Plausibilität,
PDF-Link-HEAD-Probe (slow). NI als xfail (Login-Wall).
- Sub-Issue B (#52): test_frontend_xref.py + ground_truth.py — pro BL
ein manuell kuratiertes Frontend-Sample (Drucksache + Title-Substring +
Fraktionen + Datum + PDF-URL), gegen das adapter.get_document() gespiegelt
wird. Fängt Bug-Klasse 14 (Cross-Bundesland-Match).
- Sub-Issue C (#53): test_wahlprogramme_indexed.py — Indexing-Status pro
aktivem BL aus embeddings.db, PDF-Inhalts-Plausibilität (14 Marker +
Wahlperioden-Horizont), expliziter Anti-Marker für Bug-Klasse 8
(CDU-BE 2021 vs 2026 PDF-Tausch durch abgeordnetenwatch).
- Sub-Issue D (#54): test_citations_substring.py — Property-Verification:
jedes vom LLM zitierte Snippet muss als (whitespace-normalisierter)
Substring auf der angegebenen PDF-Seite vorhanden sein. Strict-Match
mit Truncation-Marker-Toleranz, kein Fuzzy. Liest reale Assessments
aus gwoe-antraege.db. Fängt Bug-Klassen 7/10/17 (Halluzination).
Architektur: separates tests/integration/ Verzeichnis mit eigenem
conftest.py, das die Stubs der Unit-Suite (fitz/bs4/openai/pydantic_settings)
gezielt entfernt und auf echte Module umstellt — mit Fallback-Skip via
pytest.require_module wenn lokale Dev-Maschine die Prod-Deps nicht hat.
206 neue Integration-Tests, 13 Helper-Unit-Tests. 77 Unit-Tests bleiben grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:00:20 +02:00
|
|
|
pdf_url_substring="dokument/",
|
|
|
|
|
frontend_search_url="https://parldok.thueringer-landtag.de/parldok/",
|
|
|
|
|
),
|
|
|
|
|
# ─── SH (Starfinder-CGI) ────────────────────────────────────────────
|
|
|
|
|
GroundTruth(
|
|
|
|
|
bundesland="SH",
|
|
|
|
|
drucksache="20/4309",
|
|
|
|
|
title_substring="Gesunde Ernährung",
|
|
|
|
|
expected_fraktionen={"SSW"},
|
|
|
|
|
datum="2026-04-07",
|
|
|
|
|
pdf_url_substring="drucksache-20-04309",
|
|
|
|
|
frontend_search_url="http://lissh.lvn.parlanet.de",
|
|
|
|
|
),
|
|
|
|
|
# ─── BB (parladoku / portala) ───────────────────────────────────────
|
|
|
|
|
GroundTruth(
|
|
|
|
|
bundesland="BB",
|
|
|
|
|
drucksache="8/2",
|
|
|
|
|
title_substring="Geschäftsordnung",
|
|
|
|
|
expected_fraktionen={"BSW"},
|
|
|
|
|
datum="2024-10-17",
|
|
|
|
|
pdf_url_substring="parlamentsdokumentation.brandenburg.de",
|
|
|
|
|
frontend_search_url="https://www.parlamentsdokumentation.brandenburg.de/portal/",
|
|
|
|
|
),
|
|
|
|
|
# ─── RP (OPAL / portala) ────────────────────────────────────────────
|
2026-04-09 11:49:17 +02:00
|
|
|
# PDFs werden vom Landtag von `dokumente.landtag.rlp.de` ausgeliefert,
|
|
|
|
|
# nicht von `opal.rlp.de` (das ist nur das Suchfrontend). Substring auf
|
|
|
|
|
# die Drucksache-Nummer im Pfad — robust gegen weitere URL-Drift.
|
Add E2E functional acceptance test suite (#50, #51, #52, #53, #54)
Vier Sub-Issues unter Umbrella #50 — opt-in via 'pytest -m integration',
Default-Suite (77 Unit-Tests) bleibt unberührt.
- Sub-Issue A (#51): test_adapters_live.py — pro aktivem BL Reachability,
Drucksache-ID-Format, Type-Filter, Datum-/Fraktion-Plausibilität,
PDF-Link-HEAD-Probe (slow). NI als xfail (Login-Wall).
- Sub-Issue B (#52): test_frontend_xref.py + ground_truth.py — pro BL
ein manuell kuratiertes Frontend-Sample (Drucksache + Title-Substring +
Fraktionen + Datum + PDF-URL), gegen das adapter.get_document() gespiegelt
wird. Fängt Bug-Klasse 14 (Cross-Bundesland-Match).
- Sub-Issue C (#53): test_wahlprogramme_indexed.py — Indexing-Status pro
aktivem BL aus embeddings.db, PDF-Inhalts-Plausibilität (14 Marker +
Wahlperioden-Horizont), expliziter Anti-Marker für Bug-Klasse 8
(CDU-BE 2021 vs 2026 PDF-Tausch durch abgeordnetenwatch).
- Sub-Issue D (#54): test_citations_substring.py — Property-Verification:
jedes vom LLM zitierte Snippet muss als (whitespace-normalisierter)
Substring auf der angegebenen PDF-Seite vorhanden sein. Strict-Match
mit Truncation-Marker-Toleranz, kein Fuzzy. Liest reale Assessments
aus gwoe-antraege.db. Fängt Bug-Klassen 7/10/17 (Halluzination).
Architektur: separates tests/integration/ Verzeichnis mit eigenem
conftest.py, das die Stubs der Unit-Suite (fitz/bs4/openai/pydantic_settings)
gezielt entfernt und auf echte Module umstellt — mit Fallback-Skip via
pytest.require_module wenn lokale Dev-Maschine die Prod-Deps nicht hat.
206 neue Integration-Tests, 13 Helper-Unit-Tests. 77 Unit-Tests bleiben grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:00:20 +02:00
|
|
|
GroundTruth(
|
|
|
|
|
bundesland="RP",
|
|
|
|
|
drucksache="18/11250",
|
|
|
|
|
title_substring="Bildungschancen",
|
|
|
|
|
expected_fraktionen={"GRÜNE", "SPD", "FDP"},
|
|
|
|
|
datum="2025-01-23",
|
2026-04-09 11:49:17 +02:00
|
|
|
pdf_url_substring="11250-18",
|
Add E2E functional acceptance test suite (#50, #51, #52, #53, #54)
Vier Sub-Issues unter Umbrella #50 — opt-in via 'pytest -m integration',
Default-Suite (77 Unit-Tests) bleibt unberührt.
- Sub-Issue A (#51): test_adapters_live.py — pro aktivem BL Reachability,
Drucksache-ID-Format, Type-Filter, Datum-/Fraktion-Plausibilität,
PDF-Link-HEAD-Probe (slow). NI als xfail (Login-Wall).
- Sub-Issue B (#52): test_frontend_xref.py + ground_truth.py — pro BL
ein manuell kuratiertes Frontend-Sample (Drucksache + Title-Substring +
Fraktionen + Datum + PDF-URL), gegen das adapter.get_document() gespiegelt
wird. Fängt Bug-Klasse 14 (Cross-Bundesland-Match).
- Sub-Issue C (#53): test_wahlprogramme_indexed.py — Indexing-Status pro
aktivem BL aus embeddings.db, PDF-Inhalts-Plausibilität (14 Marker +
Wahlperioden-Horizont), expliziter Anti-Marker für Bug-Klasse 8
(CDU-BE 2021 vs 2026 PDF-Tausch durch abgeordnetenwatch).
- Sub-Issue D (#54): test_citations_substring.py — Property-Verification:
jedes vom LLM zitierte Snippet muss als (whitespace-normalisierter)
Substring auf der angegebenen PDF-Seite vorhanden sein. Strict-Match
mit Truncation-Marker-Toleranz, kein Fuzzy. Liest reale Assessments
aus gwoe-antraege.db. Fängt Bug-Klassen 7/10/17 (Halluzination).
Architektur: separates tests/integration/ Verzeichnis mit eigenem
conftest.py, das die Stubs der Unit-Suite (fitz/bs4/openai/pydantic_settings)
gezielt entfernt und auf echte Module umstellt — mit Fallback-Skip via
pytest.require_module wenn lokale Dev-Maschine die Prod-Deps nicht hat.
206 neue Integration-Tests, 13 Helper-Unit-Tests. 77 Unit-Tests bleiben grün.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 10:00:20 +02:00
|
|
|
frontend_search_url="https://opal.rlp.de/portal/",
|
|
|
|
|
),
|
|
|
|
|
]
|