Combines builds 68-80 since v1.0-build67. Two themes — faster recovery
from network-path changes (the headline user-visible improvement), and
diagnostic enrichment for log triage.
Network-path resilience
• Faster recovery from WiFi↔cellular transitions. Previously, single
transitions completed cleanly but back-to-back transitions could
leave the tunnel stuck at a fraction of NumConns capacity for
several minutes (worst case 4+ min). The pre-emptive smart-pause
mechanism now marks in-use TURN slots as quota-locked the instant
iOS reports a path change — saves the 486 retry burst that used
to cascade across slots.
• Larger credential pool. Pool size formula bumped twice (×1.5 →
×2.5 → ×4 of NumConns/10). For NumConns=30 the pool is now 12
slots (was 5), giving enough fresh headroom to absorb 3-4 back-
to-back path transitions without exhausting the cred supply.
• Smart cooldown durations. Saturation now uses precise per-slot
timing (vkAllocLifetime + safety) instead of the former fixed
11-minute flat cooldown. Saves 1-5 min of unnecessary slot
lockout per cascade.
• Two refinements after empirical observation: smart-pause skips
slots already in load-from-disk pending state (no double-tracking),
and skips "active-recent" slots whose lastUsedAt was within 2
seconds (those are brief touches by the path-cascade reconnect
cycle that didn't commit any real VK quota).
UI changes
• "Pool" indicator first number now shows ACTUALLY available slots
(fresh AND not saturated). Previously could show e.g. "8/8/8"
while all 8 slots were saturated for the next several minutes —
misleading. Now correctly displays "0/8/8" during such windows.
• Connections setting Stepper capped at 50 (was 64). Default 30.
Existing values above 50 are preserved.
• Backup Import file picker accepts any file type (was filtered
to .json/.text/.data). Fixes issue #8 case where iOS classified
a valid backup with a non-standard UTI and the picker greyed it
out. Invalid files still rejected post-selection by the schema
parser.
Diagnostic enrichment
• Per-process build version in startup log line: "[App] VKTurnProxy
launched (build N)" and "[Tunnel] startTunnel called (build N)".
Catches stale-binary mismatches.
• PathMonitor log lines now include WiFi SSID for wifi paths
(e.g. ssid="catch27") and Apple's machine-readable
unsatisfiedReason for unsatisfied paths (cellular-denied,
wifi-denied, vpn-inactive, etc.).
Internals
See commits e31d517 (builds 68-79) and bc925e7 (build 80) for
per-build technical detail. Major rejected experiment: pre-emptive
TURN Refresh(0) ("Fix B"). Empirically disproved 2026-05-10 —
VK ignores Refresh(0), quota release is timer-bound to server-side
600s lifetime regardless of client action. Smart-pause as
implemented works around the limitation by not trying.