Planos · agentic-dev-boilerplate
00 · continuidad de sesión

Contexto trasplantado, no resumido.

/session-handoff compacta una sesión entera de agente en un archivo, para que una sesión nueva retome exactamente donde esta se detuvo, como si la ventana de contexto se hubiera agrandado en vez de reiniciarse. El sucesor no es un lector al que se le cuenta el trabajo de otro: es esta misma sesión, con una ventana nueva. Todo lo que necesita para actuar tiene que estar en disco, direccionable y ser cierto cuando lo lea.

para quien desarrolla y quien mantiene disparo manual, por diseño mismo worktree, mismo harness
Disparo

El humano lo pide

Nota que la ventana se llena, o que el trabajo sigue más allá de esta sesión.

→
Capturar

Diez secciones

Todas, en orden. Una vacía se escribe como none con su razón.

→
Escribir

En el checkout primario

Bajo .session/handoffs/, con el número que sigue en el linaje.

→
Lanzar

El sucesor

Recién con el archivo completo. Solo, si hay runtime; si no, una línea para pegar.

01 · qué no es

Lo que se le parece y no es esta skill

Un handoff mueve la sesión entera a su propio sucesor. Cada vecino de esta tabla mueve otra cosa, y tiene su propia puerta.

Se parece a En realidad es Se usa
Pasarle una tarea acotada a otra sesión y supervisarla Orquestación: una tarea sale, el trabajo vuelve /orca-orchestration
Despachar un subagente para una pieza de trabajo Un ejecutor con briefing, adentro de ESTA sesión AGENTS.md §3, briefing-template.md
Retomar el pipeline de una historia después de una pausa Estado de una skill, por ticket /sprint-development fase 0, session-management.md
Recordar una decisión para el mes que viene Un hecho durable entre sesiones, del proyecto Engram (mem_save), un ADR o el tracker
Achicar la ventana y seguir La compactación del harness: con pérdida, no direccionable, no la controlas Nada que hacer
Pasar la SESIÓN entera a su sucesor Esta skill /session-handoff
La diferencia que importa. La compactación guarda lo que un resumidor juzgó relevante. Un handoff guarda lo que el próximo actor necesita, que es otro conjunto, y lo escribe la única parte que conoce la diferencia.
Se componen

Con los progress.md de cada skill

  • El progress.md de una skill dice dónde está UN workflow. El handoff no lo copia: lo apunta, en su lista de lectura y en su estado vivo.
No es un briefing

Los 7 componentes no aplican

  • Un briefing acota una tarea. Un handoff trasplanta una sesión. Por eso tiene su propio contrato, de diez secciones.
02 · cuándo escribir uno

El disparo es manual, y eso es a propósito

El humano ve que la ventana se llena, lo dice, y la skill corre. Sin polling, sin recordatorios, sin gastar tokens adivinando.

Escribilo cuando

Algo de esto es cierto

  • ~500k tokens de ventana usados: el umbral del dueño, salvo que nombre otro. Es su juicio sobre dónde este modelo empieza a degradarse, no configuración del proyecto: vive en la conversación, no en una clave de yaml.
  • La sesión está por terminar con trabajo en vuelo: un PR abierto, un deploy a staging sin verificar, una migración escrita pero no aplicada.
  • Lo próximo va a comerse una tajada grande de la ventana (un diff enorme, un archivo largo, el log de toda la suite) y lo que queda no alcanza para el trabajo de después.
  • Lo pide el dueño.
No lo escribas

Si lo que falta entra cómodo

  • Producir un handoff cuesta una tajada real de contexto. Un sucesor lanzado antes de tiempo paga el costo de arranque por nada.

Y un disparo automático?

La respuesta, con citas, está en references/auto-trigger.md. Veredicto: parcialmente factible, y el manual sigue siendo el disparo principal.

