# Kiano Diag 2.1 — diagnoza i poprawka single-owner

## Przed poprawką (artefakt 2.0)
- `onCreate()` uruchamiał `ensureServerLoop()` oraz osobny wątek `keepAliveLoop()`.
- `keepAliveLoop()` po braku/ zamknięciu socketu wymuszał `serverLoopRunning=false` i wywoływał `ensureServerLoop()`.
- `serveLoop()` był równolegle właścicielem pola `server`, zamykał je na wejściu oraz po błędzie.
- Dowód z `/events`: wielokrotne `SERVER_LISTEN`, `SocketException: Socket closed` i `BindException: EADDRINUSE`.

## Zmiana w 2.1
- Usunięto start wątku `kiano-keepalive-20`; nie ma już kodu, który może równolegle wyzerować stan i utworzyć drugi listener.
- Jedynym właścicielem `ServerSocket` jest pętla uruchamiana przez `ensureServerLoop()` / `serveLoop()`.
- Przy starcie wpisywane jest zdarzenie:
  `SERVER_OWNER=serveLoop keepalive_restart=disabled`.
- Wersja raportowana przez endpointy została zmieniona na `2.1-single-owner`.

## Weryfikacja lokalna
- Złożono zmodyfikowany `classes2.dex` ze smali.
- APK przechodzi `apksigner verify` dla v1, v2 i v3.
- Artefakt: `Kiano_Diag_2.1_SINGLE_OWNER_UNDEPLOYED.apk`.

## Blokada wdrożenia
Poprawiony APK ma inny certyfikat podpisu niż obecnie zainstalowany 2.0:
- 2.0: `85:01:29:11:3F:BC:BE:1C:D7:B9:44:DA:28:2A:C1:A0:93:50:09:92:2D:C7:34:12:3B:F8:EC:28:7D:C8:5B:8C`
- lokalny klucz debug: `90:21:87:0B:87:51:F8:44:60:3B:A8:61:70:77:38:E2:FF:97:B3:74:F0:FB:34:2C:B7:22:1C:1E:1A:A0:3B:B5`

Android odrzuci aktualizację tego samego pakietu z innym podpisem. Nie wysłano APK do TV, ponieważ wdrożenie zakończyłoby się przewidywalnym błędem `INSTALL_FAILED_UPDATE_INCOMPATIBLE`. Nie podejmowano prób uzyskania roota ani obchodzenia podpisu.
