dbt PR review: CI experience hides the engine's proofs (undocumented artifacts, misleading lint-only banner, silent AI lane, guessed base ref)
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 35/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- github-actions, sql, typescript
- Domain
- ci-cd, cli, data-engineering, documentation
Research direction
Start with the end-to-end dbt PR review on jaffle_shop_duckdb, then trace summary.degraded in orchestrate.ts and format.ts and the failure paths in runAiReview. Read github/review/action.yml and github/review/examples/altimate-ingestion.yml alongside the GITHUB_EVENT_PATH path. Done means the listed CI statuses, artifact hints, metadata, telemetry fields, grouped findings, and documentation are represented honestly.
Written by the indexing model from the issue text.
Description
Summary
Running the dbt PR review end to end (altimate-code 0.10.0 on jaffle_shop_duckdb with five injected changes) and mining the 30 most recent reviews in our own dogfood repo surfaced a cluster of CI-experience problems. None change what the engine proves; all change whether users see it.
Problems
- Artifacts that decide fidelity are undocumented. Equivalence and lineage-breakage proofs need
target/catalog.json(dbt docs generate) and compiled SQL for the base ref intarget-base/compiled. Neither appears in the usage doc quick-start,github/review/action.yml, orgithub/review/examples/altimate-ingestion.yml;target-baseis mentioned only in prose. 57% of our dogfood reviews ran lint-only. - "Lint-only run — no dbt manifest/warehouse was available" is shown when a manifest was present.
summary.degradedisrunDegraded || findings.some(f => f.degraded), so a single undecidable finding flips the whole-run banner (orchestrate.ts,format.ts). - The AI lane fails silently. Every failure path in
runAiReviewreturns[]with only a log; telemetry shows 18% of CI runs callreview_ai_promptand neverreview_ai_parse. A default run with no credentials attempted a stale local endpoint every time; the docs say the lane is "skipped". - Base ref is guessed.
defaultBaseRefwalksorigin/main → origin/master → main → masterand ignores the event'spull_request.base.ref. A PR againstdeploymentwas diffed againstmain. - One rule is half of all findings. "new model has no uniqueness/grain test" was 427 of 853 findings across 30 dogfood PRs, one bullet per model, never acted on.
- Headless review telemetry has no
project_id.Telemetry.setContextis only called from the interactive session loop, soaltimate reviewevents cannot be grouped by repo. - PR title/body never reach the AI lane in CI, so its intent check cannot run.
- Docs describe PII classification as "columns that newly expose sensitive data"; the lane flags any PII column present in a touched model.
Fix (this PR)
Separate lintOnly from undecidableFindings in the envelope and render each honestly; add artifact hints with the exact commands; AI lane returns ok | skipped | timeout | error with a reason, rendered in the summary and recorded in review_run (ai_status, ai_findings, undecidable_findings); scale the AI timeout with prompt size; read base ref and PR title/body from GITHUB_EVENT_PATH; group repeated grain-test findings in the summary while keeping atomic findings; set project_id on the headless path; update the docs, action and example workflow to compile head and base and generate the catalog.
Out of scope, tracked in docs/internal/2026-09-03-dbt-pr-review-deep-dive.md
Verdict provenance (catalog rules can currently block, contrary to the README), loading .altimate/review.yml from the base rather than the PR head, gate lifecycle / override wiring, inline-comment dedupe, positional equivalence false positive (core), feedback loop.
- Dominant language
- TypeScript
- Stars
- 813
- Forks
- 134
- Avg merge
- 2d 5h
- Merged PRs (30d)
- 62
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from AltimateAI/altimate-code
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
AltimateAI/altimate-code#1323 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
AltimateAI/altimate-code#1288 ·
-
Difficulty 1/5 Under an hour Newbie friendliness 92/100
AltimateAI/altimate-code#1285 ·
-
privacy: Altimate Base consent dialog no longer discloses persistent per-installation identifier Open
Difficulty 1/5 Under an hour Newbie friendliness 88/100
AltimateAI/altimate-code#1284 ·
-
Difficulty 2/5 Under an hour Newbie friendliness 72/100
AltimateAI/altimate-code#1283 ·
All issues in AltimateAI/altimate-code
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
copse-dev/agent-pane#2953 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
Eynzof/Hermes-CN-Desktop#610 ·
-
bug clawsweeper:linked-pr-open clawsweeper:needs-live-repro clawsweeper:no-new-fix-pr impact:message-loss issue-rating: 🐚 platinum hermit P2 regression
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
calcite-components needs triage refactor
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
Esri/calcite-design-system#15203 ·