2d2a1db0

By: Michael Lynch <git@mtlynch.io>

Reserve PhotoFiles for true photos; add MediaFiles.Thumbnails

Animated photos never consume a display-size variant, so they no longer
flow through PhotoFiles: ProcessAnimatedPhoto and PhotoFiles() now operate
on plain MediaFiles, and PhotoFiles() panics on any type but photo. This
makes "is a PhotoFiles" mean exactly "has a display-size variant," dropping
the dead zero-value DisplaySize field for animated items.

Add MediaFiles.Thumbnails() and route writeThumbnails and the tinybeans
import through it, replacing the duplicated desktop/mobile slice literal
and the two transposable positional args.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

Suite timing

Time to Start Worker time Duration Time to finish
Config 15s 5s 5s 21s
Eval 19s 56s 56s 1m15s
Build 48s 3m36s 1m54s 2m43s
Suite 15s 4m38s 2m27s 2m43s

Timeline

0s20s30s40s50s1m1m10s1m20s1m30s1m40s1m50s2m2m10s2m30s2m40s