What problem does it solve?
Discourse runs zero-downtime deployments, so a poorly written database migration can break production, fail SafeMigrate checks, or silently lose data on fresh installs. This Skill encodes the full set of conventions for writing safe migrations across db/migrate and db/post_migrate.
Core Features & Use Cases
- Migration placement and generation: Enforces the pre-deploy (db/migrate) vs post-deploy (db/post_migrate) split and requires generator-created timestamps instead of hand-written ones.
- Safe schema changes: Provides multi-step patterns for dropping or renaming columns and tables using Migration::ColumnDropper and Migration::TableDropper, plus concurrent indexing rules.
- Data migration discipline: Covers batched backfills with disable_ddl_transaction!, avoiding application code in migrations, and gating inserts on Migration::Helpers.existing_site? so fresh installs stay clean.
- Use Case: When asked to remove a deprecated column, the Skill walks through marking it readonly, adding ignored_columns, dropping it in a post-deploy migration, and regenerating structure.sql and annotations.
Quick Start
Review my new migration in db/migrate and tell me whether it follows Discourse's zero-downtime migration rules.