From 25e36c0257c3fe753c8982815db5e4aa2ab532e9 Mon Sep 17 00:00:00 2001 From: Kev Date: Mon, 3 Aug 2026 22:07:40 -0400 Subject: [PATCH] =?UTF-8?q?Fix=20the=20doubled=20/leaderboard=20path=20?= =?UTF-8?q?=E2=80=94=20the=20fielding=20feed=20404'd=20silently?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BASE already ends in /leaderboard, so the new feed built .../leaderboard/leaderboard/outs_above_average and 404'd. Because a failing feed degrades to an EMPTY index by design -- correct behaviour, so one broken source cannot fail the whole mechanism pull -- it surfaced as 'fielding_oaa: 0 rows' rather than as an error, which reads exactly like 'Statcast has no fielding data'. Worth noting as a class: graceful degradation makes a wiring bug look like an honest absence. Verified: 514 fielders, 31 teams. Cubs +56 OAA, Mariners -29. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01W1sivYNqY2TS5ftykmHBU9 --- src/services/adapters/statcastAdapter.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/services/adapters/statcastAdapter.js b/src/services/adapters/statcastAdapter.js index 762372f..c0ab163 100644 --- a/src/services/adapters/statcastAdapter.js +++ b/src/services/adapters/statcastAdapter.js @@ -71,7 +71,10 @@ const FEEDS = Object.freeze({ // other six feeds measures fielding at all, and the obvious substitutes // (a team's pitchers' hits-allowed) conflate pitching WITH defence and would // validate the wrong skill. Measured live 2026-08-03: 513 fielders. - fielding_oaa: (y) => `${BASE}/leaderboard/outs_above_average?type=Fielder&startYear=${y}&endYear=${y}&split=no&team=&range=year&min=1&pos=&roles=&viz=hide&csv=true`, + // NOTE: BASE already ends in /leaderboard — do not repeat it here (a doubled + // path 404s, and because a failed feed degrades to an EMPTY index by design, + // it reports as "0 fielders" rather than as an error). + fielding_oaa: (y) => `${BASE}/outs_above_average?type=Fielder&startYear=${y}&endYear=${y}&split=no&team=&range=year&min=1&pos=&roles=&viz=hide&csv=true`, }); /** statsapi — free, no key. Two calls that complete the Tier-A joins.