Planos · agentic-dev-boilerplate
00 · orquestación multi-sesión

Un director, una flota de sesiones.

/orca-orchestration coordina trabajo que no entra en una sola sesión: una sesión conductor habla con el dueño y reparte; cada worker es una sesión persistente que se queda con un alcance de punta a punta (una historia, un módulo, un racimo de bugs), reporta por un buzón y se puede interrumpir, consultar y retomar. La skill pone el CÓMO. El QUÉ sigue siendo de la skill de workflow que la llama.

para quien lidera y quien desarrolla opcional por construcción sin runtime: las mismas líneas, pegadas a mano
Gate

Binario + runtime

Tres estados. En las skills de workflow, los que fallan son silencio total.

→
Planear

Topología y claims

Se decide por lo que el trabajo ESCRIBE, no por cuántos workers hay.

→
Lanzar

Provisionar, lanzar, briefear

Una sola operación indivisible, verificada en la pantalla del worker.

→
Cerrar

En el mismo turno

Integración verificada, costo leído, worker liberado, auditoría de huérfanos.

01 · dos ejecutores

El subagente sigue siendo el default

AGENTS.md §3 está siempre activo: la conversación principal es el centro de comando y el subagente de un solo uso es el ejecutor por defecto. Esta skill agrega un SEGUNDO ejecutor y declara la excepción por escrito, porque un worker supervisado rompe tres supuestos del contrato de un solo uso: un agente nuevo por despacho, ningún canal hasta que termina, y el orquestador como único que le pregunta al usuario.

Subagente de un solo uso (default) Worker supervisado (esta skill)
Vive Adentro del turno Hasta que lo cierras
Contexto Se pierde cuando reporta Persiste; le sigues hablando
Canal Ninguno hasta que termina; no se puede pausar Mensajes, preguntas bloqueantes y respuestas en cualquier momento
El dueño lo ve No Sí: tablero, terminal, teléfono
Git El del orquestador Su propio worktree, o el checkout compartido con dueños de archivo explícitos
Sirve para Leer, verificar, mapear Escribir e integrar por su cuenta: una historia entera, trabajo largo
La regla práctica: el subagente explora y devuelve un mapa; el worker ejecuta un alcance completo. El conductor sigue usando subagentes para SUS propias lecturas, que es lo que mantiene liviano su contexto.
Despachar un subagente

El briefing de 7 componentes

  • Objetivo, documentos de contexto, estándares del proyecto (de REGISTRY.md), skills a cargar, instrucciones exactas, formato de reporte y reglas. Obligatorio en cada despacho (briefing-template.md).
Lanzar un worker

El mismo briefing, extendido para la flota

  • COMMON.md más un W-<label>.md por worker: dueños de archivo, canal, roster de hermanos, claims, ruta del reporte, label de sesión (references/brief-template.md).
02 · antes de empezar

Esto es orquestación siquiera?

Casi todo el trabajo no lo es. El árbol de decisión de la skill corta temprano.

Entra en este turno y es una lectura, una verificación o un mapa?

Subagente de un solo uso. Fin. Esto es la mayoría del trabajo.

Quieres pasar el trabajo y desentenderte?

Eso es un handoff, transferencia de dueño: sin Task, sin Dispatch, sin buzón. Una tarea suelta va por la guía orca-cli del binario; la sesión entera, porque la ventana se llena, va por /session-handoff.

Necesitas supervisar, esperar resultados, responder preguntas o un grafo de dependencias?

Orquestación. Sigue.

El trabajo escribe código?

Un worktree de Orca por worker. No escribe código? Flota en el mismo checkout (references/topologies.md).

Quieres los workers SUPERVISADOS?

Lanzamiento nativo, y nada más: el runtime solo reconoce agentes que arrancó él. Si a la máquina le faltan los argumentos por defecto del agente o las credenciales no llegan al worker, la flota corre igual, sin supervisión, y se le avisa al dueño antes de lanzar.

No hay nadie al volante?

references/automations.md. Para entrega desatendida, /autonomous-delivery decide qué corre y esta skill lo lanza.

