fix(db): aislar tracking de migraciones por módulo + backfill #5

Merged
mane merged 1 commit from fix/per-module-migrations into main 2026-06-28 22:30:19 +00:00
Owner

Las 5 llamadas a migrate() compartían drizzle.__drizzle_migrations. El
migrator de drizzle decide qué aplicar sólo por timestamp (order by
created_at desc limit 1); con tabla compartida el max es global, así que
una migración nueva de un módulo con when menor al max ya registrado por
otro módulo se saltaba en silencio. Funcionaba en DB limpia por el orden de
generación; rompía en migraciones incrementales.

Fix: cada módulo trackea en _drizzle_migrations<módulo> (migrationsTable).
Backfill idempotente siembra cada tabla por módulo desde la legacy (match
por hash) para no re-aplicar DDL en prod.

Verificado en Postgres desechable: DB limpia, estado prod (backfill, 0
re-aplicación) y repro del skip cross-módulo (viejo salta, nuevo aplica).

Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com

Las 5 llamadas a migrate() compartían drizzle.__drizzle_migrations. El migrator de drizzle decide qué aplicar sólo por timestamp (order by created_at desc limit 1); con tabla compartida el max es global, así que una migración nueva de un módulo con `when` menor al max ya registrado por otro módulo se saltaba en silencio. Funcionaba en DB limpia por el orden de generación; rompía en migraciones incrementales. Fix: cada módulo trackea en __drizzle_migrations_<módulo> (migrationsTable). Backfill idempotente siembra cada tabla por módulo desde la legacy (match por hash) para no re-aplicar DDL en prod. Verificado en Postgres desechable: DB limpia, estado prod (backfill, 0 re-aplicación) y repro del skip cross-módulo (viejo salta, nuevo aplica). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fix(db): aislar tracking de migraciones por módulo + backfill
Some checks failed
CI / quality (pull_request) Failing after 21s
CI / integration (pull_request) Failing after 31s
ef95b4cb28
Las 5 llamadas a migrate() compartían drizzle.__drizzle_migrations. El
migrator de drizzle decide qué aplicar sólo por timestamp (order by
created_at desc limit 1); con tabla compartida el max es global, así que
una migración nueva de un módulo con `when` menor al max ya registrado por
otro módulo se saltaba en silencio. Funcionaba en DB limpia por el orden de
generación; rompía en migraciones incrementales.

Fix: cada módulo trackea en __drizzle_migrations_<módulo> (migrationsTable).
Backfill idempotente siembra cada tabla por módulo desde la legacy (match
por hash) para no re-aplicar DDL en prod.

Verificado en Postgres desechable: DB limpia, estado prod (backfill, 0
re-aplicación) y repro del skip cross-módulo (viejo salta, nuevo aplica).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
mane merged commit ccb653055b into main 2026-06-28 22:30:19 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
mane/dev-platform!5
No description provided.