fix(dashboard): Spark-Row-Gruppenposition + Accept-Kachel-Klickbarkeit (#274-Nachbesserung)#290
Merged
Merged
Conversation
…ten Kachel (#274-Nachbesserung) Till-Live-Fund: Nach dem KPI-Gruppen-Umbau (#274) sitzt die einzige #spark-row fix im HTML nach #kpis-perf. Klick auf eine Kachel der oberen Gruppe "Qualität" oeffnete die Versions-Trend-Row deshalb unter der FALSCHEN (unteren) Gruppe statt direkt darunter. _openKpiSpark haengt die Row jetzt per insertAdjacentElement('afterend', ...) dynamisch unter die Gruppe der angeklickten Kachel (idx<4 = Qualitaet, dieselbe Slice-Grenze wie kpiDefs.slice(0,4)/.slice(4) in renderKpis). Reposition laeuft in beiden Faellen (Frisch-Oeffnen UND Umschalten zwischen den Gruppen bei bereits offener Row) — renderKpis selbst fasst die Row nicht an (nur die innerHTML der beiden Kacheln-Container), sie springt also zwischen periodischen Re-Renders nicht zurueck.
…entlich stillgelegt (Till-Live-Fund) #221 (#204 P8g) hatte der Kachel "Automatisch akzeptiert" sparkless:true gegeben mit der Begruendung, ch4 "Akzeptanzrate über Versionen" zeige den Trend bereits — die Klick-Sparkline sei ein reines Duplikat. Till stuft das als Regression ein: ch4 zeigt die Rate JE PDF (mehrere Linien pro Version, Median), die Kachel-Sparkline dagegen die GEPOOLTE Rate ueber alle PDFs — dieselbe Semantik wie die Klick-Sparklines von Fehlerquote/Belegrate daneben. Kein Duplikat, also wieder klickbar. sparkless:true entfernt + veralteten Kommentar korrigiert. Trend-Datenkette geprueft: kpiTrend.accept (eval_dashboard_server.py, _pooled_accept aus all_log_runs, gepoolt n_vault/n_total je Version) war bereits vollstaendig verdrahtet und unveraendert seit vor #221 — #221 hat nur den Klick-Handler im Frontend entfernt, die Datenkette nie angefasst. n-Guard (n<20) und Null-Handling in _trendChart greifen fuer 'accept' bereits generisch wie bei hall/cov/dur/tokens, keine Sonderbehandlung noetig.
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 (Till-Live-Meldung)
Klick auf eine Kachel der oberen Gruppe "Qualität" (z. B. Fehlerquote) öffnete die Versions-Trend-Row nicht direkt unter der oberen Reihe — die einzige
#spark-rowsitzt im HTML fix nach#kpis-perf(untere Gruppe). Vor dem #274-Umbau (eine Kachelreihe) lag sie korrekt direkt darunter.Fix
In
_openKpiSpark(idx):const host = document.getElementById(idx < 4 ? 'kpis-quality' : 'kpis-perf'); host.insertAdjacentElement('afterend', row);— vor dem Öffnen/Umschalten, damit die eine#spark-rowimmer direkt unter der Gruppe der angeklickten Kachel erscheint (idx<4= dieselbe Slice-Grenze wiekpiDefs.slice(0,4)/.slice(4)inrenderKpis). Reposition läuft sowohl beim Frisch-Öffnen als auch beim Umschalten zwischen den Gruppen bei bereits offener Row.renderKpisfasst die Row selbst nicht an (nur dieinnerHTMLder beiden Kacheln-Container) — sie springt also zwischen periodischen Re-Renders (15s-Poll) nicht zurück.closeKpiSparkunverändert.TDD
generative/tests/test_dashboard_kpi_groups.py::test_spark_row_relocates_to_clicked_kpi_group_on_open— RED vor dem Fix (Move-Logik-MarkerinsertAdjacentElement('afterend', row)fehlte), GREEN danach.#221-Regression: Accept-Kachel-Klick wiederhergestellt (Till-Befund)
Bei der Untersuchung fiel eine zweite, unabhängige Regression auf: Die Kachel "Automatisch akzeptiert" (
kpi-accept) war bis Commit 9726c96 (#221, 2026-07-12) klickbar. #221 gab ihrsparkless:truemit der Begründung, ch4 "Akzeptanzrate über Versionen" (Trade-off-Sektion) zeige den Trend bereits — die Klick-Sparkline sei ein Duplikat.Till stuft das als Regression ein: ch4 zeigt die Rate je PDF (mehrere Linien pro Version, Median), die Kachel-Sparkline dagegen die gepoolte Rate über alle PDFs — dieselbe Semantik wie die Klick-Sparklines von Fehlerquote/Belegrate daneben. Kein reines Duplikat.
Fix:
sparkless:trueentfernt, veralteten Begründungs-Kommentar korrigiert.Trend-Datenkette geprüft (wie angefragt):
kpiTrend.acceptwird ineval_dashboard_server.pyüber_pooled_accept()ausall_log_runs(gepooltn_vault/n_totalje Pipeline-Version) gebaut und war bereits vollständig verdrahtet — #221 hat nur den Frontend-Klick-Handler entfernt, nie die Datenkette angefasst. Live-Check gegen/data.json:kpi_trend.acceptliefert 50 echte Werte (z. B.[None, 83.3, 57.1, 40.0, 100.0, ...]),kpi_accept_n=64. Die separatedb.query_kpi_trend()-Funktion (db.py:275,accept_rate) ist ein anderer, ungenutzter Codepfad (nur inmigrate_jsonl_to_sqlite.py/conftest.pyreferenziert) — nicht die Quelle für das Frontend-kpiTrend.Das generische n<20-Delta-Warnhinweis-Muster (
(n<20)im Delta-Text) und die Null-Lücken-Behandlung in_trendChart(Punkte mitnullwerden übersprungen, Linie unterbrochen) greifen füracceptbereits identisch wie für hall/cov/dur/tokens — keine Sonderbehandlung nötig.TDD:
test_kpi_accept_tile_is_clickable_again— RED vor dem Fix (sparklessnoch imkpi-accept-Eintrag), GREEN danach. Isoliert aufkpi-accept:kpi-wall/kpi-tokens-billablebleibensparkless(dafür fehlt serverseitig weiterhin eine Zeitreihe je Version).NUL-Byte-Guard
internal/dashboard/eval_dashboard.htmlhat 1 gewolltes NUL-Byte (Trenner in einem.join('\0')). Vor/nach allen Edits per Python geprüft:count(b'\x00') == 1— unverändert. Keine bash-grep/sed-Edits verwendet.Suite
pytest generative lib/decision_engine/tests shared/tests -q→ 5893 passed, 3 skipped, 8 deselected, 0 failed (644s).ruff check .sauber.ruff format --check .sauber bis auf den vorbestehenden, unabhängigen Fundtest_vault_writer.py(siehe separater Hotfix-PR, nicht Teil dieses Diffs).Playwright-Klick-Verifikation
Firefox über
playwright-core(firefox-1532), eigener Server aus dem Worktree auf Port 8066 (ATOMIC_DB_PATH= Kopie vonC:\tmp\kpi-db.db), danach beendet.#kpi-hall(Qualität-Gruppe):#spark-rowhat KlasseopenUND ist direktesnextElementSiblingvon#kpis-quality— PASS. Screenshot: Fehlerquote-Trend direkt unter der Qualitäts-Reihe, vor dem "Kosten & Performance"-Sub-Head.#kpi-dur("Agent-Rechenzeit", untere Gruppe, nicht sparkless — anders als#kpi-tokens-billable/#kpi-wall): Row wandert unter#kpis-perf(open,nextElementSiblingvon#kpis-perf) — PASS. Screenshot: Trend direkt unter der Kosten&Performance-Reihe.#kpi-durerneut): Row schließt (open-Klasse entfernt) — PASS.#kpi-accept(jetzt wieder klickbar): Row öffnet unter#kpis-quality, zeigt echten Trend "Automatisch akzeptiert — Versions-Trend" mit realen Datenpunkten — PASS.pageerror-Events während des gesamten Durchlaufs.Gesamtergebnis:
PASS(Skript-Assertion über alle 4 Schritte).