bug
A dry run is destructive. The blob unlink is guarded by `if !dry_run` (line 125), but every "removed" candidate is still pushed to `gone` and `forget(&index, &gone)` is called unconditionally, deleting index entry files (lines 249-257). `?dry_run=true`, documented as reporting "without removing anything" (sweep.rs:87-88, docs/operations.md), actually deletes index entries for every blob the hypothetical sweep would take — which, on an over-ceiling store, is most of the index.
services/proxy/src/sweep.rs:140
Evidence quote
Not recorded
Suggested fix
Not recorded