# Git, GitHub y entornos

Cómo entra un cambio en el kit, en un sistema y en producción, quién hace merge en cada uno y dónde encaja el sistema en los entornos del producto.

El enlace 1:1 con producción solo se sostiene si los cambios entran siempre por el mismo camino: una rama, un pull request con comprobaciones y un merge decidido.

## Vocabulario mínimo

| Término | Qué es |
| --- | --- |
| **Repositorio** | La carpeta de un proyecto con todo su historial. Git guarda el historial; GitHub guarda una copia compartida. |
| **Commit** | Una foto de los cambios con un mensaje que explica qué cambia y por qué. |
| **Rama** | Una línea de commits paralela. Sirve para trabajar sin tocar lo que ya funciona. |
| **`main`** | La rama principal, la versión oficial. Las demás ramas nacen de ella y vuelven a ella. |
| **Pull request (PR)** | La petición, en GitHub, de juntar una rama con `main`. Muestra qué cambia y permite revisar y comprobar antes de aceptar. |
| **Merge** | Aceptar el PR: los commits de la rama pasan a `main`. |
| **CI** | Un robot (GitHub Actions) que ejecuta las comprobaciones en cada PR y marca el resultado en verde o en rojo. |
| **Entorno** | Una copia del producto que funciona por su cuenta, con su web, su base de datos y sus claves. |
| **Producción** | El entorno que usan los clientes. |
| **Staging** | Un entorno igual que producción, sin clientes y con datos de prueba. El ensayo general. |
| **Preview** | Un entorno temporal para un PR concreto, que desaparece al cerrarlo. |
| **Promoción** | Llevar a producción la misma versión que ya funcionó en staging. |
| **Rollback** | Volver a la versión anterior cuando la nueva falla. |

## Cómo entra un cambio

El flujo es GitHub Flow, igual en los tres repos:

1. Partir de `main` actualizada y crear una rama con un nombre que diga qué se hace.
2. Hacer commits pequeños. En un sistema, el mensaje nombra el `id` de la ficha (`feat(ds): componentes/boton …`).
3. Subir la rama y abrir un PR. La descripción responde a tres preguntas: **qué cambia, por qué y cómo se ha probado** (con los comandos ejecutados y su resultado).
4. Esperar a la CI y a la revisión. Si algo falla, más commits en la misma rama.
5. Hacer merge y borrar la rama.

```bash
git switch main && git pull
git switch -c componentes-boton-tamanos
# cambios…
git add . && git commit -m "feat(ds): componentes/boton documenta los tamaños"
git push -u origin componentes-boton-tamanos
gh pr create      # o desde la web de GitHub
```

Reglas:

- **`main` siempre funciona.** Nunca se trabaja directamente en ella.
- **Un PR, un cambio.** Una tanda de fichas puede ir en un PR; una tanda y un cambio de interfaz, no.
- **Las ramas duran poco**: horas o pocos días. Cuanto más dura una rama, más conflictos.

## Los tres repos

| | Kit | Sistema | Producción |
| --- | --- | --- | --- |
| **Comprobaciones antes del merge** | Tipos y build. | `ds sync` y `ds check` en verde. | Los tests del producto y, cuando haya CI, `ds check` del sistema. |
| **Qué pasa al hacer merge** | Nada se publica solo. Si cambia algo que usan los sistemas, se etiqueta una versión (ver «Kit y sistemas»). | Se publica el sistema, si está desplegado. | Se despliega: en producción si no hay staging; en staging si lo hay. |
| **Quién hace merge** | Quien mantiene el kit; un agente, si tiene autorización expresa y las comprobaciones pasan. | Igual que el kit. | **Siempre una persona responsable del producto.** Un agente abre el PR, pero no hace merge. |

El merge en producción es distinto porque, sin staging, **hacer merge es desplegar**: el cambio llega a los clientes en minutos. Por eso esa decisión no se delega.

## Reglas para agentes

- Una rama por tarea. Nunca commits en `main`.
- Antes de abrir un PR en un sistema: `npx ds sync` y `npx ds check`. El resultado va en la descripción.
- En producción, abrir el PR y parar. Si el checkout de producción tiene cambios sin commit de otra persona, no se tocan: se trabaja en una copia aparte del repo con `git worktree add`, que crea otra carpeta con su propia rama sobre el mismo historial.
- Si una comprobación falla, se arregla en la rama; no se desactiva la comprobación.

## Entornos del producto y el sistema

### Sin staging

Es la situación de partida de muchos productos: lo que entra en `main` sale a producción. Por eso el sistema vive en su propio repo (ver «Kit y sistemas»): documentar no puede romper el producto. Las huellas del sync detectan cualquier cambio de producción la próxima vez que se ejecute `ds sync`.

### Con staging

Cuando el producto tiene staging y CI, el sistema se engancha a esa CI:

```
Rama + PR ──▶ CI: tests + ds check ──▶ merge: main → staging ──▶ probar ──▶ promoción → producción
```

1. **`ds check` en cada PR de producción.** La CI descarga el repo del sistema junto al de producción y ejecuta `npx ds sync` y `npx ds check`. Al principio solo **avisa**: la ficha desajustada se actualiza en un PR del sistema. Cuando las fichas estén completas, **bloquea** el merge.
2. **Staging para revisar diseño en real.** Los cambios de diseño se miran en staging, con datos de demo, antes de promocionar. Con previews por PR, la revisión de diseño y de textos se hace sobre el enlace del preview, antes del merge.
3. **Iniciativas.** Una pieza de una iniciativa llega a producción por el mismo camino: PR en producción, staging y promoción. Su ficha pasa de «En desarrollo» a «En producción» cuando la versión llega a producción, no al hacer merge en staging.

## Decisiones escritas

La forma de trabajar de cada equipo (flujo de ramas, entornos, quién promociona) se decide una vez y se escribe en un registro de decisión (ADR): un archivo corto con contexto, decisión y consecuencias. Las decisiones propias del sistema van en su `docs/DECISIONES.md`.
