Planos · agentic-dev-boilerplate
00 · corridas sin nadie mirando

Entregar de noche, sin adivinar.

/autonomous-delivery es la capa entre un scheduler y /sprint-development. Un pipeline interactivo da por hecho que un humano eligió el ticket, confirmó el estado y está presente si algo se tuerce. Sin nadie en la línea, esas tres suposiciones son falsas. Esta skill no implementa nada: establece qué es cierto, elige trabajo de verdad desbloqueado, se lo pasa a la skill dueña y deja un registro desde el que la próxima corrida puede arrancar.

para quien lidera el equipo y quien es dueño del producto la dispara un scheduler, no una persona git es la verdad, el tracker una pista
Fase 0

Aislar y tomar el lock

Su propio worktree, un lock por modo. Lock vivo de otra corrida: sale limpia.

→
Fase 1

Auditar

Cuatro fuentes de evidencia en paralelo. Decide la ascendencia en git.

→
Fase 2

Seleccionar

Solo lo desbloqueado de verdad. Una corrida vacía es un resultado correcto.

→
Fase 3

Ejecutar

Despacha la skill dueña. Compuerta de migraciones, handoff sobre la marcha.

→
Fase 4

Cerrar y reportar

Verifica el cierre, rescata registros, suelta el lock, escribe el reporte.

01 · cuándo sí y cuándo no

Un scheduler la dispara con un modo. Esa es toda su superficie

Un cron, una rutina o un despertador programado abre una sesión sin humano presente y le pasa el modo. Si una persona está en la línea y nombró un ticket, esta skill sobra: su único valor es la capa de auditoría, selección y traspaso, y esa capa es puro costo cuando un humano ya eligió.

Situación Va a
Trabajo por ticket con un humano presente /sprint-development, directo
Sembrar backlog o refinar criterios de un ticket con nombre /product-management, directo
Ramas, pull requests, conflictos /git-flow-master
Definir el producto desde cero /project-foundation
Andamiaje de infraestructura /project-bootstrap
Una tajada TDD de tests unitarios /unit-testing
Una corrida programada, desatendida, con un modo /autonomous-delivery <modo>
Precondiciones

Si falta una, termina en la fase 0

  • .agents/project.yaml con el bloque autonomous_delivery: y git_strategy.branches: la rama contra la que corre cada chequeo de ascendencia es integration, o production cuando integration es null (solo-main, github-flow, trunk-based). Un integration: null es válido y no termina la corrida: en ese caso la corrida nunca mergea y el ticket queda en un PR abierto.
  • .context/dev-roadmap.md como fuente de las aristas de dependencia.
  • .env completo: las credenciales se leen por NOMBRE de variable, nunca van en un reporte.
  • Una identidad con permiso de push, verificada en la fase 0 y no en el primer push.
Sin improvisar

El reporte nombra el archivo y la clave

  • Un requisito ausente no se rodea: la corrida para y dice exactamente qué falta y dónde. Las precondiciones de la skill despachada las verifica esa skill, y esta falla rápido cuando le avisan.
02 · modos y topes

Tres modos, cada uno con un tope que no se negocia

Cada historia medida terminó siendo una cadena de miles de líneas: dos no entran en el contexto de una corrida. Los topes salen de esa medición, no de la prudencia.

Modo Elige Tope Despacha a Escribe código
story La historia de mayor prioridad, desbloqueada de verdad 1 por corrida, duro /sprint-development sí
bug Defectos desbloqueados, primero los más viejos y graves hasta 3, estrictamente en secuencia /sprint-development (entrada de bug) sí
discovery Huecos de refinamiento, épicas o backlog solo definiciones, hasta discovery_definitions /product-management nunca
Sin modo, no hay corridaEl primer token de los argumentos ES el modo. Uno faltante o desconocido es un fast-fail: nadie está para contestar, así que nunca se pregunta ni se deduce de la prosa, y nunca se cae a un modo por defecto.
Un bug a la vez, cerrado del todoEl segundo bug no se reclama hasta que el primero pasó por el cierre de la fase 4. Tres bugs no son tres hilos en paralelo.
El interruptor maestroautonomous_delivery.enabled en false, o un modo ausente de modes, terminan la corrida en la fase 0 con un reporte de una línea. No es una falla.
Los valores de tu proyecto viven en un solo lugar: el bloque autonomous_delivery: de .agents/project.yaml. El bloque de la skill es un ejemplo con los valores seguros de cada eje; citarlo como estado del proyecto es un error de procedencia.
03 · fase 0, aislamiento y lock

