9623bdeede
Bug #1 (QS wrong watermark): extracted card_face_asset_path() pure helper so the (Rank, Suit) → filename mapping is tested in isolation. 6 new unit tests confirm all 52 keys are unique and each suit resolves to its correct letter. QS.png has the wrong artwork baked in (confirmed via MD5); QS_BUG.md documents the required asset replacement. Bug #2/#3 (red square / invisible black suit on Android): add_android_corner_label used TextFont { ..default() } which gives Bevy's built-in font — that font lacks U+2660–U+2666, so suit glyphs rendered as a colored missing-glyph rectangle. Threaded Option<&Handle<Font>> from sync_cards_startup/on_change → sync_cards → spawn/update_card_entity → add_android_corner_label, which now passes FiraMono explicitly. Non-Android builds silence the unused param with let _ = font_handle. Bug #4 (waste pile): static analysis found no z or fan-offset bug; two new tests (waste_pile_cards_have_strictly_increasing_z, _draw_one_cards_have_distinct_z) pin the invariant for future changes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>