- Rename `evolution_tier` parameter to `refractor_tier` in compute_variant_hash()
to match the refractor naming convention established in PR #131
- Update hash input dict key accordingly (safe: function is new, no stored hashes)
- Update test docstrings referencing the old parameter name
- Remove redundant parentheses on boost_delta_json TextField declaration
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pure functions for computing boosted card ratings when a player
reaches a new Refractor tier. Batter boost applies fixed +0.5 to
four offensive columns per tier; pitcher boost uses a 1.5 TB-budget
priority algorithm. Both preserve the 108-sum invariant.
- Create refractor_boost.py with apply_batter_boost, apply_pitcher_boost,
and compute_variant_hash (Decimal arithmetic, zero-floor truncation)
- Add RefractorBoostAudit model, Card.variant, BattingCard/PitchingCard
image_url, RefractorCardState.variant fields to db_engine.py
- Add migration SQL for refractor_card_state.variant column and
refractor_boost_audit table (JSONB, UNIQUE constraint, transactional)
- 26 unit tests covering 108-sum invariant, deltas, truncation, TB
accounting, determinism, x-check protection, and variant hash behavior
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>