Raxx · internal docs

internal · gated

RCA — Woodpecker CI v2.8.3 nil-pointer panic at repo activation; resolved by v3.16.0 upgrade

Incident ID: 2026-07-04-woodpecker-v3-upgrade Date: 2026-07-04 Severity: SEV-2 Duration: Ongoing from Phase 1 deploy until 2026-07-04T18:29Z (approx. 12h from first trigger attempt) Blast radius: Woodpecker CI only — raxx-app/TradeMasterAPI could not be activated; no pipelines could run. GitHub Actions CI continued unaffected. No user-facing impact (pre-launch). Author: sre-agent

Summary

The Woodpecker CI v2.8.3 server panicked at server/api/repo.go:149 whenever the operator attempted to activate raxx-app/TradeMasterAPI. The panic was a nil pointer dereference on the forge OAuth token associated with the admin user — a known v2.8.x bug where a freshly-provisioned admin user's forge token record can be nil. The fix was to upgrade the server and agent from v2.8.3 to v3.16.0, where the bug is fixed. The upgrade was executed in-place via SSM without downtime, with an RDS snapshot taken first as the rollback path. DB schema migrated automatically on v3.16.0 server start. After the upgrade, repo activation succeeded (HTTP 200, webhook ID 649361254) and all three Phase 2 pilot crons were registered and enabled via the API.

Timeline (all times UTC)

Impact

What went well

What didn't go well

Root cause analysis

Detection

Resolution

Action items

# Action Owner Due Issue
1 Add post-deploy smoke to ci-woodpecker runbook: POST /api/repos?forge_remote_id=X within 5 min of server start sre-agent 2026-07-11 file
2 Update IaC PR with v3.16.0 version pin and runbook changes sre-agent 2026-07-04 PR (this branch)
3 Update SSM send-command patterns in runbook to use unquoted sed (s/OLD/NEW/g) or explicit Python when replacing image tags sre-agent 2026-07-11 file
4 Fix .woodpecker/*.yaml pipeline definitions for v3.x YAML syntax compatibility feature-developer 2026-07-11 file
5 Verify pipeline runs successfully on agent and GitHub commit status is posted after YAML fix sre-agent 2026-07-11 follow-up to #4
6 48h soak: review Phase 2 cron results on 2026-07-06 and decide Phase 3 go/no-go operator 2026-07-06

References