Primero su propio worktree, después el lock del modo

La colisión que no puede pasar es dos corridas implementando el mismo ticket en dos ramas. story y bug entran a un worktree propio, creado a mano para poder cerrarlo a mano. discovery no toca código ni crea ramas: trabaja en el checkout común y salta el aislamiento entero.

Anotar el primario

<<PRIMARY_ROOT>> sale de git rev-parse --git-common-dir, nunca de pwd. Es el mismo valor desde el primario y desde cada worktree. .session/ vive ahí toda la corrida y se lee y escribe por ruta absoluta.

Crear el worktree

Con nombre generado, nunca fijo. En Claude Code, EnterWorktree. En OpenCode y Codex, la ruta portable: git worktree add fuera del primario, desde origin/<integration-branch>.

Aprovisionar

bun run worktree:provision copia .env, .vercel/ y lo demás que git ignora. No copia .session/: el lock solo excluye a otra corrida si las dos ven el MISMO archivo.

Verificar la base

git fetch y un chequeo de ascendencia contra la rama de integración (o contra producción cuando integración es null). Si está mal, se realinea con git checkout -B. Nunca git reset --hard: la regla #13 lo prohíbe.

Si el scheduler ya asignó un worktree (la opción "Worktree" de una rutina de Claude Code, el modo worktree de una automatización de Codex), la corrida no crea un segundo: trabaja ahí, avisa en el reporte que esa opción debería ir apagada y no lo borra al final. Es un camino degradado pero funcional. Bajo Orca, el hook de archivo de orca.yaml lo audita y lo quita.

Un lock por modo, nunca una cola

Es lock.json, en .session/autonomous-delivery/<modo>/ del checkout primario, con dueño, máquina, worktree, inicio y un latido que se refresca en cada frontera de fase.

Encuentra Hace
Ningún lock Lo escribe y sigue.
Un lock con latido reciente Otra corrida es dueña del modo: sale limpia con un reporte que la nombra. No espera, no reintenta, no sigue igual. El próximo disparo es el reintento.
Un lock más viejo que lock_staleness_minutes Abandonado: lo reclama y lo anota en el log de escalaciones. El worktree de la corrida muerta queda para que un humano lo audite y lo quite.
Un lock de esta misma sesión Una fase anterior de esta corrida: sigue.
La identidad de push se verifica tres vecesgh auth status contra automation_gh_account: en la fase 0, justo antes del primer push y justo antes de cualquier merge. Una CLI con varias cuentas puede cambiar de identidad en el medio, y el error recién aparece en el merge, disfrazado de protección de rama.
Retomar sin preguntarSin usuario, la fase 0 resuelve el progress.md previo por tabla: rama en el remoto, retoma; rama ausente, escala (se perdió trabajo y no se rehace en silencio); fase final completa, archiva y arranca de cero.
04 · fase 1, auditoría

Git es la fuente de verdad. El tracker es una pista

Un tracker puede decir "listo para QA" sin nada en la rama de integración: la automatización de merge se dispara con CUALQUIER pull request, también con los internos de una cadena. Toda decisión de dependencia de la fase 2 descansa aquí, así que se verifica, nunca se infiere.

# de más confiable a menos; cuando dos chocan, gana la de arriba y el choque se REGISTRA
ascendencia en git contra la rama de integración   <- decide
pull requests abiertos + estado de ramas en el remoto  <- explica
estado vivo del tracker                                <- insinúa
archivo de cola / tablero / claims                     <- reclama
roadmap y prosa de diseño                              <- solo aristas, nunca estado

