20260730_360_governance_audit_seals.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. """Add append-only signed governance audit evidence seals."""
  2. from alembic import op
  3. revision = "20260730_360"
  4. down_revision = "20260729_350"
  5. branch_labels = None
  6. depends_on = None
  7. def upgrade() -> None:
  8. op.execute(
  9. """
  10. CREATE TABLE public.governance_audit_seals (
  11. uid UUID PRIMARY KEY,
  12. period_start TIMESTAMPTZ NOT NULL,
  13. period_end TIMESTAMPTZ NOT NULL,
  14. categories JSONB NOT NULL,
  15. event_count INTEGER NOT NULL CHECK (event_count >= 0),
  16. root_hash CHAR(64) NOT NULL,
  17. signature CHAR(64) NOT NULL,
  18. key_version VARCHAR(80) NOT NULL,
  19. sealed_by VARCHAR(160) NOT NULL,
  20. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  21. CHECK (period_end > period_start),
  22. CHECK (jsonb_typeof(categories) = 'array')
  23. );
  24. CREATE INDEX idx_governance_audit_seals_created
  25. ON public.governance_audit_seals(created_at DESC, uid);
  26. CREATE INDEX idx_governance_audit_seals_period
  27. ON public.governance_audit_seals(period_start, period_end);
  28. """
  29. )
  30. def downgrade() -> None:
  31. raise RuntimeError(
  32. "governance audit evidence is append-only; "
  33. "schema downgrade requires an approved archival migration"
  34. )