feat(dashboard): Erklär-Tooltips für Fachbegriffe auf KPI-Kacheln und Chart-Überschriften#219
Open
TillQuandel wants to merge 3 commits into
Open
feat(dashboard): Erklär-Tooltips für Fachbegriffe auf KPI-Kacheln und Chart-Überschriften#219TillQuandel wants to merge 3 commits into
TillQuandel wants to merge 3 commits into
Conversation
… Chart-Überschriften (closes #187) CSS-only Hover-Tooltips (.hint/.hint-pop, kein JS-Framework) erklären Halluzinationsrate/Fehlerquote, Belegrate/Coverage, Automatisch akzeptiert, n-Angaben, Delta-/Ziel-Chips, die Gesamt-Zeile, alle Chart-Ueberschriften sowie die Kalibrierungs- und Vergleichs-Sektion. Texte sind aus dem Berechnungscode hergeleitet (eval_dashboard.py/_calc_kpis, eval_dashboard_server.py/build_data, lib/decision_engine/aggregation.py) und machen Summe-vs-Median-Unterschiede explizit (#198 Punkt 4). Zusaetzlich .kpis-Container von overflow:hidden auf sichtbare Ecken-Radien an .kpi:first-child/:last-child umgestellt, da das Clipping sonst die oberhalb der Kacheln aufklappenden Tooltips abgeschnitten hat.
…valides Fokus-Markup (#187 Nachbesserung) Cross-Model-Review (Fable + Qwen) an PR #219 fand 6 verbleibende Fehler: 1. Die 4 Hint-Trigger auf den KPI-Kacheln (Label, n-Tag, Delta-Chip, Ziel-Chip) hatten tabindex="0", sassen aber innerhalb des Kachel- <button> (ungueltige Verschachtelung fokussierbarer Elemente). tabindex entfernt -- Tooltip bleibt hover-faehig, Keyboard-Zugang laeuft ueber den Button. 2. Hints "Laufzeit"/"Pipeline-Tokens" behaupteten einen Fallback auf Gesamtwerte, falls die aktuelle Version keine Laeufe hat. cur_dur_h/ cur_tokens (eval_dashboard.py:_calc_kpis) sind aber immer Zahlen (Summe ueber leere Liste = 0), der ??-Fallback greift nie -- Laufzeit zeigt dann "0,0 h", Pipeline-Tokens (zusaetzliche Falsy-Pruefung im Template) einen Strich "-". Texte korrigiert. 3. Hint "Evaluierte Notes" (Ziel-Chip) verschwieg den Zaehler/Nenner- Mismatch: n_notes ist nur die aktuelle Version, total_generated alle Versionen. Text praezisiert. 4. Hint "Fehlerquote" behauptete unbedingt gepoolte Berechnung; _pooled_hall_pct hat einen dokumentierten Mean-Fallback fuer Rows ohne Roh-Zaehler (aeltere DB-Eintraege vor 2026-06-27). Caveat ergaenzt. 5. Kalibrierungs-Strip: .hint lag auf dem Label-<div> (block) statt wie ueberall sonst auf einem <span> -- Unterstreichung zog sich ueber die volle Blockbreite. Auf <span> innerhalb des Label-<div> umgestellt (4 Stellen). 6. KPI-Kachel-<button> behielt title="Klick: Versions-Trend" -- ueberlagerte beim Hover ueber Label/n-Tag/Chip das native title mit dem CSS-Hint-Pop. title durch aria-label ersetzt. Nicht Teil dieser Nachbesserung: die 3 Tooltips der Vergleichstabelle (Spaltenkoepfe Fehlerquote/Belegrate) und des Charts "Akzeptanzrate je PDF" beschreiben die Aggregations-Semantik von _calc_pdf_table vor PR #222 -- werden im #222-Branch korrigiert (#222 muss nach diesem PR gemergt werden). PR-Body von #219 um Nachbesserungs-Abschnitt ergaenzt (gh pr edit).
TillQuandel
pushed a commit
that referenced
this pull request
Jul 12, 2026
…nden-Randfaelle (#204 Nachbesserung) Externes Review (Fable + Qwen) an PR #221 fand 5 Nachbesserungspunkte: 1. loadAndRender(): catch-Block entfernte .refreshing bisher unbedingt, obwohl der Erfolgspfad per seq-Guard vor Stale-Renders schuetzt — bei ueberlappenden Requests (schneller Filterwechsel) riss ein fehlschlagender AELTERER Request die Dimmung fuer einen noch laufenden NEUEREN weg. Entfernung jetzt an denselben seq-Guard gebunden. 2. Refresh-Dimmung (pointer-events:none auf .main) sperrte kurzzeitig auch die Filterbar beim automatischen 15s-Poll. loadAndRender(manual=true) -Parameter; Poll ruft loadAndRender(false) — dimmt nur bei manuellem Filterwechsel. 3. ch8-Achse erzeugte bei kleinen Datenstaenden (kumulierte Laufzeit <60s, Onboarding-Szenario) fraktionale Ticks mit voller Float-Praezision. ticks.precision:1 + Ausgabe ueber bestehendes _fmtDE (Komma, 1 Dezimale). 4. ch3-Legende gruppierte schon ab >5 Keys statt wie Vorbild ch2 ab >6 (t.enc.length) — bei exakt 6 PDFs erschien unnoetig "Weitere (1 PDFs)" inkl. Singular-Fehler. Schwelle angeglichen, Label pluralisiert korrekt. 5. renderKpis: bei gleichzeitigem n<20 UND abweichender Stichprobenbasis erklaerte der title nur die n<20-Bedeutung, der Asterisk blieb unerklaert. title kombiniert jetzt beide Bedeutungen. Test-Assertion in test_dashboard_quick_wins.py an den neuen setInterval(() => loadAndRender(false), 15000)-Aufruf angepasst. PR-Body von PR #221 korrigiert: "#217 keine Ueberschneidung" war falsch (.kpi.no-spark kollidiert mit #217s mehrzeiligem .top-Block), #219-Konflikt- liste war unvollstaendig (renderStrip-cell()-Aufrufe fehlten, Tokens-Zelle). Suite: pytest generative lib/decision_engine/tests shared/tests -q -> 5695 passed, 3 skipped, 4 deselected, 0 failed. ruff format/check clean.
…ible Name bleibt Kachelinhalt (#187 Runde 2)
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.
Ansatz
CSS-only Hover-Tooltips (
.hintTrigger + verschachteltes.hint-popals Kind-Element, keinattr()/data-Attribut, kein JS-Framework) auf allen in #187 geforderten Stellen. Erklärtexte sind aus dem Berechnungscode hergeleitet (siehe Tabelle unten), nicht geraten. Bestehendes Muster geprüft (PR #209 "Cache-Quote"): das ist ein Chart.js-Daten-Tooltip mit bereits eingebauter Formel-Erklärung — kein zweites Glossar-System nötig, daher unverändert übernommen statt dupliziert.Technik:
<span class="hint" tabindex="0">Label<span class="hint-pop">Erklärung</span></span>..hint= gepunktete Unterstreichung +cursor:help+position:relative..hint-pop= absolut positionierte Box,opacity 0→1bei:hover/:focus-visible. Rechtsbündige Variante (left:auto;right:0) für strukturell rand-nahe Elemente (:last-childin KPI-Reihe/Strip/Panel-Reihe/Tabellenkopf), damit nichts über den Viewport hinausragt.Bugfix unterwegs:
.kpis { overflow:hidden }hat die oberhalb der Kachel-Labels aufklappenden Tooltips abgeschnitten (nur ein Sliver sichtbar). Ursache war Eckenradius-Clipping für den Hover-/Tone-Hintergrund an Rand-Kacheln — jetzt stattdessen direkter Radius an.kpi:first-child/:last-child,overflow:hiddenentfernt. Kein Effekt auf Non-Hover-Zustand (siehe Screenshots).Begriff → Tooltip-Text → Code-Quelle
eval_dashboard.py:_calc_kpis(avg_accept)eval_dashboard.py:_pooled_hall_pct,lib/decision_engine/aggregation.py:hallucination_rateeval_dashboard.py:_calc_kpis(avg_cov),aggregation.py:confirmed_rate_calc_kpis(n_notes)_calc_kpis(cur_dur_h) vs._chart_tokens_by_version(duration_minMedian) — Summe-vs-Median-Klarstellung aus #198 Punkt 4_calc_kpis(cur_tokens)_calc_kpis(cur_cost_usd),config.compute_cost_per_callnBase-Logik,_DELTA_MIN_Neval_dashboard.py:version_deltaTHRESH_ACCEPT/HALL/COV_calc_kpis(n_pdfs,n_versions,total_runs,total_generated)_calc_kpis(total_accepted) +renderStripextend)orchestrator.py(n_merge)orchestrator.py(dropped_total),build_dataDB-Fallback_calc_kpis(total_tokens)_chart_tokens_by_version/kpi_trend.cost_per_note(#196 P2, PR #209)_chart_acceptance_chart_scatter_versioned_chart_tokens_by_version_chart_tokens_by_version(duration_min) — Summe-vs-Median #198 Punkt 4_read_agent_stats_chart_scaling,mark_scaling_recency_chart_longitudinal_read_calibration_data,_avg_agreement_calc_pdf_tableVerifikation
C:/tmp/verify-187/*.png(8 Screenshots + 2 Responsive-Bonusshots bei 1200/900px). Automatisierter Sweep über alle 42 Tooltip-Stellen (7 Sektionen × Re-Check = 294 Einzelprüfungen): 0 Overflow, 0 fehlende Box, opacity 1→0 korrekt bei Hover/Weg-Bewegen, keine JS-Konsolenfehler.pytest generative lib/decision_engine/tests shared/tests -q→ 5693 passed, 3 skipped, 4 deselected, 0 failed (nur HTML geändert, keine Python-Logik betroffen).format --check .(246 Dateien bereits formatiert) +check .→ beide sauber.<=5%ist noch „gut", Text sagte „unter 5%"), (2) fehlender Fallback-Hinweis bei Laufzeit/Pipeline-Tokens-Kacheln (cur_X ?? total_X).Merge-Hinweis zu #217
Nach PR #217 (
fix/213-kpi-layout) mergen. Konfliktfläche geprüft (git diff master...origin/fix/213-kpi-layout): #217 ändert exakt dieselben KPI-/Strip-CSS-Regeln (.strip .cell .sub,.kpicontainer-type,.kpi .topmin-height,.kpi .value-row/.v/.u), die dieser PR nicht anfasst — meine Änderungen sind reine Markup-Ergänzungen (neue.hint/.hint-pop-Spans) plus eine neue, eigenständige CSS-Regel (.kpis-Overflow-Fix an anderer Stelle im Block). Ein Merge-Konflikt ist daher unwahrscheinlich, aber nicht ausgeschlossen, da beide PRs denselben CSS-Block editieren — bei Konflikt beide Änderungssätze behalten (additiv, keine sich widersprechenden Werte).Closes #187
Nachbesserung (Cross-Model-Review Fable + Qwen, 2026-07-12)
Externes Review (Fable + Qwen, konsolidiert) fand 6 verbleibende Fehler in dieser Fassung, alle gefixt (Commit
fix(dashboard): Tooltip-Texte an tatsaechliche Berechnung angepasst, valides Fokus-Markup (#187 Nachbesserung)):tabindex="0", saßen aber innerhalb des<button>der Kachel.tabindexauf diesen 4 Spans entfernt — Tooltip bleibt hover-fähig, Keyboard-Zugang läuft über den umschließenden Button.cur_dur_h/cur_tokens(eval_dashboard.py:_calc_kpis) immer Zahlen (Summe über leere Liste = 0), der??-Fallback greift nie — Laufzeit zeigt dann „0,0 h", Pipeline-Tokens (wegen zusätzlicher Falsy-Prüfung im Template) einen Strich „–". Texte auf das tatsächliche Verhalten korrigiert.n_notes) ist aber nur die aktuelle Version, Nenner (total_generated) alle Versionen. Text präzisiert._pooled_hall_pcthat einen dokumentierten Mean-Fallback für Rows ohne Roh-Zähler (ältere DB-Einträge vor 2026-06-27). Caveat ergänzt..hintauf dem Label-<div>(block) statt wie überall sonst auf einem<span>— die gepunktete Unterstreichung zog sich über die volle Blockbreite. Auf<span>innerhalb des Label-<div>umgestellt (4 Stellen).<button>behielttitle="Klick: Versions-Trend"— beim Hover über Label/n-Tag/Chip erschienen nativestitleUND CSS-Hint-Pop gleichzeitig.titledurcharia-labelersetzt.Nicht Teil dieser Nachbesserung: Die 3 Tooltips der Vergleichstabelle (Spaltenköpfe „Fehlerquote"/„Belegrate") und des Charts „Akzeptanzrate je PDF" beschreiben die Aggregations-Semantik von
_calc_pdf_tablevor PR #222 — #222 ändert genau diese Berechnung. Diese 3 Texte werden im #222-Branch korrigiert. #222 muss nach diesem PR gemergt werden, sonst laufen die Tooltip-Texte wieder aus dem Ruder.Runde 2 (Opus + Mistral konvergent, 2026-07-12)
Der
aria-label="Klick: Versions-Trend"aus Punkt 6 der ersten Nachbesserung war selbst fehlerhaft: Er überschreibt laut WAI-ARIA Accessible-Name-Computation den kompletten Button-Textinhalt, wodurch Screenreader auf allen KPI-Kacheln nur noch „Klick: Versions-Trend" statt Label+Wert vorlesen. Fix (Commit86d3570):aria-labelersatzlos entfernt (Button-Textinhalt ist der korrekte Accessible Name), Klick-Hinweis stattdessen als Halbsatz an den Label-Hint-Pop-Text angehängt, damit die Information nicht verloren geht.