# WebSockets 5-Minute Preflight Runbook

Use this before deep debugging. It catches common Zoom WebSockets failures quickly.

## Skill Doc Standard Note

- Agent-skill standard entrypoint is `SKILL.md`.
- This runbook is an operational convention (recommended), not a required skill file.
- `SKILL.md` is also a navigation convention for larger skill docs.

## 1) Confirm OAuth Token Generation

- Use S2S credentials and account ID.
- Token endpoint: `https://zoom.us/oauth/token`.
- Refresh token before expiry.

### Token Sanity Checks

- Verify token response is JSON and contains `access_token`.
- Record token expiry and refresh proactively.
- If auth intermittently fails, check for clock skew and stale cached tokens.

## 2) Confirm Subscription Configuration

- Event subscription created with WebSockets delivery type.
- Required event types selected and saved.

## 3) Confirm Connection URL and Auth

- Use exact WebSocket URL from Zoom subscription config.
- Attach access token as required by protocol/headers.

## 4) Confirm Runtime Reliability

- Implement reconnect with backoff.
- Handle heartbeat/ping-pong and connection lifecycle events.
- Prevent duplicate consumers if multiple workers run.

### Minimal Reliability Policy

- Backoff: exponential with jitter.
- Cap retries and alert after sustained failures.
- Ensure only one active consumer per subscription stream in each environment.

## 5) Confirm Event Processing Semantics

- Handle ordering assumptions carefully.
- Make event handlers idempotent.
- Log event IDs and delivery timestamps.

## 6) Quick Probes

- Access token request succeeds and returns JSON.
- WebSocket connects and receives at least one subscribed event.
- Reconnect path works after forced disconnect.

### Copy/Paste Validation Commands

```bash
# 1) Validate S2S token request
curl -X POST "https://zoom.us/oauth/token" \
  -H "Authorization: Basic $(printf '%s:%s' "$ZOOM_CLIENT_ID" "$ZOOM_CLIENT_SECRET" | base64)" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=account_credentials&account_id=$ZOOM_ACCOUNT_ID"

# 2) Basic Zoom API probe with token
curl -X GET "https://api.zoom.us/v2/users/me" \
  -H "Authorization: Bearer $ZOOM_ACCESS_TOKEN"

# 3) Tail app logs while forcing reconnect tests
pm2 logs your-websocket-service --lines 120
```

Expected: token/API probes return JSON; websocket service logs show connect -> receive -> reconnect sequence.

## 7) Fast Decision Tree

- **Connection refused/closed** -> token invalid, wrong URL, or subscription config issue.
- **Connected but no events** -> wrong event selection or no triggering activity.
- **Event storms/duplicates** -> missing dedupe/idempotency logic.

## 8) WebSockets vs Webhooks Guardrail

- If your use case does not need persistent low-latency delivery, webhook delivery may be simpler to operate.
- Choose WebSockets when you can own connection lifecycle monitoring and reconnect behavior.
