PR agent for data teams · protects production ML models

Know what a data change breaks, before it ships.

The moment you open a pull request, Pathfinder reads DataHub's lineage, traces every downstream table, dashboard, and production ML model, and tells you what breaks, who to warn, and how to fix it. It posts the answer as a comment, right where you already work.

Apache-2.0 · built on DataHub's open GraphQL + MCP lineage · 26 passing tests · verdicts are deterministic

The 3am problem

One rename. A silent break three systems away.

Data flows from raw tables, through transformations, into the dashboards people read and the ML models that make live decisions. Change one column and something downstream breaks, but the person making the change can't see that far. They find out in production, at 3am. Tools like dbt docs and Recce show impact inside the dbt project; they can't see the Looker dashboard or the production model that reads the column you're about to rename.

Cross-stack lineage

dbt tools stop at the project edge. Pathfinder walks past it.

One searchAcrossLineage call on DataHub returns the whole blast radius, tables, dashboards, ML features, and the models in production.

changeorders.customer_id
reads it directly
tableanalytics.daily_orders

only DataHub sees past this line

dashboardExec Revenue (Looker)
ml featurecustomer_value
ml modelchurn_model · production
The output

It comments on the pull request. In plain language.

No new dashboard, no new habit. Pathfinder writes the verdict where engineers already are, and it's the same comment on a real PR, generated from a live DataHub.

pathfinder commented on #1 · rename orders.customer_id → cust_id bot
Pathfinder, BREAKING

This PR affects 5 downstream assets across your stack, including 2 in production.

orders, renamed customer_idcust_id

SevDownstream assetTypeOwnerWhy
breakanalytics.daily_ordersproddataset@danareads customer_id directly; the reference fails to resolve
breakchurn_modelprodml model@mariaconsumes it as a feature; the model breaks at serve time
breakcustomer_valueml featurefeeds the model; renaming breaks it upstream
breakExec Revenuedashboard@finance-teambinds to customer_id by name; the tile goes blank
partialanalytics.ltv_calcproddataset@dana2 hops down; an intermediate model may shield it, verify

Suggested fix, compatibility alias

-- keep customer_id available while consumers migrate to cust_id
select
    *,
    cust_id as customer_id  -- deprecated alias
from {{ ref('orders') }}

Owners to notify: @dana @finance-team @maria

A real comment, generated live, see it on pull request #1 ↗

How it works

Six steps, from diff to durable knowledge.

01

Detect the change

Parses the SQL/dbt in the PR to find renamed, dropped, retyped columns and changed row filters.

sqlglot diff
02

Walk the blast radius

One GraphQL call returns every downstream dataset, dashboard, ML feature, and ML model, with owners.

DataHub · searchAcrossLineage
03

Judge severity

Deterministic rules rank each asset breaking / partial / safe. A production ML model outranks an internal table.

no LLM in the verdict
04

Draft the fix

Generates a backward-compatible shim so consumers keep working while owners migrate.

an optional LLM only polishes this
05

Notify the owners

Posts the comment and @-mentions exactly the people whose assets are affected.

GitHub PR comment
06

Write it back

Annotates the dataset in DataHub with the verdict and a link to the PR, the next person inherits it.

contributes to the graph
Watch

Three minutes, end to end.

A live pull request, the blast radius, the fix, and the write-back landing in DataHub.

Watch the demo 3-minute walkthrough
Docs

Run it yourself.

Everything is reproducible. Full instructions live in the repo README; here's the short path.

DataHub needs Linux + Docker, so the demo runs in a GitHub Codespace with everything pre-wired via a committed devcontainer.

  1. Open Code ▸ Codespaces on the repo (16 GB machine).
  2. Boot DataHub and seed the demo graph:
# first run pulls images, ~5–10 min
bash demo/up.sh

Confirm the lineage schema, then run against a real PR, it posts the comment and writes the assessment back into DataHub.

pathfinder doctor pathfinder run --pr https://github.com/you/repo/pull/42

Or run offline against a lineage fixture, no DataHub needed, which is how the samples in examples/ were generated.

Drop the action into any data repo. It self-gates, skips cleanly until a DataHub secret is set, so it never fails a PR by accident.

# .github/workflows/pathfinder.yml - uses: Techkeyy/pathfinder/action@main with: datahub-url: ${{ secrets.DATAHUB_GMS_URL }} fail-on-breaking: 'false'
change_extractorSQL/dbt diff → typed column & filter changes
datahub_clientGraphQL lineage walk → the cross-stack + ML blast radius
classifierdeterministic severity (ML- and prod-aware)
remediationbackward-compatible fix generation
reporterPR comment + owner notifications
writebackannotate the change back into DataHub
  • DoesTraces the whole stack, tables, dashboards, ML features, and production ML models, in one lineage walk.
  • DoesKeeps verdicts deterministic; runs with no API key. An LLM only (optionally) polishes the drafted fix.
  • DoesReports “cannot assess”, never a false “safe”, when a changed dataset isn't in DataHub.
  • Not yetChanges that flow through a bare SELECT * aren't visible, there are no named columns to diff.
  • Not yetA model's serving deployment is one hop past DataHub's lineage edges; the model itself is flagged, the deployment is roadmap.