Verificación por riesgo

Por: Artiko
oddverificacionriesgocalidad

Verificación por riesgo

Objetivos

  • Aplicar la verificación que corresponde a cada nivel.
  • Saber qué activa un verificador independiente y qué no.
  • Preparar el traspaso a un verificador.
  • Clasificar un hallazgo como bloqueo o aviso.

Los tres niveles

La verificación de un writer delegado sigue la misma regla con RDD activo o inactivo. El nivel se juzga por lo que toca el cambio:

NivelQué tocaQué se hace
PassiveDocumentación, imágenes o comentarios sin efecto ejecutableLectura estructural
MediumUn cambio de comportamiento ordinario con pruebas enfocadasAutoverificación del writer
HighUn punto de la lista de alto riesgo, nombradoAutoverificación más un verificador independiente
flowchart TD
    A["Termina un cambio"] --> B{"¿Solo docs, imágenes<br/>o comentarios pasivos?"}
    B -->|"Sí"| C["Lectura estructural"]
    B -->|"No"| D["El writer ejecuta ## Verification<br/>y reporta comando y resultado"]
    D --> E{"¿Se nombra un punto de alto riesgo?"}
    E -->|"Sí"| F["Verificador independiente"]
    E -->|"No"| G["La autoverificación es suficiente"]
    C --> H["Comprobación del parent:<br/>reejecutar un comando"]
    F --> H
    G --> H

En todos los niveles

La comprobación del parent se mantiene siempre: volver a ejecutar un comando informado antes de entregar.


El verificador corre lo menos posible

La regla central es estrecha. El verificador independiente corre cuando, y solo cuando, el cambio toca un punto de alto riesgo y el parent lo nombra.

Situación¿Agrega verificador?
El cambio toca un punto de alto riesgo nombradoSí
El cambio es muy grandeNo
El nivel nativo dice high sin punto nombradoNo: solo informa, y el parent nombra el punto si aplica
La evaluación falló o es desconocidaNo
El cambio no está claroNo, hasta que el parent nombre el punto que aplica
Lo escribió un modelo pequeñoNo

Con la CLI, nombrar el punto se hace así:

gentle-ai review assess --cwd <repo> --agent <runtime> --json \
  --escalate-item 2 --escalate-reason "cambia la validación del token de sesión"

Cuándo corre: al final o por unidad

Cuando se escribieron inline varias entregas de una feature, corre un verificador al final de la feature, no uno por entrega. Se verifica por unidad solo si esa unidad nombra un punto de alto riesgo, ya sea en su línea Risk o en el escalamiento sobre su diff real.


Los límites de corrección

flowchart LR
    A["Bloqueos del verificador"] --> B["Un lote que corrige<br/>todos los bloqueos"]
    B --> C["Una recomprobación<br/>limitada a esos bloqueos"]
    C --> D{"¿El mismo bloqueo sigue fallando?"}
    D -->|"No"| E["Listo"]
    D -->|"Sí"| F["Una segunda corrección"]
    F --> G{"¿Sigue abierto?"}
    G -->|"No"| E
    G -->|"Sí"| H["Un resultado<br/>Needs your decision"]
  • La recomprobación no es un barrido nuevo.
  • Un hallazgo nuevo no da derecho a una segunda corrección.
  • La autorrevisión de un writer sigue el mismo límite, y luego informa partial.

Preparar a un verificador

El traspaso es una lista exacta:

  • El documento de feature completo, con todas las S# y no una sola tarea.
  • El commit base.
  • Las formas de los comandos de sondeo.

Si no hay documento de feature, se pasa el pedido textual.

Sondas derivadas de la especificación

El contrato del verificador de OpenCode empieza con una frase que resume su actitud: verificar el pedido, no el trabajo del writer. Las pruebas y ejemplos del writer no son evidencia de corrección, porque una prueba del writer puede fijar un defecto.

Debe cubrir:

#ElementoQué hace
1Sondas propiasDeriva ejemplos positivos, casos negativos y límites a partir del pedido textual y de cada regla numerada
2InvariantesLos datos quedan idénticos byte a byte tras un comando rechazado, comprobado con hash. Los comandos previos dan la misma salida que en la base
3InteraccionesLos datos nuevos fluyen por reportes, totales y exportaciones existentes
4Build y alcanceCorre el chequeo de tipos o el build si existe, y marca lo que está fuera del pedido
5Todos los elementosUn veredicto por cada S#: cumplida, no cumplida o no implementada. Lo no verificado cuenta como no cumplido
6Sondas duraderasDevuelve las sondas como pruebas listas para commit, que el writer incorpora. El verificador nunca las escribe

Dónde corren las sondas

En el primer lanzamiento, sin esperar otra autorización, dentro de una copia nueva creada con mktemp -d bajo el directorio temporal del sistema. Nunca dentro del espacio de trabajo, donde no debe dejar archivos nuevos.