Ningún harness le pasa el tamaño al agenteDos de los tres lo exponen afuera del loop del modelo. Un disparo automático se puede construir, pero es cableado nuevo, no un campo esperando a ser leído.
La compactación es el momento equivocadoLos tres harnesses avisan que la compactación es inminente, pero ahí la ventana ya está llena: el handoff lo escribiría una sesión a punto de truncarse, con el juicio degradado del que el handoff existe para escapar.
Si alguna vez se activaPregunta una vez, en dos líneas, y acepta un no sin volver a preguntar en esa sesión. Nunca escribe un handoff sin que se lo pidan.
La posición del dueño, registrada: "prefiero que el humano lo haga de manera manual". Lo que dice auto-trigger.md responde a "se podría?", no es un plan.
03 · el contrato de captura

Diez secciones, en este orden, ninguna omitida

Una sección sin nada que decir se escribe con una línea none y su razón. Una omitida y una olvidada se ven idénticas, y el sucesor no puede preguntar cuál pasó. El orden no es decorativo: se lee de arriba abajo con apuro, así que abre con lo único que hay que hacer y cierra con lo que siempre es cierto.

§ Sección Qué guarda Qué evita
0 Tu PRIMERA tarea Una tarea, no un menú. Los criterios del dueño citados, numerados, sin parafrasear. Los de una historia se citan por ruta del PBI sincronizado. Un sucesor que redecide lo que ya estaba decidido, y elige distinto
1 Identidad y autoridad Qué delegó el dueño y qué se reservó; harness, worktree, trailers; la estrategia de git y la política de push con sus valores resueltos de git_strategy:, no el nombre de la clave Volver a preguntar algo delegado, o asumir un permiso que no existe
2 Qué se construyó Un párrafo por unidad de trabajo, con SHAs, PRs, deploys y rutas. Pusheado o local, mergeado o abierto, desplegado o solo compilado Rehacer trabajo que ya estaba terminado
3 Decisiones, cada una con su porqué Alternativas descartadas, la razón, y quién decidió. Lo arquitectónico cita su ADR Revertir una elección deliberada creyendo que fue un descuido
4 Gotchas y observaciones Lo aprendido a los golpes, cada uno marcado measured o read, con la versión para la que vale Pagar dos veces el mismo costo. Es la sección más valiosa y la que más flaca sale
5 Skills, herramientas y MCPs Una tabla con la columna Load next session? respondida fila por fila con una razón Recargar todo y quemar la ventana nueva, o no cargar nada y adivinar sintaxis
6 Archivos a leer, en orden Lista numerada, rutas absolutas, para qué sirve cada uno. Los progress.md de skills, antes que el código que describen Que el sucesor tenga que buscar lo que el predecesor ya encontró
7 Estado vivo que heredas La sección perecedera. Ver frescura Actuar sobre un mundo que ya no existe. Aquí es donde los handoffs se rompen
8 Trabajo pendiente, por prioridad Ítems con letra, en el orden del dueño, con el próximo paso exacto. Separa lo decidido de lo que espera una decisión Empezar por el ítem interesante en vez del importante
9 Convenciones que le importan al dueño Cómo se presentan decisiones, qué se anuncia, idioma, registro, memoria. Cierra con el umbral al que el sucesor escribe su propio handoff Reaprender preferencias equivocándose primero. Y un linaje que muere
La IA hace

Recorre capture-contract.md sección por sección y llena templates/handoff.md.

Antes de escribir: lista el directorio de handoffs y re-verifica todo lo que va a §7.

Tú decides

Cuándo: el disparo es tuyo.

Un nombre para la sesión, si la identidad dice unknown.

Sale

Un markdown en inglés, gitignorado, desechable por diseño.

Lo durable no va aquí: va a Engram, al repo o al tracker, y el handoff lo cita.

Gate las diez secciones presentes, en orden; ninguna vacía sin su línea none.
04 · medido, predicho, perecedero

Lo que era cierto al escribir ya cambió al leer

Las conjeturas del predecesor sobre lo que va a encontrar el sucesor son útiles, y son lo primero que se vuelve viejo. Por eso cada afirmación lleva su etiqueta.

