Halluminate prod status

← back to the counter

Horizon's new OIDC runtime role could read an object but not a version of it, so every job with seed files failed at startup

Date 2026-10-08
Severity SEV-2
Outage window 16:58 – 17:31 PDT
Duration ~33m (new jobs and internal QA on problems with seed files)
Detected by User reports (Israel, Jonathan, Victoria)
Prod breaker Wyatt, retiring the last long-lived AWS key one permission too eagerly
Status Resolved
Author Wyatt (investigation by Claude)

Summary

HAL-10076 moved the Horizon Vercel deployment off the wyatt IAM user's access key and onto the horizon-vercel-runtime-production role through Vercel OIDC. The new role granted s3:GetObject on taiga-horizon but not s3:GetObjectVersion. The build-context step copies each problem seed file with a versioned CopySource (?versionId=), and S3 authorizes that copy as s3:GetObjectVersion. Every job on a problem with seed files failed at startup. Adding the one action (#13250) and running pulumi up fixed it.

Impact

Timeline

When (PDT) What happened
11:09 #13214 merges: horizon-vercel-runtime-{production,preview} roles, with s3:GetObject but no s3:GetObjectVersion
15:32 #13215 merges: the app federates through the role when AWS_RUNTIME_ROLE_ARN is set
~16:51 AWS_RUNTIME_ROLE_ARN set on production; the deployment stops using the wyatt key
16:58 Outage begins: first job fails with not authorized to perform: s3:GetObjectVersion
17:11 #13246 merges (removes the job-dispatcher IAM user attachments) — unrelated to the trigger, but it made the key path harder to roll back to
17:17 Israel reports a job that will not start; Jonathan confirms at 17:20
17:20 Victoria reports internal QA failing at startup and names the missing action
17:24 Wyatt acknowledges in the thread
17:29 #13250 merges (adds s3:GetObjectVersion to DataObjects)
17:31:16 Recovery: pulumi up --stack prod updates both runtime role policies
17:31:21 Last failure: one run that started 5 s after the apply, before IAM propagated
17:31 – 17:47 15 new runs, 0 failures; affected environments run normally

How it happened

What surprised us

What went well / what went poorly

Went well:

Went poorly:

Action items

# Action Priority Ticket
1 Grant s3:GetObjectVersion to both runtime roles P0 Done — #13250, applied 17:31
2 Before any credential cutover, run one job on a problem with seed files on preview under the new role P1 HAL-10076