[
  {
    "type": "raw_sql",
    "description": "Remediate duplicate active AI schedule jobs before enforcing uniqueness, preserving a processing job ahead of pending jobs and otherwise the oldest job",
    "database": "{{store}}",
    "always_check": true,
    "sql": "UPDATE `aiScheduleJobs` AS duplicateJob INNER JOIN `aiScheduleJobs` AS keeper ON keeper.weekStart = duplicateJob.weekStart AND keeper.solverType = duplicateJob.solverType AND keeper.status IN ('pending','processing') AND duplicateJob.status IN ('pending','processing') AND ( (keeper.status = 'processing' AND duplicateJob.status = 'pending') OR (keeper.status = duplicateJob.status AND (keeper.createdAt < duplicateJob.createdAt OR (keeper.createdAt = duplicateJob.createdAt AND keeper.jobId < duplicateJob.jobId))) ) SET duplicateJob.status = 'failed', duplicateJob.completedAt = COALESCE(duplicateJob.completedAt, CURRENT_TIMESTAMP), duplicateJob.errorMessage = COALESCE(duplicateJob.errorMessage, 'Superseded during active-job uniqueness migration')"
  },
  {
    "type": "raw_sql",
    "description": "Add the generated active schedule-job week key when it is missing",
    "database": "{{store}}",
    "check_query": "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'aiScheduleJobs' AND COLUMN_NAME = 'activeWeekStart'",
    "sql": "ALTER TABLE `aiScheduleJobs` ADD COLUMN `activeWeekStart` DATE GENERATED ALWAYS AS (CASE WHEN status IN ('pending','processing') THEN weekStart ELSE NULL END) STORED COMMENT 'Generated key for one active job per week and solver'"
  },
  {
    "type": "raw_sql",
    "description": "Enforce one active schedule job per week and solver when the unique index is missing",
    "database": "{{store}}",
    "check_query": "SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'aiScheduleJobs' AND INDEX_NAME = 'idx_unique_active_week_solver' AND NON_UNIQUE = 0 GROUP BY INDEX_NAME HAVING GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) = 'activeWeekStart,solverType'",
    "sql": "ALTER TABLE `aiScheduleJobs` ADD UNIQUE INDEX `idx_unique_active_week_solver` (`activeWeekStart`, `solverType`)"
  }
]
