Disparadores de delegación

Por: Artiko
odddelegacionsubagentesenrutamiento

Disparadores de delegación

Objetivos

  • Identificar cada disparador y su condición exacta.
  • Decidir cuándo un writer tiene un motivo válido.
  • Conocer la evolución de las reglas, para interpretar documentos antiguos del repositorio.

La regla general

Each trigger holds only when its condition truly holds, and only then is it mandatory, not advisory; no trigger holds by default, and when in doubt work inline.

internal/components/agentguidance/routing.go

Esta oración contiene tres afirmaciones:

  1. Un disparador existe solo cuando su condición se cumple de verdad.
  2. Cuando se cumple, es obligatorio. Se detiene y se delega antes de continuar.
  3. Ante la duda, se trabaja inline.

Una vez resuelto el disparador, se reevalúa el tamaño y la tarea sigue pequeña si mantiene los tres criterios.


El mapa de disparadores

flowchart TD
    A["Durante el trabajo"] --> B{"¿Decisión de producto abierta?"}
    B -->|"Sí"| B1["Ask: una pregunta y esperar"]
    A --> C{"¿Comprensión excede el presupuesto?"}
    C -->|"Sí"| C1["Mapping: un explorador"]
    A --> D{"¿Falla la prueba de reanudación?"}
    D -->|"Sí"| D1["Tracking: documento, espejo y commits"]
    A --> E{"¿Motivo de writer?"}
    E -->|"Sí"| E1["Writer: un worker por unidad"]
    A --> F{"¿La línea Risk nombra un punto?"}
    F -->|"Sí"| F1["Verification: verificador independiente"]
DisparadorCondiciónAcción
AskDecisión de producto o diseño abiertaUna pregunta enfocada, luego detenerse y esperar
MappingLa comprensión excede el presupuesto inline o necesita más de ~5 búsquedas secuencialesUn explorador de solo lectura antes de decidir o escribir
VerificationLa línea Risk nombra un punto de alto riesgoUn verificador independiente después de las comprobaciones propias
TrackingTarea grandeDocumento de feature, espejo y commits por unidad
WriterMotivo con nombre, ver abajoUn writer acotado por unidad
PreparationEl Writer trigger delega una escrituraLa lectura que la prepara se delega con ella o antes

El Writer trigger en detalle

Es el más restrictivo. Solo existen dos motivos:

Motivo (a): paralelismo

Se necesitan todas estas condiciones:

  • Dos o más unidades de comportamiento independientes.
  • Superficies de edición disjuntas.
  • Cada una requiere varios minutos de trabajo: varios archivos o aproximadamente más de 100 líneas cambiadas.
  • Se lanzan juntas.

La justificación es de costo: un subagente pasa uno o dos minutos leyendo antes de escribir.

Motivo (b): contexto

El backstop de sesión larga: el parent llegó cerca de ~150k tokens y entrega la siguiente unidad acotada a un worker fresco.

Qué no es un motivo

Situación¿Justifica un writer?Explicación
La tarea es grandeNoRecibe seguimiento, y el parent sigue inline con su bitácora
Muchos archivosNoEl número de archivos nunca activa este disparador
Un modelo más barato podría hacerloNoLa relación de precios está excluida
Separar pruebas, docs y códigoNoUna unidad lleva todo eso junto
Unidades de ~100 líneas o menosNoSiempre inline: escribirlas cuesta menos que arrancar workers
Varias tareas pequeñas independientesNoCorren inline, una tras otra
Una entrega que depende de otraNoLas unidades dependientes no son independientes

Qué es una unidad

Una unidad es una pieza de comportamiento independiente con su código, sus pruebas y su documentación. Nunca se divide un comportamiento en writers de pruebas, documentación y código.

flowchart LR
    subgraph N["Sin motivo"]
        N1["Writer de código"] --- N2["Writer de pruebas"] --- N3["Writer de docs"]
    end
    subgraph S["Con motivo"]
        S1["Unidad A<br/>código, pruebas y docs"]
        S2["Unidad B<br/>código, pruebas y docs"]
    end

Los cuatro motivos del README

El README agrupa el conjunto de delegaciones por motivo en una tabla:

MotivoCuándo aplica
ExplorationLa comprensión necesita más de una tanda inline o más de ~5 búsquedas secuenciales
Parallel writersDos o más unidades independientes con superficies disjuntas, cada una de varios minutos
Context backstopUna sesión larga entrega su siguiente unidad a un worker fresco
Independent verifierUn cambio que nombra un punto de alto riesgo

Route declaration

