- Config saves are atomic (temp file + fsync + os.replace); a crash or
power loss mid-write no longer truncates the file, which previously
caused a silent reset to defaults on next launch.
- Stored config is merged over a deep copy of the defaults: keys added
in newer versions resolve properly instead of returning None, and the
nested cached_versions dict is no longer shared with (and mutated on)
the class-level default dict.
- History SQLite connection enables WAL and a 5s busy timeout so the
download thread can record entries while the history dialog reads
without "database is locked" errors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>