Skip to main content
The end-to-end PR reviewer is a DinoAI agent that acts like a thorough senior reviewer: it checks out the PR branch and reads the diff with the Terminal Tool, checks the linked Jira issue, verifies test and documentation coverage, traces downstream impact through get_lineage and get_exposures, and posts a single structured verdict (APPROVE / REQUEST_CHANGES / REJECT) to Slack. A GitHub Actions workflow triggers the agent on every PR and fails the check when the verdict is REJECT, so the review gates the merge.
This is the Jira variant of the end-to-end PR reviewer. If your team tracks work in Linear, follow that guide instead: the two differ only in the ticket tool (get_jira_issue vs get_linear_issue) and the ticket wording in the agent and trigger script.
Prerequisites
  • Jira connected (the agent calls get_jira_issue to fetch linked tickets). Recommended but not strictly required: if the PR has no Jira link, the agent notes it under SCOPE and continues.
  • Slack connected (the agent posts reviews to #pr-reviews via post_slack_message).
  • An account API key with the DinoAI agent API capability, and admin access to your dbt™ repo on GitHub to add Actions secrets.
  • Familiarity with programmable agents.
Estimated time: 20 minutes.

Steps

1

Create the agent

In the Agent app, open Agents, select New agent, and start from the dbt-model-reviewer template (or Start from scratch). Fill in the builder fields with the content below. See Build an agent in the UI for a tour of the builder.Name: pr-reviewer-e2eRole:
Goal:
Backstory:
Model: leave Auto selected.Allowed tools (everything else is refused, see the Tools Reference):
  • run_terminal_command
  • read_file, search_files_and_directories, ripgrep_search
  • get_jira_issue
  • get_lineage, get_exposures
  • run_sql_query
  • post_slack_message
Output: set the Slack channel to #pr-reviews (or your team’s channel).
The Copilot-only GitHub PR tools (read_pull_request, list_pull_requests) are not available to programmable agents, so the agent reads the diff with git via run_terminal_command instead: the trigger script passes base_branch so the agent pod checks out the PR branch, and the trigger message carries the PR description, base branch, changed-file list, and Jira issue key. get_lineage and get_exposures (dbt Discovery tools) ground the IMPACT section in the real dependency graph, including dashboards, instead of a text search.
2

Deploy the agent

Select Deploy and choose where the agent lives: Just here saves it to the workspace and makes it live immediately, Open a pull request commits it to your repo as .dinoai/agents/pr-reviewer-e2e.yml so it is governed as code. Either way, the agent is triggerable by name from the API. See Creating Agents in the App.
3

Store Paradime credentials as GitHub secrets

Generate an account API key with the DinoAI agent API capability. Copy the API Endpoint shown when the key is generated, the key itself (it starts with prdm_cmp_), and the workspace_token of the workspace the agent lives in (see Company & workspace token).In your dbt™ repo on GitHub, go to SettingsSecrets and variablesActions and add three repository secrets:
4

Add the GitHub Actions workflow

Create .github/workflows/dinoai-pr-review.yml in your dbt™ repo. The workflow runs on every PR when it is opened, updated, or marked ready for review:
.github/workflows/dinoai-pr-review.yml
Then add the trigger script as scripts/pr_review_e2e.py. It reads the PR event payload, computes the changed-file list and any linked Jira issue, triggers the agent, waits for the run to finish, posts the full review as a PR comment, and exits non-zero on a REJECT verdict so the check fails:
scripts/pr_review_e2e.py
Authentication uses an account API key (api_secret starting with prdm_cmp_ plus workspace_uid), which requires paradime-io 6.0.0 or later. See Install and authenticate the Paradime Python SDK.
The issue-key pattern [A-Z]{2,10}-\d+ matches standard Jira keys like DATA-417. If your project keys contain digits (e.g. TEAM1-42), widen the pattern to [A-Z][A-Z0-9]{1,9}-\d+.
5

Read the verdict

Open a PR. The workflow triggers the agent, and when the run completes the full review lands in two places: as a comment on the PR itself and as a message in #pr-reviews. The agent always cites the file and line number for every issue it raises, and it never returns APPROVE if either TESTS or DOCS is FAIL. On a REJECT verdict the workflow exits non-zero, so the check fails and blocks the merge.
On a PR with full coverage that matches its Jira ticket, the DinoAI end-to-end PR review check passes and the review appears as a PR comment and in #pr-reviews with an APPROVE verdict. On a PR missing tests or docs, TESTS or DOCS reads FAIL and the verdict is REQUEST_CHANGES or REJECT, with each issue cited by file and line; a REJECT fails the check. If the run never starts or times out, the Actions log shows the session ID to look up in the Agent app. If the PR has no Jira link, SCOPE notes it and the rest of the review still runs.

How it works

The workflow fires on every PR open, push, or ready-for-review event. The trigger script reads the PR event payload, diffs base against head for the changed-file list, extracts the Jira issue key from the PR description, and passes all of it in the trigger message, along with base_branch so the agent pod checks out the PR branch. The agent then reads the full diff with git via run_terminal_command, pulls the ticket’s requirements and acceptance criteria with get_jira_issue (Jira Tool), and works through the six review dimensions. For IMPACT it walks the dependency graph with get_lineage from each changed model and checks get_exposures for dashboards and apps that consume them, so “this change breaks the revenue dashboard” is a graph fact, not a guess. When the run completes, the script posts the review as a PR comment and fails the job on a REJECT verdict, gating the merge.

Delegate test-writing (optional)

Instead of just flagging missing tests in the verdict, let the reviewer fix them: add test-maintainer to this agent’s Squad in the builder and invoke_agent to its allowed tools. The reviewer then delegates to the dbt™ test maintainer, which writes and validates the tests and reports back via notify_parent_session before the final verdict is composed.

Run it from Bolt instead (optional)

If you do not want the review to gate the merge, you can skip the GitHub Action and run the same agent natively from Bolt: add a Run Paradime DinoAI Agent command to a Bolt schedule with an on-merge trigger, with no API keys to configure. The review then runs after each PR merges and posts to Slack only. See Run an agent with Bolt.

Next steps

End-to-end PR reviewer (Linear)

The same agent for teams that track work in Linear.

dbt™ test maintainer

Delegate test-writing to this sub-agent from the reviewer.

Jira Tool

Everything the agent can read and write in Jira.

Programmable Agents reference

The agent schema, tools, and API.