Avatars: locked aspect changes real pixels
Fixed vector from the task book: a 2000×1000 image with aspect locked and width set to 1000 must become 1000×500. resizeDimensions returns width:1000, height:500, scale:0.5, previewOnly:false, changesEncodedDimensions:true — export dimensions match preview dimensions, no CSS-only trick.
A 4000×3000 JPEG with EXIF orientation 6 (90° CW) is first normalized to 3000×4000 with orientation reset to 1, then scaled by the same rule; export never rotates twice.
The 20 MiB / 24 MP budget is enforced up front: 6000×5000 (30 MP) returns PIXEL_BUDGET_EXCEEDED and files over 20 MiB return INPUT_TOO_LARGE. On low-memory mobile devices, reduce the dimensions first.
This round emits a JSON plan; real pixel resampling is untested.