"""create platform increment tables""" from alembic import op revision = "20260909_agent_platform_v31" down_revision = "20260909_baseline_schema" branch_labels = None depends_on = None TABLES = [ """CREATE TABLE domain_event_outbox ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, event_id CHAR(36) NOT NULL, event_type VARCHAR(64) NOT NULL, aggregate_type VARCHAR(32) NOT NULL, aggregate_id VARCHAR(64) NOT NULL, trace_id VARCHAR(64) NOT NULL, payload JSON NOT NULL, status VARCHAR(16) NOT NULL DEFAULT 'pending', retry_count INT UNSIGNED NOT NULL DEFAULT 0, next_retry_at DATETIME(6) NULL, last_error VARCHAR(500) NULL, occurred_at DATETIME(6) NOT NULL, published_at DATETIME(6) NULL, created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY (id), UNIQUE KEY uk_domain_event_id (event_id), KEY idx_domain_outbox_pending (status, next_retry_at, id), CONSTRAINT chk_domain_outbox_status CHECK (status IN ('pending','published','failed','dead')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""", """CREATE TABLE request_idempotency ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL, session_id VARCHAR(64) NOT NULL, agent_type VARCHAR(32) NOT NULL, idempotency_key VARCHAR(64) NOT NULL, request_hash CHAR(64) NOT NULL, trace_id VARCHAR(64) NOT NULL, status VARCHAR(16) NOT NULL DEFAULT 'processing', result_message_id BIGINT UNSIGNED NULL, error_code VARCHAR(64) NULL, locked_until DATETIME(6) NULL, expire_at DATETIME(6) NOT NULL, created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY (id), UNIQUE KEY uk_idempotency_scope (user_id,agent_type,idempotency_key), KEY idx_idempotency_expire (expire_at), KEY idx_idempotency_trace (trace_id), CONSTRAINT chk_idempotency_status CHECK (status IN ('processing','completed','failed')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""", """CREATE TABLE agent_run ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, run_id CHAR(36) NOT NULL, idempotency_id BIGINT UNSIGNED NOT NULL, session_id VARCHAR(64) NOT NULL, user_id BIGINT UNSIGNED NOT NULL, agent_type VARCHAR(32) NOT NULL, trace_id VARCHAR(64) NOT NULL, request_message_id BIGINT UNSIGNED NOT NULL, result_message_id BIGINT UNSIGNED NULL, status VARCHAR(24) NOT NULL DEFAULT 'queued', attempt_count INT UNSIGNED NOT NULL DEFAULT 0, worker_id VARCHAR(128) NULL, locked_until DATETIME(6) NULL, result_version INT UNSIGNED NULL, error_code VARCHAR(64) NULL, cancel_requested_at DATETIME(6) NULL, started_at DATETIME(6) NULL, completed_at DATETIME(6) NULL, created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY (id), UNIQUE KEY uk_agent_run_id (run_id), UNIQUE KEY uk_agent_run_idempotency (idempotency_id), UNIQUE KEY uk_agent_run_trace (trace_id), KEY idx_agent_run_worker_lease (status,locked_until), CONSTRAINT chk_agent_run_status CHECK (status IN ('queued','running','succeeded','failed','cancel_requested','cancelled')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""", """CREATE TABLE config_release ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, release_no VARCHAR(64) NOT NULL, title VARCHAR(128) NOT NULL, change_summary VARCHAR(1000) NOT NULL, status VARCHAR(20) NOT NULL DEFAULT 'draft', created_by BIGINT UNSIGNED NOT NULL, reviewer_id BIGINT UNSIGNED NULL, reviewed_at DATETIME(6) NULL, activated_at DATETIME(6) NULL, supersedes_release_id BIGINT UNSIGNED NULL, rollback_of_release_id BIGINT UNSIGNED NULL, active_slot TINYINT GENERATED ALWAYS AS (IF(status='active',1,NULL)) STORED, created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY(id), UNIQUE KEY uk_config_release_no(release_no), UNIQUE KEY uk_config_release_active_one(active_slot), CONSTRAINT chk_config_release_status CHECK (status IN ('draft','validating','pending_review','approved','active','superseded','rejected','rolled_back')), CONSTRAINT chk_config_release_separation CHECK (reviewer_id IS NULL OR reviewer_id <> created_by) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""", """CREATE TABLE platform_config_item ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, release_id BIGINT UNSIGNED NOT NULL, namespace VARCHAR(64) NOT NULL, config_key VARCHAR(128) NOT NULL, value_json JSON NOT NULL, schema_version VARCHAR(32) NOT NULL, checksum CHAR(64) NOT NULL, created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), PRIMARY KEY(id), UNIQUE KEY uk_config_item_release(release_id,namespace,config_key) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""", """CREATE TABLE model_endpoint_config ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, endpoint_code VARCHAR(64) NOT NULL, provider VARCHAR(32) NOT NULL, model_name VARCHAR(128) NOT NULL, base_url VARCHAR(500) NOT NULL, secret_ref VARCHAR(256) NOT NULL, capabilities JSON NOT NULL, allowed_data_levels JSON NOT NULL, context_window INT UNSIGNED NOT NULL, timeout_ms INT UNSIGNED NOT NULL DEFAULT 15000, status VARCHAR(16) NOT NULL DEFAULT 'disabled', created_by BIGINT UNSIGNED NOT NULL, reviewer_id BIGINT UNSIGNED NULL, reviewed_at DATETIME(6) NULL, created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), PRIMARY KEY(id), UNIQUE KEY uk_model_endpoint_code(endpoint_code), CONSTRAINT chk_model_endpoint_status CHECK (status IN ('draft','approved','active','disabled','archived')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""", """CREATE TABLE model_routing_rule ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, release_id BIGINT UNSIGNED NOT NULL, rule_code VARCHAR(64) NOT NULL, agent_type VARCHAR(32) NOT NULL, task_type VARCHAR(48) NOT NULL, model_policy VARCHAR(32) NOT NULL, primary_endpoint_id BIGINT UNSIGNED NOT NULL, fallback_endpoint_ids JSON NULL, condition_json JSON NULL, max_attempts TINYINT UNSIGNED NOT NULL DEFAULT 2, latency_budget_ms INT UNSIGNED NOT NULL DEFAULT 15000, priority INT NOT NULL DEFAULT 100, created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), PRIMARY KEY(id), UNIQUE KEY uk_model_route_release(release_id,rule_code), CONSTRAINT chk_model_route_attempts CHECK (max_attempts BETWEEN 1 AND 3) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""", """CREATE TABLE model_routing_fallback ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, routing_rule_id BIGINT UNSIGNED NOT NULL, endpoint_id BIGINT UNSIGNED NOT NULL, fallback_order TINYINT UNSIGNED NOT NULL, retryable_error_codes JSON NULL, created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), PRIMARY KEY(id), UNIQUE KEY uk_model_fallback_order(routing_rule_id,fallback_order), UNIQUE KEY uk_model_fallback_endpoint(routing_rule_id,endpoint_id), CONSTRAINT chk_model_fallback_order CHECK (fallback_order BETWEEN 1 AND 2) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""", """CREATE TABLE prompt_template_version ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, release_id BIGINT UNSIGNED NOT NULL, prompt_code VARCHAR(64) NOT NULL, task_type VARCHAR(48) NOT NULL, agent_type VARCHAR(32) NULL, version INT UNSIGNED NOT NULL, system_prompt MEDIUMTEXT NOT NULL, user_prompt_template MEDIUMTEXT NOT NULL, input_schema JSON NULL, output_schema JSON NULL, checksum CHAR(64) NOT NULL, created_by BIGINT UNSIGNED NOT NULL, created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), PRIMARY KEY(id), UNIQUE KEY uk_prompt_version(prompt_code,version) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4""", ] def upgrade() -> None: for statement in TABLES: op.execute(statement) def downgrade() -> None: for table in ("prompt_template_version", "model_routing_fallback", "model_routing_rule", "model_endpoint_config", "platform_config_item", "config_release", "agent_run", "request_idempotency", "domain_event_outbox"): op.drop_table(table)