# el chequeo que más se usa, siempre con fetch inmediatamente antes
git fetch origin
git merge-base --is-ancestor <merge-commit> origin/<integration-branch>   # exit 0 == llegó de verdad
Cuatro fuentes, en paralelo

Un verificador por fuente

  • Ascendencia en git, en cada commit de merge que contribuye a una dependencia.
  • Pull requests abiertos y ramas sin mergear.
  • Estado vivo del tracker, con su changelog y sus comentarios.
  • El archivo de cola, tablero o claims, leído entero, no solo la fila propia.
Por qué no un solo agente

Porque alisaría la contradicción

  • Que las cuatro fuentes no coincidan es el caso normal. Un agente único las concilia en un relato prolijo y borra justo la señal que la fase 2 necesita ver.
La IA hace

Fetch, las cuatro fuentes, el ledger vivo de migraciones con [DB_TOOL] y la protección de ramas por los DOS endpoints: el clásico devuelve 404 cuando la protección es un ruleset. Sin capacidad db (o con stack.database.engine: none) se salta el ledger, se avisa en el reporte y no se reclama ningún ticket que toque el esquema.

Tú decides

Nada en el momento. Cada discrepancia entre tracker y git queda en el log de escalaciones, con evidencia, para que la leas y para que la próxima corrida sepa de qué manera miente este tracker.

Sale

Una tabla, no un relato: ticket, lo que dice el tracker, commit de merge, si es ancestro, PR abierto, estado de la rama y un veredicto (merged, claimed-only, in-flight, not-started).

05 · fase 2, selección

Elige lo que está desbloqueado de verdad, o no elige nada

Cuatro entradas, ponderadas y no promediadas. El veredicto de la fase 1 pisa a las otras cuando no coinciden.

Entrada Manda sobre Nunca manda sobre
.context/dev-roadmap.md aristas de dependencia, compuertas de mockup, orden el estado actual de cualquier cosa
El tracker, consultado ahora estado vivo, responsable, changelog si el trabajo se mergeó
Veredicto de la fase 1 si el trabajo se mergeó qué hay que construir
Cola, tablero o claims quién tiene qué fila al momento de leer si una dependencia salió

Listo no es un estado

Lee el rastro de refinamiento: preguntas bloqueantes abiertas, respuestas de práctica marcadas como borrador, casos borde sin tildar, o un cambio de estado sin comentario que lo explique. Cualquiera significa no listo, diga lo que diga el campo. Es un salteo con razón anotada, no una escalación.

Chequeo de crecimiento

Estimación alta, una historia de UI sin mockup donde el plan de diseño lo espera, una decisión de arquitectura implícita en los criterios, más de una migración o una ruta nueva de autorización: no se reclama sin un humano presente. Se anota y se toma la siguiente.

El protocolo de claim

Escribe su nombre en la fila, guarda y vuelve a leer el archivo. Si ahora hay otro nombre, ganó un par: retrocede y toma el siguiente candidato. Nunca se pelea una fila ni se edita la de otra corrida.

Una corrida vacía es un resultado correcto. Si nada sobrevive, sale limpia con un reporte que dice qué consideró y por qué descartó cada uno. Elegir trabajo marginal para no entregar un reporte vacío es justo la falla que esta fase existe para evitar.
06 · fase 3, ejecución

Despacha a la skill dueña y no repite sus etapas

Cada despacho lleva el briefing de siete componentes. El componente 7 (reglas) carga la compuerta de migraciones, la ruta del worktree, la prohibición de rebasear ramas ya pusheadas y el procedimiento de parada por contexto: una regla que vive solo en esta skill nunca llega al ejecutor.

Modo Despacho Lo que agrega esta skill
story /sprint-development, entrada de historia nueva clave del ticket, tabla de la fase 1, el claim, la ruta del worktree, la compuerta de migraciones, el presupuesto de contexto
bug /sprint-development, entrada de bug (causa raíz primero) lo mismo, una vez por bug, en secuencia
discovery /product-management el hueco encontrado en la fase 2 y su evidencia

La compuerta de migraciones

