Your agents opened eleven pull requests this morning. Which one needs a human?
PullPulse routes GitHub pull requests into the Slack channels your team already uses, mentions the people who can actually act, and ranks the queue by the review effort each change really needs. Review is the bottleneck now; a notifier that treats a 900-line agent refactor like a colleague's typo fix multiplies the work instead of reducing it.
Unattended PRs get their own policy
Detected from the account that opened the pull request — bot actor type plus a registry of known agent logins — then held until CI is green, collapsed into one rollup per repo, and escalated to a human only when the risk score earns it. Never inferred from commit trailers or branch names, so a person using an AI editor keeps their own message.
Ranking, not filtering
Every pull request gets a deterministic 0–100 risk score and an estimated review time, from real signals: blast radius via CODEOWNERS, migrations, dependency and CI changes, test-to-source ratio, diff entropy.
One message per pull request
A single self-updating Slack message tracks status, reviewers, checks and mergeability. Follow-ups go in its thread. No channel-per-PR, no re-post storms.
A model that may nudge, never decide
The AI brief says what changed and which three hunks to read first. It can adjust a risk score by ±15 points and must explain itself; it can never set one. Scores stay reproducible with no model at all.
Reminders that stop
Nudges respect working hours, timezones and a per-person notification cap, escalate along CODEOWNERS, and go silent the moment a human actually acts.
Your agents are users too
The same review state is exposed over MCP, so Claude Code or Cursor can ask what is blocking and who knows the code instead of guessing from a diff.
How it works
- Add it to Slack, then choose the repositories. Two screens: authorise the Slack app, then pick which repositories our GitHub App may see. Nothing to deploy, no app of your own to register, no secrets to paste anywhere — and the setup page tells you what is still missing.
- Commit a
.pullpulse.yml, or don't. Defaults route every pull request to one channel and hold agent PRs until CI is green. Rules are first-match-wins with an explain trace, so routing is auditable rather than mysterious. - Work in Slack. One self-updating message per pull request, reminders that escalate along CODEOWNERS and stop when someone reviews, a daily digest, and an agent in the sidebar that answers "what's blocking my PRs?" from live state.
Where your data lives
PullPulse runs on Cloudflare's edge: D1 for state, R2 for a replayable webhook archive, Durable Objects for per-pull-request consistency. Slack and model credentials are sealed with AES-256-GCM, the raw webhook archive is swept after 30 days, and diff content is never persisted or logged — it exists only in memory during enrichment and in the prompt sent to the model. The privacy page names every table, every sub-processor and every retention window.