Serve old builds pictures by image id, and keep legacy pictures findable

Three gaps for builds and rows from before picture ids:
- Image payloads go without assetId to clients that don't ask for it
  (acceptsPictureIds on the snapshots and applyBatch): such a client
  keeps no assetId, so a copy would read to it as an unsaved change.
- images:getAssetUrl answers for an image's own id with the picture it
  shows, as old builds ask when a picture's address expires.
- A picture from before upload statuses is looked up among its own
  strategy's rows first: copies keep pictures' ids across strategies,
  so twenty copies could fill a lookup of every strategy's rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3665677216Dara Adedeji committed on 10/10/2026, 8:35:58 PMparent09301ab

Checks

All checks passed
10 files changedLine totals unavailable