fix(ratio): respect any ratio's dump intent, not just Hank's
Six sites hardcoded the dump-stat check as
ratioKey === 'hank' && roles.tert2 === key
which meant the rep allocator and grade ignored every other ratio's
dump declaration:
- Aec3 declares forcedDump: 'dex' but the planner queued reps for DEX
when it was below its 13.51% target.
- Custom ratios with one or more 0-multiplier slots were trained
anyway, since only tert2 was checked.
- "Only train 2 stats" / "only train 3 stats" builds had no clean
declarative way to be honoured.
Replace all six sites with a single helper:
isStatDumped(key, ratioKey, roles)
That returns true when:
- RATIOS[ratioKey].forcedDump matches
key (Aec3 → DEX), OR
- The ratio's multiplier for whichever role
key occupies is 0
(Hank's tert2; or any Custom slot zeroed out — this is what makes
2/3-stat builds work without further code changes).
Sites updated:
computeRepPlan (rep allocator)
overallGrade (overall ratio grade)
getDriftWarnings (per-stat drift detection)
buildExportText (export panel display)
renderOverview x2 (recommended stat picker + per-stat status)
Effect for Aec3 + DEX dump (the user's loadout): DEX is now skipped
in the rep planner, the grade, drift warnings, recommended stat,
status row, and exported text. Reps redistribute to STR/SPD/DEF based
on whichever is most behind its ratio target. Hank behaviour is
preserved (its tert2 multiplier of 0 still triggers the skip).
Custom ratios automatically get the same treatment for any 0-multiplier
slot — including 2-stat or 3-stat training plans without further code.
Co-Authored-By: Claude Opus 4.7 (1M context) [email protected]