measured

Esta sesión lo corrió y leyó la salida

  • Se puede usar como punto de partida, con la hora en que se midió.
predicted

Nadie lo observó

  • "Si CI falla en lint, haz X" es predicted. Una rama predicha presentada como hecho manda al sucesor por un camino que ya no existe.

§7, la sección PERISHABLE

Todo lo que sigue en movimiento: PRs abiertos y sus checks, deploys sin confirmar READY para el SHA pusheado, subagentes o comandos en segundo plano, transiciones de Jira en vuelo, migraciones escritas sin aplicar, sesiones reanudables.

Cada ítem marcado PERISHABLE, con la hora de reloj en que se midió por última vez.
Cada ítem con el comando exacto que lo re-verifica: gh pr checks <N>, bun run jira:sync-issues get <KEY>, el poll de deploy de /vercel-cli. La instrucción es re-verificar, después actuar, nunca al revés.
Los ids se copian tal cual, en backticks: número de PR, clave del tracker, SHA, id de deploy, id de sesión, handle de terminal. "El PR de antes" no es un id.
Lo perecedero le gana a la prioridad. Si algo de §7 necesita atención antes del orden de §8, el ítem lo dice. El sucesor no lo puede inferir.
# forma de un ítem de §7 (templates/handoff.md)
- **staging deploy**: `PERISHABLE`, measured <HH:MM>. Ids: `<sha>` `<deployment-id>`.
  Re-verify: `<the exact command>`. Then: <what to do with each outcome>.
Un recibo no es un resultado. Esto es la Critical Rule #16 de AGENTS.md aplicada al traspaso: un 201 o un "deploy aceptado" anotado en el handoff no dice que la cosa pasó. El sucesor lee el destino antes de actuar.
05 · dónde vive y cómo se llama

Siempre en el checkout primario, aunque la sesión corra en un worktree

<<PRIMARY_ROOT>> se resuelve igual desde el primario y desde cada worktree (.agents/README.md, sección "Checkout roots"). Nunca se deriva de pwd.

# la ruta
<<PRIMARY_ROOT>>/.session/handoffs/<predecessor-session-name>-handoff-NN.md

# cómo se resuelve PRIMARY_ROOT
dirname "$(git rev-parse --path-format=absolute --git-common-dir)"

# el linaje se lee en la lista de archivos: el nombre del sucesor es el basename sin extensión
<base>
<base>-handoff-01
<base>-handoff-01-handoff-02

Por qué el primario

Un handoff escrito adentro de un worktree muere con el worktree. Y dos worktrees del mismo linaje contarían NN cada uno desde su propio directorio vacío.

Si alguno quedó por error en el .session/ de un worktree, lo rescata bun run worktree:audit --rescue antes de que el worktree se vaya.

Cómo se elige NN

Listando <<PRIMARY_ROOT>>/.session/handoffs/. Dos dígitos desde 01, contados en todo el linaje. Nunca se asume. Dos handoffs con el mismo número son un linaje que no se puede leer.

De dónde sale el nombre

Del valor session= de la línea AGENT IDENTITY: que inyecta el hook (la misma etiqueta que llevan los trailers de commit), con espacios y paréntesis cambiados por -. Si dice unknown, la IA te pide un nombre en vez de inventarlo.

Los nombres largos son el punto: un linaje que no se lee es un linaje que no se audita.

Por qué gitignorado

.session/ está ignorado. Un handoff describe el estado de una sesión, no es un registro del proyecto: commitearlo pondría una foto que se pudre bajo control de versiones.

06 · lanzar al sucesor

Primero el archivo completo, después la sesión nueva

El orden no se invierte: un sucesor que arranca primero lee un archivo que todavía no existe. Corre en el mismo worktree que el predecesor (<<REPO_ROOT>>) y en el mismo harness. Solo el archivo vive en el primario.

# el binario pelado: sus MCPs leen .env por el loader de .env
claude     # o: opencode · codex, el mismo harness del predecesor

