Closes#73
Adds POST /api/v2/evolution/cards/{card_id}/evaluate — force-recalculates
a card's evolution state from career totals (SUM across all
player_season_stats rows for the player-team pair).
Changes:
- app/services/evolution_evaluator.py: evaluate_card() function that
aggregates career stats, delegates to formula engine for value/tier
computation, updates evolution_card_state with no-regression guarantee
- app/routers_v2/evolution.py: POST /cards/{card_id}/evaluate endpoint
plus existing GET /tracks and GET /tracks/{id} endpoints (WP-06)
- tests/test_evolution_evaluator.py: 15 unit tests covering tier
assignment, advancement, partial progress, idempotency, fully evolved,
no regression, multi-season aggregation, missing state error, and
return shape
- tests/__init__.py, tests/conftest.py: shared test infrastructure
All 15 tests pass. Models and formula engine are lazily imported so
this module is safely importable before WP-01/WP-05/WP-07/WP-09 merge.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>