Situación Se usa en cambio
Una historia, una sesión, sus etapas corridas por subagentes /sprint-development en modo de un ticket. Una flota es su modo batch-sprint con más de un ejecutor
Decidir QUÉ puede trabajar una corrida desatendida /autonomous-delivery: auditoría, selección, topes
Rama, commit, push, PR, o un git worktree sin flota /git-flow-master
Una tarea larga, una sesión, sin hermanos Hacer la tarea
03 · el gate

Tres estados, y el silencio como regla

El gate mira el binario más un runtime alcanzable. Nunca mira si la skill del proveedor está instalada: una máquina con el binario y sin esas guías es igual de capaz, porque esta skill sabe pedirle la gramática al binario.

# el gate de SKILL.md: el flag de alcance está ANIDADO
command -v orca >/dev/null 2>&1 \
  && [ "$(orca status --json </dev/null 2>/dev/null | jq -r '.result.runtime.reachable' 2>/dev/null)" = "true" ]
Estado En una skill de workflow En esta skill
A · sin binario Silencio total. No se nombra, no se recomienda, no es prerequisito, no aparece en un PR ni en un plan. El flujo escribe su launch.txt y el humano pega las líneas Una línea, y solo porque el usuario PIDIÓ orquestación; después, el fallback
B · binario, runtime inalcanzable Silencio (el mismo fallback) orca open --json una vez, se vuelve a chequear una vez; sigue sin responder, se trata como A
C · listo El refuerzo se activa sin anunciarse: el runtime lanza los workers con el prompt idéntico, y reportan al buzón ADEMÁS de los tokens en archivo Modo completo: conductor, worker, automatización
La recomendación de una línea (estados A o B, solo aquí): la orquestación de nivel 1 ya está en la sesión, con los subagentes de AGENTS.md §3. La profesional (sesiones persistentes con las que se habla, un buzón, un tablero, el teléfono) necesita Orca instalado. Sin Orca, igual se escribe launch.txt con una línea lista para pegar por worker.
La prueba que decide cualquier edición futura: esta línea tendría sentido, sin cambios, para un desarrollador que nunca oyó hablar de Orca? Si no, va en esta skill y no en la de workflow. La prohibición real siempre fue que la ausencia del orquestador no cueste nada y nunca se reporte; un gate silencioso la cumple, y por eso una skill de workflow puede llevar unas pocas líneas detrás del gate.
04 · tres capas

La skill del repo apunta; no copia

Si la guía del binario ya lo dice, esta skill lleva un puntero. Una copia se desincroniza en silencio con la próxima versión.

CAPA 3 · DOCTRINA DEL REPO   .agents/skills/orca-orchestration/   (T1, versionada)
   cuándo partir el trabajo · topología por actividad · provisión · brief · gotchas medidos · frases del dueño
        ^ apunta a v
CAPA 2 · GRAMÁTICA + MÁQUINA  orca skills get orchestration   (buzón, Run, Task, ciclo del worker)
                               orca skills get orca-cli        (terminales, worktrees, tablero, navegador)
   la sirve EL BINARIO, versionada con él
        ^ opera sobre v
CAPA 1 · APP                  la app corriendo · runtime alcanzable · tablero · teléfono
Se cargan juntas

Las guías del proveedor, al lado de esta skill

  • La lista es orchestration.orchestrator_skills en .agents/project.yaml. Son chicas, y se cargan desde el principio, en el conductor y en el worker: una gramática que nadie cargó produce flags inventados.
Lista vacía

Igual funciona

  • Sin guías instaladas, la skill le pide la gramática al binario. Los temas PROFUNDOS se piden a demanda siempre (orca skills get <topic>), solo cuando una guía apunta a uno.
05 · modos

Quién carga qué

Los modos son roles, no subcomandos: cada sesión carga lo justo para el suyo.

Modo Quién Carga
CONDUCTOR La sesión que habla con el dueño SKILL.md + references/coordinator-playbook.md + las guías del proveedor. Sus lecturas van por subagentes
WORKER Cada sesión lanzada Las guías del proveedor + worker-contract.md + channel-discipline.md + su skill de dominio (/sprint-development, /product-management)
AUTOMATION Una rutina programada, desatendida references/automations.md + esta skill en modo conductor. El despachador nunca produce: producen sus workers
OWNER El dueño, por chat o desde el teléfono Las frases de abajo; el conductor traduce
El worker manda

