PullPulse posts one message per pull request and edits it as things happen. This page covers that message, its thread, and the surfaces around it: the digest, the reminder DM, the agent rollup and the markdown fallback.
One card, never re-posted
A pull request gets one Slack message. Every later event — a check finishing, a review landing, a
push — edits that message in place; nothing is re-sent for the same pull request. Posting can wait
for a draft to be marked ready or for checks to start, per the repository's holdUntil setting.
Once posted, the message stays one message until merged or closed, when it collapses (see "The
fold").
The four-stop rail
Every card carries a rail: four stops, one glyph each, always in this order, always the same labels.
● Ready · ● Checks · ◐ Review · ○ Merge (full card)
●●◐○ (compact row)
Only the glyph changes; one event moves one character and nothing else. The same rail, compact, appears in the digest table, the reminder and the App Home queue.
| Stop | not started | done | in progress | blocked |
|---|---|---|---|---|
| Ready | ○ draft |
● ready for review |
— | — |
| Checks | ◌ no CI |
● passing |
◔ running |
⊗ failing |
| Review | ○ nobody looked |
● fully approved |
◔ someone reviewing, ◐ partial |
⟲ changes requested |
| Merge | ○ not yet |
● merged |
— | ⊘ conflicts |
The ask line
Line one of the card body: what the pull request wants, how much work it is, and what to know before approving.
👀 Needs a reviewer · ▮▮▮▮ high · ~45 min · migration, no tests
- Ask — a short phrase, up to 22 characters: Needs a reviewer, Lee is reviewing, Build failing, Changes requested, 1 approval, Ready to merge, Merge conflicts, Merged, Closed.
- Meter and effort — the complexity meter and minute estimate; see How PullPulse rates a pull request.
- Flags — up to two attention flags; more collapse to
+n.
Before the file list has arrived, the line shows only the ask — no meter, no estimate, no guess.
The ledger line
One line under the card answers "what just happened, and when, in your own timezone":
Posted · asked Lee and Sam · 11:34 AM
It updates on every transition and names who did it; the time is a Slack date token, so each reader sees their own clock. It never disappears — with nothing new to report it says when the card was first posted and who was asked.
The three buttons
Fixed order, so a reader's thumb keeps its place:
- Open on GitHub
- Brief — the AI summary, in the thread
- I'll review it while the card is asking a reviewer for something (nobody has looked, someone is mid-review, or one approval is not enough); Explain otherwise (red build, changes requested, conflict, or already ready to merge).
I'll review it does what reacting 👀 does: requests a GitHub review from whoever clicked, and the Review stop updates to show them holding it.
The low-emphasis row
Four icon buttons, always reachable: 🔍 Explain (the routing trace — matched rule, rejected rules and why, resolved targets), ⏰ Snooze (hides the card from the clicker only), 🔕 Mute (shared — shows on the card with who muted it and until when), 📅 Snooze until… (pick a time). Snooze is personal and invisible to everyone else; mute is shared and visible to everyone.
The fold: merged or closed
A merged or closed pull request stops being a card. It collapses to one line: the state mark, the title, the finished rail, who resolved it, and — for a merge — the one number kept, time from ready to merge:
Add rate limiting to the ingest path #412 · ●●●● · merged by @dana · 3h 48m from ready to merged · View
No alert, no detail, no buttons — the thread and reactions stay, since it is the same message, just
shorter. A compact-density card with no transition for 48 hours folds the same way temporarily,
and unfolds on the next event; see Keeping a busy channel quiet.
What each event changes
| Event | What changes | Notifies |
|---|---|---|
| Draft opened; ready with checks running | nothing posted yet | — |
| Checks turn green | first post | mention set, once |
| Claimed | Review → in progress; ledger names who | — |
| Push, checks turn red | Checks → failing; ask moves to author | — |
| Checks green again | Checks → passing; previous ask restored | — |
| Changes requested | Review → changes requested; ask moves to author | — |
| Approved, more needed | Review → partial; ledger names who is left | — |
| Approved, mergeable, green | Review → done; ask becomes Ready to merge | one reply to author |
| Base moves, conflicts appear | Merge → conflicts; ask moves to author | — |
| Merged / closed | folds to one line | — |
| Reminder fires | ledger notes how long it's been quiet | DM to reviewer(s) |
| Channel route muted | metadata line gains who and until when | — |
Exactly one notification
The table above has one Notifies entry, and that is the whole rule: the mention set (reviewers,
by default) is named once, in the first post's mention line; the author gets one thread reply the
first time the pull request can merge, via notifyAuthorOnReady (default on, never for an agent or
bot author); reminders are DMs, never channel pings, and stop once a human approves or requests
changes. Every other transition is a silent edit — nobody is re-notified for a card they already
saw.
The thread
Three things only: the brief (one reply, rewritten on every push — what changed, why it matters, what to check, suggested reviewers); the ready-to-merge ping (sent once, to the author); relayed review comments from GitHub. There is no per-transition log — the ledger on the card is the log.
Digest, reminders, and the agent rollup
- The digest — read instead of the channel: totals for the window (opened, merged, median first-review time, share opened by agents), then one row per pull request grouped by what it needs (needs a review, ready to merge, awaiting changes, stale, agent queue, merged recently), each with the compact rail.
- The reminder DM carries the card for one pull request, or a carousel of up to ten for several, highest complexity first, each with its own buttons. Past ten, the DM lists the top ten and points at App Home.
- The agent rollup collapses concurrent pull requests from a coding agent into one message per repository, ranked, instead of one interruption each. Rows carry the compact rail.
Markdown fallback
A Slack client that does not know the card and carousel blocks sees a plain markdown message
stating the same facts in the same order instead.
Releases
A repository's releases are a separate surface with its own opt-in, its own three-stop rail and its own fold; see Releases and what shipped.