require_review), the Control Plane posts a review to Slack. A reviewer clicks Approve or Reject in the message. They never open the Control Plane: hoop finds the hoop user behind the Slack user and checks that user’s groups.
This page is for the Control Plane. For the Gateway, see Slack.
How it works
- Channels are per listener. A listener without channels uses the fallback channel.
- Reviewers are hoop users. They come from Slack user groups (the Slack import) or from the Users page.
- 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.
- A paid Slack plan (Pro or higher) for the Slack import: Slack user groups do not exist on the free plan. Without it, add reviewers on the Users page.
- 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.
slack-manifest.json
slack-manifest.json
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…).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. Add reviewers
A reviewer is a hoop user in the group the rule names. Add them in one of two ways.- Slack import
- Users page
The members of the Slack user groups you pick become hoop users.
@dba-leads becomes the group dba-leads.- Go to Settings → Users → Slack import.
- Pick the user groups and the sync interval (5 minutes or more).
- Click Save, then Sync now.
- Open Members: the users show with their groups and Slack ID.
- Finds each member by Slack ID, then by email, else creates the user. The Slack ID links the two.
- Skips bots, guests, deactivated users and users of other organizations.
- Keeps the group name of the first import. A rename in Slack does not rename the hoop group, so the rules that name it keep working.
- A member who leaves the user group loses the hoop group and keeps the account.
- A user deactivated in Slack is deactivated in hoop, never an admin. The import never reactivates a user.
- Refuses a user group named
admin,auditororapprover. - Writes one audit entry with who joined and left each group.
4. Name the reviewers on the rule
Go to AI Analyzer and open the rule. Set a risk level to Hold for approval, then add the groups in Reviewers. The Control Plane sets the listener’sapproval_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 the groups that may approve. Reject asks for an optional comment. On a click, hoop finds the approver:- The hoop user with that Slack ID.
- Else, exactly one hoop user with the Slack user’s email.
The Sidecar sees the approval on its next poll, within 5 seconds.
Troubleshooting
- No message in Slack. The bot is not in the private channel, the channel ID is wrong, the listener has no channel and there is no fallback, 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.
- The Slack import shows no user groups. The app lacks
usergroups:read(add it and reinstall), or the Slack plan has no user groups. - A sync fails with “no longer exists”. The user group was deleted in Slack. Remove it from the import.
- A sync fails with “slack returned no email”. The app lacks
users:read.email. Add it and reinstall the app. The run writes nothing until then.
Differences from the Gateway
The Sidecar reports a statement, not a person, so the requester is unknown. Compared with the Gateway:- No
/hoop subscribe: add reviewers with the Slack import or on the Users page. - Channels are set per listener, not per connection.
- No message to the requester, no requester groups and no self-approval check.