Paste/file fallback, pixel budget & frame degradation
Input semantics. The Input scenario selector offers desktop-paste, mobile-no-permission, file-picker and clipboard-denied. Desktop Ctrl/Cmd+V with an image in the clipboard reaches pasted; a mobile device without clipboard permission, a denial, or an empty clipboard reaches awaiting-file and recommends choosing a file. allowFileSelect=true and fileInputVisible=true hold in every scenario. Real File/Blob inputs cannot be decoded this round: DECODER_UNAVAILABLE is returned and the input is preserved.
Early blocking. Change image to {"id":"big","width":4000,"height":4000,"bytes":1000,"hasAlpha":false,"format":"jpeg"}, padding to 512, frame.kind to none and scale to 2. 4000×4000 is exactly at the 16 MP input boundary; the 1x design canvas is 5024×5024, so 2x needs 10048×10048 = 100.96 MP. checkExportBudget returns EXPORT_PIXEL_LIMIT with suggestedScale=1; phases stop at budget, no canvas is allocated and no blank result appears.
Frame failure. Set frame.assetStatus to failed, loading or missing: resolveFrame returns applied=false, degraded=true, exportable=true, fallback:"frameless", the layer list contains no frame layer, and a complete frameless plan is still exported. Device frames need licensed artwork; without verification they also degrade to frameless and no unlicensed asset is bundled.
Background switching. Choosing Solid dark replaces only background; image, crop, padding, radius, frame, preset, format and scale are all preserved (real assertions on workspaceReducer and switchBackground).