Building Ask OddMan: Part 1
Notes on the data, the graph, and the agent we're building underneath it

We’re going to spend the next two articles walking through how we’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.
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.
Why nflverse
We’re currently building against nflverse as our primary NFL data source, and we picked it deliberately rather than defaulting to it.
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.
Gaining access as an outside company means entering into a formal licensing relationship, not just filling out a registration form.
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.
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 nflverse first.
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 nflverse's 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.
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.
nflverse 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.
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.
Mapping the ontology before we trusted it
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 nflverse endpoint and started drafting the ontology underneath it.
Meaning, what a player object really is, how it relates to a team, a game, a play, or a season.
We used a free graph tool offered by Microsoft to actually visualize and draw those relationships before we committed to anything at scale.
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.
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.
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.
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.
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’t know. It just inherits the confusion and hands it back to the user with confidence.
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.
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.
From ontology to a real knowledge graph
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.
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.
That distinction matters more than it might sound like it does.
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.
Picture this. You’re asking Ask OddMan a question like "how has Patrick Mahomes' usage changed against teams that blitz heavily."
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.
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.
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.
We're not saying every question resolves that cleanly today, as we're still early in this build.
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.
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.
In the next article, we’ll get into the harness itself: how we’re coordinating multiple agents, how memory works across a session and across a project, and how we’re thinking about control as we hand more of this over to an agentic system.
We’ll keep sharing this as we go.

