{"id":1202,"date":"2026-05-26T17:22:27","date_gmt":"2026-05-26T21:22:27","guid":{"rendered":"https:\/\/scootercam.net\/blog\/?p=1202"},"modified":"2026-05-26T17:22:29","modified_gmt":"2026-05-26T21:22:29","slug":"scout-updates","status":"publish","type":"post","link":"https:\/\/scootercam.net\/blog\/scout-updates\/","title":{"rendered":"Scout Updates"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Scootercam&#8217;s MLB Scout continues to evolve. Originally it was a tool to help predict those days when <em>both<\/em> the White Sox and Cubs pitchers would win their games, and I was interested in building a only go\/no-go decision maker for that combo bet. So with 4 outcomes I was leaving a bit on the table if I didn&#8217;t explore the other three outcomes. I brought in data from Kalshi &#8211; what are actual bettors thinking? Is it possible to compare Scootercam&#8217;s MLB Scout scores with what the market is saying? Does Scout have any sort of edge, or just noise?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Scout Quadrant Lean \u2014 Summary &amp; Practical Use Guide<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ScooterCam Worldwide LLC \u2014 MLB Scout<\/strong> Session date: May 26, 2026<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Background<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The MLB Scout tool was originally designed to answer one question: <em>is today a good day for both the Cubs and Sox to win?<\/em> The combo score \u2014 the minimum of the two individual pitcher scores \u2014 drives a binary PLAY\/PASS recommendation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The work in this session grew from a single observation: a PASS on the combo is not the same as <em>no edge<\/em>. When the Kalshi payout matrix shows positive returns across all four outcome quadrants, the market is pricing every outcome as profitable. If Scout is saying PASS, it is identifying something the market may be underweighting \u2014 namely, that one pitcher is significantly stronger or weaker than the other. That asymmetry doesn&#8217;t disappear on a PASS day. It rotates to a different quadrant.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This led to two related questions:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Validity<\/strong> \u2014 does Scout&#8217;s directional lean actually predict the correct quadrant better than Kalshi&#8217;s market pricing?<\/li>\n\n\n\n<li><strong>Reliability<\/strong> \u2014 is that edge consistent, or noise?<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Both questions require data that wasn&#8217;t being collected. This session built the collection infrastructure and the display layer, timed to accumulate a meaningful sample before the All-Star break.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Changes Made<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. Scout Quadrant Lean strip \u2014 <code>mlb-scout.php<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What was added:<\/strong> A new UI section inserted between the existing GONOGO bar and the Kalshi payout matrix inside the Next Combo block.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it shows:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Individual pitcher score chips for Cubs and Sox (color-coded by tier)<\/li>\n\n\n\n<li>The point differential when the lean is directional (WL or LW cases)<\/li>\n\n\n\n<li>A compact 2\u00d72 grid of the four outcome quadrants \u2014 WW, WL, LW, LL \u2014 with the Scout-favored quadrant highlighted in green with a SCOUT tag<\/li>\n\n\n\n<li>Kalshi joint probabilities in each cell when market data is available<\/li>\n\n\n\n<li>A one-sentence explanation of why Scout leans that direction<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rendering logic (<code>render_scout_lean()<\/code>):<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Condition<\/th><th>Lean<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Combo score \u2265 58<\/td><td>WW<\/td><td>Both pitchers favorable \u2014 standard PLAY day<\/td><\/tr><tr><td>Cubs score \u2212 Sox score &gt; 15<\/td><td>WL<\/td><td>Cubs face weak pitcher, Sox face strong one<\/td><\/tr><tr><td>Sox score \u2212 Cubs score &gt; 15<\/td><td>LW<\/td><td>Sox face weak pitcher, Cubs face strong one<\/td><\/tr><tr><td>Both scores \u2264 35<\/td><td>LL<\/td><td>Both teams face strong pitchers \u2014 tough day all around<\/td><\/tr><tr><td>Difference \u2264 15, neither in LL zone<\/td><td><em>(hidden)<\/em><\/td><td>No clear directional signal<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The strip is hidden entirely when no signal exists \u2014 no empty placeholder.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sub-text varies by lean type<\/strong> so the language is always accurate:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WW: <em>&#8220;Combo play confirmed \u2014 both pitchers support the call&#8221;<\/em><\/li>\n\n\n\n<li>WL\/LW: <em>&#8220;Not a combo play \u2014 Cubs\/Sox pitcher advantage points to a quadrant&#8221;<\/em><\/li>\n\n\n\n<li>LL: <em>&#8220;Not a combo play \u2014 both teams face tough pitchers today&#8221;<\/em><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why the strip sits between GONOGO and the payout matrix:<\/strong> The GONOGO bar answers the combo question. The lean strip answers a different question. The payout matrix then shows the financial context for all four quadrants. Each layer adds something distinct; the order reflects the analytical hierarchy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The SCOUT tag also appears on the matching cell in the payout matrix<\/strong>, visually linking the two sections without duplicating data.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. Divergence tracking \u2014 <code>mlb-cache-cron.php<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What was added:<\/strong> Five new fields written to <code>sc_bet_tracker.json<\/code> for every combo day. Two new helper functions. A three-branch freeze logic block. An updated cron schedule.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">New tracker fields<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Type<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>scout_lean<\/code><\/td><td>string|null<\/td><td>WW \/ WL \/ LW \/ LL, derived from pitcher scores<\/td><\/tr><tr><td><code>kalshi_cubs_yes<\/code><\/td><td>float|null<\/td><td>Cubs win probability captured before first pitch<\/td><\/tr><tr><td><code>kalshi_sox_yes<\/code><\/td><td>float|null<\/td><td>Sox win probability captured before first pitch<\/td><\/tr><tr><td><code>kalshi_implied_lean<\/code><\/td><td>string|null<\/td><td>Highest joint-probability quadrant per Kalshi market<\/td><\/tr><tr><td><code>kalshi_pregame_captured<\/code><\/td><td>bool<\/td><td><strong>Data quality flag<\/strong> \u2014 true only when both prices captured before game 1 first pitch<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Why the freeze timing matters<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Kalshi keeps markets open until a game ends. A team losing 7-0 in the eighth inning may show at 3% \u2014 a real price, but not a pre-game belief. Capturing that would corrupt the divergence comparison, which is meant to pit Scout&#8217;s pre-game read against the market&#8217;s pre-game read.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The cron uses a three-branch pattern to prevent this:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Branch 1 (post-freeze):<\/strong> Entry already frozen in a previous run. All five fields preserved unchanged. No Kalshi fetch.<\/li>\n\n\n\n<li><strong>Branch 2 (at freeze moment):<\/strong> Game 1 just started this cron cycle. Kalshi prices are now in-game. The prices from the previous pre-game cron run are carried forward instead. If no pre-game prices exist, the fields stay null and <code>kalshi_pregame_captured<\/code> stays false \u2014 honest, not papered over.<\/li>\n\n\n\n<li><strong>Branch 3 (pre-game):<\/strong> Game hasn&#8217;t started. Fresh Kalshi prices and lean computed and stored. <code>kalshi_pregame_captured<\/code> set to true if both prices are non-null.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The combo score freeze follows the same lifecycle and is unchanged from the original.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Cron schedule update<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Old:<\/strong> <code>0 9,15 * * *<\/code> \u2014 twice daily (9 AM and 3 PM server time)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>New:<\/strong> <code>0 9,12,15,18 * * *<\/code> \u2014 four times daily (9 AM, noon, 3 PM, 6 PM)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The noon run was the critical addition. For day games starting at 1:05\u20132:20 PM ET, Kalshi typically lists markets 2\u20133 hours before first pitch \u2014 roughly 10:30\u201311:30 AM ET. The 9 AM cron was consistently too early; the 3 PM cron arrived after first pitch. The noon run catches this window cleanly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The 6 PM run covers evening games (7:05\u20138:10 PM ET first pitch) as a belt-and-suspenders companion to the 3 PM run.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>If GlowHost server time is UTC rather than ET:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>EDT (UTC\u22124): <code>0 13,16,19,22 * * *<\/code><\/li>\n\n\n\n<li>EST (UTC\u22125): <code>0 14,17,20,23 * * *<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Confirm in cPanel \u2192 Server Information.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Practical Use Guide<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Reading the Scout Quadrant Lean<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>On a PLAY day (combo score \u2265 58):<\/strong> The lean strip shows WW highlighted and confirms the combo call. Both pitchers are rated favorable \u2014 conditions support both teams winning. The Kalshi prices in the grid give you a sense of how the market is pricing the same outcome. If Scout says WW and Kalshi&#8217;s implied lean is also WW, there is no divergence \u2014 the model and the market agree.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>On a PASS day with a directional lean (WL or LW):<\/strong> This is the analytically interesting case. Scout is not saying <em>don&#8217;t bet<\/em> \u2014 it is saying <em>don&#8217;t bet on the combo<\/em>. The pitcher differential suggests one team has a meaningful edge that the W\/W bet can&#8217;t capture. The highlighted quadrant is where Scout thinks the day&#8217;s real signal lives.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example: Cubs 72, Sox 41, combo score 41 \u2192 PASS on the combo, lean to W\/L. Cubs face a hittable pitcher; Sox face a strong one. The Cubs Win \/ Sox Lose diagonal may carry edge even on a day the combo fails.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cross-reference this with the Kalshi payout matrix below. If the W\/L cell shows an attractive payout and Kalshi&#8217;s implied lean is WW (meaning the market is treating it as a likely W\/W day), you have a divergence: Scout is leaning W\/L, the market is leaning W\/W. That divergence is what the tracker is recording for later analysis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>On a PASS day with an LL lean:<\/strong> Both teams face strong opposing pitchers. Neither lineup has a favorable matchup. The L\/L quadrant is statistically suggested \u2014 not a bet on losing per se, but an acknowledgment that neither team is set up to score freely. The Kalshi market may still be implying W\/W as the most-likely outcome (it is the most common MLB day outcome by frequency). That gap between Scout and Kalshi on LL days is one of the more interesting divergence patterns to watch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>When the strip is absent:<\/strong> Both pitcher scores are close (within 15 points) and the combo isn&#8217;t a PLAY. Scout has no clear directional read. Showing a lean in that band would be noise.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Understanding the data quality flag<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>kalshi_pregame_captured: true<\/code> means the divergence data for that day is clean \u2014 both Kalshi prices were recorded before first pitch and will be meaningful for comparison.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>kalshi_pregame_captured: false<\/code> means no pre-game prices were captured. This happens primarily with day games on days when Kalshi hadn&#8217;t listed the market before the last pre-game cron run. The Scout lean is still recorded for that day and can be evaluated against the actual outcome \u2014 but the Scout vs. Kalshi divergence comparison should exclude it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The cron log will print a <code>[LEAN]<\/code> warning line when this happens, so you can track the frequency without opening the JSON.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">What to watch for as data accumulates<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The goal is to reach roughly <strong>10 resolved combo days where <code>kalshi_pregame_captured<\/code> is true and <code>scout_lean<\/code> is non-null<\/strong>. At current Cubs\/Sox scheduling frequency, that is approximately 3 weeks of data. Well before the All-Star break.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At that threshold, the Scout Validation section in <code>mlb-scout.php<\/code> can gain a <strong>Quadrant Lean Accuracy<\/strong> sub-section showing:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Scout lean accuracy across all lean days (lean matched actual quadrant)<\/li>\n\n\n\n<li>Kalshi implied lean accuracy across clean days<\/li>\n\n\n\n<li>Divergence days \u2014 where Scout and Kalshi disagreed \u2014 and who was right<\/li>\n\n\n\n<li>Breakdown by lean type (WW, WL, LW, LL) to identify where the model is strongest<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The most valuable finding will be on <strong>divergence days<\/strong> \u2014 not the days they agree, but the days Scout says W\/L and Kalshi says W\/W, or Scout says LL and Kalshi says W\/W. If Scout is systematically right on those days, the model has genuine predictive validity beyond what the market is pricing. If Kalshi is consistently right, the market is capturing the pitcher asymmetry better than the score formula, which is a tuning signal.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Tuning notes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The 15-point threshold<\/strong> (<code>$threshold = 15<\/code> in both <code>render_scout_lean()<\/code> and <code>compute_scout_lean()<\/code>) determines when a pitcher score differential is considered meaningful enough to call a directional lean. It is defined in both files \u2014 keep them in sync.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the season&#8217;s data shows that the model&#8217;s WL\/LW leans are only accurate when the differential is wider, raise the threshold. If 15 points is catching too much noise, raise it. If accurate leans are being missed because the differential is just below 15, lower it. The tracker log will have the raw score data to make this judgment empirically rather than by intuition.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The 35-point LL ceiling<\/strong> \u2014 both scores must be at or below 35 for an LL lean to fire. This can similarly be tuned if the data shows the LL call is most accurate at a different threshold.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Both thresholds are early-season estimates. The All-Star break review is the right moment to revisit them with real data.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><em>ScooterCam Worldwide LLC \u00b7 mlb-scout.php \u00b7 mlb-cache-cron.php<\/em> <em>Session: May 26, 2026<\/em> <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Scootercam&#8217;s MLB Scout continues to evolve. Originally it was a tool to help predict those days when both the White Sox and Cubs pitchers would win their games, and I was interested in building a only go\/no-go decision maker for that combo bet. So with 4 outcomes I was leaving a bit on the table &#8230; <a title=\"Scout Updates\" class=\"read-more\" href=\"https:\/\/scootercam.net\/blog\/scout-updates\/\" aria-label=\"Read more about Scout Updates\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[46],"tags":[],"class_list":["post-1202","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/posts\/1202","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/comments?post=1202"}],"version-history":[{"count":1,"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/posts\/1202\/revisions"}],"predecessor-version":[{"id":1204,"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/posts\/1202\/revisions\/1204"}],"wp:attachment":[{"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/media?parent=1202"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/categories?post=1202"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scootercam.net\/blog\/wp-json\/wp\/v2\/tags?post=1202"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}