Skill: Integración de historia de usuario
Guía para
cerrar e integrar el trabajo de una historia de usuario
: verificar que la carpeta de la US tenga su
con todas las tareas en
, y luego hacer
merge de la rama actual hacia la rama desde la que se creó.
Alcance del submit: El skill
cierra localmente lo ya implementado. Verifica condiciones y ejecuta
. No hace push, no borra ramas, no crea MRs/PRs, no resuelve conflictos, no modifica
. Lo que no esté en
bloquea el merge — el usuario decide cómo proceder, nunca se fuerza.
Encaja al final del ciclo iniciado por
story-define →
story-plan →
story-implement. Ver
Handoffs del ciclo.
Cómo preguntar al usuario
Cuando este skill indique preguntar, pedir, confirmar, validar o sugerir algo al usuario, hacerlo mediante la herramienta de preguntas estructuradas que ofrezca el cliente (la que renderiza opciones tappables o un selector de respuesta) en lugar de redactar la pregunta como prosa libre. Reglas:
- Una pregunta por turno cuando sea posible; máximo tres preguntas en un mismo bloque.
- Opciones cortas y mutuamente excluyentes (2–4 por pregunta) cuando la respuesta admita categorías; usar entrada libre solo si no hay forma razonable de enumerar opciones.
- No repreguntar lo que ya está respondido en el contexto, en o en de la US.
- Una sola tanda al inicio para resolver lagunas antes de cualquier operación git (US asociada a la rama, carpeta ambigua, rama base); no ir descubriendo huecos turno a turno. Rama base ambigua: listar los candidatos detectados como opciones tappables (p. ej. , , ); no proponer un default implícito.
- Fallback: si el cliente no expone esta herramienta, formular la pregunta en prosa con opciones enumeradas (1, 2, 3…).
Cada sección posterior que diga preguntar al usuario, validar con el usuario, confirmar o sugerir al usuario asume este mecanismo; no se vuelve a repetir.
Resolución de idioma
Orden canónico compartido con el resto del ciclo de historias. Detenerse en el primer paso que aplique:
- (raíz del repo) → línea
preferred language: <ISO 639-1>
(p. ej. , ). Si no existe esa línea pero hay claves legacy (, , ), usarlas solo como fallback al leer MEMORY antiguo.
- Idioma del turno del usuario (mensaje actual).
- Preguntar al usuario qué idioma prefiere y persistir la respuesta en con
preferred language: <código>
.
Ubicación de archivos
| Artefacto | Ruta |
|---|
| Carpeta de la US | docs/specs/user-stories/US-XXX-[nombre-corto]/
|
| Progreso de la US | docs/specs/user-stories/US-XXX-[nombre-corto]/progress.md
|
| Tareas referenciadas | docs/specs/user-stories/US-XXX-[nombre-corto]/TK-XXX-[kebab-case].md
|
Convenciones de rama
- Formato canónico:
feature/US-XXX-[nombre-corto]
con prefijo obligatorio, en mayúsculas y nombre en kebab-case.
- : tres dígitos con cero a la izquierda; coincide con el número de la carpeta de la US.
- La carpeta de la US se deriva descontando el prefijo :
feature/US-042-exportacion-csv
→ docs/specs/user-stories/US-042-exportacion-csv/
.
- Una rama sin o sin formato no es submiteable por este skill.
- Ejemplos:
feature/US-042-exportacion-csv
, feature/US-013-ajuste-permisos
.
Información requerida antes de mergear
Antes de tocar git, el agente debe tener clara la siguiente información. No asumir nada — si algún dato no se resuelve, preguntar al usuario.
| Dato | Cómo obtenerlo | Si no está disponible |
|---|
| Rama actual | git branch --show-current
| Si no encaja con el patrón feature/US-XXX-[nombre-corto]
: preguntar a qué US corresponde antes de continuar |
| Carpeta de la US | Derivar del nombre de rama descontando el prefijo | Si la carpeta no existe: parar e informar; si hay varias coincidentes: preguntar cuál |
| Estado de | Leer el archivo en la carpeta de la US | Si no existe: parar e informar; el merge requiere poblado |
| Working tree | | Si hay salida: parar e informar; no se mergea con cambios pendientes |
| Rama base | (1) → línea ; (2) git config --get branch.<branch>.merge
; (3) preguntar al usuario | No asumir , ni por defecto |
| Idioma de preferencia | Ver Resolución de idioma | Preguntar y persistir en con preferred language: <código>
|
Leer
completo antes de iniciar cualquier operación git. Las tres condiciones (rama, working tree, estados) se evalúan antes de cambiar de rama o invocar
.
Validación antes de mergear
Antes de cambiar de rama o ejecutar el merge, verificar las siguientes condiciones. Si alguna falla, no mergear — informar al usuario y resolver primero.
¿Qué verificar?
- Rama actual con formato válido:
feature/US-XXX-[nombre-corto]
. Sin el prefijo o sin el segmento no se puede derivar la carpeta de la US.
- Working tree limpio: sin salida. Cualquier cambio sin commitear bloquea el merge.
- Carpeta de la US existe:
docs/specs/user-stories/US-XXX-[nombre-corto]/
presente con dentro.
- Todas las tareas en : parsear y confirmar que cada entrada tiene estado (case-insensitive, sin espacios extra). Estados como , o vacío bloquean el merge.
- Code review con veredicto Apto: ejecutar (modificador ) antes del merge. Solo un veredicto ✅ Apto permite continuar. ❌ No apto e ⚠️ Incompleto bloquean el merge hasta que el usuario corrija los problemas y el review se repita con resultado Apto.
- Rama base resoluble: identificada por reflog, por config, o confirmada explícitamente por el usuario. Si hay varios candidatos plausibles y ninguno definitivo, preguntar.
Si hay conflicto:
⚠️ No es posible mergear todavía:
- <razón concreta>
- [TK-XXX: estado-actual] — <detalle si aplica>
Ejemplos de razón concreta:
Rama actual no cumple feature/US-XXX-...: rama es 'fix/hotfix-cache'
,
Working tree sucio: 3 archivos modificados
,
progress.md: TK-002 en In Progress, TK-005 en Pending
,
Rama base ambigua: candidatos main, develop, release/2026.q2
.
Flujo: Submit estándar
Camino feliz cuando todas las verificaciones pasan.
- Detectar rama actual con
git branch --show-current
y validar el patrón feature/US-XXX-[nombre-corto]
. Si no encaja, parar y preguntar.
- Verificar working tree limpio con . Si hay salida, parar e informar.
- Localizar la carpeta de la US descontando el prefijo del nombre de rama:
feature/US-XXX-[nombre-corto]
→ docs/specs/user-stories/US-XXX-[nombre-corto]/
. Si la carpeta no existe o hay varias coincidentes, parar.
- Leer y validar que todas las tareas tienen estado . Si alguna no lo está, parar mostrando la lista completa de tareas no con su estado actual.
- Ejecutar (modificador ) sobre la rama actual. Si el veredicto es ❌ No apto o ⚠️ Incompleto, parar y reportar el informe al usuario — no continuar con el merge hasta obtener veredicto ✅ Apto en una nueva ejecución.
- Resolver la rama base:
- → buscar la entrada inicial con o
branch: Created from <ref>
.
- Fallback:
git config --get branch.<branch>.merge
y derivar la rama base local correspondiente.
- Si ninguno concluye o hay ambigüedad: preguntar al usuario sin proponer un default.
- Calcular delta con
git rev-list --count <base>..HEAD
para reportar cuántos commits se van a integrar.
- Cambiar a la rama base con . Si falla, parar y reportar.
- Ejecutar el merge con
git merge --no-ff <feature-branch> -m "Merge US-XXX: <nombre-corto>"
. El mensaje de merge usa solo (sin el prefijo ). Si surge conflicto, ir al flujo de conflictos.
- Reportar resultado al usuario: rama origen (con prefijo ), rama destino, número de commits integrados, hash del commit de merge, estado del HEAD y nota explícita de que no se hizo push ni se borró la rama de la US.
Flujo: Manejo de conflictos
Cuando
produce conflictos.
- Abortar inmediatamente con para restaurar el repo al estado previo al merge. No intentar resolución automática ni usar / .
- Identificar archivos en conflicto parseando la salida del intento de merge.
- Reportar al usuario la lista de archivos en conflicto y dejar claro que el repo quedó como estaba. Indicar que el siguiente paso (rebase, merge manual, decisión de alcance) está fuera del skill.
- Parar. No reintentar; no encadenar otra acción git sin nueva instrucción del usuario.
Flujo: Rama base ambigua
Cuando reflog y config no concluyen, o existen varios candidatos plausibles.
- Listar los candidatos detectados (p. ej. , , ramas de release con commits ancestros del HEAD actual).
- Preguntar al usuario cuál es la rama base correcta. No proponer un default ni inferir por convención del proyecto sin confirmación.
- Esperar respuesta antes de continuar al paso 7 del flujo estándar. Sin respuesta clara, no hay merge.
Checklist antes de mergear
Información:
Validación:
Ejecución:
Cierre:
Ejemplos
Ejemplo 1 — Camino feliz
- Entrada: Rama
feature/US-042-exportacion-csv
, working tree limpio, con tres tareas todas en , reflog indica .
- Salida: →
git merge --no-ff feature/US-042-exportacion-csv -m "Merge US-042: exportacion-csv"
→ reporte: «Merged 7 commits de feature/US-042-exportacion-csv
→ . Commit de merge: . HEAD en , working tree limpio. La rama de US no fue borrada ni se hizo push.»
Ejemplo 2 — Tarea pendiente
- Entrada: Rama
feature/US-013-ajuste-permisos
, working tree limpio, con TK-001 en y TK-002 en .
- Salida: Sin operaciones git. Mensaje:
⚠️ No es posible mergear todavía:
- progress.md tiene tareas no Done:
- TK-001: Done
- TK-002: In Progress
- Completa o marca explícitamente cada tarea como Done antes de reintentar.
Ejemplo 3 — Rama base ambigua
- Entrada: Rama , reflog sin entrada , sin upstream local; existen , y como ancestros plausibles.
- Comportamiento: El agente lista los candidatos y pregunta cuál es la rama base correcta. No asume ni . No mergea hasta tener respuesta.
Ejemplo 4 — Working tree sucio
- Entrada: Rama , dos archivos modificados sin commitear, íntegro en .
- Salida: Sin operaciones git. Mensaje listando los archivos pendientes y pidiendo commit, stash o descarte antes de reintentar.
Ejemplo 5 — Conflicto en el merge
- Entrada: Verificaciones OK, rama base , produce conflictos en .
- Comportamiento: El agente ejecuta , deja el repo en el estado previo, lista los archivos en conflicto y pide al usuario resolverlos manualmente. No reintenta.
Ejemplo 6 — Rama sin prefijo
- Entrada: Rama (sin el prefijo ), íntegro en .
- Salida: Sin operaciones git. Mensaje: «La rama actual no cumple el patrón
feature/US-XXX-[nombre-corto]
. Renombra la rama con git branch -m feature/US-099-cleanup-logs
antes de reintentar el submit.»
Anti-patterns
- Hacer merge sin verificar o ignorando tareas no .
- Hacer merge sin haber ejecutado o con veredicto ❌ No apto / ⚠️ Incompleto — el merge solo procede con veredicto ✅ Apto.
- Modificar para «forzar» que aparezcan en sin que el trabajo esté completo.
- Aceptar ramas sin prefijo o con prefijos alternativos (, , ) como rama de submit.
- Asumir , o como rama base sin confirmarlo por reflog, config o usuario.
- Resolver conflictos automáticamente o usar / para hacerlo pasar.
- Usar merge fast-forward por defecto cuando el historial de la rama de US se perdería; preservar con salvo petición explícita del usuario.
- Hacer push de la rama base o borrar la rama de la US sin que el usuario lo pida explícitamente fuera del skill.
- Mergear con working tree sucio o desde una rama que no encaja con
feature/US-XXX-[nombre-corto]
.
- Cerrar varias US en una sola pasada del skill; este flujo cubre una US por ejecución.
- Reintentar el merge tras un conflicto sin nueva instrucción del usuario.
- Narrar el trabajo realizado en el mensaje al usuario («leí progress.md», «detecté la rama»); solo reportar resultados y pendientes.
- Lanzar preguntas al usuario como prosa libre cuando el cliente expone una herramienta de preguntas estructuradas; preguntar la rama base sin listar candidatos como opciones tappables cuando la herramienta está disponible.
Notas
Handoffs del ciclo
Posición: cierre local — último paso del pipeline de historias (sin push ni PR).
| |
|---|
| Entrada | Rama feature/US-XXX-[nombre-corto]
; working tree limpio; commits de la implementación ya hechos (); con cada TK listada en ; con veredicto ✅ Apto. |
| Salida | Merge a la rama base local; reporte con hash de merge. Sin push ni borrado de rama. |
| Siguiente paso (fuera del skill) | Push de la rama base y CI — decisión del usuario. |
| PR/MR () | Abrir antes de este skill, estando en feature/US-XXX-[nombre-corto]
(o con la feature ya publicada en remoto). Tras el merge local, la rama activa es la base; bloquea en ///. |
| Regreso a implement | TK no o incompleto → completar en y actualizar antes de reintentar. |
| Regreso a define / plan | Alcance de US reducido o TK fuera de entrega → alinear con / , corregir y reintentar. |
progress.md
El skill
lee para verificar estados, pero no lo modifica. La actualización de estados durante la implementación es responsabilidad de
story-implement. Si al revisar el archivo aparecen tareas en
que sí están terminadas en código, el usuario debe corregir el archivo antes de reintentar el submit — no es papel del submit ajustar progreso.
Estados de
Estados válidos por tarea:
,
,
. Solo
(case-insensitive, sin espacios extra) cierra una tarea para merge.
Detección de rama base
es la fuente más fiable, pero solo funciona localmente y se pierde si la rama se clonó fresh o si
ya pasó. El fallback a
git config --get branch.<branch>.merge
cubre el caso de upstream local. Cuando ambos fallan, la pregunta al usuario es
por diseño, no por descuido: el skill no debe adivinar la rama de integración.
Sin push intencional
La decisión de cuándo publicar el merge en el remoto queda fuera del skill, para preservar el control del usuario sobre integración con CI/CD, MRs/PRs y revisión. El mensaje final al usuario debe dejar explícito que el merge es solo local y que push y limpieza de ramas son pasos manuales posteriores.
Mensaje al usuario
Solo resultados y lo que el usuario debe saber o decidir. No incluir razonamiento interno, cadenas de pensamiento ni narración del trabajo en curso. Si hay condiciones que bloquean el merge, listarlas en viñetas con detalle suficiente para que el usuario pueda actuar (qué archivos, qué tareas, qué estados).