ALTER TABLE `characters` ADD COLUMN `story_character_id` BIGINT NULL, ADD INDEX `characters_story_character_id_idx` (`story_character_id`); CREATE TABLE `story_characters` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `novel_source_id` BIGINT NULL, `story_bible_id` BIGINT NULL, `global_character_id` BIGINT NULL, `name` VARCHAR(100) NOT NULL, `alias_names` JSON NULL, `role_type` VARCHAR(50) NOT NULL DEFAULT 'supporting', `identity_desc` TEXT NULL, `background_desc` TEXT NULL, `personality_desc` TEXT NULL, `relationship_json` JSON NULL, `character_arc` TEXT NULL, `world_role_desc` TEXT NULL, `negative_rules` TEXT NULL, `source_type` VARCHAR(50) NOT NULL DEFAULT 'character_extraction', `source_version_id` BIGINT NULL, `status` VARCHAR(50) NOT NULL DEFAULT 'active', `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 `story_characters_project_id_status_idx` (`project_id`, `status`), INDEX `story_characters_novel_source_id_idx` (`novel_source_id`), INDEX `story_characters_story_bible_id_idx` (`story_bible_id`), INDEX `story_characters_global_character_id_idx` (`global_character_id`), INDEX `story_characters_source_type_idx` (`source_type`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE `video_clips` ADD COLUMN `engine_version` VARCHAR(80) NULL, ADD COLUMN `asset_lock_json` JSON NULL, ADD COLUMN `motion_control_json` JSON NULL, ADD COLUMN `camera_control_json` JSON NULL, ADD COLUMN `composer_usage_json` JSON NULL, ADD INDEX `video_clips_engine_version_idx` (`engine_version`); CREATE TABLE `project_pipeline_configs` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `ip_isolation_enabled` BOOLEAN NOT NULL DEFAULT true, `video_engine_enabled` BOOLEAN NOT NULL DEFAULT true, `scene_composer_enabled` BOOLEAN NOT NULL DEFAULT false, `default_generation_mode` VARCHAR(50) NOT NULL DEFAULT 'single_model', `video_engine_version` VARCHAR(80) NOT NULL DEFAULT 'video_engine_v1', `scene_composer_version` VARCHAR(80) NOT NULL DEFAULT 'scene_composer_v1_reserved', `ip_rules_json` JSON NULL, `video_engine_config_json` JSON NULL, `scene_composer_config_json` JSON 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`), UNIQUE INDEX `project_pipeline_configs_project_id_key` (`project_id`), INDEX `project_pipeline_configs_scene_composer_enabled_idx` (`scene_composer_enabled`), INDEX `project_pipeline_configs_default_generation_mode_idx` (`default_generation_mode`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; INSERT INTO `project_pipeline_configs` ( `project_id`, `ip_isolation_enabled`, `video_engine_enabled`, `scene_composer_enabled`, `default_generation_mode`, `video_engine_version`, `scene_composer_version`, `ip_rules_json`, `video_engine_config_json`, `scene_composer_config_json` ) SELECT `id`, true, true, false, 'single_model', 'video_engine_v1', 'scene_composer_v1_reserved', JSON_OBJECT( 'character_ip_policy', 'clean_reusable_assets_only', 'story_character_policy', 'story_bible_and_relationships_only', 'project_character_policy', 'project_look_anchor_scene_state_only', 'forbidden_ip_fields', JSON_ARRAY('episode_plot', 'shot_state', 'project_costume', 'scene_action') ), JSON_OBJECT( 'mode', 'single_model_first', 'candidate_count_default', 1, 'multi_model_compare_default_enabled', false, 'requires_human_clip_selection', true ), JSON_OBJECT( 'enabled', false, 'reserved_stage', 'phase_5', 'notes', 'Scene Composer is recorded for future automatic ordering/emotion/transition logic. Current production keeps human clip selection and FFmpeg render.' ) FROM `projects` ON DUPLICATE KEY UPDATE `updated_at` = CURRENT_TIMESTAMP(3);