Examples / PR review bot
PR review bot
When a pull request opens, Murmurator reads the diff, asks your model for a structured risk review, comments on the PR, and pings Slack when something looks risky.
GitHubSlackYour AI models
What you tell the assistant
Why it works
- Structured output drives the branching — high-risk reviews also go to Slack.
- The model only sees the diff you fetched; nothing else leaves your connections.
- Every run keeps the exact input, output and tokens for each step.
What it builds
Trigger
GitHub
github · pull_request · northwind/api
tool
Fetch pull request
github.get_pull_request
llm
Review the diff
smart · structured
tool
Comment on the PR
github.create_comment
tool
Alert #eng-reviews
slack.post_message
if review.output.data.risk equals high
View the definition
trigger:
kind: github
connection: github
events: [pull_request]
actions: [opened, ready_for_review]
repos: [northwind/api]
steps:
- key: pr
name: Fetch pull request
kind: tool
tool: github.get_pull_request
args:
repo: "{{ trigger.repository.full_name }}"
number: "{{ trigger.pull_request.number }}"
include_diff: true
- key: review
name: Review the diff
kind: llm
model: smart
system: You are a meticulous senior engineer reviewing a pull request. Be specific and brief.
prompt: |
Review this pull request. Focus on correctness, security and data migrations.
{{ steps.pr.output }}
schema:
type: object
properties:
risk: { type: string, enum: [low, medium, high] }
summary: { type: string }
concerns: { type: array, items: { type: string } }
required: [risk, summary, concerns]
- key: comment
name: Comment on the PR
kind: tool
tool: github.create_comment
args:
repo: "{{ trigger.repository.full_name }}"
number: "{{ trigger.pull_request.number }}"
body: "**Automated review — risk: {{ steps.review.output.data.risk }}**\n\n{{ steps.review.output.data.summary }}"
- key: alert
name: "Alert #eng-reviews"
kind: tool
if: { path: steps.review.output.data.risk, equals: high }
tool: slack.post_message
args:
channel: C04ENGREVIEW
text: ":rotating_light: High-risk PR: {{ steps.pr.output.title }} {{ steps.pr.output.html_url }}"
A sample run
What each step produces
Fetch pull request tool
succeeded
Fetch pull request tool
Calling github.get_pull_request
{
"number": 1482,
"title": "Backfill invoice currency and drop legacy column",
"author": "sokafor",
"state": "open",
"additions": 212,
"deletions": 48,
"changed_files": 9,
"html_url": "https://github.com/northwind/api/pull/1482"
}
Review the diff llm
succeeded
Review the diff llm
Using model smart (Claude Sonnet 5, Murmurator AI)
{
"text": "",
"data": {
"risk": "high",
"summary": "The migration drops `invoices.legacy_currency` in the same deploy that backfills its replacement. If the backfill job lags, reads during the deploy window will return null currencies.",
"concerns": [
"Split the column drop into a follow-up migration after the backfill completes.",
"The backfill runs in a single transaction over ~4M rows; batch it.",
"Add a NOT NULL constraint only after verifying the backfill."
]
}
}
Comment on the PR tool
succeeded
Comment on the PR tool
Calling github.create_comment
{
"id": 2231984410,
"html_url": "https://github.com/northwind/api/pull/1482#issuecomment-2231984410"
}
Alert #eng-reviews tool
succeeded
Alert #eng-reviews tool
Calling slack.post_message
{
"channel": "C04ENGREVIEW",
"ts": "1758639620.004100"
}
Trigger payload
{
"event": "pull_request",
"action": "opened",
"repository": {
"full_name": "northwind/api"
},
"pull_request": {
"number": 1482,
"title": "Backfill invoice currency and drop legacy column"
}
}
More examples
Your next automation is one sentence away.
14-day free trial with $5 of built-in AI included. Cancel anytime.