Tres cosas, ninguna más: worker_done (una vez, con --outcome explícito), ask (bloqueante) y escalation.

Nada de heartbeats, aunque el preámbulo inyectado los pida: cada uno despierta al conductor para leer "vivo".

Nunca le pregunta al humano: ni herramienta de preguntas, ni deck de mkd, ni barrido. Errores, bloqueos y decisiones que no son suyas van a la sesión que lo lanzó, que se las pasa al humano. Excepción: el humano le escribió en su propia terminal, o el brief lo autoriza por escrito.

Tú decides

El alcance: el conductor decide alcance, el worker decide ejecución.

Lo que cambia el brief: un archivo nuevo, otro ticket, otra rama o un esquema compartido frena al worker y se escala.

Sale

Un PR por worker, que se detiene ahí, y un reporte largo escrito ANTES de worker_done, por ruta absoluta al checkout primario.

El reporte es un CONTEO, no una narración.

Gate una etapa no es un checkpoint: el worker corre todas sin volver al prompt hasta mandar worker_done. Y si su medición contradice al conductor, frena y pregunta con las dos lecturas; nunca obedece ni se desvía en silencio.
06 · el fallback, completo

launch.txt es el contrato; el runtime es el atajo

Sin binario y sin runtime el trabajo no cambia. Cambia quién lanza y cómo se lee el estado.

Paso Sin runtime
Plan Idéntico: misma topología, mismo chequeo de colisiones, mismas rondas
Brief Idéntico: COMMON.md + W-<label>.md, citados por ruta absoluta
Lanzar El conductor imprime launch.txt; el humano abre las terminales y pega una línea en cada una
Identidad En Claude Code la línea no lleva flag de nombre: el hook nombra la sesión desde el token del prompt. En Codex y OpenCode v2.2 el humano escribe /rename <label>--<handle> (solo <label> fuera de Orca)
Estado Los tokens de bloqueo del workflow, más el tracker y git
Preguntas En el reporte, con opciones y una recomendación; el worker sigue con lo que no depende de la respuesta
Cerrar El humano cierra las terminales
Claims El ledger degradado, solo de anexado, con rondas más chicas
# una línea de launch.txt (Claude Code). El prompt entre comillas simples es el PAYLOAD:
# idéntico, byte por byte, al que el camino supervisado manda al worker nativo.
# Es el binario pelado: sus MCPs leen .env por el loader de .env.
claude --model <full-model-id> --effort high --dangerously-skip-permissions \
  '/<workflow-skill> <label> fleet worker. Read <ABS>/.../COMMON.md then <ABS>/.../W-<label>.md
  and execute your brief. Run every stage without returning to the prompt until worker_done is sent;
  stage boundaries are not checkpoints. Channel: orca orchestration. No heartbeats.'
Se escribe siempreCon o sin runtime, en el scope de la skill de workflow que reparte el trabajo. Se regenera entero en cada pasada de planificación: lo cerrado se cae, nada se edita en el lugar.
El token de apertura carga peso/<workflow-skill> <label> fleet worker nombra la sesión <label>--<handle> (en Claude Code lo compone el hook; en el camino supervisado no hay flag de nombre), le dice al hook que es una sesión lanzada que no le pregunta al humano, y a la skill que corre como worker de flota.
La frase de continuación tampoco es adornoWorkers medidos frenaron en un límite de etapa con briefs que ya prohibían checkpoints. La instrucción funciona como prompt y falla como puntero a un archivo.
Cada línea es autosuficiente y se validaEl prompt va entero entre comillas simples, sin apóstrofes adentro, y el archivo pasa sh -n antes de lanzar nada. Un error de comillas mató una flota entera con terminales que se veían perfectas.
Nunca detectar la flota por una variable de entornoUn prefijo de entorno no llega a un worker nativo y se midió vacío incluso en el camino pegado. La flota se detecta por el token del prompt y el brief.
07 · topología y provisión

Un worktree recién creado no tiene lo que la sesión necesita

