oven+lith: fail loud on uniform-color thumbnail duds
Oven `grabPiece` was silently downgrading uniform-color captures to a
256x256 still WebP — exactly 528 bytes, byte-identical every time, so
Pinata always returned the same CID for repeated rebakes. The keep
pipeline then recorded that stale CID with `thumbnailFallback: null`,
making the bake look successful while the piece's thumbnail stayed
frozen on whatever black frame had been captured first.
Oven: when caller passes `skipCache:true`, retry the animated capture
up to 3 times on uniform-color frames, and throw on the final attempt
instead of falling through to the dud-still encoder. Frozen content
(legitimately identical frames) is unchanged. Non-fresh callers keep
the legacy still-frame fallback.
Lith: the rebake path now retries the oven /grab call up to 3 times on
forceFresh, and treats "returned CID matches the existing thumbnail"
as a soft failure (silent Pinata dedup) so we retry instead of looping
the same broken bytes forever. Also surfaces oven's response body in
the error message for easier diagnosis.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>