Paso 4: Tamaño de tarea y riesgo

Por: Artiko
oddprotocolotamano-de-tareariesgo

Paso 4: Tamaño de tarea y riesgo

Objetivos

  • Aplicar los tres criterios de tarea pequeña y la prueba de reanudación.
  • Enumerar los seis puntos de alto riesgo y sus exclusiones.
  • Escribir una línea Risk correcta.
  • Separar las tres decisiones que suelen mezclarse: documento, escritor y verificador.

Este capítulo es el más importante del curso. Casi todas las demás reglas dependen de lo que se decide aquí.


Tarea pequeña: tres condiciones

Una tarea es pequeña cuando se cumplen las tres:

#CriterioCómo se comprueba
1ComprendidaEl resultado está especificado, se sabe qué y dónde cambiar, y no hay decisión de producto o diseño abierta. Se demuestra con una tanda de lectura: hasta 3 llamadas y unos 10k tokens
2Riesgo contenidoNo toca ningún punto de alto riesgo
3Reanudable desde el diffSi la sesión se detuviera ahora, alguien podría terminar el trabajo con el pedido original y git diff

La prueba de reanudación

El tercer criterio tiene nombre propio y decide el documento de feature. Una tarea es grande únicamente cuando falla, cosa que la fuente asocia a estos casos:

  • Varias sesiones de trabajo.
  • Espera de algo externo.
  • Entregables separados que quieres mantener aparte. Esto no incluye varias funcionalidades pedidas a la vez.
  • Requisitos demasiado largos para sobrevivir a una compactación del contexto.

The number of files, commands or tests, fixes, or a requested todo list never decides size.

internal/components/agentguidance/routing.go

La documentación usa “large” y “substantial” como sinónimos: las reglas de enrutamiento dicen large, y la guía de uso prefiere substantial.

Contraejemplos útiles

SituaciónClasificaciónMotivo
Renombrar un campo en 30 archivos con un patrón claroPequeñaSe comprende y el diff lo explica todo
”Hazme una lista de tareas y arregla estos 5 bugs”Por sí mismo no es grandeUna lista pedida y un número de arreglos no deciden el tamaño
Tres funcionalidades distintas pedidas juntasPor sí mismo no es grande”Nunca varias funcionalidades pedidas a la vez”
Integración que espera credenciales de un proveedorGrandeDepende de algo externo
Especificación de 80 líneas con mensajes exactosGrandeLos requisitos no sobreviven a una compactación
Un cambio con 2 sesiones previstasGrandeFalla la prueba de reanudación

El camino pequeño

Cuando la tarea es pequeña, el camino es breve:

  • Trabajo inline, incluidos varios archivos de un mismo cambio comprendido.
  • Se observa RED inline antes del arreglo.
  • La prueba enfocada y la suite corren inline, una vez cada una.
  • Sin explorador, worker ni verificador.
  • Sin documento de feature, espejo ni commits, salvo que los pidas.
  • La lista de tareas es opcional.

Alto riesgo: los seis puntos

La definición general dice que un error sería difícil de detectar, difícil de deshacer o llegaría más allá del cambio. La lista es cerrada y numerada porque otras herramientas la citan por número.

#PuntoIncluyeNo incluye
1Datos o efectos irreversiblesMigraciones, cambiar o borrar datos almacenados, cambios de formato persistidoGuardar registros nuevos, una base de desarrollo o pruebas que un seed o backup reconstruye
2SeguridadAutenticación, permisos, credenciales, secretos, guardas, sandbox
3Contratos que otros consumenCambiar o eliminar API pública, flags de CLI, formatos de configuración, exports publicados, prompts o contratos espejadosAgregar un flag, comando o campo opcional. Los cambios pedidos no son de alto riesgo por sí mismos, pero las roturas no pedidas en código compartido sí lo son
4ConcurrenciaLocks, condiciones de carrera, orden asíncrono
5Entrega o entornoInstaladores, release, CI, deploy, dependencias
6Sin prueba que atrape una regresiónLo que cambia no tiene ninguna prueba capaz de detectarlo

”No está claro” no es alto riesgo por defecto

“Unclear” cuenta como alto riesgo solo cuando una mirada acotada no puede determinar si aplican los puntos del 1 al 5. La regla existe porque tratar toda duda como riesgo alto activaría verificadores sin motivo.


La línea Risk

Todo cambio de código, pequeño o delegado, cierra con una línea en uno de estos formatos:

Risk: item 3 (cambia el formato de salida de --json, que consumen otros scripts)
Risk: none

Cualquier punto citado activa el disparador de verificación. Antes de escribir Risk: none hay una comprobación concreta:

Check whether the diff changes code that existing behavior the request did not mention also uses (shared options, parsers, helpers); if it does, that is item 3.

internal/components/agentguidance/routing.go

Es decir, si tocaste un parser compartido para agregar una opción a un comando, debes preguntarte qué le pasó a los otros comandos que lo usan.