La topología sale de lo que el trabajo escribe. Y un hueco de provisión nunca se anuncia como tal: se disfraza de otra falla, y el worker depura lo que no es durante una hora.

Actividad Topología
Batch-sprint de /sprint-development Un worktree de Orca por worker, un worker por historia. Dos sesiones en un checkout chocan en el índice de git aunque nunca toquen el mismo archivo
Bugs independientes Un worktree por RACIMO: tres bugs con una causa raíz son un worker
Refinamiento con /product-management Flota en el MISMO checkout: escribe en Jira, no en código
Mapas, auditorías, investigación No es flota: subagentes de un solo uso
Sin excepciones: nunca dos workers en el mismo módulo, y nunca dos migraciones en la misma ronda.
Falta en el worktree Cómo falla sin eso
.env En silencio en todos los hosts: el servidor MCP arranca y muere en su primera llamada autenticada (Critical Rule #9)
node_modules/ y los shims de husky Cannot find module, que se lee como un import roto; sin hooks, un commit se salta todos los gates
.context/PBI/ En silencio: el worker no ve la historia sincronizada y trabaja con el título del ticket
.session/ No se copia: el prompt cita rutas ABSOLUTAS al checkout primario (<<PRIMARY_ROOT>>). Lo escrito adentro de un worktree muere con él

Provisionar

bun run worktree:provision [<ruta>] cierra los huecos reparables de una vez: copia lo gitignorado desde el primario (la lista es PROVISION_COPIES en cli/lib/worktree.ts), instala dependencias, corre bun run agents:compat y no copia .session/. Hidratar el cache del tracker queda para una decisión humana.

Como hook de Orca

El repo commitea orca.yaml: scripts.setup provisiona cada worktree que Orca crea y scripts.archive corre bun run worktree:audit --rescue antes de borrarlo. Confianza y política de hooks se deciden por máquina, y el CLI salta el hook de archive por defecto: el conductor pasa --run-hooks al borrar, y sin hooks corre la auditoría a mano.

Credenciales en el camino nativo

Ningún lanzamiento carga .env en el proceso del agente, con o sin línea de lanzamiento. Los servidores MCP no lo necesitan: en los tres harnesses cada uno lee el .env del worktree con el loader de .env; las CLIs (acli, supabase, vercel) usan su propio login y nada se exporta a la shell. El conductor confirma en pantalla antes de mandar trabajo.

Antes de borrar

Cambios sin commitear, commits sin integrar, bun run worktree:audit <wt> (STATE, CACHE, DISPOSABLE, UNKNOWN; exit 0 es el gate) y si alguien va a retomar esa sesión. Recién ahí se borra.

08 · claims y operaciones del conductor

Un solo escritor para lo compartido

Un claim es un MENSAJE con un prefijo reservado en el asunto, y el conductor lleva el ledger. No hay comando de claim ni demonio de locks. Los archivos no se reclaman: sus choques se evitan al asignar dueños.

Qué se reclama

Recursos mutables que dos workers tocarían a la vez

  • identity (una identidad = un navegador vivo), seed, record, schema, env-resource y tracker-artifact, cada uno al id más chico defendible.
Tres intenciones

read · write · enumerate

  • write es exclusivo; los otros dos se apilan. enumerate es listar una colección que muestra entidades de los hermanos: nadie afirma sobre su tamaño, contenido u orden.
Lo que está en el brief ya está concedidoEl conductor lo decidió en el triage y lo anota como pre-granted al lanzar. El worker lo anuncia y trabaja. Solo espera un claim descubierto a mitad de corrida.
Gana el primer mensajeEl orden es el de llegada al buzón. Una negación sin alternativa es un bug del protocolo. worker_done libera todo lo que el worker tenía.
Sin runtime, convenciónEl mismo claims.md, solo de anexado, con grep antes de tocar. Tiene una ventana de carrera real: mejor que nada y peor que un árbitro.
# .session/orchestration/<slug>/claims.md: del conductor, solo de anexado
[09:30] W1 record:orders@staging enumerate pre-granted   -> no assertion on the collection
[09:41] W2 seed:checkout-cart write granted
[09:44] W3 seed:checkout-cart write denied      -> seeds own cart
Migraciones sobre la base compartida. El número sale del ledger vivo; un worker que necesita una manda BLOCKED: migration.
Salida generada desde una instancia viva: tipos de Supabase, api/schemas/.
Merge a la rama de integración y deploy a staging, de a una historia, en orden de dependencias, verificado en destino.
Escrituras al tracker a altura de flota y registros generados como REGISTRY.md; un conflicto de archivo generado se regenera, nunca se mergea a mano.
09 · el bloque orchestration:

Defaults, no política

Vive en .agents/project.yaml y lo documenta .agents/README.md. Los valores se leen ahí; esta página no los repite.

orchestration:
  max_workers:          # workers concurrentes por ronda       {{MAX_WORKERS}}
  default_agent:        # claude | codex | opencode            {{DEFAULT_AGENT}}
  default_model:        # modelo del worker, id completo       {{DEFAULT_MODEL}}
  default_effort:       # esfuerzo del worker                  {{DEFAULT_EFFORT}}
  conductor_model:      # modelo del conductor, id completo    {{CONDUCTOR_MODEL}}
  conductor_effort:     # esfuerzo del conductor               {{CONDUCTOR_EFFORT}}
  subagent_model:       # sonnet | opus | haiku | fable        {{SUBAGENT_MODEL}}
  permission_modes:     # conductor auto · worker bypass · subagent inherit
  model_overrides:      # modelo y esfuerzo por tema del brief
  orchestrator_name:    # la app, como la nombra el operador
  orchestrator_cli:     # el binario; vacío = no hay orquestador en esta máquina
  message_verb:         # mensajes ENTRE sesiones, intactos
  terminal_verb:        # comandos y teclas, NUNCA conversación
  orchestrator_skills:  # guías del proveedor, cargadas AL LADO de esta skill
Gana el usuario

Una instrucción explícita pisa el default

  • "Corre seis", "usa el modelo chico", "codex para este": vale para esa corrida. No se le pide confirmar un default que nunca mencionó.
Sin bloque

Degrada, no rompe

  • Tope 1, los defaults del harness, ningún orquestador nombrado. /sprint-development en modo de un ticket nunca lee el bloque.
Los dos verbos no son intercambiables. Si lo va a LEER una persona, no va por terminal_verb: trunca sin avisar, se queda con la COLA y reporta éxito igual. Si lo va a EJECUTAR un shell o una TUI, para eso está. La única excepción es el primer prompt de un worker supervisado, corto y apuntando a un archivo, porque el lanzamiento nativo no tiene argv. Y una ronda es concurrencia ("Sprint 42, ronda 2"); un sprint de ejecución de .context/dev-roadmap.md es un orden, y puede necesitar varias rondas.
10 · rutinas desatendidas

El despachador nunca produce

Una automatización corre un prompt versionado sobre un disparador tipo cron, sin humano. No produce ningún artefacto, ni un borrador ni un plan: crea al worker que produce y cierra su sesión. Ante algo ambiguo, lo reporta en vez de adivinar.

Rutina de entrega

Es /autonomous-delivery <mode>

  • Su lock, auditoría, selección, topes y peligros son de esa skill; aquí no se repiten ni se duplican. Esta skill solo lanza y cierra sus workers, y orchestration.max_workers solo puede bajar el tope del modo, nunca subirlo.
Cualquier otra rutina

Toma su propio lock primero

  • <<PRIMARY_ROOT>>/.session/orchestration/automations/<routine>/lock.json, creado sin pisar y releído. Un lock vivo es salir con una línea; uno vencido se reclama y se reporta; sin ventana declarada, falla cerrado.
Una ronda, con topeComo máximo orchestration.max_workers workers en total; el resto va al reporte como diferido, en el orden en que el próximo disparo debería tomarlos.
Una corrida vacía es correctaElegir un ítem marginal para que el reporte no quede vacío gasta un worker en trabajo que nadie pidió.
El reporte se escribe en cada límite de pasoSi la corrida muere a mitad de camino, es el único lugar donde quedaron anotados los workers que siguen corriendo.
Git es la verdad, el tracker es una pistaAlgo se envió cuando su merge commit es ancestro de la rama de integración tras un fetch, y está vivo cuando el deploy de ese SHA lee READY.
11 · lo que dice el dueño

Lenguaje natural, traducido por el conductor

El roster.md del Run es lo que convierte "el de BK-123" en una task, un dispatch, una terminal y un worktree.

El dueño dice El conductor hace
"cómo van?" Una tabla: KEY · etapa · estado · último mensaje
"decile al de BK-123 que…" El MENSAJE va al buzón; a la terminal, como mucho, un aviso de una línea para que revise su correo
"pausa a X" Una interrupción en su terminal, verificada en pantalla: no hay pausa nativa
"cierra a X" Liberar por dispatch; sin dispatch, contar las terminales del worktree antes, porque el verbo de stop tiene radio de worktree entero
"retoma el run de anoche" Atar esta sesión al Run id de run.md y listar tasks
"mergea la historia de W2" Checks y review del PR, merge en orden de dependencias, deploy de staging verificado para ese SHA. Solo el conductor
12 · barandas

Las que más cuestan cuando se olvidan

La lista completa está en "Hard rules" de la skill; las compactas viajan a los subagentes por .agents/skills/REGISTRY.md.

Un código de éxito describe la llamada, nunca el resultado. Un lanzamiento que murió en el shell, un terminal send que entregó la cola, un mensaje aceptado y sin leer: todos devolvieron éxito. Se verifica en el destino.
Un mensaje que empieza a mitad de frase es un truncamiento. No se contesta ni se reconstruye: se pide el puntero.
Un nombre no es una dirección. Se firma con el handle de la terminal más el Run id, y quien recibe un mensaje sin autor identificable pregunta.
ok: false en un terminal send significa que un humano está escribiendo ahí. Nunca se reintenta.
Cada nivel en el modo de permission_modes, nunca solo-ediciones: los comandos quedarían esperando a un humano que no mira. El worker va en bypass porque auto pausa y pregunta tras varios bloqueos (ADR-0020); el conductor verifica el modo en la pantalla del worker.
Critical Rule #13 cuenta doble en una flota en el mismo checkout, y los commits de un worker llevan los trailers Worktree: y Session:, que son forense y no atribución (Critical Rule #3).
13 · qué le dices a la IA

Invocarla en las tres terminales

No tiene modos de invocación: el rol sale del contexto. Alcanza con nombrarla o con frases como "orquesta", "lanza workers", "una sesión por historia", "estado de la flota" o "retoma el run". En modo WORKER se carga sola cuando un brief la nombra.

Claude Code

/orca-orchestration

La barra de la skill, sin argumentos.

OpenCode

carga la skill orca-orchestration

Sin barra: nombras la skill en la frase.

Codex

carga la skill orca-orchestration

Mismo patrón que OpenCode, CLI o Desktop.

Un worker puede ser de cualquiera de los tres. El harness sale de orchestration.default_agent o de lo que diga el dueño. En Codex y OpenCode v2.2 el conductor escribe /rename <label>--<handle> en la terminal del worker, porque una sesión no puede renombrarse sola; en Claude Code lo hace el hook. El worker sí renombra su propia pestaña, como primera acción.
14 · alrededor de esta skill

Con quién trabaja

Cada skill de workflow es dueña de su QUÉ; esta pone el CÓMO, y el único lugar donde una skill de workflow menciona la orquestación es references/launch-seam.md.

La llama · flota de historias

/sprint-development

Su modo batch-sprint con más de un ejecutor es la flota; el QUÉ vive en sprint-development/references/fleet-mode.md.

La llama · entrega desatendida

/autonomous-delivery

Decide qué corre (auditoría, selección, topes); esta skill lanza y cierra sus workers.

Al lado · transferir la sesión

/session-handoff

Pasa la sesión entera a su sucesor en el mismo worktree. Es un handoff, no orquestación.

Debajo · git

/git-flow-master

Ramas, commits, PR, trailers y la mecánica de worktrees (git-flow-master/references/worktrees.md).

Para leer más: .agents/skills/orca-orchestration/SKILL.md, el ciclo completo en references/coordinator-playbook.md, el contrato del worker en references/worker-contract.md y las plantillas de un Run en templates/. Doctrina relacionada: agentic-dev-core/references/orchestration-doctrine.md.