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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user