Session 47: Name normalization + grade intel + ticker polish (2149 tests)
- Name normalization completed: NICKNAMES table (Matt↔Matthew, Mike↔Michael...)
resolved in nameKey, parenthetical team-tag strip "(STL)", verified accent-fold
(Iván/Ivan, José/Jose). Slate strip now DISPLAYS the normalized de-dotted name
("AJ Ewing" not "A.J. Ewing") via buildPlayerStripsFromProps.
- Complete MLB VYNDR INTELLIGENCE: mlbGameLogFeatures derives rest_days (days off
between latest games; 0=B2B) + ab_per_game (usage). buildIntelFields renders
usage as "X AB/G", rest as B2B/Xd, matchup from bvp_advantage fallback.
- Ticker SCAN dedup: pushTickerItems keeps one SCAN per sport (sport field or
text-prefix parse for legacy); MOVE/GRADE preserved; cap 50.
- BOMBER threshold prorated for mid-season (hr>=15 strong / >=10 mod) so June
sluggers classify BOMBER not FLEX/DRIVER.
Backend 2122 -> 2149 tests (+27), 179 suites. Web build clean (exit 0).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -473,6 +473,26 @@ snapshot, locked to the line, and read from cache.
|
||||
team (full name OR mascot via `slateAdapter.buildPitcherMap`/`pitchersForGameTeams`).
|
||||
ERA is best-effort (season stats per pitcher id, cached).
|
||||
|
||||
## Name Norm + Intel + Ticker (Session 47 — non-obvious)
|
||||
- **Name normalization is now complete:** `playerName.js` (both copies, kept
|
||||
identical) strips parenthetical team tags ("(STL)"), de-dots, suffix-strips,
|
||||
accent-folds the key, AND resolves first-name nicknames via the `NICKNAMES`
|
||||
table ("matt"→"matthew"). `nameKey` does the nickname resolution; `normalizeName`
|
||||
does display/key. To add a nickname, edit BOTH copies. The SLATE displays the
|
||||
normalized de-dotted name (`buildPlayerStripsFromProps` → `normalizeName().display`),
|
||||
not raw PropLine — that's why "AJ Ewing" shows, not "A.J. Ewing".
|
||||
- **MLB VYNDR INTELLIGENCE fields** come from `mlbGameLogFeatures`: `rest_days`
|
||||
(gap-1 between the two latest game dates; 0 = B2B), `ab_per_game` (usage). If a
|
||||
field is missing from the card, check that `mlbGameLogFeatures` produced it and
|
||||
`buildIntelFields` has a branch (usage reads usage_rate→minutes→ab_per_game;
|
||||
matchup reads opp_rank_stat→bvp_advantage).
|
||||
- **Ticker SCAN dedup:** `pushTickerItems` keeps one SCAN per sport (via the
|
||||
`sport` field on the event, or parsed from the text prefix for legacy items).
|
||||
MOVE/GRADE are time-specific and never deduped.
|
||||
- **BOMBER threshold is prorated for mid-season** (`hr>=15` strong / `hr>=10`
|
||||
moderate). If you re-tune archetype thresholds, remember season totals are
|
||||
partial mid-season — don't use full-season cutoffs.
|
||||
|
||||
## Active Skills
|
||||
- vyndr-voice (all user-facing output)
|
||||
- prop-analysis (grading methodology)
|
||||
|
||||
Reference in New Issue
Block a user