dbt PR Review
Requirements
Agent: reviewer (read-only) — also works from analyst/builder.
Tools used: dbt_pr_review (primary), impact_analysis, altimate_core_equivalence, altimate_core_check, lineage_check, read-only git.
When to Use This Skill
Use when the user wants to:
- Review a dbt pull request (changed models) before merge
- Get a single verdict (APPROVE / COMMENT / REQUEST_CHANGES) with evidence
- Understand the downstream blast radius of a model/column change
- Check whether a "refactor" actually preserves results (query equivalence)
- Catch PII exposure, contract breaks, or warehouse-cost anti-patterns pre-merge
What makes this different from a generic AI reviewer
Generic reviewers read the diff as text and guess. This review is backed by the
Rust core: every blocking finding carries a deterministic proof (an equivalence
counterexample, a downstream-model list, a PII classification). The verdict is
signed into a replayable envelope keyed to the dbt manifest.
Workflow
Run the verdict engine. Call dbt_pr_review once:
dbt_pr_review({}) reviews the working tree against origin/main.
dbt_pr_review({ base: "origin/main", head: "HEAD", manifest_path: "target/manifest.json" })
for an explicit PR range.
- The tool reads
.altimate/review.yml for the per-repo rubric and mode.
Read the signed envelope. It contains the verdict, a risk tier
(trivial / lite / full), and findings grouped by severity
(critical / warning / suggestion), each with engine evidence.
Present the verdict exactly as returned. Group findings by severity.
If the run is degraded (no manifest/warehouse), state that lineage,
equivalence, and data-impact were NOT verified — it is a lint-only review.
Respect the safety invariant. An UNDECIDABLE equivalence result is a
WARNING, never a block. Never claim a refactor is unsafe when equivalence
could not be decided — recommend a data-diff instead.
Configuration (.altimate/review.yml)
mode: comment # comment (never blocks) | gate (blocks on REQUEST_CHANGES)
severityThreshold: suggestion
manifestPath: target/manifest.json
dialect: snowflake
reviewers: [] # empty = tier defaults; or pin lanes e.g. [lineage_breakage, semantic_change]
exclude:
- models/legacy/**
rubric:
blockOn: [lineage_breakage, contract_violation, pii_exposure, semantic_change]
warningPatternThreshold: 3
thresholds:
warehouseCostMinRows: 1000000
Verdict rubric (defaults)
- REQUEST_CHANGES — any blocking-category
critical (broken lineage with
downstream consumers, contract violation, PII exposure, proven non-equivalent
rewrite), or ≥3 warnings (risk pattern).
- COMMENT — only suggestions, or a single non-blocking warning.
- APPROVE — no findings.
In comment mode (default), REQUEST_CHANGES is posted as comments rather than
blocking the merge. Switch to gate per-repo once you trust the false-positive rate.
1---2name: dbt-pr-review3description: Cloudflare-style AI code review for dbt/SQL pull requests. Produces a signed APPROVE/COMMENT/REQUEST_CHANGES verdict where every blocking finding is backed by a deterministic engine call — column-lineage blast radius, query equivalence, PII classification, and A–F grade. Use to review a dbt PR or the working-tree changes before merge.4---56# dbt PR Review78## Requirements9**Agent:** `reviewer` (read-only) — also works from `analyst`/`builder`.10**Tools used:** `dbt_pr_review` (primary), `impact_analysis`, `altimate_core_equivalence`, `altimate_core_check`, `lineage_check`, read-only `git`.1112## When to Use This Skill1314Use when the user wants to:15- Review a dbt pull request (changed models) before merge16- Get a single verdict (APPROVE / COMMENT / REQUEST_CHANGES) with evidence17- Understand the downstream blast radius of a model/column change18- Check whether a "refactor" actually preserves results (query equivalence)19- Catch PII exposure, contract breaks, or warehouse-cost anti-patterns pre-merge2021## What makes this different from a generic AI reviewer2223Generic reviewers read the diff as text and guess. This review is backed by the24Rust core: every blocking finding carries a deterministic proof (an equivalence25counterexample, a downstream-model list, a PII classification). The verdict is26**signed** into a replayable envelope keyed to the dbt manifest.2728## Workflow29301. **Run the verdict engine.** Call `dbt_pr_review` once:31 - `dbt_pr_review({})` reviews the working tree against `origin/main`.32 - `dbt_pr_review({ base: "origin/main", head: "HEAD", manifest_path: "target/manifest.json" })`33 for an explicit PR range.34 - The tool reads `.altimate/review.yml` for the per-repo rubric and `mode`.35362. **Read the signed envelope.** It contains the verdict, a risk tier37 (trivial / lite / full), and findings grouped by severity38 (critical / warning / suggestion), each with engine evidence.39403. **Present the verdict** exactly as returned. Group findings by severity.41 If the run is **degraded** (no manifest/warehouse), state that lineage,42 equivalence, and data-impact were NOT verified — it is a lint-only review.43444. **Respect the safety invariant.** An UNDECIDABLE equivalence result is a45 WARNING, never a block. Never claim a refactor is unsafe when equivalence46 could not be decided — recommend a data-diff instead.4748## Configuration (`.altimate/review.yml`)4950```yaml51mode: comment # comment (never blocks) | gate (blocks on REQUEST_CHANGES)52severityThreshold: suggestion53manifestPath: target/manifest.json54dialect: snowflake55reviewers: [] # empty = tier defaults; or pin lanes e.g. [lineage_breakage, semantic_change]56exclude:57 - models/legacy/**58rubric:59 blockOn: [lineage_breakage, contract_violation, pii_exposure, semantic_change]60 warningPatternThreshold: 361 thresholds:62 warehouseCostMinRows: 100000063```6465## Verdict rubric (defaults)6667- **REQUEST_CHANGES** — any blocking-category `critical` (broken lineage with68 downstream consumers, contract violation, PII exposure, proven non-equivalent69 rewrite), or ≥3 warnings (risk pattern).70- **COMMENT** — only suggestions, or a single non-blocking warning.71- **APPROVE** — no findings.7273In `comment` mode (default), REQUEST_CHANGES is posted as comments rather than74blocking the merge. Switch to `gate` per-repo once you trust the false-positive rate.