Skip to main content

impactgraph

What breaks if I merge this? — a pre-merge safety net for code and data, built on datagraph.

PyPI Python CI License

flowchart LR
    classDef changed fill:#ffe0b2,stroke:#e65100,stroke-width:2px
    classDef hit fill:#fde2e2,stroke:#c62828
    G["git diff<br/>(PR vs base)"] --> F["changed functions<br/>models · files"]:::changed
    F -->|graph walk| T["tables · columns"]:::hit --> M["dbt models"]:::hit --> D["dashboards · APIs"]:::hit
    D --> R["risk level · owners to notify<br/>test plan"]
    R --> O["PR comment (Markdown)<br/>JSON · HTML · exit code (--fail-on)"]

impactgraph takes the git diff of a pull request, maps it onto a deterministic dependency graph (Python/JS functions → Lambdas/APIs → tables → dbt models → columns → dashboards) and reports the blast radius, risk level, owners to notify and a test plan — as a terminal report, JSON, a Markdown PR comment, or an interactive HTML view — with an exit code you can gate CI on.

It is the pull-request product built on datagraph, the engine that holds everything data-related: extractors (Python, dbt, SQL, warehouse metadata, Airflow, Lambda, JS, OpenLineage, DataHub, plugins), lineage, relationships, profiling, the knowledge base for AI assistants and the MCP server. impactgraph re-exports the whole engine, so one install gives you both.

git diff  ──►  changed functions / models / files  ──►  graph walk  ──►  risk · owners · tests

New here? Run the guided tour - it creates a demo git repo, makes a change and shows every feature:

python examples/example_impactgraph.py

Install

pip install impactgraph            # core (pulls in datagraph)
pip install "impactgraph[sql]"     # + sqlglot for .sql files and column lineage
pip install "impactgraph[all]"     # + yaml, anthropic (AI explanation), mcp

30-second use

# uncommitted changes in the working tree, Python code + dbt
impactgraph check --repo . --dbt-manifest target/manifest.json

# a PR branch against main, Markdown for the PR comment, fail the job at HIGH or above
impactgraph check --repo . --base origin/main --format markdown --fail-on HIGH

# machine-readable, and keep the graph for later questions
impactgraph check --repo . --base origin/main --format json --save-graph impactgraph.json
impactgraph impact dbt:customer --graph impactgraph.json       # any datagraph command passes through
impactgraph lineage table:prod.analytics.dim_customer --graph impactgraph.json
impactgraph context dim_customer --graph impactgraph.json      # knowledge pack for an AI assistant

Typical output (text format):

changed files (1): src/etl/load_customers.py
Changed: func:src/etl/load_customers.py::load_customers   risk HIGH (score 20.0)
├── ▤ prod.analytics.customer (table) via writes_to
│   └── ◆ dim_customer (dbt_model) via depends_on
│       └── ◆ fact_booking (dbt_model) via depends_on
│           ├── 📊 revenue_report (dashboard) via exposes
│           └── 📊 customer_dashboard (dashboard) via exposes
Notify: finance (revenue_report) · growth (customer_dashboard)
Recommended tests:
  ✓ pytest -k load_customers
  ✓ dbt build --select dim_customer+ fact_booking+
  ✓ Manually validate 'revenue_report' after deploy

check options: --base/--head, --code DIR (code root if not the repo root), --graph FILE / --save-graph FILE --update, every datagraph build input (--dbt-manifest --dbt-catalog --sql --airflow --lambda --js --warehouse --openlineage --lineage-file --datahub), --max-depth, --no-inferred (artifact-backed edges only), --format text|json|markdown, --html FILE, --fail-on LEVEL, -o FILE.

GitHub Action — a comment on every PR

# .github/workflows/impact.yml
name: change impact
on: pull_request
permissions: { contents: read, pull-requests: write }
jobs:
  impact:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }
      - uses: actions/setup-python@v5
        with: { python-version: "3.12" }
      - uses: sumit-gupta03/impactgraph@main
        with:
          repo-path: src
          dbt-manifest: target/manifest.json
          fail-on: CRITICAL        # LOW | MEDIUM | HIGH | CRITICAL | NONE

The action installs impactgraph, diffs the PR against its base, posts the Markdown report as a PR comment (and to the job summary) and exposes level as an output.

Python API

from impactgraph import check, to_markdown

