turn-eta — di cuándo terminará este turno y aprende de lo que tomó
Antes de que comience el trabajo, escribe los pasos como una lista numerada y di cuándo terminará. Cronometra cada paso a medida que se completa. Cuando finalice el turno, cierra la respuesta con la hora real de finalización. La siguiente estimación leerá ese registro.
Cuándo se ejecuta
Cada turno que contenga trabajo real — editar un archivo, ejecutar un comando, buscar en el código.
- Hay trabajo en el turno → llama a
planantes de empezar y abre tu respuesta con lo que imprime, en el orden en que lo imprime: la línea**ETA …**primero, sola, luego los pasos numerados. La hora de finalización es lo que el lector busca; los pasos debajo son el razonamiento detrás. Llama astep <id>a medida que cada paso se completa, ydone <id>cuando el trabajo del turno esté terminado. - El último párrafo también es una hora, y depende de si algo sigue ejecutándose.
- Todo terminó antes de que escribas la respuesta → el bloque completo que
doneimprime: la línea de finalización dedone. Para entonces la ETA ha expirado; reimprimirla le entrega al lector una estimación que el reloj ya desmintió, mientras que los tiempos por paso muestran dónde falló. - Algo sigue ejecutándose (un trabajo en segundo plano, una tarea delegada) → el pronóstico:
**ETA 17:45**. Vuelve a calcularlo mientras escribes, nunca pegues el número queplanimprimió antes.
- Todo terminó antes de que escribas la respuesta → el bloque completo que
- Turno solo de conversación (responder una pregunta, decidir qué construir) → no hagas nada. Es ruido.
- Una corrección de una línea no vale la ceremonia. Úsalo cuando haya más de un paso.
Comandos
Node puro, sin instalación. Ejecútalo desde donde esté instalado el skill.
# antes del trabajo — nombra los pasos y obtén una ETA
node <skill>/scripts/eta.js plan \
"reproducir el fallo" "corregir el analizador de fechas" "actualizar los fixtures" "volver a ejecutar la suite" \
--provider anthropic --model claude-opus-5 --size M
# **ETA 17:45** (14 min)
#
# 1. reproducir el fallo
# 2. corregir el analizador de fechas
# 3. actualizar los fixtures
# 4. volver a ejecutar la suite
#
# 4 pasos, ~14 min (3.5 min/paso de anthropic/claude-opus-5 M, 6 turnos)
#
# (las últimas 6 estimaciones fueron 3 min más largas)
# turn id: 48i35qek
# cada vez que se completa un paso — medido y el resto se vuelve a pronosticar según el ritmo medido
node <skill>/scripts/eta.js step 48i35qek
# 2/4 corregir el analizador de fechas — 8m 06s
#
# **ETA 17:49** (4 min después)
# cuando el trabajo del turno está terminado
node <skill>/scripts/eta.js done 48i35qek
# **FINALIZADO 17:48** (estimado 14 min / real 17 min)
# lo que dice el registro ahora mismo
node <skill>/scripts/eta.js stats
Nombra los pasos, no solo los cuentes. plan rechaza un número desnudo. Un conteo que nadie puede verificar no es un plan — los pasos nombrados permiten que la persona que lee diga "salta el 3" antes de empezar. Pon esa lista numerada al inicio de tu respuesta, luego haz el trabajo.
Debes pasar tu propio --provider y --model. Un shell no puede ver qué modelo lo está impulsando. Usa los identificadores que te conoces a ti mismo — --provider anthropic --model claude-opus-5, --provider openai --model gpt-5-codex, --provider google --model gemini-3-pro. Si falta algo, cae bajo unknown/unknown, que sigue funcionando pero agrupa todos los modelos juntos.
--size es S (corrección pequeña), M (normal, por defecto), o L (gran bloque). Aproximado está bien; solo evita que los turnos pequeños arrastren el promedio de los grandes.
El id del turno es obligatorio. plan imprime uno; llévalo a través de cada step y el done final — step 48i35qek, done 48i35qek. Otro agente trabajando en el mismo proyecto escribe en el mismo registro, por lo que una llamada sin id solía cerrar cualquier turno que estuviera abierto — el de otro. step y done ahora lo rechazan sin él. Un turno que nadie ha tocado durante cuatro horas se considera abandonado.
Dónde vive el registro
<raíz del proyecto>/.eta/<provider>/<model>/log.tsv
Dentro del proyecto, para que un agente cuyos permisos se limitan a su directorio de trabajo pueda leer su propio historial. La raíz del proyecto es el .git más cercano hacia arriba, de lo contrario el directorio actual. El proveedor y el modelo son carpetas, para que el ritmo de un modelo nunca se convierta silenciosamente en el de otro.
Añade .eta/ a .gitignore. Es una medición de tu máquina en tus turnos; no significa nada para nadie más y cambia en cada turno.
Establece TURN_ETA_DIR en otro directorio .eta para compartir el historial entre proyectos. Solo se consulta cuando el registro local es demasiado escaso para decir algo.
Cómo mejora la estimación
done registra la estimación, el real y los tiempos por paso. plan los lee y toma la mediana de minutos por paso, caminando desde la coincidencia más específica hacia afuera y deteniéndose en el primer escalón con al menos 3 turnos terminados:
- este proveedor + modelo + mismo tamaño
- este proveedor + modelo
- este proveedor, cualquier modelo
- todo en el
.etade este proyecto - el registro compartido en
TURN_ETA_DIR, mismo orden - de lo contrario 4 minutos por paso
Mediana en lugar de media, para que un turno que se alargó no arrastre todas las estimaciones futuras. Solo cuentan los últimos 20 turnos por escalón. plan imprime qué escalón usó, para que el número nunca sea un misterio.
A mitad del turno, step combina ese historial con el ritmo que este turno está llevando realmente, ponderado por cuánto del turno está hecho: en el paso 1 de 4 el historial aún pesa tres cuartos, para el paso 3 este turno pesa tres cuartos. Un primer paso lento mueve la hora de finalización sin secuestrarla.