Session 54: Audit cleanup — name edges + polish (2255 tests)

P1 name edge cases (BOTH playerName.js copies, kept identical):
- normalizeName strips hyphens (display+key): "Jung-hoo Lee" === "Jung Hoo Lee".
- nameKey strips single-letter MIDDLE tokens: "Josh H Smith" === "Josh Smith"
  (keeps first+last; real middle names + collapsed initials untouched).
- richie -> richard added to NICKNAMES.

P2 polish:
- Team Hub names normalized at the source (teamService.getTeamHub) so
  "J.C. Escarra" renders as "JC Escarra" like the dashboard.
- snapshotService dedup keeps the highest-confidence GRADE but the richest
  DISPLAY (accented "José" over "Jose") so prop rows match the pitcher line.
- correlationWarning names the game: "2 legs from the same game (NYY @ BOS)".

Backend 2246 -> 2255 tests (+9), 194 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 15:45:07 -04:00
parent b012da13f8
commit 8629021774
11 changed files with 137 additions and 12 deletions
+11
View File
@@ -63,6 +63,17 @@ describe('getTeamHub (MLB, injected)', () => {
expect(await svc.getTeamHub('mlb', 'ZZZ', { mlbAdapter, cacheGet: cache.cacheGet, cacheSet: cache.cacheSet })).toBeNull();
});
it('normalizes roster player display names (no dots) — Session 54', async () => {
const dotted = {
...mlbAdapter,
async getTeamRoster() { return [{ id: 99, name: 'J.C. Escarra', position: 'C' }]; },
async getSeasonAverages() { return null; },
};
const cache = memCache({ 'grades:mlb': { grades: [] } });
const hub = await svc.getTeamHub('mlb', 'NYY', { mlbAdapter: dotted, cacheGet: cache.cacheGet, cacheSet: cache.cacheSet });
expect(hub.roster[0].player).toBe('JC Escarra');
});
it('caches the assembled hub (writes teamhub:{sport}:{abbr})', async () => {
const cache = memCache({ 'grades:mlb': gradesEnv });
await svc.getTeamHub('mlb', 'NYY', { mlbAdapter, cacheGet: cache.cacheGet, cacheSet: cache.cacheSet });