0005 — Promoción a producción por rama, no por dev entero
Estado: aceptada · Fecha: 2026-09-19
Contexto
promote.yml hacía git merge --ff-only origin/dev || git reset --hard origin/dev sobre main,
así que main era siempre una copia de dev. Eso tenía tres consecuencias:
- No se podía elegir qué subía. Cualquier cosa integrada en
deviba a producción en el siguiente promote, la hubiera aprobado QA o no. - Las ramas nacían de
dev, con trabajo ajeno sin aprobar dentro. Aunque se abriera un PR de una sola rama amain, arrastraba todo lo demás. - Los arreglos hechos a mano en
mainse perdían o bloqueaban el promote. El 2026-09-19,maintenía tres cherry-picks que no estaban endev. El--ff-onlyfallaba, elreset --harddejaba un push sin fast-forward y GitHub lo rechazaba, así que el promote ya no podía correr.
Decisión
Un solo camino a producción: el PR de una rama concreta a main.
- Toda rama sale de
main. Primero va por PR adevpara que QA la pruebe en Test. Cuando QA la aprueba, la misma rama va por PR amain. devnunca se fusiona enmain. Es solo el entorno de QA.sync-main-to-dev.ymlfusionamainendeven cada push amain. Los choques endocs/generated/los resuelve regenerando; los de código los deja en un PR.promote.ymlya no mueve código. Corta la versión sobremain: notas con git-cliff, etiqueta, y relanza el deploy y el sync, porque su push con elGITHUB_TOKENno dispara workflows.- La aprobación de QA es el merge del PR a
main. La organización está en el plan gratuito: no hay required reviewers en environments y la protección de ramas no se puede imponer en un repo privado. Es una regla de equipo, no algo que GitHub bloquee.
Descartado
- Mantener también "promover
deventero". Con dos caminos, las ramas vuelven a salir dedevpor costumbre y deja de saberse qué hay en producción. Promover "todo lo aprobado" se hace igual: fusionando los PRs aprobados uno detrás de otro. - Cherry-pick de
devamain. Da commits duplicados con otro SHA (git cherrylos marca como distintos) y conflictos en cada sincronización. Se usa una sola vez, en la transición, para pasar lo que ya estaba endev. - Feature flags como mecanismo principal. Siguen siendo la opción para funcionalidades grandes o de larga duración, pero no hacen falta para cambios pequeños.
Consecuencias
- Migraciones:
supabase db push --include-allacepta que lleguen fuera de orden. La regla es que la migración de una rama no dependa de la de otra rama sin aprobar; si depende, suben juntas. - Riesgo: QA prueba en
devuna combinación distinta de la que llega amain. Para cambios grandes, conviene una comprobación rápida en producción después del deploy, o un flag. - Artefactos de
yarn gen: chocan entre ramas. El PR amaintiene que llevarlos regenerados sobremain, y el CI lo comprueba. - Guía operativa: Flujo de ramas. Los agentes la tienen en
la skill
flujo-de-ramasy en la regla de Cursor.cursor/rules/flujo-de-ramas.mdc.