result = check(".", base="origin/main", inputs={"dbt_manifest": "target/manifest.json"})
print(result.level, result.score, result.changed_files)
print(result.analysis.recommended_tests, result.analysis.owners)
print(to_markdown(result))                     # the PR comment
assert not result.breaches("HIGH")

Everything from datagraph is re-exported (from impactgraph import ImpactGraph, analyze_impact, DbtExtractor, ...).

How it works (and why it is trustworthy)

  1. Deterministic graph — built from artifacts only (AST, manifests, SQL parse, metadata, git). No LLM builds nodes.
  2. Typed edges with an impact directioncontains, writes_to, exposes flow forward; calls, imports, depends_on flow backward — so a change propagates the way reality does.
  3. Provenance — every edge is extracted, inferred or llm; --no-inferred drops heuristics.
  4. Diff → function — changed line ranges map to the exact functions/models touched, not whole files.
  5. Risk, owners, tests — a weighted score over affected node types (dashboards and tables weigh more), owners collected from dbt/DataHub metadata, test suggestions per node type.
  6. AI only explainsimpactgraph explain ... (optional [ai]) narrates the result; it never changes it.

Use it from AI coding assistants

Copy skills/impactgraph/ to .claude/skills/impactgraph/ (or ~/.claude/skills/) and ask "is this change safe?", "what breaks if I change load_customers?". For MCP, the knowledge base (wiki, context) and data analysis (relationships, profile) use datagraph directly.

impactgraph vs datagraph

impactgraph datagraph
Audience developers, reviewers, CI data engineers, analysts, AI-assistant builders
Question will this PR break something? where does this data come from, how is it related, what does it look like, give my assistant the context
Ships check / pr CLI, GitHub Action, skill; passes everything else through the engine: extractors, lineage, relationships, profiling, wiki/context, MCP, plugins
Graph & node ids identical — a graph built by one is readable by the other

Security

impactgraph inherits datagraph's security model (deterministic core, LLM only explains, prompts wrap repo/warehouse text as untrusted data, DSN passwords never stored or logged, profiling masks sensitive columns, quoted identifiers, escaped HTML). The PR comment is plain Markdown built from node names in your repository; the GitHub Action needs only pull-requests: write and the default GITHUB_TOKEN. See the datagraph security notes.

Development

git clone https://github.com/sumit-gupta03/impactgraph && cd impactgraph
pip install -e ".[dev]"     # pulls datagraph-core from PyPI (the engine; import name datagraph)
pytest

History: versions ≤ 0.5 of this repository contained the whole engine; it now lives in datagraph and impactgraph (≥ 0.6) is the thin PR-focused layer.

Authors

Sumit Kumar Gupta and Nitish Pradhan.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

impactgraph-0.7.5.tar.gz (16.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

impactgraph-0.7.5-py3-none-any.whl (12.2 kB view details)

Uploaded Python 3

File details

Details for the file impactgraph-0.7.5.tar.gz.

File metadata

  • Download URL: impactgraph-0.7.5.tar.gz
  • Upload date:
  • Size: 16.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for impactgraph-0.7.5.tar.gz
Algorithm Hash digest
SHA256 fec4d0d05bd983a0dcc6bf3615f3fdd89bf94fdd1ba6dcbdad19abc2b1bcefd5
MD5 02103f3955f788d46a2a4f4e4d2bea29
BLAKE2b-256 c56e558e6c772f474258720c9e2168298a93b99d369f9c3d2cf1c45e74a869f8

See more details on using hashes here.

Provenance

The following attestation bundles were made for impactgraph-0.7.5.tar.gz:

Publisher: publish.yml on sumit-gupta03/impactgraph

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file impactgraph-0.7.5-py3-none-any.whl.

File metadata

  • Download URL: impactgraph-0.7.5-py3-none-any.whl
  • Upload date:
  • Size: 12.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for impactgraph-0.7.5-py3-none-any.whl
Algorithm Hash digest
SHA256 6cf1987594f78cd3c117cf4fd79c26e567c4d689fc4f7870fd79998332bfaa15
MD5 c59ae801f9c3c745ab03aedf06fb37f6
BLAKE2b-256 cf77a2db543156190098c7481a59191f408a6bd2d01a6f5685f5ba7a4237749c

See more details on using hashes here.

Provenance

The following attestation bundles were made for impactgraph-0.7.5-py3-none-any.whl:

Publisher: publish.yml on sumit-gupta03/impactgraph

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.7.6

2 files

This release

0.7.5 This release

2 files

0.7.4

2 files

0.7.3

2 files

0.7.2

2 files

0.7.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page