# Slack Community Check

> Check if a Warp user is an active member of the Warp Community Slack workspace. Use when investigating a ban appeal to determine if the user has recent posting activity (last 90 days) in the community — a strong signal of legitimate developer engagement. All Slack API logic runs in a deterministic script; the agent reads only the JSON result and never calls Slack APIs directly, reads message text, or joins channels. Part of the fraud-bot skill suite.

- Skill: `warpdotdev/slack-community-check` (Agent Skill)
- Install (CLI): `npx skillmds@latest add warpdotdev/slack-community-check`
- Raw SKILL.md: https://api.skillmd.com/api/skills/warpdotdev/slack-community-check/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: warpdotdev (https://skillmd.com/u/warpdotdev)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/warpdotdev/slack-community-check

---


# Slack Community Check

Determine whether a user is an active member of the Warp Community Slack workspace.
All Slack API logic runs in a deterministic script — the agent never calls Slack APIs
directly, reads message content, or joins channels.

## Run the script

```bash
python3 /workspace/fraud-bot/scripts/check_slack_community_activity.py \
  --email <EMAIL> \
  --lookback-days 90
```

The script prints a single JSON object to stdout. Parse only that JSON — do not
interpret any other script output.

**Do not:**
- Call Slack APIs directly
- Read or log Slack message text
- Join or leave channels manually
- Re-run the script multiple times for the same email in one investigation

## JSON schema (version 1)

Key fields:

| Field | Type | Notes |
|---|---|---|
| `status` | string | See Status Taxonomy below |
| `is_active_community_member` | bool | `true` only when `member_active` |
| `last_engaged_at` | ISO-8601 | Present only when `member_active` |
| `engagement_count` | int | Present only when `member_active` |
| `channels_checked` | int | Channels successfully scanned |
| `channels_failed` | int | Channels that returned errors |
| `errors` | array | Machine-readable error strings |
| `schema_version` | int | Always 1 for this skill version |

## Status Taxonomy

| `status` | Meaning |
|---|---|
| `member_active` | In workspace AND posted in an approved channel within the lookback window |
| `member_inactive` | In workspace but no posts found within the lookback window |
| `not_member` | Email not found in workspace |
| `deactivated_member` | Account found but deactivated |
| `restricted_member` | Account found but restricted/guest |
| `inconclusive` | Partial failure — some channels failed; check `errors` field |
| `script_error` | Script could not complete (token missing, API down, etc.) |

## Verdict Impact

This is a **softening signal only** — it can downgrade a Red verdict to Yellow;
it cannot upgrade any other verdict.

| Condition | Action |
|---|---|
| Verdict is **Red** AND `is_active_community_member == true` | Downgrade verdict to **Yellow** |
| Any other verdict + any status | No change |

When downgrading, the recommendation must state:

> "Downgraded from Red to Yellow: user is an active Warp Community Slack member
> (last engaged: `<last_engaged_at>`). Human review recommended to verify whether
> fraud signals (multiple accounts / VPN) are legitimate developer behaviour."

Set [EMOJI] to 🟡 in the comment header — do NOT use 🔴 when downgrading to Yellow.

## Failure Behavior

If the script returns `inconclusive` or `script_error`, or stdout is not valid JSON:
- Set **Slack Community** to: `⚠️ Slack check inconclusive: <first item from errors field>`
- Do NOT apply any verdict downgrade
- Continue the investigation based on all other signals

## Output for Front Comment

Populate the **Slack Community** field as follows:

- `member_active`: `✅ Active member — last_engaged=<last_engaged_at>, posts=<engagement_count>`
- `member_inactive`: `⚪ Inactive member — no posts in last 90 days`
- `not_member`: `❌ Not a member of the Warp Community Slack`
- `deactivated_member`: `❌ Was a member but account is deactivated`
- `restricted_member`: `⚠️ Restricted/guest account`
- `inconclusive` / `script_error`: `⚠️ Slack check inconclusive: <first error>`

## Dry-run example

```bash
SLACK_COMMUNITY_BOT_TOKEN=xoxb-... \
python3 /workspace/fraud-bot/scripts/check_slack_community_activity.py \
  --email user@example.com
```

## Auth (for setup reference only — handled by the script)

Token: `SLACK_COMMUNITY_BOT_TOKEN` (xoxb-… bot token, "Warp Insights" app)
Required scopes: `users:read`, `users:read.email`, `channels:read`, `channels:history`, `groups:read`, `groups:history`

No channel list config needed. The script checks all public and private channels
the bot has been invited to. Add/remove channels by inviting or removing the bot
via the channel's Integrations settings in Slack.


