-- Bot Persona A/B Testing -- Adds: bot_persona_variants, bot_persona_experiments, bot_persona_assignments, bot_persona_metrics CREATE TABLE `bot_persona_variants` ( `id` INT NOT NULL AUTO_INCREMENT, `bot_id` INT NOT NULL, `experiment_id` INT NULL, `variant_key` VARCHAR(20) NOT NULL, `label` VARCHAR(50) NOT NULL, `description` VARCHAR(200) NULL, `stance_keywords` JSON NULL, `top_topic_types` JSON NULL, `top_human_users` JSON NULL, `style_hints` JSON NULL, `weight` FLOAT NOT NULL DEFAULT 0.5, `is_control` BOOLEAN NOT NULL DEFAULT FALSE, `is_active` BOOLEAN NOT NULL DEFAULT TRUE, `sample_count` INT NOT NULL DEFAULT 0, `reply_count` INT NOT NULL DEFAULT 0, `like_count` INT NOT NULL DEFAULT 0, `human_reply_count` INT NOT NULL DEFAULT 0, `engagement_score` FLOAT NOT NULL DEFAULT 0, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (`id`), UNIQUE INDEX `bot_persona_variants_bot_id_variant_key_key`(`bot_id`, `variant_key`), INDEX `bot_persona_variants_bot_id_is_active_idx`(`bot_id`, `is_active`), INDEX `bot_persona_variants_experiment_id_idx`(`experiment_id`) ); CREATE TABLE `bot_persona_experiments` ( `id` INT NOT NULL AUTO_INCREMENT, `bot_id` INT NOT NULL, `name` VARCHAR(80) NOT NULL, `description` VARCHAR(200) NULL, `status` VARCHAR(20) NOT NULL DEFAULT 'active', `winner_variant_key` VARCHAR(20) NULL, `min_samples_per_arm` INT NOT NULL DEFAULT 20, `significance_level` FLOAT NOT NULL DEFAULT 0.1, `primary_metric` VARCHAR(30) NOT NULL DEFAULT 'engagement_score', `config` JSON NULL, `started_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `ended_at` DATETIME(3) NULL, `last_analyzed_at` DATETIME(3) NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (`id`), INDEX `bot_persona_experiments_bot_id_status_idx`(`bot_id`, `status`), INDEX `bot_persona_experiments_status_idx`(`status`) ); CREATE TABLE `bot_persona_assignments` ( `id` INT NOT NULL AUTO_INCREMENT, `bot_id` INT NOT NULL, `variant_id` INT NOT NULL, `ref_type` VARCHAR(20) NOT NULL, `ref_id` INT NOT NULL, `forum_slug` VARCHAR(30) NULL, `replies` INT NOT NULL DEFAULT 0, `likes` INT NOT NULL DEFAULT 0, `human_replies` INT NOT NULL DEFAULT 0, `impressions` INT NOT NULL DEFAULT 0, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (`id`), UNIQUE INDEX `bot_persona_assignments_ref_type_ref_id_key`(`ref_type`, `ref_id`), INDEX `bot_persona_assignments_bot_id_variant_id_idx`(`bot_id`, `variant_id`), INDEX `bot_persona_assignments_variant_id_created_at_idx`(`variant_id`, `created_at`) ); CREATE TABLE `bot_persona_metrics` ( `id` INT NOT NULL AUTO_INCREMENT, `variant_id` INT NOT NULL, `date` DATE NOT NULL, `impressions` INT NOT NULL DEFAULT 0, `replies` INT NOT NULL DEFAULT 0, `likes` INT NOT NULL DEFAULT 0, `human_replies` INT NOT NULL DEFAULT 0, `content_count` INT NOT NULL DEFAULT 0, `avg_replies` FLOAT NOT NULL DEFAULT 0, `avg_likes` FLOAT NOT NULL DEFAULT 0, `computed_score` FLOAT NOT NULL DEFAULT 0, `updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (`id`), UNIQUE INDEX `bot_persona_metrics_variant_id_date_key`(`variant_id`, `date`), INDEX `bot_persona_metrics_date_idx`(`date`) );