-- Frozen golden datasets and explicit rule-acceptance evidence. -- This migration never activates a rule or changes an asset, review decision, publication, or index. CREATE TABLE IF NOT EXISTS `aihr_golden_dataset` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` varchar(20) NOT NULL, `dataset_code` varchar(64) NOT NULL, `version_no` int NOT NULL, `name` varchar(120) NOT NULL, `description` varchar(1000) DEFAULT NULL, `status` varchar(20) NOT NULL DEFAULT 'DRAFT', `sample_count` int NOT NULL DEFAULT 0, `content_hash` char(64) DEFAULT NULL, `owner_id` bigint NOT NULL, `frozen_by` bigint DEFAULT NULL, `frozen_time` datetime DEFAULT NULL, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_golden_dataset_version` (`tenant_id`, `dataset_code`, `version_no`), KEY `idx_aihr_golden_dataset_status` (`tenant_id`, `status`, `update_time`), CONSTRAINT `ck_aihr_golden_dataset_status` CHECK (`status` IN ('DRAFT','FROZEN','RETIRED')), CONSTRAINT `ck_aihr_golden_dataset_sample_count` CHECK (`sample_count` >= 0) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Immutable versions of human-labeled rule calibration datasets'; CREATE TABLE IF NOT EXISTS `aihr_golden_sample` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` varchar(20) NOT NULL, `dataset_id` bigint NOT NULL, `sample_key` varchar(100) NOT NULL, `risk_class` varchar(20) NOT NULL, `expected_decision` varchar(20) NOT NULL, `reason_codes_json` json DEFAULT NULL, `evidence_ref` varchar(500) NOT NULL, `asset_id` bigint DEFAULT NULL, `version_id` bigint DEFAULT NULL, `created_by` bigint NOT NULL, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_golden_sample` (`tenant_id`, `dataset_id`, `sample_key`), KEY `idx_aihr_golden_sample_risk` (`tenant_id`, `dataset_id`, `risk_class`, `id`), CONSTRAINT `ck_aihr_golden_sample_risk` CHECK (`risk_class` IN ('LOW','MEDIUM','HIGH','CRITICAL')), CONSTRAINT `ck_aihr_golden_sample_decision` CHECK (`expected_decision` IN ('PASS','REVIEW','BLOCK')) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Human-labeled samples belonging to a versioned golden dataset'; CREATE TABLE IF NOT EXISTS `aihr_rule_golden_evaluation` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` varchar(20) NOT NULL, `evaluation_id` bigint NOT NULL, `dataset_id` bigint NOT NULL, `golden_sample_id` bigint NOT NULL, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_rule_golden_evaluation` (`tenant_id`, `evaluation_id`), KEY `idx_aihr_rule_golden_sample` (`tenant_id`, `golden_sample_id`, `evaluation_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Traceable link from a shadow evaluation to its frozen golden label'; CREATE TABLE IF NOT EXISTS `aihr_rule_acceptance_profile` ( `id` bigint NOT NULL AUTO_INCREMENT, `tenant_id` varchar(20) NOT NULL, `rule_id` bigint NOT NULL, `version_no` int NOT NULL, `risk_class` varchar(20) NOT NULL, `min_total_samples` int NOT NULL, `min_golden_samples` int NOT NULL, `min_reviewed_samples` int NOT NULL, `min_agreement_rate` decimal(7,6) NOT NULL, `max_false_allow_rate` decimal(7,6) NOT NULL, `max_false_block_rate` decimal(7,6) NOT NULL, `min_review_coverage_rate` decimal(7,6) NOT NULL, `status` varchar(20) NOT NULL DEFAULT 'DRAFT', `owner_id` bigint NOT NULL, `freeze_reason` varchar(500) DEFAULT NULL, `frozen_by` bigint DEFAULT NULL, `frozen_time` datetime DEFAULT NULL, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_aihr_rule_acceptance_profile` (`tenant_id`, `rule_id`, `version_no`), KEY `idx_aihr_rule_acceptance_status` (`tenant_id`, `rule_id`, `status`, `version_no`), CONSTRAINT `ck_aihr_rule_acceptance_risk` CHECK (`risk_class` IN ('LOW','MEDIUM','HIGH','CRITICAL')), CONSTRAINT `ck_aihr_rule_acceptance_status` CHECK (`status` IN ('DRAFT','FROZEN','RETIRED')), CONSTRAINT `ck_aihr_rule_acceptance_counts` CHECK ( `min_total_samples` >= 1 AND `min_golden_samples` >= 1 AND `min_reviewed_samples` >= 1), CONSTRAINT `ck_aihr_rule_acceptance_rates` CHECK ( `min_agreement_rate` BETWEEN 0 AND 1 AND `max_false_allow_rate` BETWEEN 0 AND 1 AND `max_false_block_rate` BETWEEN 0 AND 1 AND `min_review_coverage_rate` BETWEEN 0 AND 1) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Frozen, risk-specific evidence thresholds for a processing-rule version';