El segundo vehículo que la spec exige (§0.5 · Annex C.1), y el que de verdad
acredita: `agent-check` es un lint de NUESTRO repo; esto lo corre un tercero
contra SU implementación.
PORTABLE POR CONSTRUCCIÓN
El kit no importa `createEngineAgent`. Habla con un `ConformanceSubject`
estructural —start · run · authorize · reject · resolveEscalation · stop ·
disable— que el implementor adapta sobre su motor; `subject.ts` es el ejemplo
trabajado de ese adaptador, no una dependencia. Vive fuera del barrel
(precedente `adapters/*`, D-AG.1c): quien no corre conformance no lo paga.
DIEZ CASOS, CADA FALLO CITANDO SU ID
AG-2 · AG-4 (el control vuelve aunque el transporte reviente — la lectura más
dura del requisito) · AG-5 · AG-6 (escalada no terminal + razón tipada) ·
AG-9 (interrumpir es volver, no un error) · AG-10 (kill global) · AG-21 (una
capacidad inventada vuelve como resultado corregible, no mata el run) ·
AG-25 (lo irreversible no se ejecuta sin revisar ni con el techo más suelto) ·
AG-26 (clamp de iniciativa) · AG-50 (degradación sin transporte).
Un caso que falla solo se falla A SÍ MISMO: una implementación a la que le
falte un requisito recibe igualmente el informe completo del resto, que es la
diferencia entre una suite de conformance y un smoke test.
Y EL KIT SABE FALLAR
Un kit que no puede fallar no prueba nada, así que hay un test que rompe AG-4
a propósito y comprueba que el informe lo nombra. No es lo mismo que
`engine-agent.test.ts`: aquella suite prueba el MOTOR con acceso a sus
interioridades; ésta prueba el CONTRATO por la misma puerta que tiene un
tercero, y es la que nos pillaría enviando un eje que nuestra propia
especificación rechaza.
AG-35 y AG-41 quedan FUERA a propósito mientras §D de la spec siga abierta —
un kit que afirmara un requisito sin decidir estaría inventando la decisión.
Hay un test que fija esa ausencia.
TRAMPA CAZADA, QUE ES LO QUE HACEN LAS SUITES
Tres casos fallaban por lo mismo, y no era el motor: pasar
`createEngineTimers()` como `timers` TIPA pero revienta — `EngineTimers`
expone `schedule`, no `once`, así que el primer timeout llama a `undefined` y
el run cierra como `transport-error`. La factory de `active-app` adapta el
puerto justamente por eso. Anotado en el handoff.
Verificado: agent 33/33 (10/10 conformance) · arts:check 24/24 ·
agent:check limpio · docs:check sin errores nuevos · check de vuelta en los 73
preexistentes (los 17 que aparecieron eran míos: `asserts condition` exige
llamarse por un nombre anotado, y yo lo desestructuro del contexto).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>