fix(dashboard): ch1-Akzeptanzbalken bei 0-Eval-Lauf ehrlich kennzeichnen + Merge-Notes als eigene Scatter-Kategorie#275
Merged
Conversation
…nen + Merge-Notes als eigene Scatter-Kategorie (#249)
This was referenced Jul 14, 2026
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.
Befund
Folge zu #237 (Rest-Backlog aus PR #246). Zwei im Issue genannte Ehrlichkeitslücken bleiben, nachdem #246 nur die Akzeptanz-KACHEL neutralisiert hat:
(a) ch1 "Akzeptanzrate je PDF" (
internal/dashboard/eval_dashboard.html,renderCharts()) färbte einen Balken tone-basiert (mint/amber/coral nachT.accept-Schwelle), auch wenn für die PDF-Gruppe 0 Notes evaluiert wurden — der Wert stammt dann rein aus Routing-Logs (accept), nicht aus Eval-Daten. Repro-Fall Run20260713-084724(M3, Schlebbe & Greifeneder):accept=100.0, n_notes=0→ vollständig grüner 100%-Balken, identischer Fehleindruck wie die #237-Kachel. Zusätzlicher Fund dabei: das(n=X)-Label wurde bein_notes===0durch einen Truthy-Check (nMap[p.l]?..., 0 ist falsy) stillschweigend weggelassen — der einzige ehrliche Hinweis verschwand genau dann, wenn er am wichtigsten wäre.(b) Scatter-Chart (ch2, Fehlerquote vs. Belegrate): gemergte, nicht evaluierte Vault-Notes (Routing "Merge" — landen im Vault, werden aber laut #237-Diagnosebefund nie separat neu evaluiert) hatten kein Fehlerquote/Belegrate-Koordinatenpaar und tauchten im Chart schlicht nicht auf — implizit als Nicht-Problem statt als eigene Kategorie sichtbar.
Live-Renderpfad ist
internal/dashboard/eval_dashboard.html+generative/eval_dashboard_server.py::_build_live_html()(fetch/data.json) — nicht das deprecated_build_html()ingenerative/eval_dashboard.py(Legacy-CLI-Pfad, per Code-Kommentar dort explizit als "NICHT dieser hier" markiert).Fix
(a)
renderCharts()ch1-Block: neuebarColor(p)-Funktion — Balken mitn_notes===0bekommen die neutrale Grau-Farbet.ink4(dieselbe gedämpfte Farbe wie die bestehende "Weitere"-Sammelkategorie in Scatter/Scaling, keine neue Farbe) statt der tone-Schwelle. Label zeigt(n=X)jetzt immer, auch bei 0 (!=null-Check statt Truthy-Check). Tooltip erklärt bein_notes===0zusätzlich "keine Eval-Basis — 0 Notes evaluiert (nur Routing-Daten)".(b) Neues Feld
n_mergepro PDF-Zeile:_accept_from_runs()(generative/eval_dashboard.py) gibt jetzt(accept, accept_ver, accept_n, n_merge)zurück — Summe der Merge-Stub-Notes auf derselben Versions-Basis wieaccept/accept_n(kein zweiter Aggregationspfad, SSoT)._calc_pdf_table()trägtn_mergein beide Zeilentypen (Eval-Gruppen + Routing-only) ein. Client liestd.pdf_table[].n_mergeund zeigt eine explizit beschriftete Legenden-Kategorie "N gemergt, nicht evaluiert" neben dem Scatter (.hint/.hint-pop-Tooltip mit PDF-Breakdown) — dieselbe visuelle Sprache (Dot + Label) wie die "Weitere"-Kategorie, keine neue CSS-Regel. Bewusst kein fiktiver Scatter-Punkt: Merge-Notes haben kein Fehlerquote/Belegrate-Wertepaar, ein erfundenes Koordinatenpaar wäre selbst eine neue Ehrlichkeitslücke.Anker-Korrektur: Issue nannte
_chart_scaling(eval_dashboard.py:1034) als Anker für (b). Nach Analyse ist_calc_pdf_table/_accept_from_runsder präzisere Anker — dort existiert bereits die Merge-Zahl pro Routing-Run (n_mergein_read_all_log_runs()),_chart_scalingselbst aggregiert nur Wörter-vs-Notes-Zahl (Chart 3, unverändert).TDD — RED-Beleg
generative/tests/test_dashboard_ch1_merge_scatter_honesty.py, 9 Tests. RED vor dem Fix:Nach Fix: alle 9 GREEN (4 Python-Datenschicht-Tests direkt gegen
_accept_from_runs/_calc_pdf_table, 5 String-Marker-Tests gegen_build_live_html()— gleiches Muster wie #246).Suite + Lint
pytest generative lib/decision_engine/tests shared/tests -q: 5866 passed, 3 skipped, 8 deselected.ruff check+ruff format --checkauf geänderte Dateien: sauber.Verifikation (Playwright-Browser-Launch fehlgeschlagen, siehe unten — Ersatzverifikation)
Server entkoppelt aus dem Worktree gestartet (Port 8064,
ATOMIC_DB_PATHauf eine reine Kopie der Analytics-DBC:\tmp\249-db.db, nur lesend zugegriffen). Playwright-Firefox startete 3x in Folge mit identischem Fehler (<process did exit: exitCode=0>sofort nach Launch — systemisches Sandbox-Problem, kein Fluke). Ersatz: die IDENTISCHE JS-Logik ausrenderCharts()/_mergedBreakdown/_mergedLegendChip1:1 in ein Node-Skript kopiert und gegen ECHTE/data.json-Antworten des laufenden Servers ausgeführt:20260713-084724(n_notes=0, accept=100.0, n_merge=1, verifiziert per/data.json?run=20260713-084724): Balkenfarbe#7e92a6(=--ink-4, neutral/grau, NICHT mint/grün), Label"Schlebbe und Greifen… (n=0)", Tooltip["100 % akzeptiert", "keine Eval-Basis — 0 Notes evaluiert (nur Routing-Daten)"]./data.json, u. a. 2 Routing-only-Zeilen mitn_notes=0UNDn_merge>0): Merge-Chip"34 gemergt, nicht evaluiert"korrekt gerendert.#6dbf8c= mint) — der Guard trifft nurn_notes===0-Zeilen.--ink-4ist in beiden Themes definiert (:rootdunkel#7e92a6, Light-Override#6b6b6b) — automatisch hell/dunkel-tauglich ohne neue CSS-Regel.NUL-Byte-Invarianten von
eval_dashboard.htmlvor/nach Edit geprüft: exakt 1 (unverändert).Eigener Server-Prozess nach Verifikation beendet, Port 8064 wieder frei.
Geänderte HTML-Regionen
Ausschließlich
renderCharts()ch1-/ch2-Block undrenderScatter()(+ 2 neue Helper-Funktionen_mergedBreakdown/_mergedLegendChipdirekt davor) — keine Berührung der KPI-Kachelleiste (#kpis,kpiDefs), die parallel von einem anderen Agenten bearbeitet wurde.Closes #249