Session 7e: Grade adapter, normalize consolidation, ARCH-2 banners

This commit is contained in:
Kev
2026-06-10 03:37:07 -04:00
parent 6f4a353de9
commit 012c0ef47e
11 changed files with 571 additions and 60 deletions
+10
View File
@@ -1,4 +1,14 @@
/**
* ARCH-2 (Session 7e): LEGACY circuit breaker. The canonical implementation
* lives in src/utils/rateLimiter.js (createCircuitBreaker factory).
* New code should import from there.
*
* Current callers of this legacy module (remove this file when the list
* empties):
* - src/services/UnifiedOddsProvider.js
* - src/services/adapters/ESPNAdapter.js
* - src/services/adapters/PinnacleAdapter.js
*
* Per-upstream circuit breaker.
*
* States:
+3 -21
View File
@@ -23,32 +23,14 @@
const { reverseLineMovement, juiceDegradation, getLineMovement } = require('./lineMovement');
const { getSupabaseServiceClient } = require('../../utils/supabase');
// DUP-1 (Session 7e): consolidated into src/utils/normalize.js.
// Trap matching strips digits — keepDigits stays at the default false.
const { normalizeName } = require('../../utils/normalize');
function inactive(reason) {
return { score: 0, active: false, explanation: reason };
}
// Normalize player names for matching across data sources. ParlayAPI may
// emit "Brunson, Jalen" while ESPN emits "Jalen Brunson" — strip case,
// punctuation, suffixes, and collapse whitespace so equivalence works.
//
// DUP-1 (Session 7c): a near-identical implementation lives in
// scripts/populate-player-ids.js. The script's variant keeps digits
// (some legacy roster fields encode jersey numbers); this one strips
// them because trap matches go by player name only. If the script
// stops needing digits, consolidate to a shared util.
function normalizeName(name) {
if (!name) return '';
return String(name)
.normalize('NFD')
.replace(/[̀-ͯ]/g, '')
.toLowerCase()
.replace(/\b(jr|sr|ii|iii|iv|v)\.?\b/g, '')
.replace(/[^a-z\s]/g, ' ')
.replace(/\s+/g, ' ')
.trim();
}
// Detect whether a key teammate transitioned from OUT in the recent past
// to AVAILABLE now. Called by the orchestrator (Section 2) before invoking
// the trap detector — the orchestrator owns the injury-history context.
+10
View File
@@ -1,4 +1,14 @@
/**
* ARCH-2 (Session 7e): LEGACY rate limiter. The canonical implementation
* lives in src/utils/rateLimiter.js (factory pattern, paired with
* createCircuitBreaker). New code should import from there.
*
* Current callers of this legacy module (remove this file when the list
* empties):
* - src/services/UnifiedOddsProvider.js
* - src/services/adapters/ESPNAdapter.js
* - src/services/adapters/PinnacleAdapter.js
*
* Token bucket rate limiter, per upstream key.
*
* Each upstream (ESPN, Pinnacle, DK, etc.) gets its own bucket so a runaway