···11# Changelog
2233+## 0.2.4
44+55+Review fixes: type safety, error handling, cleanup.
66+77+- `LadderTimeoutError` class replaces regex-based timeout detection
88+- `Exporter` interface now includes optional `setEstimatedBatchBytes`
99+- Staging directory created once per exporter, not per subprocess
1010+- Guard against negative byte estimates in timeout calculation
1111+- CLI `--version` now reports correct version
1212+313## 0.2.3
414515Skip slow assets, finish the rest, retry later.
616717### Skip-and-defer
81899-- **Individual retry on batch timeout** — when a batch times out, each asset
1010- is retried individually to find the slow one(s). Fast assets proceed
1111- immediately; slow ones are deferred.
1919+- **Individual retry on batch timeout** — when a batch times out, each asset is
2020+ retried individually to find the slow one(s). Fast assets proceed immediately;
2121+ slow ones are deferred.
1222- **Deferred retry** — assets that timed out individually are retried with a
1323 longer timeout after all remaining batches complete.
1424- **Clear feedback** — you see exactly which file is slow:
···1727 Batch timed out — retrying 50 assets individually...
1828 Deferring BIG_VIDEO.MOV (video, 450.2 MB) — timed out, will retry after remaining batches
1929 ```
2020-- **Size-scaled timeouts** — 5 min base + 1 min per 100 MB of estimated
2121- batch size.
3030+- **Size-scaled timeouts** — 5 min base + 1 min per 100 MB of estimated batch
3131+ size.
2232- **Sorted batches** — photos first (by size), then videos (by size).
2323-- **Retry hint** — summary shows `Run attic backup again to retry failed
3333+- **Retry hint** — summary shows
3434+ `Run attic backup again to retry failed
2435 assets.` when there are failures.
25362637## 0.2.2
+1-1
cli/mod.ts
···14141515const main = new Command()
1616 .name("attic")
1717- .version("0.2.3")
1717+ .version("0.2.4")
1818 .description("Back up your iCloud Photos library to S3-compatible storage")
1919 .action(function (this: Command) {
2020 this.showHelp();