pub fn plan(
target: &Snapshot,
live: &Snapshot,
payload_present: &dyn Fn(&str) -> bool,
) -> PlanExpand description
What it takes to make live look like target.
payload_present says whether a digest is in the cache, so the decision is
testable without one. An empty target is a complete uninstall: the same
operation, deliberately not a second code path.