Skip to main content
PRFlow posts one Slack card per merge request and keeps updating that same message as the MR moves through its lifecycle, while review comments join it as threaded replies. The colored rail on the card’s left edge summarizes the state at a glance, so you can scan a channel without reading a single row. The same card and colors apply to GitHub pull requests.

Reading the requirement rows

The card body shows one row per merge requirement that is actually enabled for the repository: required CI, approvals (with the required count), an up-to-date branch, resolved review threads, and merge conflicts. Each row flips independently as events arrive:
  • 🟢 the requirement is confirmed passing
  • 🔴 the requirement is failing and blocks the merge
  • 🔄 in progress right now (a running pipeline)
  • ⚪ pending (a pipeline that exists but has not started)
  • ◻️ unknown, PRFlow has no signal yet; unknown is never treated as passing
A draft PR’s card shows a 📝 Draft row while the draft flag is set (drafts post when the rule’s Draft PRs switch is on). The rail color is derived from those rows plus the MR’s lifecycle, as follows.

Blue: under review

PRFlow Slack card with a blue rail: CI pending, approvals and threads unknown, up to date, no conflicts

A freshly opened MR: the pipeline is pending and no review signals exist yet.

The default state. Nothing is known to block the merge, but not every requirement is confirmed passing yet. A just-opened MR usually starts blue: the pipeline has not run and nobody has reviewed it. Rows showing ◻️ or ⚪ keep the card blue rather than green, because PRFlow never counts an unknown as a pass.

Amber: in flux

PRFlow Slack card with an amber rail: CI running, other requirements unchanged

The pipeline is running; the card will flip on its own when it finishes.

The state is changing right now. The rail turns amber while the MR is a draft, while a pipeline is actively running, or while a merge is scheduled to happen automatically (for example “merge when pipeline succeeds”). Amber resolves itself: once the pipeline finishes or the draft is marked ready, the card moves to blue, red, or green.

Red: blocked

PRFlow Slack card with a red rail: CI failed, approvals 1/2, two unresolved threads

A blocked MR: failed CI, a missing approval, and two unresolved threads.

At least one required merge gate is failing. Failed or canceled CI, missing approvals, unresolved review threads, a branch that needs a rebase, and merge conflicts all turn the rail red, and the failing rows name exactly what is left to fix. Less common blockers (blocked by another MR, security policy violations, a missing Jira issue, and similar) also turn the rail red and appear as their own row. A failing gate that is not required, such as an optional pipeline, never turns the card red.

Green: ready to merge

PRFlow Slack card with a green rail: CI passed, approvals 2/2, all threads resolved, up to date, no conflicts

Every required gate is passing; the MR can be merged right now.

Every required gate is confirmed passing: the MR is mergeable right now. Green is earned, never assumed. If any required gate is still unknown, the card stays blue instead of guessing.

Purple: merged

PRFlow Slack card with a purple rail: merged into main

A merged MR: the requirement rows collapse into a single line.

The MR was merged. The requirement rows collapse into a single line naming the target branch, so the card becomes a compact record of the MR in the channel. Merged is the card’s only final state: a merged MR cannot be reopened, so the card never changes again.

Grey: closed

PRFlow Slack card with a grey rail: closed

An MR closed without merging.

The MR was closed without being merged: the rows collapse into a single ❌ Closed line. Unlike merged, closed is not final. If the MR is reopened, the card comes back to life and the rail returns to whatever color the reopened MR’s state calls for.
Questions about a state you’re seeing? Email hello@prflow.dev.