<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Fumbles @OddMan: Engineering]]></title><description><![CDATA[How OddMan is built. Architecture, feature announcements, and the technical decisions made behind the platform we are building.]]></description><link>https://fumbles.oddman.ai/s/engineering</link><image><url>https://substackcdn.com/image/fetch/$s_!TjQP!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40f12682-1513-4b61-9251-5b10491ea239_1280x1280.png</url><title>Fumbles @OddMan: Engineering</title><link>https://fumbles.oddman.ai/s/engineering</link></image><generator>Substack</generator><lastBuildDate>Mon, 12 Oct 2026 22:11:55 GMT</lastBuildDate><atom:link href="https://fumbles.oddman.ai/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Kabir Devgun]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[inquiries@oddman.ai]]></webMaster><itunes:owner><itunes:email><![CDATA[inquiries@oddman.ai]]></itunes:email><itunes:name><![CDATA[Jacob Ollmann]]></itunes:name></itunes:owner><itunes:author><![CDATA[Jacob Ollmann]]></itunes:author><googleplay:owner><![CDATA[inquiries@oddman.ai]]></googleplay:owner><googleplay:email><![CDATA[inquiries@oddman.ai]]></googleplay:email><googleplay:author><![CDATA[Jacob Ollmann]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Building Ask OddMan: Part 2]]></title><description><![CDATA[The harness, the memory, the guardrails, and everything in between]]></description><link>https://fumbles.oddman.ai/p/building-ask-oddman-part-2</link><guid isPermaLink="false">https://fumbles.oddman.ai/p/building-ask-oddman-part-2</guid><pubDate>Tue, 01 Sep 2026 12:49:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Eshm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b00675-2036-4f2e-a404-3badb603a0b3_1164x1074.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Eshm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b00675-2036-4f2e-a404-3badb603a0b3_1164x1074.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Eshm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b00675-2036-4f2e-a404-3badb603a0b3_1164x1074.png 424w, https://substackcdn.com/image/fetch/$s_!Eshm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b00675-2036-4f2e-a404-3badb603a0b3_1164x1074.png 848w, https://substackcdn.com/image/fetch/$s_!Eshm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b00675-2036-4f2e-a404-3badb603a0b3_1164x1074.png 1272w, https://substackcdn.com/image/fetch/$s_!Eshm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b00675-2036-4f2e-a404-3badb603a0b3_1164x1074.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Eshm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b00675-2036-4f2e-a404-3badb603a0b3_1164x1074.png" width="1164" height="1074" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/09b00675-2036-4f2e-a404-3badb603a0b3_1164x1074.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1074,&quot;width&quot;:1164,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:150553,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://oddmanlabs.substack.com/i/211055891?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b00675-2036-4f2e-a404-3badb603a0b3_1164x1074.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Eshm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b00675-2036-4f2e-a404-3badb603a0b3_1164x1074.png 424w, https://substackcdn.com/image/fetch/$s_!Eshm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b00675-2036-4f2e-a404-3badb603a0b3_1164x1074.png 848w, https://substackcdn.com/image/fetch/$s_!Eshm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b00675-2036-4f2e-a404-3badb603a0b3_1164x1074.png 1272w, https://substackcdn.com/image/fetch/$s_!Eshm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b00675-2036-4f2e-a404-3badb603a0b3_1164x1074.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In our last article we walked through the data foundation underneath Ask OddMan: why we started with nflverse, how we mapped the ontology before trusting it, and how that work is becoming a real knowledge graph. This note is about what sits on top of that foundation: the agentic harness that actually does the thinking, and the guardrails we're building around it.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://fumbles.oddman.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to receive our latest insights and understandings about building a research partner for professional sports.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><div class="callout-block" data-callout="true"><h4 style="text-align: center;">Why one agent wasn&#8217;t enough</h4></div><p>We&#8217;re building Ask OddMan as a multi-agent system, not a single model answering questions. The distinction sounds subtle but it changes almost everything about how the product is structured underneath.</p><p>We're currently working through a few core capabilities that make up the harness:</p><h4><strong>Agentic orchestration</strong></h4><p>This is the coordination layer, the part responsible for planning and routing tasks across our internal fleet of agents rather than asking one model to do everything at once.</p><p>A question about a player's usage trend and a question that requires pulling a chart, checking a narrative, and cross-referencing an injury report are different shapes of work. We also believe they deserve different handling rather than one model trying to be good at all of it simultaneously.</p><h4><strong>Data sources</strong></h4><p>This is the connective tissue between the harness and everything we described in Part 1: querying into our data warehouse, connecting out to third-party APIs, and running retrieval and vector search over both narrative content and memory.</p><p>This is also where the knowledge graph gets used in practice, not just stored.</p><h4><strong>Skill builder</strong></h4><p>We're composing workflows as structured files, markdown documents that define a skill, the tools it can call, and the connections it needs, rather than hardcoding every capability into the agent logic directly.</p><p>We like this approach because it means teaching Ask OddMan something new looks more like writing a document than shipping a new build.</p><h4><strong>The model</strong></h4><p>Given that we are a start up and that speed to market is what we are up against, we have decided to use an LLM for many reasons to begin with. Let&#8217;s breakdown the thinking behind that choice.</p><p>We&#8217;re building instrumentation into the harness itself to understand volume, cost, and token spend broken down by which skill is actually being executed, not just an aggregate bill at the end of the month. </p><p>We believe that's the only honest way to know what a system like this really costs to run at scale, skill by skill rather than as one number.</p><p>Once we see that volume cross a real cost threshold, we intend to use what we've learned from that instrumentation to start building and fine-tuning our own language models for the specific skills where it makes sense, rather than staying dependent on general-purpose models for everything indefinitely.</p><p>Right now we're still gathering the data that will tell us when we should be.</p><div class="callout-block" data-callout="true"><h4 style="text-align: center;"><strong>Beyond serving someone else's stats</strong></h4></div><p>There's a version of Ask OddMan that only ever repackages numbers other people already published, and we don't think that's interesting enough on its own.</p><p>Alongside the harness work, we're currently building our own machine learning models to produce original stats and insights for the NFL, not just retrieve and narrate the ones that already exist across nflverse or anywhere else.</p><p>The part we care about most is what happens after a model produces something new.</p><p>We're not treating an original stat as a one-off output that lives in a chart and then disappears. We're feeding it back into the knowledge graph itself, as a real node connected to the players, teams, and games it describes, the same way everything else in that graph is connected.</p><p>That means a proprietary insight we generate isn't sitting off to the side as a separate feature. It becomes part of the same structure Ask OddMan is already traversing, available to inform the next question a user asks, not just the one that prompted it.</p><p>We're early in this, and we're being careful not to call something a "stat" until we trust the model behind it the same way we came to trust the ontology work in Part 1.</p><p>But this is the direction we're building toward: an Ask OddMan that doesn't just know what's already been said about a player, but is starting to say some genuinely new things of its own.</p><div class="callout-block" data-callout="true"><h4 style="text-align: center;"><strong>Memory that actually means something</strong></h4></div><p>We think a lot about what "memory" should mean for a research partner, because the word gets used loosely. </p><p>For us it's a few distinct layers working together, not one big undifferentiated context blob:</p><ul><li><p><strong>Thread sessions</strong></p><p>Thread sessions<strong> </strong>hold the immediate back and forth of a single conversation.</p></li><li><p><strong>Projects</strong></p><p>Carries context forward across an entire body of work, the way a real project should, so a session doesn't start from zero every time.</p></li><li><p><strong>Tools</strong></p><p>This<strong> </strong>lets the agent reach out and get fresh information rather than relying only on what it remembers.</p></li><li><p><strong>The way you view sports</strong></p><p>Learn how a given user tends to think and what they tend to care about, so the system gets more useful to that specific person over time rather than staying generic.</p></li></ul><p>We believe this layered approach is closer to how an actual research relationship works. You don&#8217;t re-explain your point of view to a colleague every morning, and we don&#8217;t think you should have to re-explain it to Ask OddMan either.</p><div class="callout-block" data-callout="true"><h4 style="text-align: center;">Control, before scale</h4></div><p>We&#8217;re building this with governance in mind from the start, not bolting it on after the fact. </p><p>A system that can plan, route tasks across agents, query a live data warehouse, and remember things about a user is a system that needs real boundaries, not just capability.</p><p>We don't have a polished answer to give you here yet, because we're still building it. But we wanted to say plainly that we're thinking about it now, at this stage, rather than treating it as a problem for later.</p><p>That's consistent with how we think about everything else on OddMan: the tools should give Independent Creators real leverage, and the leverage has to come with protection built in, not around.</p><p>We're not finished. Most of what we described across these two articles is still being built, tested, and rebuilt as we learn where our own assumptions were wrong. That's the actual shape of this right now, and we'd rather tell you that than pretend otherwise.</p><p>We'll keep sharing this as we go.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://fumbles.oddman.ai/p/building-ask-oddman-part-2?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Fumbles @Oddman! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://fumbles.oddman.ai/p/building-ask-oddman-part-2?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://fumbles.oddman.ai/p/building-ask-oddman-part-2?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[Building Ask OddMan: Part 1]]></title><description><![CDATA[Notes on the data, the graph, and the agent we're building underneath it]]></description><link>https://fumbles.oddman.ai/p/building-ask-oddman-part-1</link><guid isPermaLink="false">https://fumbles.oddman.ai/p/building-ask-oddman-part-1</guid><pubDate>Mon, 17 Aug 2026 12:24:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!CEb1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcf7a0e8-40c9-4b51-b8a4-1ccd154e8e22_1080x721.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CEb1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcf7a0e8-40c9-4b51-b8a4-1ccd154e8e22_1080x721.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CEb1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcf7a0e8-40c9-4b51-b8a4-1ccd154e8e22_1080x721.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CEb1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcf7a0e8-40c9-4b51-b8a4-1ccd154e8e22_1080x721.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CEb1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcf7a0e8-40c9-4b51-b8a4-1ccd154e8e22_1080x721.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CEb1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcf7a0e8-40c9-4b51-b8a4-1ccd154e8e22_1080x721.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CEb1!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcf7a0e8-40c9-4b51-b8a4-1ccd154e8e22_1080x721.jpeg" width="1200" height="801.1111111111111" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fcf7a0e8-40c9-4b51-b8a4-1ccd154e8e22_1080x721.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:721,&quot;width&quot;:1080,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:122852,&quot;alt&quot;:&quot;man wearing blue and white jersey shirt standing&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="man wearing blue and white jersey shirt standing" title="man wearing blue and white jersey shirt standing" srcset="https://substackcdn.com/image/fetch/$s_!CEb1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcf7a0e8-40c9-4b51-b8a4-1ccd154e8e22_1080x721.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CEb1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcf7a0e8-40c9-4b51-b8a4-1ccd154e8e22_1080x721.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CEb1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcf7a0e8-40c9-4b51-b8a4-1ccd154e8e22_1080x721.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CEb1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcf7a0e8-40c9-4b51-b8a4-1ccd154e8e22_1080x721.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@westoneichner">Weston Eichner</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p></p><p>We&#8217;re going to spend the next two articles walking through how we&#8217;re building Ask OddMan, our AI research partner grounded in live sports data. Not the finished-product version. The actual version, mid-build, with the decisions we made and why we made them.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://fumbles.oddman.ai/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to receive our latest insights and understandings about building a research partner for professional sports.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p>We wanted to start with data, because everything else depends on getting this part right. An AI research partner is only as trustworthy as what it's standing on, and before we wrote a single line of agent logic, we spent real time just trying to understand the shape of the world we were about to model.</p><div class="callout-block" data-callout="true"><h4 style="text-align: center;">Why nflverse</h4></div><p>We&#8217;re currently building against <em>nflverse</em> as our primary NFL data source, and we picked it deliberately rather than defaulting to it.</p><p>The NFL doesn't run an open, self-serve developer program for its official statistical data. That data is licensed out through an exclusive partnership, currently held by Genius Sports, which covers real-time play-by-play and Next Gen Stats through the end of the 2027-28 season.</p><p>Gaining access as an outside company means entering into a formal licensing relationship, not just filling out a registration form.</p><p>We believe the right way to approach that kind of conversation is with a complete understanding of what we actually need, not a partial one.</p><p>Walking into a discussion with a league, a data partner, or a franchise before we know our own data requirements felt backwards to us. So we're building our foundation on <em>nflverse</em> first.</p><p>It's a community-maintained project, and the code itself is released under the MIT license. What mattered more to us was the data licensing underneath it: the majority of <em>nflverse's</em> datasets are published under CC-BY 4.0, meaning we can use them broadly as long as we attribute the source, with a narrower subset, the FTN charting data, carrying a CC-BY-SA 4.0 requirement instead.</p><p>That's a fundamentally different starting point than the NFL's own official data, which flows through an exclusive licensing partnership rather than an open, attributable license.</p><p><em>nflverse</em> also happens to be the largest, most robust dataset available outside of the NFL's own systems, going back to 1999 for play-by-play.</p><p>We're using this phase to learn everything we can about the shape of football data, so that if and when we do sit down with a league, a data partner, or a team, we're bringing clarity instead of a wish list.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!adPT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4a4c5f5-57a7-4140-b981-4ead738c7356_2610x1420.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!adPT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4a4c5f5-57a7-4140-b981-4ead738c7356_2610x1420.png 424w, https://substackcdn.com/image/fetch/$s_!adPT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4a4c5f5-57a7-4140-b981-4ead738c7356_2610x1420.png 848w, https://substackcdn.com/image/fetch/$s_!adPT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4a4c5f5-57a7-4140-b981-4ead738c7356_2610x1420.png 1272w, https://substackcdn.com/image/fetch/$s_!adPT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4a4c5f5-57a7-4140-b981-4ead738c7356_2610x1420.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!adPT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4a4c5f5-57a7-4140-b981-4ead738c7356_2610x1420.png" width="1456" height="792" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4a4c5f5-57a7-4140-b981-4ead738c7356_2610x1420.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:792,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:758111,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://oddmanlabs.substack.com/i/210987044?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4a4c5f5-57a7-4140-b981-4ead738c7356_2610x1420.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!adPT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4a4c5f5-57a7-4140-b981-4ead738c7356_2610x1420.png 424w, https://substackcdn.com/image/fetch/$s_!adPT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4a4c5f5-57a7-4140-b981-4ead738c7356_2610x1420.png 848w, https://substackcdn.com/image/fetch/$s_!adPT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4a4c5f5-57a7-4140-b981-4ead738c7356_2610x1420.png 1272w, https://substackcdn.com/image/fetch/$s_!adPT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4a4c5f5-57a7-4140-b981-4ead738c7356_2610x1420.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="callout-block" data-callout="true"><h4 style="text-align: center;">Mapping the ontology before we trusted it</h4></div><p>Twenty years of historical data is a lot to commit to a warehouse blind. Before we loaded any of it into our data warehouse, we pulled samples from every <em>nflverse</em> endpoint and started drafting the ontology underneath it.  </p><p>Meaning, what a player object really is, how it relates to a team, a game, a play, or a season. </p><p>We used a free graph tool offered by Microsoft to actually visualize and draw those relationships before we committed to anything at scale. </p><p>Seeing the nodes and edges on the screen, rather than just imagining them from a schema doc, is what let us catch the relational gaps early. </p><p>A missing edge between two entities is easy to miss in a spec and very hard to miss when you're looking at the graph. We'd rather find that out with a sample than with twenty years of production data already sitting in the warehouse.</p><p>We're repeating this same process across the other major leagues we're bringing into OddMan. It's slower than just pulling everything in and sorting it out later, but we believe the upfront cost is worth it.</p><p>This is worth explaining, because it's easy to treat data cleanup as a chore that happens before the interesting work starts, and we don't see it that way.</p><p>An AI system like Ask OddMan doesn't reason about football in the abstract. It reasons about whatever structure we hand it, and if that structure is inconsistent the model doesn't know that. As an example, if a player object means something slightly different depending on which endpoint it came from, the model wouldn&#8217;t know. It just inherits the confusion and hands it back to the user with confidence.</p><p>Clean, well-related data isn't a nice-to-have ahead of the AI work. It's a direct input into whether Ask OddMan's answers are trustworthy at all.</p><p>We'd rather spend the time now finding the gaps than have Ask OddMan discover them later, in front of a user, as a wrong answer.</p><div class="callout-block" data-callout="true"><h4 style="text-align: center;">From ontology to a real knowledge graph</h4></div><p>Here's where it stopped being a diagramming exercise and became infrastructure. The relationships we mapped, player to team, team to league, player to game, game to play, aren't just documentation now.</p><p>We're building them into our graph database, so that a league, a team, and a player exist as connected objects rather than rows that happen to share a foreign key.</p><p>That distinction matters more than it might sound like it does.</p><p>A relational table can tell you a player is on a roster. A graph can tell you how that player connects outward through every game, every transaction, and every teammate. It can also let something like Ask OddMan traverse those connections the way a person actually thinks about a storyline, not the way a database schema forces you to think about one.</p><p>Picture this. You&#8217;re asking Ask OddMan a question like "how has Patrick Mahomes' usage changed against teams that blitz heavily."</p><p>In a relational world, answering that well means writing a chain of joins across player tables, game tables, participation tables, and defensive scheme tables, and hoping the schema designer anticipated that exact question.</p><p>In the graph pictured above, Mahomes is a node, and the path outward is already there: from the player node to his participation records, from each participation record to the specific game it belongs to, from that game to the opposing team, and from that team to whatever defensive tendencies we've modeled as connected to it.</p><p>Ask OddMan doesn't need a query written in advance for that exact question. It walks the edges that already exist, the same way a scout would follow the thread from a player to a game to an opponent, and assembles the answer from real, connected structure instead of a query someone had to predict.</p><p>We're not saying every question resolves that cleanly today, as we're still early in this build.</p><p>But that's the shape of what the graph is for, and it's why we believe it's worth the extra investment over a purely relational approach.</p><p>We're still early in populating this graph fully, and we expect to keep finding gaps the same way the visualization tool helped us find them in the ontology phase. But the foundation is real, and it's the foundation everything else we're building on Ask OddMan sits on top of.</p><p>In the next article, we&#8217;ll get into the harness itself: how we&#8217;re coordinating multiple agents, how memory works across a session and across a project, and how we&#8217;re thinking about control as we hand more of this over to an agentic system.</p><p>We&#8217;ll keep sharing this as we go.</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://fumbles.oddman.ai/p/building-ask-oddman-part-1?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Fumbles @Oddman! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://fumbles.oddman.ai/p/building-ask-oddman-part-1?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://fumbles.oddman.ai/p/building-ask-oddman-part-1?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item></channel></rss>