Skip to main content

GCP Service-Account Key Rotation — supervisor-sa

This runbook covers rotating the supervisor-sa@factory-495015.iam.gserviceaccount.com key that powers the supervisor planner’s Gemini 2.5 Pro fallback via Vertex AI.
Who owns this? Adrian (GCP console) or Sauna (if proxy auth is fixed). How often? Quarterly, or immediately on suspected compromise.

Context

The supervisor planner uses VERTEX_ACCESS_TOKEN at runtime to call https://us-central1-aiplatform.googleapis.com/…/gemini-2.5-pro:generateContent. That short-lived bearer token is minted from the supervisor-sa JSON key (SUPERVISOR_VERTEX_SA_KEY org secret) in two places:

Rotation procedure

1. Mint a new key (do NOT delete the old one yet)

2. Update the org secret

3. Verify the new key works

Wait for the workflow to pass (green check). If it fails, do not delete the old key — re-check the new key contents and retry.

4. Delete the old key

5. Shred the local copy

6. Document the rotation

Add an entry to this file’s Rotation log section below.

If the factory-supervisor Worker is deployed

When the Worker reads VERTEX_ACCESS_TOKEN at request time, it exchanges the SA key for a short-lived token using the JWT Bearer Token flow. After updating the org secret, also rotate the Worker secret:
Token expiry: Google access tokens are valid for 1 hour. The supervisor Worker is expected to refresh VERTEX_ACCESS_TOKEN by implementing the JWT Bearer Token flow using the Web Crypto API at startup. Until that is implemented (post-SUP-3), a scheduled GitHub Actions workflow can re-run step 2 above to keep the secret fresh. See docs/supervisor/ARCHITECTURE.md §6 for the long-term design.

Rotation log