- Pin boto3==1.42.65 to match project convention of exact version pins
- Use player_id (not player) for FK column access in card_storage.py
to match the pattern used throughout the codebase
- Add comment explaining the tier is None guard in S3 upload scheduling
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New service with S3 upload functions for the refractor card art
pipeline. backfill_variant_image_url reads rendered PNGs from disk,
uploads to S3, and sets image_url on BattingCard/PitchingCard rows.
18 tests covering key construction, URL formatting, upload params,
and error swallowing.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
NumPy 2.x requires X86_V2 instruction set (SSE4.2/AVX) which
the production server CPU doesn't support. Pin to numpy 1.x
to avoid RuntimeError on startup.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>