Parity-Regel: Uebersicht-Service-Block in companion-app portiert

Nutzer stellte klar: Panel und companion-app sollen immer denselben
funktionalen Stand haben, auch wenn eine Anfrage nur das Panel nennt -
das ist reiner Testkomfort (Docker-Instanz laesst sich am schnellsten
ansehen), keine Scope-Entscheidung. Regel als verbindlicher Absatz in
AGENTS.md verankert, direkt unter der bestehenden Maintenance-Regel.

Erste Anwendung im selben Zug: die eben im Panel gebaute
"Naechster Service"-Kachel nach companion-app/ portiert.

- daten/service.ts: neues naechsterService() als Gegenstueck zu
  naechsterTermin() im Panel - waehlt ueber Oelwechsel-/Inspektions-
  Prognose und die von Hand gepflegte Hauptuntersuchung hinweg den
  zeitlich naechsten Termin. bisText() liefert denselben Artikel wie
  ART_BIS im Panel ("bis zum Oelwechsel" / "bis zur Inspektion").
- screens/Uebersicht.tsx: die bisherigen Kacheln "Reichweite"/
  "Kilometerstand" nebeneinander plus eine separate "Service"-Kachel
  mit Werteliste weichen einer Reichweiten-Kachel plus einer
  Service-Kachel mit .dm-serviceblock (Knopf, nur der obere Teil) und
  .dm-servicezeile (reine Anzeige) darunter - dieselbe Control/Content-
  Trennung wie im Panel.
- stile/screens.css: .dm-serviceblock/.dm-servicezeile ergaenzt.

Tests: 4 neue in service.test.ts (naechsterService waehlt das frueher
faellige Datum, nimmt die Hauptuntersuchung auf, liefert nichts ohne
Servicebuch/HU, bisText-Artikel je Art), 1 neuer in screens.test.tsx,
der mit einem vi.fn() als geheZu wirklich belegt, dass ein Klick auf
den Serviceblock navigiert und ein Klick auf die Kilometerstand-Zeile
es nicht tut - dafuer bekam zeige() in screens.test.tsx erst einen
injizierbaren geheZu-Parameter (vorher hart auf () => {} verdrahtet).

npm run typecheck sauber, npm run test 100/100 (von 95), npm run build
erfolgreich.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-17 20:44:31 +02:00
co-authored by Claude Opus 5
parent 600c92fd0f
commit 2848b5286f
6 changed files with 256 additions and 62 deletions
+35 -5
View File
@@ -58,6 +58,18 @@ the linked documents — this file points, it does not duplicate.
> adjust the status table, bump the "Last updated" date). This file must always be written in
> **English**, even though the rest of the project is German.
> **Parity rule (binding, stated by the owner 2026-08-17):** the HA panel
> (`homeassistant/www/audi-dashboard-app.js`) and the companion app (`companion-app/`) must
> **always be at the same functional state**. When a request names only the panel, that is *not* a
> scoping decision — the owner simply tests there because the Docker instance makes it quick to see.
> Port every user-visible change to both in the **same session**, and say so in the report. The two
> are independent implementations (vanilla JS + shadow DOM vs. React + `@audi-dash/ui`), so a port
> is a re-implementation, not a copy: keep the *behaviour and wording* identical, let each side use
> its own idiom, and skip only what genuinely cannot apply (documented per case — e.g. panel-only
> CSS bugs, or HA-panel-only concepts like the entity Setup menu). If a port is impossible or
> unreasonably large, say so explicitly instead of leaving it silently undone. This rule exists
> because the two had already drifted six days apart once (see section A).
**How this file is loaded:** Claude Code does not read `AGENTS.md` natively; the root `CLAUDE.md`
imports it via `@AGENTS.md` (official recommended pattern). Other agents (Codex, Cursor, Copilot)
read `AGENTS.md` directly. Edit content here, not in `CLAUDE.md`.
@@ -1459,11 +1471,29 @@ wraps the web app for iPhone; a PWA home-screen install is the accepted intermed
jede Odometer-Aktualisierung verschiebt sie), das Tagesdatum also mehr Genauigkeit verspricht,
als der Wert hat. Live geprüft bei 375px und 1280px: Block und Wertezeile fluchten mit der
Kachelkante (16→359 bzw. 564→1236), Chevron bündig rechts, Tippfläche 88px hoch, keine neuen
Konsolenfehler. Deployed als Version `1787006000`, synchron in `installationspaket/`.
Entwurf und Begründung als Artefakt: „Zwei Kacheln, drei Antworten“.
**Noch offen:** die Änderung existiert nur im Panel, nicht in `companion-app/` — dort steht
die Übersicht weiter mit dem alten Aufbau (siehe den Drift-Eintrag weiter oben; die beiden
Codebasen laufen sonst wieder auseinander).
Konsolenfehler. Deployed als Version `1787007000` (zwischenzeitlich auf Nutzerwunsch von
`.tile.flat` auf eine normale `.tile` mit Hintergrund umgestellt — `.serviceblock:active
{opacity:.55}` als Tipp-Rückmeldung ergänzt, da der übliche `.tilebtn`-Hintergrundwechsel
hier nicht geht), synchron in `installationspaket/`. Entwurf und Begründung als Artefakt:
„Zwei Kacheln, drei Antworten“.
- [x] **Parity rule eingeführt (2026-08-17):** der Nutzer stellte klar, dass Panel und
`companion-app/` immer denselben funktionalen Stand haben sollen — auch wenn eine Anfrage nur
das Panel nennt, das ist reiner Testkomfort (Docker-Instanz), keine Scope-Entscheidung. Regel
als verbindlicher Absatz direkt unter der Maintenance-Regel oben in dieser Datei verankert.
Als erste Anwendung sofort im selben Zug die Übersicht-Neugestaltung von oben nach
`companion-app/` portiert (siehe `Uebersicht.tsx`): `naechsterService()` in `daten/service.ts`
neu — Gegenstück zu `naechsterTermin()` im Panel, wählt über Ölwechsel-/Inspektions-Prognose
und die von Hand gepflegte Hauptuntersuchung hinweg den zeitlich nächsten Termin, `bisText()`
liefert denselben Artikel wie `ART_BIS` im Panel. Die beiden bisherigen Kacheln
"Reichweite"/"Kilometerstand" nebeneinander plus eine separate "Service"-Kachel mit
Werteliste wichen einer Reichweiten-Kachel plus einer Service-Kachel mit `.dm-serviceblock`
(Knopf, nur der obere Teil) und `.dm-servicezeile` (reine Anzeige) darunter — dieselbe
Control/Content-Trennung wie im Panel. `npm run typecheck` blieb sauber, `npm run test` auf
100/100 (von 95 — vier neue Tests für `naechsterService()`/`bisText()` in `service.test.ts`,
einer in `screens.test.tsx`, der mit einem `vi.fn()` als `geheZu` wirklich belegt, dass ein
Klick auf den Serviceblock navigiert und ein Klick auf die Kilometerstand-Zeile es nicht tut
— dafür musste `zeige()` in `screens.test.tsx` erst einen injizierbaren `geheZu`-Parameter
bekommen, vorher war er hart auf `() => {}` verdrahtet), `npm run build` erfolgreich.
- [ ] Fix remaining documentation drift (statistics claim, README gaps, obsolete TODO comment) —
text-only changes; INSTALL.md's WLAN/TommiG1 drift and stale variable names were fixed
2026-08-12 (see section B); `DESIGN_REVIEW_2026-08-13.md` and `REVIEW_main_2026-08-13.md`