Para que la delegación sea observable, en trabajo grande se registra la ruta por tarea y la evidencia del disparador en el documento de feature.

- [x] T1 (S1-S5) inline · sin motivo de writer · RED→GREEN · 6c66491
- [x] T4 (S3) delegated · paralelismo con T5, superficies disjuntas · f58774f

La idea proviene de un problema real: cuando ODD no exigía declarar la ruta, omitir una delegación resultaba invisible.


Evolución de las reglas

Si exploras odd/tasks/ en el repositorio encontrarás reglas que parecen contradecir lo anterior. Son registros históricos.

timeline
    title Cómo cambió la delegación según las tareas del repositorio
    Delegación como descripción : El parent hacía todo inline : odd-mandatory-delegation detecta el problema
    Disparadores obligatorios : Regla de 4 archivos : Regla de 2 archivos no triviales
    Proporción de gasto : Una segunda edición mecánica no activa la regla : odd-spend-proportionality
    Tamaño de tarea : Comprensión, riesgo y reanudación : task-size-canon
    Delegar por un motivo : Writer solo por paralelismo o contexto : 1731-parity-delegate-for-reason
DocumentoQué regla registraEstado
odd-mandatory-delegation.mdDisparadores obligatorios, regla de archivos, declaración de rutaLa obligatoriedad y la declaración siguen. La regla de archivos, no
odd-spend-proportionality.mdDelegación por dos archivos no trivialesSustituida
task-size-canon.mdTamaño por comprensión, riesgo y reanudaciónVigente
1731-parity-delegate-for-reason.mdWriter por motivo, y verificar siempre el código de modelos menoresLa primera sigue, la segunda se eliminó del texto actual

El último caso ilustra por qué se debe leer el texto instalado. La especificación S8 de 1731 mencionaba verificación “always on smaller-model code”, mientras que el texto vigente dice que el modelo o esfuerzo del writer nunca agrega un verificador. La bitácora histórica registra lo que se decidió entonces.


Los números detrás de la decisión

El README atribuye estas reglas a mediciones, no a la intuición. En una corrida de un bug de tres líneas, pasar a inline sin subagentes bajó de 335 s a 77 s y de 56 a 10 turnos. El capítulo 22 analiza esa tabla y sus límites: cada celda es una sola ejecución.


Actividad

Para cada caso, decide si hay motivo de writer:

  1. Tres arreglos independientes de 20 líneas cada uno.
  2. Dos servicios sin relación, cada uno con unas 200 líneas y sus pruebas, en carpetas distintas.
  3. Una funcionalidad de 800 líneas en un módulo, sin paralelismo.
  4. Una API y un cliente que depende de esa API.
Una posible solución
  1. No. Unidades de ~100 líneas o menos corren inline, una tras otra.
  2. Sí, por paralelismo: independientes, disjuntas y de varios minutos, siempre que se lancen juntas.
  3. No por tamaño. Se registra si falla la prueba de reanudación y sigue inline, salvo que aparezca el backstop de contexto.
  4. No. Una entrega que depende de otra no es independiente.

Autoevaluación

  1. ¿Qué afirma la fuente sobre seguir inline después de activarse un disparador?

    • A. Es aceptable si el trabajo sale bien
    • B. Es un defecto de enrutamiento aunque tenga éxito
    • C. Es la conducta recomendada para ahorrar tokens
    • D. Solo importa en tareas grandes
  2. ¿Cuáles son los dos motivos válidos para un writer?

    • A. Tamaño y número de archivos
    • B. Riesgo y costo del modelo
    • C. Paralelismo y backstop de contexto
    • D. Tareas grandes y pruebas largas
  3. ¿Cuál es el motivo de excluir unidades de ~100 líneas o menos?

    • A. Las pruebas no se pueden delegar
    • B. No caben en un prompt
    • C. Lo exige el proveedor
    • D. Escribirlas cuesta menos que arrancar workers
  4. ¿Para qué sirve Route declaration?

    • A. Para que una delegación omitida sea observable
    • B. Para que el binario bloquee la tarea
    • C. Para calcular la tarifa
    • D. Para activar RDD
Respuestas
  1. B. “Executing past a fired trigger inline is a routing defect even if the work succeeds.”
  2. C. Son los motivos (a) y (b).
  3. D. Es la explicación del texto.
  4. A. “So skipped delegation is observable instead of silent.”

Lista de control

  • Puedo nombrar los seis disparadores y su condición.
  • Aplico las cuatro condiciones del paralelismo.
  • Mantengo código, pruebas y documentación en la misma unidad.
  • Sé que los documentos de odd/tasks/ son historia, no el texto vigente.

Fuentes

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