Audit: Wisch-Zeile und Auswahlliste der App nachgezogen

Gleichlauf, Funktion und Fehler geprueft. Sauber: 28/28 Dienste ueber
const/Registrierung/services.yaml/Klarnamen, 27/27 Sensorrollen, Routen
deckungsgleich, 47 Panel-Seiten live ohne einen Konsolenfehler, App
ebenso, Fahrzeugstatus textgleich, Bestand ohne Befund ausser den drei
bekannten Altbelegen mit odometer_km als Zeichenkette.

Zwei echte Befunde, beide in der App und beide dort, wo ein juengerer
Zwilling die Korrekturen des aelteren nie bekommen hat:

WischLoeschen (Raeder-Archiv) liess den roten Loeschknopf dauerhaft
sichtbar unter der Zeile stehen - genau der Haarlinien-Fehler, den das
Panel am 16.08.2026 mit visibility:hidden behoben hat - und malte den
Zeileninhalt mit dem durchscheinenden --tile auf eine Kachel, wodurch im
Nachtmodus der Streifen heller wird und das Rot durchscheint (Regel aus
Abschnitt AP). Beides behoben und im Nachtmodus nachgemessen.

.dm-auswahl option stand auf --tile; die aufgeklappte Liste eines <select>
malt der Browser ausserhalb der Seite, ein durchscheinender Wert laesst
dort den hellen Systemgrund durch. Im Panel steht dafuer seit dem
16.08.2026 --canvas.

