Skip to main content
When a listener holds a statement for a person (require_review), the Control Plane posts a review to Slack. A reviewer clicks Approve or Reject in the message. hoop finds the hoop user behind the Slack user by email and checks that user’s groups.
This page is for the Control Plane. For the Gateway, see Slack.

How it works

  • Reviewers are hoop users. Their groups come from your identity provider at each login.
  • Channels are per listener. A listener without channels uses the fallback channel.
  • Socket Mode. The Control Plane dials out to Slack. No inbound URL is exposed.

Requirements

  • Permission to create a Slack app and install it in your workspace.
  • An admin user on the Control Plane.
  • One Slack app for this Control Plane only. Slack sends each click to any open connection of the app. A Gateway or a second Control Plane on the same app token takes clicks that are not theirs.
  • One Control Plane replica with Slack configured. See Replicas and Deployment Strategy.

1. Create the Slack app

1

Create the app from a manifest

Open a new Slack app from an app manifest, choose the workspace and paste this manifest.
2

Install it

Click Install to Workspace. Then open OAuth & Permissions and copy the Bot User OAuth Token (xoxb-…).
3

Create the app-level token

Open Basic Information → App-Level Tokens → Generate Token and Scopes. Name it hoop, add the scope connections:write, and copy the token (xapp-…).
4

Prepare the channels

Choose a fallback channel, and optionally one channel per listener. For a private channel, invite the bot: type /invite @Hoop Bot in the channel.hoop takes channel IDs, not names. Open the channel details and copy the Channel ID at the bottom (C0…).
Already have a Slack app for hoop? Add the users:read and users:read.email scopes and reinstall it. Slack does not apply new scopes before a reinstall. Do not share it with a Gateway.

2. Configure the Control Plane

1

Save the tokens

Go to Settings → Slack → Configurations. Paste the Slack bot token and the Slack app token. Optionally set the Fallback channel: it receives the reviews of listeners with no channel. Click Save.The Control Plane log shows connected to Slack with Socket Mode.
2

Choose a channel per listener

Open the Listeners tab. It lists every listener of every Sidecar. Type the channel IDs in a listener’s row and click Save on that row.A listener with no channel posts to the fallback channel. With neither, the review is filed but nobody is notified in Slack, and the Control Plane logs a warning.

3. Give reviewers their groups

A reviewer is a hoop user in a group the rule names. The groups come from the login:
  • With an identity provider (OIDC or SAML): each login replaces the user’s groups with the ones the provider sends. OIDC keeps the admin group; SAML does not. For OIDC, set IDP_GROUPS_CLAIM to the claim that holds them. See Identity provider.
  • With local auth, or a login that sends no groups: set the groups on Settings → Users.
A reviewer needs a hoop user: they log in once, or an admin adds them on Settings → Users. With an identity provider, no invitation is needed: the first login creates the user. With local auth, only an admin creates users. A group change in the identity provider reaches hoop at the reviewer’s next login. After login, an admin lands on Sidecars and every other user on Reviews.
Microsoft Entra ID sends group IDs (GUIDs) by default, not names. Name those IDs on the rule, or configure Entra to send group names.
If a reviewer’s Slack email differs from their hoop email, set their Slack ID on Settings → Users. To copy it in Slack: open the person’s profile → ⋮ → Copy member ID (U…).

4. Name the reviewers on the rule

Go to AI Analyzer and open the rule. Set a risk level to Hold for approval, then pick the groups in Reviewers. The list shows every group of the organization. One approval from any of them releases the statement. With no group, the admin group reviews. The Control Plane sets the listener’s approval_rule to this rule for you. See Holding a statement for a person.

5. Approve in Slack

The review shows the Sidecar, the listener, the statement and one button per group that may approve. Reject asks for an optional reason. More details opens the review on the Control Plane Reviews page, which every signed-in user can open. On a click, hoop finds the approver:
  1. The hoop user with that Slack ID.
  2. Else, exactly one hoop user with the Slack user’s email.
The user must be active or invited, and in the group of the button. Otherwise only the clicker sees why: see Messages in Slack. The Sidecar sees the approval on its next poll, within 5 seconds.

Messages in Slack

On the review message

Everyone in the channel sees these. They replace the buttons as the review changes, whether a reviewer acts in Slack, on the Reviews page or through the API.

Only to the person who clicked

hoop checks a click in this order and answers with the first check that fails. Reject asks for the reason before these checks run, so a refused reviewer sees the answer after sending the reason. The Slack user The hoop user The group The review

Troubleshooting

  • No message in Slack. The listener has no channel and there is no fallback, a channel ID is wrong, the bot is not in the private channel, or the log lacks connected to Slack with Socket Mode.
  • A click does nothing, or answers “You are not registered”. Another server uses the same app token, usually a Gateway. Give the Control Plane its own app.
  • Each review arrives twice. Two Control Plane replicas run with Slack configured. Run one.
  • A reviewer is refused after joining a group. hoop reads groups at login. The reviewer logs in again.

Differences from the Gateway

The Sidecar reports a statement, not a person, so the requester is unknown. Compared with the Gateway:
  • No /hoop subscribe: hoop matches the Slack user by email.
  • Channels are set per listener, not per connection.
  • No message to the requester, no requester groups and no self-approval check.