BEGIN; ALTER TABLE user_account ADD COLUMN platform_role varchar(24) NOT NULL DEFAULT 'customer' CHECK (platform_role IN ('customer','ops_viewer','ops_operator','ops_approver','ops_admin')); CREATE TABLE runtime_config_version ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), public_id uuid NOT NULL UNIQUE DEFAULT gen_random_uuid(), tenant_id uuid NOT NULL REFERENCES tenant(id), config_key varchar(100) NOT NULL CHECK (config_key ~ '^[a-z][a-z0-9_.-]{2,99}$'), display_name varchar(200) NOT NULL CHECK (length(trim(display_name))>0), config_kind varchar(24) NOT NULL CHECK (config_kind IN ('PERSONA','VOICE','MODEL','ROUTING','AGENT_BUNDLE')), version_no integer NOT NULL CHECK (version_no>0), status varchar(24) NOT NULL DEFAULT 'DRAFT' CHECK (status IN ('DRAFT','PENDING_APPROVAL','PUBLISHED','RETIRED')), payload jsonb NOT NULL CHECK (jsonb_typeof(payload)='object'), secret_refs jsonb NOT NULL DEFAULT '{}'::jsonb CHECK (jsonb_typeof(secret_refs)='object'), change_summary varchar(500) NOT NULL CHECK (length(trim(change_summary))>0), validation_result jsonb NOT NULL DEFAULT '{}'::jsonb CHECK (jsonb_typeof(validation_result)='object'), created_by uuid NOT NULL, submitted_by uuid, submitted_at timestamptz, approved_by uuid, approved_at timestamptz, published_by uuid, published_at timestamptz, retired_at timestamptz, supersedes_id uuid REFERENCES runtime_config_version(id), rollback_of_id uuid REFERENCES runtime_config_version(id), row_version bigint NOT NULL DEFAULT 1 CHECK (row_version>0), created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(), CONSTRAINT runtime_config_creator_tenant_fk FOREIGN KEY (created_by,tenant_id) REFERENCES user_account(id,tenant_id), CONSTRAINT runtime_config_submitter_tenant_fk FOREIGN KEY (submitted_by,tenant_id) REFERENCES user_account(id,tenant_id), CONSTRAINT runtime_config_approver_tenant_fk FOREIGN KEY (approved_by,tenant_id) REFERENCES user_account(id,tenant_id), CONSTRAINT runtime_config_publisher_tenant_fk FOREIGN KEY (published_by,tenant_id) REFERENCES user_account(id,tenant_id), CONSTRAINT runtime_config_version_key UNIQUE (tenant_id,config_key,version_no), CONSTRAINT runtime_config_submission_check CHECK ( (status='DRAFT' AND submitted_at IS NULL AND approved_at IS NULL AND published_at IS NULL) OR (status='PENDING_APPROVAL' AND submitted_by IS NOT NULL AND submitted_at IS NOT NULL AND approved_at IS NULL AND published_at IS NULL) OR (status='PUBLISHED' AND submitted_by IS NOT NULL AND submitted_at IS NOT NULL AND approved_by IS NOT NULL AND approved_at IS NOT NULL AND published_by IS NOT NULL AND published_at IS NOT NULL) OR (status='RETIRED' AND retired_at IS NOT NULL) ) ); CREATE UNIQUE INDEX runtime_config_one_published_key ON runtime_config_version(tenant_id,config_key) WHERE status='PUBLISHED'; CREATE INDEX runtime_config_list_idx ON runtime_config_version(tenant_id,config_key,version_no DESC); CREATE INDEX runtime_config_status_idx ON runtime_config_version(tenant_id,status,updated_at DESC); COMMIT;