Escribir el archivo de migración es trabajo técnico y siempre es autónomo. Aplicarlo a una base compartida es irreversible y le pega a cada agente concurrente: es otro acto, con otra compuerta, según autonomous_delivery.migrations.

migrations: Cambio aditivo Cambio destructivo (drop, rename, reescritura)
confirm (por defecto) Pausa y pide aprobación: destino, qué hace, que es aditivo. Pausa y pide aprobación, con una segunda opción real: diferirlo.
autonomous Sigue. Igual para. autonomous nunca cubre esto.
unrestricted Sigue. Sigue. Opt-in y peligroso a propósito: para una base sin datos de producción que perder. Nunca es el defecto.

Un caso que la compuerta no abre: con stack.database.migrations_tool en prisma o drizzle, la doctrina de cambios de base pide consultar al equipo antes de aplicar, y nadie está en la línea. La corrida escribe la migración generada, la pushea y la escala, diga lo que diga migrations:.

El número sale del ledger vivoInmediatamente antes de escribir el archivo, nunca de listar el directorio local: el ledger puede ir adelante de tu rama por la migración sin mergear de un par.
Releer después de cada applyY comparar la definición viva contra el archivo commiteado. Nunca se aplica una migración solo para que desaparezca un error local.
Tests verdes no son evidenciaAl menos una aserción tiene que pasar por una ruta de escritura real de producción. Fixtures que siembran la columna que el código lee, y no la que producción escribe, mantienen la suite verde sobre un camino de datos muerto.
Fase 3.5, por ticket

Limpieza inmediata, no al final

  • Confirmar que la rama está pusheada (o que no hubo commits).
  • Rescatar el .session/ local de la skill despachada con bun run worktree:audit <path> --rescue; si sale con error, no se sigue.
  • git worktree remove <path> y una línea en progress.md.
Opcional

Un worker supervisado por ticket

  • Cuando pasa la compuerta de orquestación (binario y runtime alcanzable), un despacho de story o bug puede ir a un worker por ticket. Lock, auditoría, selección, topes y compuertas siguen siendo de esta skill; el worker para en un PR abierto y el merge queda en la corrida. Con integration: null pasa lo mismo en toda la corrida: nunca mergea, y el merge a producción es la etapa 5 de /sprint-development, una decisión humana.
07 · el contrato de presupuesto

Lo que se acaba primero es el contexto, no el reloj

En la corrida de la que sale esta skill, cada generación de workers se retiró por contexto, varias a mitad de un ticket. Se diseña para eso.

Handoff sobre la marcha

handoff.md se completa en cada frontera de fase y después de cada tajada terminada, según context_budget.handoff_checkpoint. Una sesión que se quedó sin espacio no puede escribir por qué.

Medir el propio presupuesto

En cada frontera de fase. Al llegar a context_budget.stop_at_remaining_pct deja de tomar trabajo: ni tajada nueva, ni agente en segundo plano, ni despertador programado.

La parada limpia, en este orden

Primero el push. Después rescatar registros, el estado de reanudación en handoff.md (rama, SHA, PRs, el próximo comando concreto), la última entrada de progress.md, soltar el lock y reportar.

# la secuencia de parada limpia
1. PUSH de la rama          <- siempre primero: trabajo sin pushear en un worktree descartable
                                  es la única pérdida irrecuperable de este sistema
2. rescatar registros de sesión
3. estado de reanudación en handoff.md, escrito para un extraño que retoma en frío
4. última entrada de progress.md
5. soltar el lock
6. reportar
Una corrida que entrega un traspaso limpio es un éxito. Se la juzga por si la próxima puede retomarla, no por si shippeó. Una muerte a mitad de ticket con trabajo sin pushear es la falla contra la que está diseñada.
08 · quién decide qué

Decide lo técnico sola. Escala solo cuatro cosas

Sigue agentic-dev-core/references/decision-protocol.md: buscar en el registro, seguir lo ya decidido, un panel de jueces puntuado si la pregunta es nueva de verdad, y escalar solo lo que corresponde. Todo queda escrito donde la fase 1 de la próxima corrida lo va a encontrar.

