fix(dashboard): pdf_key-Drift-Varianten in _pdf_group_key kanonisieren#311
Merged
Conversation
U6-Befund (UX-Review 2026-07-15): dieselbe Quelle (Bates - Information Behavior) stand unter bis zu 3 Schreibweisen nebeneinander im Dashboard. B3-Befund (Opus-Statistiker-Abnahme PR #305): _version_pair_compare verlor Bates deshalb still aus common_pdfs -- jedes v0.3.143-vs-alt-Paar zeigte "kein gemeinsamer PDF-Corpus", obwohl Bates in beiden Versionen evaluiert wurde. Ursache: _pdf_filter_key erkennt nur Volltitel-Struktur "Autor - Jahr - Titel"; "Bates - Information Behavior.pdf" (ab v0.3.143, Jahr verloren) und bare "Bates" (eval_version 1.3) fallen deshalb NICHT auf denselben Slug wie "bates-2017"/"Bates - 2017 - Information Behavior.pdf". Fix: _PDF_GROUP_ALIASES-Map in _pdf_group_key (generative/eval_dashboard.py) -- Post-Slug-Lookup fuer belegte Drift-Varianten, die die bestehende Autor-Jahr-Slug-Logik nicht erkennt. Jeder Eintrag mit DB-Beleg (run_id-Join bzw. exakte Note-Titel-Ueberschneidung, s. PR-Body) dokumentiert -- kein geratener Merge. Reine Anzeige-seitige Kanonisierung, Bestandsdaten unangetastet; da _pdf_group_key die SSoT-Gruppierungsfunktion fuer PDF-Dropdown, -Tabelle, Versions×PDF-Matrix UND den Corpus-Overlap-Guard (eval_dashboard_server.pdf_notes) ist, wirkt der Fix konsistent auf allen Konsumenten. Zwei zusaetzliche, gleich gut belegte Drift-Paare (exakte Note-Titel-Treffer in beiden Runs) im selben Aufwasch mitgenommen: rl-information-seeking- quantum.pdf -> jaiswal-2020, cobaltite-paper.pdf -> dhanasekhar-2025. test-short.pdf trotz thematischer Naehe zu Dhanasekhar NICHT gemerged (Inhalts-Identitaet ohne Quell-PDF-Diff nicht verifizierbar). Ein bestehender, davon unabhaengiger Test nutzte "Bates.pdf" nur als generischen Platzhalter (Docstring: "stellvertretend") fuer die #232-Artefaktzeilen-Sichtbarkeit -- umbenannt auf "Testquelle.pdf", um die Kollision mit dem neuen Alias zu vermeiden (keine Verhaltensaenderung am Getesteten). Tests: 6 neue + 1 angepasst (RED vor dem Fix verifiziert). Volle Suite (generative, lib/decision_engine/tests, shared/tests): 6035 passed, 3 skipped (unveraendert ggue. vorher). ruff check + format: clean. internal/dashboard/eval_dashboard.html nicht angefasst (Konsumenten-Analyse: keine eigene Gruppierungslogik im Frontend). Sichtpruefung (Playwright/ firefox-1532, read-only Kopie der echten Produktionsdaten): PDF-Dropdown und Versions×PDF-Matrix zeigen Bates/Jaiswal/Dhanasekhar je genau einmal, 0 Page-Errors.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Kurzfassung
_version_pair_compareverlor sie deshalb still auscommon_pdfs_PDF_GROUP_ALIASES-Map in_pdf_group_key(generative/eval_dashboard.py) — Anzeige-seitig, Bestandsdaten unangetastettest-short.pdf(Inhalts-Identität unsicher)common_pdfsfür v0.3.130/v0.3.143 (echte Daten):[]→["bates-2017"]Problem (belegt)
U6 (UX-Review 2026-07-15): Im Dashboard standen bis zu 3 „Bates"-Schreibweisen nebeneinander.
B3 (Opus-Statistiker-Abnahme zu PR #305):
_version_pair_compare("v0.3.130", "v0.3.143")liefertecommon_pdfs=[], obwohl Bates in beiden Versionen evaluiert wurde. Ursache:_pdf_filter_keyerkennt nur die Struktur "Autor - Jahr - Titel" (nimmt die ersten zwei " - "-Segmente). Rohdaten, die davon abweichen, fallen auf einen anderen Slug:"Bates - 2017 - Information Behavior.pdf"/"bates-2017.pdf"→ Slugbates-2017"Bates - Information Behavior.pdf"(Jahr fehlt, ab v0.3.143) → Slugbates-information-behavior"Bates"(bare, eval_version 1.3) → SlugbatesDrei verschiedene Gruppen-Keys für dieselbe Quelle.
Alias-Tabelle (jede Zuordnung mit Beleg aus den Bestandsdaten)
Ermittelt READ-ONLY aus
C:\tmp\sweep-backup-20260715-213521\atomic_analytics.db(eval_versions 1.3+4.1) + gezielter Fensterprüfung im Haupt-Repogenerative/.cache/quality_history.jsonl(eval_version 4.3, bestätigt dieselbe Drift-Variante).bates-information-behavior("Bates - Information Behavior.pdf", ab v0.3.143, bestätigt in eval_version 4.1 und 4.3)bates-2017_PDF_META["bates"]s Themenbeschreibung (Berrypicking, Begriffsgeschichte).bates(bare"Bates",note_evals.pdf, eval_version 1.3, Testlaufrun_id=test-20260519-120000)bates-2017run_idträgt inpipeline_runs.pdf_source="Bates - 2017 - Information Behavior.pdf".rl-information-seeking-quantum("rl-information-seeking-quantum.pdf", v0.3.34)jaiswal-2020"Information Seeking als Reinforcement-Learning-Task.md"(v0.3.34 und v0.3.39,"Jaiswal - 2020 - Reinforcement Learning-driven Information Seeking A Quantum Probabilistic....pdf"). Zusätzlich zitiert der v0.3.34-Lauf selbst explizit "Jaiswal et al. 2020" (NoteMoC-Quantum-inspired Reinforcement Learning Framework (Jaiswal et al. 2020).md).cobaltite-paper("cobaltite-paper.pdf", v0.3.51/v0.3.54)dhanasekhar-2025"AC magnetization studies.md"(v0.3.51/54 und v0.3.56/58,"Dhanasekhar - 2025 - Coexistence of magnetic and dielectric glassy states in alternating kagome and.pdf"), durchgängig dieselbe Fachterminologie (LuBaCo4O7, Kinetic Arrest, Dielectric/Magnetic Glassy State).Geprüft, aber NICHT gemergt:
test-short.pdf(v0.3.48) teilt dieselbe Fachterminologie mit der Dhanasekhar-Gruppe (LuBaCo4O7, Kinetic Arrest, Glassy State) — aber der Name ist rein synthetisch (kein Autor-/Titel-Bezug wie bei den anderen Kandidaten), und ob die Pipeline dieselbe Quelle oder einen bewusst anderen (kürzeren) Testausschnitt evaluiert hat, lässt sich ohne Diff der Quell-PDFs nicht verifizieren. Gemäß "bei Unsicherheit nicht zusammenführen" ausgelassen.Alle 44 distinct
pdf-Werte innote_evals(eval_versions 1.3+4.1) wurden gesichtet; keine weiteren belegbaren Drift-Paare gefunden (u. a. geprüft und bewusst getrennt gehalten:"Exploring information behaviour.pdf"— eigenständige Wilson-Quelle, nicht Bates;"Meehan - 2017 - Forster..."— Rezension von Forsters Buch, andere bibliografische Entität als"Forster - 2017 - ...";Beutelspacher/zettelkasten-primer/Porst-2014-Auszug-S1-40— stabil, keine Varianten).Wirkungsnachweis:
_version_pair_compareauf echten Daten (read-only)Reale
note_evals-Zeilen (eval_version=4.1,pipeline_version IN (v0.3.130, v0.3.143)) aus der Backup-DB, einmal mit geleerter_PDF_GROUP_ALIASES(= Stand vorher) und einmal mit der neuen Map gerechnet:Bates ist jetzt Teil des Schnittmengen-Deltas — vorher fiel es komplett heraus (
only_a/only_b, niecommon_pdfs), JEDES v0.3.143-vs-alt-Paar hätte Bates so weiterhin verloren.Konsumenten-Analyse
_pdf_group_keyist die SSoT-Gruppierungsfunktion; folgende Konsumenten wurden geprüft (alle beziehen ihren Gruppen-Key direkt oder transitiv aus dieser einen Funktion, kein Konsument dupliziert die Slug-Logik separat):_dedupe_pdf_options) — Live-Check: genau 1 "Bates"-Option ("Bates - 2017 - Information Behavior")._calc_pdf_table) — nutzt_pdf_group_keysowohl für Eval-Gruppen als auch für die Routing-Run-Zuordnung; vor dem Fix erzeugte die pdf_key='bates'-Mehrdeutigkeit (2 konkurrierende Eval-Gruppenbates-2017/bates-information-behavior) für v0.3.143 zusätzlich eine 3. Routing-only-Zeile (_calc_pdf_tables "mehrdeutiger Kurz-Key"-Regel, per-PDF-Tabelle: drei Datengrundlagen in einer Zeile, Substring-Doppelzählung, pdf_key-Drift, fehlende PDFs #194 P2) — mechanistisch die dritte der "bis zu 3" U6-Zeilen._calc_version_pdf_matrix,_version_pair_compare) — Live-Check: genau 1 Matrix-Zeile "Bates (2017)" (vorher potenziell 2, je nach Versionsauswahl), 1 Zeile "Dhanasekhar (2025)"; keine rohen Alias-Quell-Keys (cobaltite,rl-information) mehr in der Anzeige.eval_dashboard_server.py:781,pdf_notes→version_delta) — bekommt durch denselben Fix automatisch konsistente PDF-Zählung für den fix(eval-dashboard): Re-Eval-Dedup je Note in KPI-Aggregation + Corpus-Overlap-Guard fuer Versions-Delta #293-Guard.internal/dashboard/eval_dashboard.html— NICHT angefasst: Frontend hat keine eigene Gruppierungs-/Slug-Logik (geprüft, kein Treffer fürpdf_group_key/eigene Slug-Funktion), rendert nur die vom Server bereits kanonisierten Keys/Labels.Bestehende Tests, die die alte Doppel-Anzeige NICHT testeten, aber zufällig "Bates.pdf" als generischen Platzhalter nutzten (
test_pair_matrix_does_not_hardcode_exclude_known_artifact_row, Docstring selbst: "stellvertretend"), wurden auf einen neutralen Namen (Testquelle.pdf) umbenannt, um die Kollision mit dem neuen Alias zu vermeiden — keine Verhaltensänderung am eigentlich Getesteten (#232-Artefaktzeilen-Sichtbarkeit).RED-Nachweis
6 neue Tests schlugen vor dem Fix exakt wie erwartet fehl:
Nach dem Fix: alle grün.
Testnachweis
generative/tests/test_dashboard_pdf_filter.py+generative/tests/test_dashboard_version_pdf_matrix.py: 60/60 grün.test_dashboard_pdf_table.py,test_dashboard_delta_pdf_overlap.py,test_dashboard_hall_kpi.py,test_dashboard_followups.py,test_reeval_baseline_guard.py): 157/157 grün.pytest generative lib/decision_engine/tests shared/tests -q: 6035 passed, 3 skipped, 8 deselected (keine Regressionen).ruff check .+ruff format --check .: clean.Sichtprüfung (Playwright, firefox-1532-Weg)
Read-only-Kopie der echten Bestandsdaten (Backup-DB +
quality_history.jsonl) in.cache/des Worktrees geladen, Server auf Port 8069, danach Datenkopien gelöscht + Server beendet.#global-pdf, DOM-Text): genau 1 "Bates"-Option.window._lastData.pair_matrix: genau 1 Zeile mit Keybates-2017(Label "Bates (2017)"), genau 1 mit Keydhanasekhar-2025;compare["v0.3.130|v0.3.143"].common_pdfs == ["bates-2017"](und 5 weitere Versionspaare zusätzlich bestätigt).Offene Punkte
test-short.pdfbewusst nicht gemergt (s. oben) — falls später doch als Dhanasekhar-Ausschnitt verifizierbar, wäre das ein eigener, separat belegter Alias._PDF_LABELS/_PDF_META(Kurzschlüssel"bates") und_pdf_group_keys Konvention ("bates-2017"mit Jahr) besteht unverändert fort (Matrix-Label fällt für Bates auf den_pdf_short_name-Fallback "Bates (2017)" statt den registrierten Text "Bates 2017" zurück) — vorbestehend, außerhalb dieses PR-Scopes.