# el primer prompt, idéntico en los dos caminos
Read `<absolute path to the handoff>` top to bottom and continue that session exactly where it stopped.
El nombre de la sesión viajaPor el flag del propio harness (se lee en su --help, no se copia aquí). En Claude Code el hook también titula una sesión sin nombre a partir de un --name <valor> en el primer prompt.
Si §0 impone un orden, va en el promptUn puntero a un archivo se lee como material de referencia; una instrucción en el prompt se lee como instrucción.
La gramática del runtime no se copiaCuando hace falta, se le pide su guía al binario. Una copia se desincroniza en la próxima versión.
Handoff (esta skill) Orquestación (/orca-orchestration)
Qué se mueve La sesión entera Una tarea acotada
El predecesor Termina Sigue trabajando y supervisa
Canal después Ninguno, por diseño Buzón, preguntas, respuestas
Objetos del runtime Una terminal Run, task, dispatch, worker
Los últimos actos del predecesor, en orden: confirmar en pantalla que el sucesor arrancó y tiene el archivo; persistir lo durable en memoria (mem_session_summary), porque el handoff es desechable y la memoria no; y parar. No cierra su propia terminal: terminar al predecesor es decisión del dueño, y una sesión que se cierra a mitad de una verificación no puede avisar que el handoff falló.
07 · reglas duras

Las barandas que no se negocian

Viven en el bloque ## Compact Rules y en "Hard rules" de la skill; las compactas son las que viajan a los subagentes por .agents/skills/REGISTRY.md.

Sin secretos en el archivo. Nombra la clave de .env donde vive una credencial, nunca su valor. Cookies, tokens y rutas de storageState.json quedan afuera.
Nunca se borra el handoff del predecesor. El linaje es la pista de auditoría: escribir -handoff-02 no quita -handoff-01.
Nombra lo que NO está hecho, y por qué. Un handoff que se lee como un éxito sin fisuras escondió algo, y lo escondido es siempre lo que muerde.
Cada ruta es absoluta. El sucesor puede arrancar en otro directorio.
Paridad de harness. Un handoff armado para las convenciones de un agente y entregado a otro es un problema de traducción que nadie pidió.
Es un artefacto del repo: en inglés aunque la conversación no lo sea, sin atribución de IA (Critical Rules #3 y #12), y nunca commiteado.
08 · qué le dices a la IA

Invocarla en las tres terminales

No tiene modos: una sola corrida, tres pasos. Alcanza con nombrarla, o con frases como "hagamos el handoff", "pasa el contexto a otra sesión" o "hand this session over".

Claude Code

/session-handoff

La barra de la skill, sin argumentos.

OpenCode

carga la skill session-handoff

Sin barra: nombras la skill en la frase.

Codex

carga la skill session-handoff

Mismo patrón que OpenCode, CLI o Desktop.

El sucesor sale del mismo host. Un predecesor de Claude Code lanza un Claude Code; OpenCode lanza OpenCode; Codex lanza Codex. La línea de lanzamiento es del harness, no del runtime.
09 · alrededor de esta skill

Con quién trabaja

Es chica a propósito: el artefacto pesado es el markdown que produce, y todo el contrato vive en references/capture-contract.md.

Al lado · otra forma de mover trabajo

/orca-orchestration

Para delegar una tarea acotada y supervisarla mientras sigues. Sus verbos de terminal y sus trampas son los que usa el lanzamiento con runtime.

Apuntada · estado por historia

/sprint-development

Su fase 0 retoma una historia desde .session/sprint-development/<KEY>/progress.md. El handoff apunta a ese archivo, no lo copia.

Citada · lo que dura

Engram, ADRs y el tracker

Los hechos que sobreviven a la sesión van ahí. El handoff los cita; el predecesor cierra con mem_session_summary.

Para leer más: .agents/skills/session-handoff/SKILL.md, sus tres referencias en references/ y el esqueleto en templates/handoff.md. Doctrina relacionada: agentic-dev-core/references/session-management.md.