BUSCAR EN EL REGISTRO -> ya decidido? SEGUIRLO
        |
        | no decidido
        v
  producto / seguridad nueva / irreversible / reservado?
        |  no                                  |  sí
        v                                      v
  PANEL DE JUECES PUNTUADO (3-5 lentes)     ESCALAR (informado)
        |                                      |
        +---------> ESCRIBIRLO <---------------+
El registro que lee primero

El log de escalaciones, entero

  • .session/autonomous-delivery/escalation-log.md, más .context/ADR/ y los tickets hermanos. Busca la FORMA de la pregunta, no su redacción: un fallo que te gobierna puede haberlo escrito hace una hora una corrida que nunca viste.
  • Escalar aquí es caro: no hay quién conteste, y una parada por una cuestión técnica cuesta un turno programado entero.
Producto: es configuración

decision_authority.product

  • escalate (el defecto correcto): una pregunta de producto para la corrida.
  • decide: no hay PO humano. Un subagente de decisión puntúa las opciones, publica el fallo en el ticket bajo un encabezado con el perfil que decidió y la corrida sigue. Nunca se presenta como firma humana.
  • Seguridad nueva, irreversible y lo reservado escalan con cualquiera de los dos.
Escalar es una parada limpiaEscribe la entrada (qué pasó, por qué es de esta categoría, qué tiene que decidir el humano, qué cuesta esperar), pushea, suelta el lock, avisa y termina. Nunca deja una sesión estacionada esperando una respuesta que no puede llegar.
Dos canales, dos trabajosescalation_channel lleva solo escalaciones, algo que un humano tiene que resolver. report_channel lleva los resúmenes. Con null, el archivo del reporte es la notificación.
Discovery crea, el operador vetaNo hay compuerta de aprobación: crea hasta su tope, anota cada clave en discovery/created-log.md (solo se agrega) y la reporta. Al arrancar, lee ese log contra el tracker: un ticket cerrado o borrado es un veto vigente y no se recrea, ni con otro título.
Para el dueño del producto: tu control sobre discovery es el veto después del hecho. Cerrar una historia en Backlog cuesta un click. La skill prohíbe reintroducir una espera de aprobación, o una versión más suave de ella, porque una propuesta sin respuesta dejó varios disparos seguidos sin crear nada, y el tope por corrida es lo que acota el daño.
09 · fase 4, cierre y reporte

Cada paso puede perderse con el anterior, por eso el orden

Nada se evapora en silencio: cada discrepancia, cada decisión autónoma y cada chequeo que la corrida no pudo hacer aparece nombrado en el reporte.

1 · Cierre de la skill dueña, verificado. Que la transición automática del tracker de verdad ocurrió, que el responsable de verdad cambió, el comentario de traspaso y la sincronización de la caché. Esta skill no lo reimplementa: comprueba que pasó.
2 · Rescatar antes de borrar. El estado de esta skill ya vive en <<PRIMARY_ROOT>>, pero una skill despachada puede haber escrito un .session/ dentro del worktree: bun run worktree:audit <worktree> --rescue.
3 · Soltar el lock. También si escaló o paró por presupuesto: el lock es de una sesión en marcha, no de un ticket sin terminar.
4 · Escribir el reporte en .session/autonomous-delivery/<modo>/run-report.md, también para la corrida vacía.
5 · Publicar el resumen en report_channel si hay uno configurado. Nunca un destino improvisado.
6 · Archivar la sesión y cerrar la memoria con la ruta del archivo.
7 · Cerrar SU worktree, el último paso. ExitWorktree(remove) en Claude Code, git worktree remove desde el primario en la ruta portable. Nunca el de otra corrida, y nunca uno que asignó el scheduler.
Artefacto Alcance y vida Para qué
run-report.md una corrida; se pisa en cada corrida y se archiva lo que hizo esta corrida, para un humano que se pone al día
handoff.md una corrida, escrito de continuo; se archiva lo que la próxima corrida no puede sacar de otro lado
escalation-log.md todas las corridas y modos; solo se agrega, nunca se archiva cada parada, cada fallo, cada discrepancia
progress.md una corrida; solo se agrega, se archiva estado mecánico para retomar, con lo que queda sin pushear
Lo primero que lee un líder: la sección "Not verified by this run" del reporte. Lo que una corrida programada no pudo comprobar se nombra exacto, para que quien sí puede sepa por dónde empezar. Nunca queda implícita.
10 · barandas

