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:
Kev
2026-06-19 01:45:36 -04:00
parent c8fc9f577e
commit 78db55d499
13 changed files with 346 additions and 32 deletions
+35 -2
View File
@@ -4,8 +4,41 @@
2026-06-18
## Current Phase
SHIP BUILD v46.0 — Grade-card intel (MLB game logs) + player-name normalization
+ MLB starting pitchers. Three focused P1 fixes on the Session-45 snapshot model.
SHIP BUILD v47.0 — Name normalization completed (nicknames/accents/parens),
full MLB VYNDR INTELLIGENCE (rest/usage), ticker SCAN dedup, BOMBER threshold.
## Session 47 (2026-06-19) — SHIPPED ✅ NAME NORM + INTEL + TICKER POLISH
Backend 2122 → **2149 tests** (+27), 179 suites. Web build clean (exit 0).
### Phase 1 — complete name normalization
`playerName.js` (both copies) gained: parenthetical-tag strip ("Jose Fermin (STL)"
→ "Jose Fermin"), a ~50-entry NICKNAMES table resolved in `nameKey` ("Matt"↔
"Matthew", "Mike"↔"Michael"), and the existing accent-fold now verified for
Iván/Ivan, José/Jose. The slate strip now DISPLAYS the normalized de-dotted name
(`buildPlayerStripsFromProps` uses `normalizeName().display`) — "A.J. Ewing" shows
as "AJ Ewing", not the raw PropLine string.
### Phase 2 — complete VYNDR INTELLIGENCE for MLB
The audit showed only Form. `mlbGameLogFeatures` now also derives `rest_days`
(days off between the two most recent game-log dates; 0 = B2B, matching the NBA
convention) and `ab_per_game` (the MLB "usage" equivalent). `buildIntelFields`
renders `usage` as "X AB/G", `rest` as "B2B"/"Xd rest", and a matchup grade from
`bvp_advantage` when no opp rank. So MLB grade cards now show Form + Usage + Rest
(+ Matchup when available).
### Phase 3 — ticker SCAN dedup
`pushTickerItems` keeps only the LATEST SCAN per sport (drops prior SCAN events
for any sport with a fresh scan; parses the sport from a `sport` field or the
text prefix for legacy items). MOVE/GRADE events preserved; cap stays 50.
### Phase 4 — archetype threshold
BOMBER's HR thresholds prorated for mid-season (`hr>=15` strong / `hr>=10`
moderate, was `>=20`/`>=15`), so June sluggers (Schwarber/Harper ~17-18 HR)
classify as BOMBER instead of FLEX/DRIVER. `computeLineDeltas` re-verified
structurally sound (deltas populate on the 2nd+ snapshot).
## Session 46 (2026-06-18) — SHIPPED ✅ P1 FIXES
## Session 46 (2026-06-18) — SHIPPED ✅ P1 FIXES