Inspiration
A dropped column silently poisoned a fraud model's feature for six weeks. Nothing failed, no test caught it, and nobody noticed until the money was gone. That keeps happening because the person renaming a column in a staging model can't see the SageMaker endpoint five hops downstream dbt's lineage stops at the edge of dbt. So we built something that can see the whole path, and put it in front of the merge button.
What it does
Blast Radius intercepts every PR touching data code, diffs the SQL structurally, and walks DataHub's graph at column level to find what the change actually breaks down to MLFeatures, MLModels, and live deployments. Then it does three things a chatbot doesn't: blocks the merge with a failing status check, writes the migration and shim view grounded in real catalog schemas, and writes back a Change Impact Record, structured properties, and column-level warnings. The output judges see is "this breaks 3 dashboards, 1 Airflow DAG, and critically fraud_risk_v3, serving 40,000 req/day."
How I built it
Five agents in a LangGraph state machine: parse → traverse → score → remediate → write back. The parser uses sqlglot AST diffing to tell a rename from a drop by comparing expressions, not string similarity. Traversal is a deterministic BFS that carries the column across transforms. Severity weights entity type by change kind, tier, real query volume, and serving traffic, escalating to CRITICAL whenever a live model lands in the radius. We wired both DataHub access paths the SDK for CI, MCP for the dev loop behind one interface, and hand-authored the ML slice the sample data doesn't include.
Challenges I ran into
URN resolution was by far the hardest part: a file path isn't a URN, and every naive approach fails silently, traversing from something nonexistent and reporting "no impact." Our resolver tries overrides, cache, convention, then scored search and reports unresolved rather than guessing, because a wrong URN is worse than no answer. The other real discipline was resisting the LLM: handing it a lineage tool is easy and it hallucinates a hop the moment you're on stage. Keeping traversal deterministic cost effort and is the only reason the demo survives live.
Accomplishments that I am proud of
It blocks a merge and writes the fix everyone else demos an agent answering a question. It closes the loop with read tools, mutations, governance proposals, and Context Documents, so the catalog is smarter after each PR than before it. It runs in thirty seconds with zero dependencies and produces identical output to the live pipeline. And it uses the ML entities almost nobody touches: the raw column → feature → model → deployment path you genuinely can't fake without a context platform.
What I learned
Metadata platforms are most valuable at the moment of change, not the moment of search a catalog you browse is a wiki, a catalog wired into CI is a control plane. We also learned the boundary between deterministic code and model output is a design decision with consequences: put the LLM in charge of facts and it fails unpredictably, put it in charge of prose and code with facts from the graph and it's reliable enough to gate a merge on.
What's next for Blast Radius
Probably turning reverse mode findings into assignable work rather than reports nobody reads, and attaching real warehouse spend so "breaks three dashboards" becomes a number a VP acts on. Longer term, every merged override is a labeled example that our rubric was wrong feeding that back would let the firewall calibrate itself per organization instead of shipping one universal threshold. The same engine also extends past schema changes to test removals, freshness SLAs, and deprecations: anything where the damage is real but invisible at the diff.
Built With
- datahub
- dbt
- github-actions
- gpt-4o-mini
- langgraph
- mcp
- openrouter
- python
- sqlglot
Log in or sign up for Devpost to join the conversation.