Raxx · internal docs

internal · gated

RCA — Postgres owner privilege voids audit-chain append-only invariant (#1455)

Incident ID: 2026-05-15-audit-role-split-1455 Date: 2026-05-15 Severity: SEV-2 Duration: Detected 2026-05-15 UTC; staging remediation applied same day; prod blocked pending Essential-0 → Standard-0 upgrade (ongoing) Blast radius: Pre-launch internal only — no customers. Audit-chain tamper-evidence guarantee was paper-only: runtime Postgres connection held owner privileges, making every REVOKE in the SC-A2 schema a no-op. Author: sre-agent

Summary

Raptor's DATABASE_URL Postgres credential is the database owner. Even though migration 016 defined REVOKE-based append-only constraints on customer_audit_events and all *_history shadow tables, those REVOKEs were meaningless while the application runtime connected as the owner. Any bug or compromised process could DELETE or UPDATE audit rows directly. Operator tagged the issue pre-launch-blocker on 2026-05-15 UTC with T-8 days to v1 launch. Staging was fully remediated (full privilege matrix applied, verified, flag enabled, application healthy). Prod is blocked because the prod Heroku Postgres addon is on Essential-0, which does not support pg:credentials:create. Prod requires an operator-initiated addon upgrade to Standard-0 before role separation can be completed there.

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 Upgrade raxx-api-prod Postgres from Essential-0 to Standard-0 operator 2026-05-19 UTC #1455 (this incident escalation)
2 Create raptor_app credential on prod via heroku pg:credentials:create; apply migration 031 grant blocks; set RAPTOR_APP_DATABASE_URL; enable FLAG_RAPTOR_APP_ROLE_SEPARATION=1 on prod sre-agent (after op. completes item 1) 2026-05-19 UTC filed as part of prod cutover
3 Add CI job: verify live raptor_app privilege matrix on staging Postgres (DELETE=f on audit tables) sre-agent 2026-05-21 UTC new type:reliability issue to file
4 Reopen or un-close RM-10 (#1568) execution tracking — split "SOP written" from "SOP executed" in any future ops card operator / PM immediate #1568
5 Create audit_archiver and raptor_audit_compliance no-login roles — requires Heroku support ticket (RDS owner cannot CREATEROLE) operator post-v1 new issue

References