# Secret Rotation Runbook

Date: 2026-02-15  
Scope: bot service + dashboard deployment secrets

## Objective

Rotate all production credentials on a fixed cadence and after any suspected leak, while preserving service continuity.

## Rotation Scope

- Supabase:
  - `SUPABASE_KEY` / service-role key used by bot service
  - JWT settings (`SUPABASE_JWT_ISSUER`, `SUPABASE_JWT_AUDIENCE`) verification values
- Exchange credentials:
  - `ALPACA_API_KEY`, `ALPACA_API_SECRET`
  - `REAL_ALPACA_API_KEY`, `REAL_ALPACA_API_SECRET`
- AI provider keys:
  - `OPENAI_API_KEY`
  - `GEMINI_API_KEY`
  - `PERPLEXITY_API_KEY`
- Notification/API integration keys (if configured)

## Rotation Procedure

1. Create new credentials in provider consoles.
2. Update secret stores (CI/CD, Azure, Vercel, etc.) with new values.
3. Deploy bot and dashboard with new secret versions.
4. Validate:
   - bot startup + auth checks
   - exchange order placement dry-run path
   - dashboard auth and websocket connectivity
5. Revoke old credentials only after validation window.
6. Record rotation date, actor, and affected systems in release notes.

## Enforcement

- CI includes executable secret hygiene scan:
  - `scripts/verifySecretHygiene.ts`
- Gitleaks workflow remains enabled on push/PR.
- Never commit real secrets into tracked files (`.env`, docs, scripts, configs).

## Cadence

- Standard: every 30 days
- Immediate rotation triggers:
  - Secret leaked in logs/repo/chat/email
  - Access control incident
  - Team-member offboarding