Zur ausgelieferten .ipa: entpackt und gelesen - Erweiterung mit echtem
Programm, beide Plugins samt Methoden im App-Programm, App-Gruppe in
beiden Profilen, Kalender- und Standortschluessel da. Fehlt nur die
CFBundleVersion der Erweiterung (der Grund fuer die abgelehnte
Installation) und der Kamera-Schluessel - beides im Skript behoben und
wirksam beim naechsten Xcode-Lauf.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-04 13:49:40 +02:00
co-authored by Claude Opus 5
parent 68732aa10f
commit 9e9ca9ca28
6 changed files with 136 additions and 7 deletions
+108 -2
View File
@@ -10,8 +10,9 @@ fuer den Zugangs-Token; dazu Debug-Mode, eine Version-Kachel, das Knopfpaar nach
HIG und Bilder ohne Verzoegerung; dazu eine Musterseite, die die App ohne Token
und ohne Netz rendert; dazu der QR-Code aus einem gespeicherten Bild, ein stiller
Debug-Knopf und der HA-Zugang bei den Zugaengen; der Cache-Brecher der Bilder haengt
jetzt am Foto statt am App-Start, `2026.9.4.14`,
Abschnitte CC bis CI. Davor: Geraetezeit statt Ankunftszeit - die Wurzel hinter der 3-km-Fahrt:
jetzt am Foto statt am App-Start; dazu ein Audit mit zwei Befunden in der
Wisch-Zeile und der Auswahlliste der App, `2026.9.4.15`,
Abschnitte CC bis CJ. Davor: Geraetezeit statt Ankunftszeit - die Wurzel hinter der 3-km-Fahrt:
das Fahrtfenster stand in Geraetezeit, der Verlauf war nach Ankunftszeit sortiert. Dazu die neun
Paritaetsbefunde und die verunreinigte Batteriehistorie, `2026.9.4.1`, Abschnitt CB. Davor: Der Regler stellt den Schlaf-Timeout des Dongles, flespi lesend und
schreibend, die eigene Warteschlange wieder entfallen, `2026.9.3.10`, Abschnitt BZ. Davor: Zugaenge: die Dienste-Token aus App und Panel bedienbar, der Wert kommt nie
@@ -10166,3 +10167,108 @@ Dazu 6 Regressionstests (`src/screens/bilder.test.ts`): Zeitstempel statt
Startzeit, gleich bleibend ohne Aenderung, wechselnd bei Aenderung, `0` fuer
ein fehlendes Foto, Rueckfall ohne Staende, und der gemerkte Stand ueber einen
Neustart.
## CJ. Audit vom 04.09.2026: zwei echte Befunde, beide in der App (2026.9.4.15)
Auftrag des Eigentuemers: Gleichlauf pruefen, Zwischenablage und
Teilen-Erweiterung beurteilen, App und Panel auf Funktion und Fehler abklopfen.
### Was sauber ist
29 Backend-Dateien `py_compile`, beide Frontend-Dateien als **Modul** geparst
(Abschnitt AQ), `tsc --noEmit`, 221 Tests, `vite build`. Tabellen in beide
Richtungen abgeglichen, ohne Abweichung:
| | |
|---|---|
| Dienste | 28 in `const.py`, 28 registriert, 28 in `services.yaml`, 28 Klarnamen |
| Sensorrollen | 27 im Katalog, 27 in der Dataclass, jede mit Beispielnamen, beide Listenfelder mit vier |
| Routen | Panel-Unterseiten und App-Titel decken sich; nur in der App: die fuenf Reiterwurzeln und `live` (LiveFahrt, ohne Panel-Gegenstueck, dokumentiert) |
**Panel live durchgelaufen**, 47 Seitenaufrufe (fuenf Reiter, alle 17
Einzelfahrten, alle 16 Einzelbelege, jede Unterseite): **kein einziger
Konsolenfehler**, keine unbehandelte Ablehnung. In der App dasselbe ueber die
angemeldete Sitzung, ebenfalls fehlerfrei.
**Textgleich zwischen Panel und App** (Vergleich am gerenderten Text): der
Fahrzeugstatus Zeichen fuer Zeichen, die Raeder-Seite bis auf den
Loeschknopf - und genau der war der Befund (unten). Die Einstellungen fuehren
in beiden dieselben acht Abschnitte in derselben Reihenfolge.
**Bestandspruefung** (18 Fahrten, 16 Tankvorgaenge, 17 Batterietage): keine
0-km-Fahrt, keine negative Strecke, keine doppelte Kennung, keine
Ueberschneidung, kein Ende vor dem Beginn, alle Spannungen in 8-16 V, der
Verlauf sortiert. Einziger Befund sind die drei bekannten Altbelege mit
`odometer_km` als Zeichenkette (`"50250"`, Abschnitt CA) - der Lesepfad faengt
sie ueber `als_kilometerstand()` ab.
### Befund 1: die Wisch-Zeile der App hatte zwei Absicherungen nicht
`WischLoeschen` (Raeder-Archiv, gebaut am 02.09.2026) ist der juengere
Zwilling von `SwipeRow` im Design-System - und hat dessen beide Korrekturen
nie bekommen:
* **Der rote Loeschknopf lag dauerhaft sichtbar unter der Zeile.** Genau daran
hatte das Panel am 16.08.2026 den Haarlinien-Fehler: Zeilenhoehen sind
gebrochen, die Kante faellt nicht auf das Pixelraster, und das Rot blitzt als
duenner Rahmen um jede Zeile durch. Panel und Design-System halten ihn
deshalb `visibility: hidden`, bis wirklich gewischt wird.
* **Der Zeileninhalt war mit `var(--tile)` gemalt** - dem durchscheinenden
Kachelton. Die Zeile liegt aber auf einer Kachel: zweimal derselbe Schleier
ergibt im Nachtmodus einen sichtbar helleren Streifen, und das Rot darunter
scheint durch. Das ist die Regel aus Abschnitt AP, wortgleich schon einmal
aufgetreten.
Beides behoben (`.dm-wisch--zeigt`, `--tile-deckend`), live im Nachtmodus
nachgemessen: Knopf `hidden`, Zeile `rgb(23,27,33)` (deckend), und „Loeschen"
steht nicht mehr im Text der Seite - wie im Panel.
### Befund 2: die aufgeklappte Auswahlliste konnte durchscheinen
`.dm-auswahl option` stand auf `var(--tile)`. Die Liste eines `<select>` malt
der Browser selbst, ausserhalb der Seite - ein durchscheinender Wert laesst
dort den hellen Untergrund des Systems durch. Im Panel steht aus genau diesem
Grund seit dem 16.08.2026 `--canvas` (`.feld select option`, mit
ausdruecklichem Kommentar). Jetzt auch in der App.
**Geprueft und NICHT geaendert:** `.dm-standort-leer` malt ebenfalls `--tile`,
aber `.standort-leer` im Panel tut dasselbe - beide gleich, also kein
Gleichlauf-Befund. Eine Aenderung waere hier eine Gestaltungsfrage fuer beide
Seiten, keine Korrektur einer Abweichung.
### Zwischenablage und Teilen-Erweiterung: der Stand vor dem naechsten Xcode-Lauf
Die **ausgelieferte** `App.ipa` (Stand `2026.9.4.5`, Commit `d819f2e`)
entpackt und gelesen. Alles daran ist richtig - bis auf den einen Punkt, der
sie unbrauchbar macht:
| | |
|---|---|
| Erweiterung `DataMetric360Share.appex` | echtes Programm, 110.320 Bytes |
| `BelegZwischenablagePlugin` / `KalenderTerminPlugin` | beide im App-Programm, samt `pdfHolen` und `terminAnlegen` |
| App-Gruppe `group.app.datametric360` | in **beiden** Bereitstellungsprofilen |
| Standort- und beide Kalender-Schluessel | vorhanden |
| URL-Schema `datametric360` | vorhanden |
| Aktivierungsregel | Anhang oder Datei, je einer - das Teilen-Blatt zeigt die App also an |
| **`CFBundleVersion` der Erweiterung** | **fehlt** - genau der Grund, aus dem iOS die Installation ablehnt (Abschnitt CD) |
| `NSCameraUsageDescription` | fehlt - der Scanner kam erst danach |
Beides ist im Skript laengst behoben und wirkt beim naechsten Lauf:
`ios-signieren.sh` schreibt eine echte Build-Nummer in **beide** Buendel,
**bricht ab**, wenn einem davon eine brauchbare fehlt, und setzt den
Kamera-Schluessel.
Der Rest der Verdrahtung ist stimmig gelesen: beide Swift-Erweiterungen
erfuellen `CAPBridgedPlugin` mit `identifier`/`jsName`/`pluginMethods`, die
Namen decken sich mit `registerPlugin("BelegZwischenablage")` bzw.
`("KalenderTermin")` und den Methodennamen auf der TS-Seite, und
`ios-teilen-einrichten.mjs` kopiert beide Dateien und haengt sie an die
Sources-Phase des App-Ziels (mit Idempotenz-Pruefung), setzt die Entitlements
auf beiden Zielen.
**Was das nicht heisst:** dass es auf dem Geraet laeuft. Swift wird hier nicht
uebersetzt, und die Lehre aus Abschnitt AK gilt unveraendert - vier von fuenf
Fehlern der nativen Huelle haben einen erfolgreichen Archivlauf erzeugt und
sind erst am fertigen `.ipa` aufgefallen. Nach dem naechsten Lauf gehoert
deshalb geprueft: `CFBundleVersion` in beiden Buendeln, `NSCameraUsageDescription`
in der App, beide Plugin-Namen im Programm.