Skip upfront source fetch when relay handles the push
Commit

The sync flow fetched the full source closure into an in-memory store before deciding which strategy would run. For relay-only paths the strategy then fetched the same closure again from source to stream to the target — every relay-eligible sync paid for the source pack twice.
Skip the upfront FetchToStore when:
- Force and prune are off (otherwise relay is disabled and materialized needs the closure).
- No desired ref already exists on target at a different hash (otherwise BuildPlans needs ancestry data for fast-forward detection, or the divergent ref will route to materialized).
In that case all plans are skips, creates, or tag-creates — incremental relay handles them via streaming FetchPack and the local store goes unread. The conservative check leaves the prior path in place for any case that might actually need the closure (force, prune, FF updates, tag retargets).
Verified end-to-end: TestRun_IntegrationSkipsLocalFetchOnRelayOnlySync asserts exactly one upload-pack fetch on a target-has-master / source-adds-release scenario, and TestRun_IntegrationKeepsLocalFetchWhenAncestryNeeded ensures the FF-update path still has the store populated for ReachesCommit.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com Entire-Checkpoint: a64da795353e