29604db9cd
Rewrite run_pipeline's download->import section to download into a per-job staging dir (cleared before each candidate), verify completeness there, promote only a complete album into the library via import_album, tag the final dir, then DB-import. The staging dir is always removed in a try/finally, so a partial/failed download never touches or corrupts the library, and a retry can no longer leave orphan files behind. Also point test_upgrade_e2e.py's run_pipeline call at dest_root="/tmp/lib" (matching every other pipeline test) since import_album now unconditionally creates the final dir, which requires a writable dest_root.