flowchart TD
    A["Terminé el cambio"] --> B{"¿Toca alguno de los puntos 1 al 6?"}
    B -->|"Sí"| C["Risk: item N (motivo)"]
    B -->|"No lo parece"| D{"¿Cambia código compartido por<br/>comportamiento que el pedido no menciona?"}
    D -->|"Sí"| E["Risk: item 3 (motivo)"]
    D -->|"No"| F["Risk: none"]
    C --> G["Verificador independiente<br/>tras las comprobaciones propias"]
    E --> G

Tres decisiones independientes

Este es el punto que más confusión genera. Tamaño, escritor y verificador se deciden por separado, cada uno con su propio disparador.

DecisiónDepende deConsecuencia
¿Hay documento de feature?Solo la prueba de reanudaciónDocumento, espejo y commits
¿Hay worker?Solo el Writer triggerDelegación de la escritura
¿Hay verificador independiente?Solo un punto de alto riesgo nombradoVerificación extra

docs/trigger-rules.md lo deja claro: el alto riesgo saca a una tarea del camino pequeño, pero el documento de feature sigue dependiendo únicamente de que falle la prueba de reanudación.

Eso produce combinaciones que al principio sorprenden:

flowchart LR
    subgraph A["Cambio de 2 líneas en login"]
        A1["Reanudable: sin documento"]
        A2["Sin motivo de writer: inline"]
        A3["Punto 2: con verificador"]
    end
    subgraph B["Refactor de varias sesiones sin riesgo"]
        B1["No reanudable: con documento"]
        B2["Sin motivo de writer: inline"]
        B3["Sin punto de riesgo: sin verificador"]
    end
    subgraph C["Dos módulos independientes grandes"]
        C1["Según reanudación"]
        C2["Unidades paralelas: con writers"]
        C3["Según punto de riesgo"]
    end

Reevaluar

Cuando un mecanismo termina, se vuelve a evaluar el tamaño. Una tarea que parecía incierta puede pasar a pequeña después de recibir el mapa de un explorador, y sigue siendo pequeña mientras se mantengan los tres criterios.


Tres números que no se deben mezclar

NúmeroQué esQué no es
~400 líneas por tareaHeurística de planificaciónCriterio de tamaño, tope o disparador
~400 líneas acumuladasPresupuesto de entrega de la rama, capítulo 15Criterio para decidir si una tarea es grande
Presupuesto del revisorLímite de lo que cabe en el prompt de RDDIndicador de riesgo

Actividad

Clasifica cada caso con tamaño, ruta y línea Risk:

  1. Corregir un typo en un mensaje de error que un script externo analiza.
  2. Agregar un flag nuevo y opcional a un comando, tocando el parser compartido por 5 comandos.
  3. Migrar una columna en producción, con un script de 40 líneas.
  4. Traducir toda la documentación del proyecto en varias sesiones.
Una posible solución
  1. Aplica el punto 3, porque otro consumidor analiza el mensaje, así que no cumple el criterio de riesgo contenido. Como sigue siendo reanudable, no lleva documento. Inline con verificador.
  2. Agregar el flag no es alto riesgo. Pero el parser es compartido: si el cambio afecta a los otros comandos, aplica el punto 3. La línea depende de la comprobación diferencial del capítulo 8.
  3. Punto 1. El documento depende de la reanudación, y 40 líneas pueden no necesitarlo. Verificador obligatorio.
  4. Grande por varias sesiones. Risk: none si es documentación sin efectos ejecutables. Inline, salvo que existan unidades paralelas con motivo.

Autoevaluación

  1. ¿Qué decide que una tarea sea grande?

    • A. Que toque más de 400 líneas
    • B. Que se hayan pedido varias funcionalidades a la vez
    • C. Que toque más de cinco archivos
    • D. Que falle la prueba de reanudación
  2. Agregar un flag opcional nuevo a una CLI, sin alterar lo existente, ¿es punto 3?

    • A. No: agregar un flag está excluido
    • B. Sí, siempre
    • C. Solo si supera las 100 líneas
    • D. Solo si RDD está activo
  3. ¿Cuál es la excepción dentro del punto 1?

    • A. Las migraciones en staging
    • B. Cualquier formato persistido
    • C. Guardar registros nuevos o una base que un seed reconstruye
    • D. Los cambios de esquema pedidos por el usuario
  4. Un cambio de dos líneas en autenticación, reanudable desde el diff, recibe:

    • A. Documento de feature y worker
    • B. Sin documento, y verificador independiente por el punto 2
    • C. Documento de feature sin verificador
    • D. Ningún control, porque es pequeño en líneas
Respuestas
  1. D. Los demás criterios están descartados expresamente.
  2. A. La exclusión del punto 3 lo menciona, siempre que no rompa código compartido sin pedirlo.
  3. C. Es la aclaración entre paréntesis del punto 1.
  4. B. El documento depende de la reanudación, y el verificador del punto de riesgo.

Lista de control

  • Aplico los tres criterios sin mirar el número de archivos.
  • Recuerdo los seis puntos y sus exclusiones.
  • Hago la comprobación de código compartido antes de escribir Risk: none.
  • Decido documento, escritor y verificador por separado.

Fuentes

internal/components/agentguidance/routing.go, docs/trigger-rules.md, odd/tasks/task-size-canon.md, odd/tasks/1731-parity-delegate-for-reason.md.