Startup no longer blocks on a download. New split:
- services/installer.py: download_and_stage() (runs while the app is open →
staging\app.new, verified) and apply_staged() (launcher swaps it into app\
at next launch, when the exe isn't locked).
- launcher.py: slimmed to seed + apply_staged + launch; no network at startup.
- main_window: a new version lights a dot on the ⚙ 配置 button instead of a
blocking banner; the old open-folder banner is removed.
- settings_dialog: "检查并更新" downloads + stages, then "下次启动生效".
Verified end-to-end over a local HTTP server (download→stage→apply); 101 tests
pass (test_installer +11, test_launcher rewritten).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>