Los ejemplos de la especificación que mutan datos corren solo sobre estado aislado. Los ejemplos autorizados por el parent son los únicos comandos del espacio de trabajo además de esas sondas.


Severidad

flowchart TD
    A["Hallazgo"] --> B{"¿Silencia una opción explícita con éxito,<br/>o cambia salida existente sin pedirlo?"}
    B -->|"Sí"| C["Bloqueo, siempre"]
    B -->|"No"| D{"¿Se reproduce con entrada realista?"}
    D -->|"No, valor fuera de dominio"| E["Aviso"]
    D -->|"Sí"| F{"¿Ya se reproducía en la base?"}
    F -->|"Sí"| E
    F -->|"No"| C
HallazgoSeveridad
Defecto causado por el cambio, reproducido con entrada realistaBloqueo
Elemento de especificación sin cumplirBloqueo
Ignorar en silencio una opción explícita, devolviendo éxitoBloqueo, siempre
Cambiar salida existente que nadie pidió cambiarBloqueo, siempre
Defecto que ya existía en la baseAviso
Valor fuera de dominioAviso

El verificador debe reproducir un posible bloqueo en la base antes de llamarlo así.


El contrato de comprobación

Reglas complementarias que aplican a toda verificación:

  • Un documento o imagen pasivo no necesita un subagente semántico artificial.
  • El contenido activo, mixto, operativo, ejecutable o desconocido recibe verificación funcional.
  • Una comprobación rápida aplicable corre una vez.
  • El trabajo largo recibe una estimación de costo y efectos antes de lanzarse.
  • Un verificador no disponible se informa como no disponible: no se simula ni se reintenta sin fin.
  • El resultado de una comprobación nunca autoriza la entrega.

La forma reducida

Algunos runtimes no tienen subagentes, así que no hay writer ni verificador separados. El orquestador hace la acción y su propia verificación, y usa el nivel nativo:

NivelConducta
PassiveLectura estructural. No se ejecutan los comandos de ## Verification
Medium o highSe ejecutan esos comandos exactos, en primer plano, y se informa el resultado

Una evaluación fallida no significa lo mismo en todos los contextos

Aquí hay una diferencia que conviene tener presente:

ContextoSi review assess falla
Verificador independiente con delegación disponibleSolo informa. La autoverificación del writer se mantiene y no se agrega verificador
Forma reducida, sin delegaciónSe trata como high y se ejecutan los comandos de verificación
Preflight de revisión RDDNunca baja el nivel: el commit se trata como debido y se ejecuta el STATUS de preflight

En los tres se mantiene la misma regla: nunca se deduce riesgo bajo a partir de una evaluación fallida.


Actividad

Toma una función con persistencia en tu proyecto y escribe cuatro sondas para un cambio hipotético: un caso positivo, un límite, una entrada rechazada con comprobación de hash y un comando existente comparado con la base. Indica en qué copia temporal correrían.


Autoevaluación

  1. Un cambio de 1200 líneas de comportamiento ordinario sin puntos de alto riesgo recibe:

    • A. Un verificador por ser grande
    • B. Dos verificadores en paralelo
    • C. Autoverificación del writer, sin verificador
    • D. Solo lectura estructural
  2. Tras la recomprobación aparece un hallazgo nuevo. ¿Da derecho a una segunda corrección?

    • A. Sí, si es grave
    • B. No: la segunda corrección es solo para el mismo bloqueo que sigue fallando
    • C. Sí, automáticamente
    • D. Solo si lo aprueba otro verificador
  3. Un comando acepta --dry-run, lo ignora y devuelve éxito. ¿Cómo se clasifica?

    • A. Bloqueo, siempre
    • B. Aviso, porque no lanza error
    • C. Depende del tamaño del diff
    • D. No se considera defecto
  4. ¿Dónde corre un verificador sus sondas?

    • A. En el espacio de trabajo, para ahorrar tiempo
    • B. En producción
    • C. En una rama nueva del repositorio
    • D. En una copia creada con mktemp -d, fuera del espacio de trabajo
Respuestas
  1. C. El tamaño no agrega un verificador.
  2. B. “A new finding never earns one.”
  3. A. Es uno de los dos casos que siempre son bloqueo.
  4. D. No debe dejar archivos nuevos en el espacio de trabajo.

Lista de control

  • Sé qué nivel corresponde sin fijarme en el tamaño.
  • Solo pido un verificador cuando puedo nombrar el punto.
  • Entrego el documento completo al verificador.
  • Aplico los límites de corrección sin ciclos adicionales.
  • Clasifico hallazgos reproduciéndolos antes en la base.

Fuentes

internal/assets/skills/_shared/odd-orchestrator-sections.md, internal/assets/opencode/agents/gentle-ai-verify.md, internal/components/agentguidance/routing.go, odd/tasks/verify-always-rdd-high.md, docs/review-integration.md.