Skip to content

fix(dashboard): Spark-Row-Gruppenposition + Accept-Kachel-Klickbarkeit (#274-Nachbesserung)#290

Merged
TillQuandel merged 2 commits into
masterfrom
fix/274-spark-row-gruppenposition
Jul 15, 2026
Merged

fix(dashboard): Spark-Row-Gruppenposition + Accept-Kachel-Klickbarkeit (#274-Nachbesserung)#290
TillQuandel merged 2 commits into
masterfrom
fix/274-spark-row-gruppenposition

Conversation

@TillQuandel

Copy link
Copy Markdown
Owner

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-row sitzt 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-row immer direkt unter der Gruppe der angeklickten Kachel erscheint (idx<4 = dieselbe Slice-Grenze wie kpiDefs.slice(0,4)/.slice(4) in renderKpis). Reposition läuft sowohl beim Frisch-Öffnen als auch beim Umschalten zwischen den Gruppen bei bereits offener Row. renderKpis fasst die Row selbst nicht an (nur die innerHTML der beiden Kacheln-Container) — sie springt also zwischen periodischen Re-Renders (15s-Poll) nicht zurück. closeKpiSpark unverä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-Marker insertAdjacentElement('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 ihr sparkless:true mit 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:true entfernt, veralteten Begründungs-Kommentar korrigiert.

Trend-Datenkette geprüft (wie angefragt): kpiTrend.accept wird in eval_dashboard_server.py über _pooled_accept() aus all_log_runs (gepoolt n_vault/n_total je 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.accept liefert 50 echte Werte (z. B. [None, 83.3, 57.1, 40.0, 100.0, ...]), kpi_accept_n=64. Die separate db.query_kpi_trend()-Funktion (db.py:275, accept_rate) ist ein anderer, ungenutzter Codepfad (nur in migrate_jsonl_to_sqlite.py/conftest.py referenziert) — 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 mit null werden übersprungen, Linie unterbrochen) greifen für accept bereits identisch wie für hall/cov/dur/tokens — keine Sonderbehandlung nötig.

TDD: test_kpi_accept_tile_is_clickable_again — RED vor dem Fix (sparkless noch im kpi-accept-Eintrag), GREEN danach. Isoliert auf kpi-accept: kpi-wall/kpi-tokens-billable bleiben sparkless (dafür fehlt serverseitig weiterhin eine Zeitreihe je Version).

NUL-Byte-Guard

internal/dashboard/eval_dashboard.html hat 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 -q5893 passed, 3 skipped, 8 deselected, 0 failed (644s). ruff check . sauber. ruff format --check . sauber bis auf den vorbestehenden, unabhängigen Fund test_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 von C:\tmp\kpi-db.db), danach beendet.

  1. Klick #kpi-hall (Qualität-Gruppe): #spark-row hat Klasse open UND ist direktes nextElementSibling von #kpis-quality — PASS. Screenshot: Fehlerquote-Trend direkt unter der Qualitäts-Reihe, vor dem "Kosten & Performance"-Sub-Head.
  2. Klick #kpi-dur ("Agent-Rechenzeit", untere Gruppe, nicht sparkless — anders als #kpi-tokens-billable/#kpi-wall): Row wandert unter #kpis-perf (open, nextElementSibling von #kpis-perf) — PASS. Screenshot: Trend direkt unter der Kosten&Performance-Reihe.
  3. Toggle-Klick (#kpi-dur erneut): Row schließt (open-Klasse entfernt) — PASS.
  4. Zusatz: Klick #kpi-accept (jetzt wieder klickbar): Row öffnet unter #kpis-quality, zeigt echten Trend "Automatisch akzeptiert — Versions-Trend" mit realen Datenpunkten — PASS.
  5. Keine pageerror-Events während des gesamten Durchlaufs.

Gesamtergebnis: PASS (Skript-Assertion über alle 4 Schritte).

Tilltime added 2 commits July 15, 2026 01:00
…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.
@TillQuandel TillQuandel merged commit 3eb89a5 into master Jul 15, 2026
1 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants