test(variety): extract and test sub-score/warnings pure functions
- Extract computeSubScores() and computeWarnings() to variety.ts
- 18 unit tests covering formulas, boundaries, clamping, edge cases:
- proteinDiversity: repeats × 2 penalty, clamped to 0
- ingredientOverlap: overlaps × 1.5 penalty, clamped to 0
- effortBalance: easy-hard diff × 1.5, total=0 → 10
- warnings: repeat≥2 days, overlap≥2 days, duplicates
Addresses QA blockers: untested business logic in sub-score derivations.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>