Fix
- Update checker no longer reports a "downgrade" as available update. Switched to ordered numeric version comparison; only strict-newer remote versions trigger the notice. Non-numeric tags (-SNAPSHOT etc.) fall back to string-equals.
Update checker
Performance
- Polls SpigotMC every 6 h for new versions, plus one check at plugin start.
- Surfaces in /ds version, the System block of /ds status, and as a one-shot click-to-download notice for ops on join.
- Async, 5 s timeout, never blocks the main thread.
- Toggle via update-checker.enabled in config (default on).
Translations
- %datasync_player_session_owned% placeholder used to block the main thread on a Redis round-trip per evaluation — switched to a local ownership check. Scoreboard / tab-list plugins no longer cause tick stutter on slow Redis.
- DataSynchronizationAPI#isSessionOwned() bounds the remote lookup at 100 ms; a stalled Redis returns best-effort false instead of hanging the caller.
- Session-heartbeat and pause-expiry-sweep FINE loggers switched to lazy suppliers — no per-player string building when the log level is off.
- /ds status no longer allocates a fresh map copy on every getPausedPlayers() read; returns a live unmodifiable view.
- Bundle meta.version 2 → 3. On-disk YAMLs auto-migrate on first start: the old file is backed up as <name>.yml<random-suffix>, the fresh bundle takes its place. New update-checker keys added to en, de, es, pt_br, fr, pl.
- API Coordinates unchanged: de.squarecodefx:datasynchronization-api:2026.5.2 (API version 1.0.0). No breaking changes.
- isSessionOwned() Javadoc now documents the 100 ms best-effort timeout.