Lo que no hace nunca, con nadie mirando

Las reglas que tienen que atar al ejecutor viven en ## Compact Rules y llegan a cada briefing por .agents/skills/REGISTRY.md. Cada riesgo observado, con su disparador y su chequeo, está en references/hazard-catalogue.md.

Nunca avanza una dependencia por un cambio de estado en el tracker. Solo la ascendencia en git decide si algo salió.
Nunca rebasea, fuerza el push ni reescribe historia pusheada. Sobre una rama que un subagente ya pusheó, mergea la base. Y una operación denegada es una señal para parar y nombrar el permiso que falta, nunca un acertijo.
Nunca toca su propia configuración de permisos para recuperar una capacidad.
Nunca improvisa una identidad o credencial cuando falta la declarada. Un worktree sin su .env es la forma más común de esa tentación: falla cerrado y reporta.
Nunca adivina una transición. Un slug que falta en .agents/jira-workflows.json no dispara nada: deja el issue donde está y el reporte recomienda bun run jira:sync-workflows.
Nunca commitea salida regenerada sin leerla. Tipos o clientes generados desde una instancia compartida absorben el esquema sin mergear de un par.
Nunca edita la fila, la rama ni el worktree de otra corrida, salvo para reclamar una fila libre según el protocolo.
Sin atribución de IA en commits, pull requests ni comentarios del tracker (Critical Rule #3).
Editar una regla no cambia nada hasta regenerar el registro con bun run skills:registry. El registro es lo que llega a un briefing: una regla que no llegó al briefing no llegó a ningún ejecutor.
11 · qué le dice el scheduler a la IA

Invocarla en las tres terminales

Lo escribe el prompt de la rutina, no una persona. El modo va siempre explícito: story, bug o discovery, definidos en ## Mode routing de la skill.

Claude Code

/autonomous-delivery bug

La barra de la skill y el modo como primer argumento.

OpenCode

carga la skill autonomous-delivery, modo bug

Sin barra: el prompt de la rutina nombra la skill y el modo.

Codex

carga la skill autonomous-delivery, modo bug

Mismo patrón que OpenCode, CLI o Desktop.

Al armar la rutina, deja apagada la opción de worktree del scheduler. La skill crea y cierra su propio aislamiento en los tres hosts: así la fase 4 puede borrar el worktree de la corrida en vez de dejarlo en disco para un humano.
12 · alrededor de esta skill

Con quién trabaja

Selecciona y despacha; cada etapa del trabajo la hace su dueña. Fuera de alcance quedan la verificación de QA, que arranca desde el estado listo para QA, y elegir qué construir, que es producto y escala.

Despachada · story y bug

/sprint-development

Implementa, revisa y despliega cada ticket. Su cierre de Stage 4 es el que la fase 4 verifica.

Despachada · discovery

/product-management

Refinamiento, épicas y criterios: la única skill que llama el modo discovery.

Al lado · git

/git-flow-master

Ramas, pull requests, merges, conflictos y la planificación de cadenas de PRs.

Upstream · aristas

/project-context dev-roadmap

Cuando las aristas o el orden de .context/dev-roadmap.md están viejos o faltan.

Opcional · workers y rutinas

/orca-orchestration

Lanza, supervisa y cierra los workers despachados, y registra la corrida como rutina programada. Solo cuando pasa su compuerta; cada QUÉ sigue siendo de esta skill.

Para leer más: .agents/skills/autonomous-delivery/SKILL.md y sus tres referencias en references/ (audit-and-selection.md, hazard-catalogue.md, run-report-format.md). Doctrina relacionada: agentic-dev-core/references/decision-protocol.md y session-management.md.