Versionsvergleich: nur eine neuere Fassung zaehlt

Nach dem Xcode-Lauf lief die App auf 2026.9.4.17, die Instanz auf
2026.9.4.5 - und die App bot an, sich auf .5 zu erneuern. Die
Gleichheitspruefung konnte den Rueckschritt nicht sehen.

versionOrdnung() sortiert jetzt Stelle fuer Stelle als Zahl, aber nur was
dem Format JJJJ.M.T.N entspricht; sonst gibt es eine Abweichung ohne
Richtung. Streifen, Startblatt und OTA-Knopf schlagen nur noch an, wenn
die App nachweislich aelter ist. Damit ist die frueher dokumentierte
Entscheidung "nur auf Gleichheit" umgedreht - Begruendung in
VERSIONIERUNG.md und AGENTS.md Abschnitt CL.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 16:10:47 +02:00
parent 6365136275
commit cefb235f6d
12 changed files with 328 additions and 33 deletions
+97
View File
@@ -10477,3 +10477,100 @@ einer anderen Adresse steht, muss prozentkodiert werden - oder er gehoert dort n
hin. Die frueheren, erfolgreichen Installationen liefen alle ueber die blanke
Manifest-Adresse; der Zusatz kam am 04.09. dazu und ist seither nie durch eine
gelungene Installation gegangen.
## CL. Der Versionsvergleich kennt jetzt eine Richtung (2026.9.4.19)
Gemeldet nach dem ersten Start der frisch installierten `.17`: „App laeuft auf
4.17, bereit liegt 4.5. Sie kann sich direkt hier erneuern." Die reale Instanz
stand noch auf `2026.9.4.5` - angeboten wurde also ein **Rueckschritt um zwoelf
Fassungen**, der die Oberflaeche still auf den Stand vom Vormittag zurueckgedreht
haette (ohne QR-Scanner, ohne Bestaetigungsblatt, ohne Debug-Bereich), waehrend
die native Huelle auf `.17` geblieben waere. Danach haetten App und Server
uebereingestimmt und die Meldung waere verschwunden - der Verlust also still.
**Die alte Pruefung konnte das nicht sehen**, und zwar folgerichtig: sie
verglich nur auf Gleichheit. Das Buendel (`.5`) passte zur Serverfassung (`.5`)
und war ungleich der laufenden (`.17`) - beide Bedingungen erfuellt, Knopf da.
Dass `.5` **aelter** ist als `.17`, war ihr per Konstruktion unzugaenglich.
**Vorgabe des Eigentuemers:** erkannt wird eine neuere Fassung und keine andere.
### Eine dokumentierte Entscheidung wurde damit umgedreht
`appVersion.ts` und `VERSIONIERUNG.md` sagten bis hierher ausdruecklich das
Gegenteil - „bewusst kein groesser/kleiner-Vergleich: die Version ist eine
Kennung, keine Zahl. Ein Sortierversuch waere scheingenau und wuerde bei einem
Formatwechsel still falsche Antworten geben." Beide Stellen sind umgeschrieben,
nicht ergaenzt (Regel dieses Dokuments: ueberholte Regeln entfernen, nicht
stapeln).
**Der Einwand von damals ist eingebaut, nicht verworfen:** `versionOrdnung()`
sortiert ausschliesslich, was dem Format `JJJJ.M.T.N` entspricht - jede Stelle
muss eine reine Ziffernfolge sein, geprueft mit einem Muster und **nicht** mit
`parseInt`, das `4b` klaglos als 4 gelesen und damit genau die scheingenaue
Antwort erzeugt haette. Passt eine Seite nicht ins Schema, kommt `null` zurueck:
dann meldet die App eine Abweichung **ohne Richtung** und bietet nichts an.
Verglichen wird Stelle fuer Stelle als Zahl - zeichenweise stuende `.17` vor
`.5`, also genau der gemeldete Fall.
### Was sich wo aendert
| Lage | Streifen | Startblatt | OTA-Knopf |
|---|---|---|---|
| App aelter | „bitte aktualisieren" | ja | ja |
| **App neuer** | **still** | **nein** | **nein** |
| verschieden, nicht sortierbar | neutraler Hinweis | nein | nur bei Serveruebereinstimmung |
| gleich / nicht vergleichbar | still | nein | nein |
`Versionsstand` heisst jetzt `gleich | aelter | neuer | abweichend | unbekannt`;
`abweichend` bedeutet nur noch „verschieden, aber nicht sortierbar". Der Streifen
meldet diesen Fall **neutral** statt zu schweigen - der Grundsatz „nie eine
stille Veraltung" gilt auch dort, nur ohne eine Richtung zu behaupten, die nicht
belegt ist.
`buendelPasst()` behaelt seine bisherigen Bedingungen und bekommt eine dritte:
das Buendel muss **vorwaerts** gehen. Ist die Reihenfolge nicht bestimmbar, gilt
weiter die alte Regel (nur Serveruebereinstimmung) - eine erfundene Reihenfolge
waere schlechter als die Regel von vorher.
### Kein Panel-Gegenstueck, und das ist geprueft
Das Panel liest `APP_VERSION` an genau drei Stellen und **zeigt** sie nur an
(`vEinst()`, Zeile 3417). Es vergleicht nichts und kennt kein OTA-Buendel - es
laedt seine Dateien bei jedem Aufruf frisch und kann gar nicht veralten. Echte
Ausnahme von der Paritaetsregel, kein stillschweigend ausgelassener Port.
### Verifiziert
`tsc --noEmit` sauber, **244 Tests** (von 225; 6 neue fuer `versionOrdnung()`,
5 fuer den Rueckschritt in `buendelPasst()`, 2 fuer das Startblatt, dazu zwei
geaenderte Erwartungen in `appVersion.test.ts` - die Richtungsangabe ist eine
gewollte Verhaltensaenderung, kein Bruch). `vite build` sauber, Panel als Modul
geparst, `audi_ha_test` auf `2026.9.4.19` sauber gestartet, kein Traceback.
**Gegen den alten Stand als fehlschlagend nachgewiesen:** mit ausgehaengter
Reihenfolgepruefung fallen drei der neuen Tests um, darunter der gemeldete Fall
wortwoertlich (`buendelPasst(.5, laeuft .17, Server .5)` liefert dann `true`).
**Live in allen drei Lagen**, ohne den Container anzufassen - dafuer bekam nur
der Entwicklungsserver voruebergehend eine andere einkompilierte Nummer,
waehrend die Instanz durchgehend auf `.19` stand:
| einkompiliert | Instanz | Streifen | Startblatt | OTA-Knopf |
|---|---|---|---|---|
| `.99` (App voraus) | `.19` | still | nein | **nicht vorhanden** |
| `.18` (App zurueck) | `.19` | „aelter als der Server" | - | - |
| `.19` (gleich) | `.19` | still | nein | nein |
Das Startblatt erscheint im Browser grundsaetzlich nicht (`otaMoeglich()`, nur
nativ) - seine Entscheidung ist deshalb ueber `hinweisFaellig()` geprueft, nicht
optisch. Das Manifest steht danach wieder auf `2026.9.4.19`, gleichauf mit dem
Buendel (sha256 `58969a38…`).
### Was der Eigentuemer davon merkt
Die Meldung auf dem Telefon verschwindet nicht durch dieses Update - die App
laeuft ja auf `.17` und bekommt `.19` erst, wenn die Instanz sie ausliefert. Der
Weg bleibt: **erst die Integration auf der realen Instanz aktualisieren**
(Einstellungen -> Version -> pruefen, installieren, neu starten), danach bietet
die App den Schritt `.17` -> `.19` an, und der geht vorwaerts.