check / check (push) Successful in 26s
backup() is now a Library method: it refreshes, fetches each pending original (and, optionally, thumbnail) through the content cache and pools, then rebuilds the sidecar, symlink, and per-collection JSON views from the model. The downloadDirectory layout and the exit-code contract are unchanged. An original already on disk is treated as complete and never re-fetched, so runs are idempotent and an interrupted run resumes from the directory listing. Per-file download and symlink failures are recorded in a durable failures.json (classification, attempt count, last-tried) and no longer abort the run, subsuming #8. exit stays non-zero while any failure remains. The CLI now opens a Library and calls backup(). Model: opus-4-8