| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- """Persist P3-WP06 B1 policy, provision, hold-release, and reclaim lifecycle."""
- from alembic import op
- revision = "20260811_482"
- down_revision = "20260811_481"
- branch_labels = None
- depends_on = None
- def upgrade() -> None:
- op.execute(
- """
- CREATE TABLE public.trusted_delivery_policy_transitions (
- uid UUID PRIMARY KEY, policy_uid UUID NOT NULL REFERENCES public.trusted_delivery_policy_versions(uid),
- operation VARCHAR(20) NOT NULL CHECK(operation IN ('activate','rollback')),
- idempotency_key VARCHAR(160) NOT NULL UNIQUE,
- request_digest CHAR(64) NOT NULL CHECK(request_digest ~ '^[0-9a-f]{64}$'),
- approval_ref VARCHAR(200) NOT NULL, approval_digest CHAR(64) NOT NULL CHECK(approval_digest ~ '^[0-9a-f]{64}$'),
- actor_uid UUID NOT NULL REFERENCES public.users(id), created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()
- );
- ALTER TABLE public.trusted_delivery_grants
- ADD COLUMN approval_ref VARCHAR(200),
- ADD COLUMN approval_digest CHAR(64),
- ADD COLUMN purpose VARCHAR(100),
- ADD COLUMN environment VARCHAR(30),
- ADD COLUMN target_capability JSONB;
- ALTER TABLE public.trusted_delivery_grants
- ADD CONSTRAINT trusted_delivery_grants_approval_projection_check CHECK (
- (approval_ref IS NULL AND approval_digest IS NULL AND purpose IS NULL AND environment IS NULL AND target_capability IS NULL)
- OR (approval_ref IS NOT NULL AND approval_digest ~ '^[0-9a-f]{64}$' AND purpose IS NOT NULL
- AND environment IN ('development','test','production') AND jsonb_typeof(target_capability)='object')
- );
- ALTER TABLE public.trusted_delivery_grants DROP CONSTRAINT trusted_delivery_grants_status_check;
- ALTER TABLE public.trusted_delivery_grants ADD CONSTRAINT trusted_delivery_grants_status_check
- CHECK(status IN ('active','revoked','failed','held','reclaimed'));
- ALTER TABLE public.trusted_delivery_deliveries ADD COLUMN operation VARCHAR(20) NOT NULL DEFAULT 'provision'
- CHECK(operation IN ('provision','revoke'));
- ALTER TABLE public.trusted_delivery_deliveries DROP CONSTRAINT trusted_delivery_deliveries_status_check;
- ALTER TABLE public.trusted_delivery_deliveries ADD CONSTRAINT trusted_delivery_deliveries_status_check
- CHECK(status IN ('pending','processing','applied','dead_letter','reclaimed'));
- ALTER TABLE public.trusted_delivery_receipts DROP CONSTRAINT trusted_delivery_receipts_status_check;
- ALTER TABLE public.trusted_delivery_receipts ADD CONSTRAINT trusted_delivery_receipts_status_check
- CHECK(status IN ('applied','failed','reclaimed'));
- CREATE TABLE public.trusted_delivery_hold_releases (
- uid UUID PRIMARY KEY, hold_uid UUID NOT NULL REFERENCES public.trusted_delivery_legal_holds(uid),
- idempotency_key VARCHAR(160) NOT NULL UNIQUE,
- request_digest CHAR(64) NOT NULL CHECK(request_digest ~ '^[0-9a-f]{64}$'),
- approval_ref VARCHAR(200) NOT NULL, approval_digest CHAR(64) NOT NULL CHECK(approval_digest ~ '^[0-9a-f]{64}$'),
- actor_uid UUID NOT NULL REFERENCES public.users(id), created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()
- );
- CREATE UNIQUE INDEX uq_trusted_delivery_hold_release ON public.trusted_delivery_hold_releases(hold_uid);
- """
- )
- def downgrade() -> None:
- op.execute(
- """DO $$ BEGIN
- IF EXISTS(SELECT 1 FROM public.trusted_delivery_policy_transitions)
- OR EXISTS(SELECT 1 FROM public.trusted_delivery_hold_releases)
- OR EXISTS(SELECT 1 FROM public.trusted_delivery_grants WHERE approval_ref IS NOT NULL)
- OR EXISTS(SELECT 1 FROM public.trusted_delivery_deliveries WHERE operation <> 'provision')
- OR EXISTS(SELECT 1 FROM public.trusted_delivery_receipts WHERE status='reclaimed') THEN
- RAISE EXCEPTION 'downgrade requires approved lifecycle archival migration';
- END IF;
- END $$;
- DROP TABLE public.trusted_delivery_hold_releases;
- ALTER TABLE public.trusted_delivery_receipts DROP CONSTRAINT trusted_delivery_receipts_status_check;
- ALTER TABLE public.trusted_delivery_receipts ADD CONSTRAINT trusted_delivery_receipts_status_check CHECK(status IN ('applied','failed'));
- ALTER TABLE public.trusted_delivery_deliveries DROP CONSTRAINT trusted_delivery_deliveries_status_check;
- ALTER TABLE public.trusted_delivery_deliveries ADD CONSTRAINT trusted_delivery_deliveries_status_check
- CHECK(status IN ('pending','processing','applied','dead_letter'));
- ALTER TABLE public.trusted_delivery_deliveries DROP COLUMN operation;
- ALTER TABLE public.trusted_delivery_grants DROP CONSTRAINT trusted_delivery_grants_status_check;
- ALTER TABLE public.trusted_delivery_grants ADD CONSTRAINT trusted_delivery_grants_status_check CHECK(status IN ('active','revoked','failed','held'));
- ALTER TABLE public.trusted_delivery_grants DROP CONSTRAINT trusted_delivery_grants_approval_projection_check;
- ALTER TABLE public.trusted_delivery_grants DROP COLUMN target_capability, DROP COLUMN environment, DROP COLUMN purpose,
- DROP COLUMN approval_digest, DROP COLUMN approval_ref;
- DROP TABLE public.trusted_delivery_policy_transitions;"""
- )
|