- compute_variant_hash: use refractor_tier key, json.dumps with sort_keys
instead of str(), add variant=0 remapping guard
- Section 5.3.1 step 3: scaling denominator is total_requested_addition,
not total_requested_reduction
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Section 5.3 of 05-rating-boosts.md described profile-based boost
distribution (power/contact/patient hitter profiles) that was never
built. Updated to document the actual shipped algorithms: fixed column
deltas for batters and TB-budget priority drain for pitchers, both in
database/app/services/refractor_boost.py.
Corrected the truncation behavior — the implementation scales positive
deltas proportionally rather than discarding them, preserving the
108-sum exactly in all cases.
Updated REFRACTOR_PHASE2_VALIDATION_SPEC.md T4-1 to reflect shipped
function signatures and marked the case as complete.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Allow upload scripts to target a local API server instead of the remote
production server, enabling 32x+ concurrency for dramatically faster
full-cardset uploads (~30-45s vs ~2-3min for 800 cards).
- pd_cards/core/upload.py: add api_url param to upload_cards_to_s3(),
refresh_card_images(), and check_card_images()
- pd_cards/commands/upload.py: add --api-url CLI option to upload s3
- check_cards_and_upload.py: read PD_API_URL env var with prod fallback
- Update CLAUDE.md, CLI reference, and Phase 0 project plan docs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>