chimera-test-the-wiring-not-the-class
Una clase ensamblada a mano en una prueba demuestra que la clase funciona, no que algo llegue hasta ella — cubre el camino que producción toma realmente.
Conferida por quien revisó y leyó la tarjeta, no reclamada por el propio archivo. Una tarjeta que el agente destila durante una ejecución que consumió contenido no confiable nace contaminada y queda retenida para revisión antes de ser recuperada.
Cuándo viene a la mente
- funciona en las pruebas pero no en la app
- agregaste un componente detrás de una factory o un registry
- el flag viene apagado por defecto
- suite en verde, comportamiento roto
Evita y Comprueba es donde suele estar el valor. Haz es la sección que todo el mundo escribe.
El cuerpo de la tarjeta de arriba es una traducción. El original en inglés es lo que importa la CLI, lo que lee el agente en ejecución y lo que atestigua el hash de abajo.
Disparador
Construiste un componente al que producción llega indirectamente: a través de una factory, un registro, un cargador de plugins, un flag de configuración, un router, un entrypoint de CLI, un contenedor de inyección de dependencias. Tus pruebas lo construyen directamente y llaman a sus métodos.
Cada una de esas pruebas puede pasar mientras el componente es inalcanzable en el sistema en ejecución — porque nada en ellas ejercita el registro, el valor por defecto del flag, o la rama del ensamblador que decide si incluirlo siquiera.
No aplica a una función pura que quienes la llaman importan y llaman directamente. Ahí, el import es el cableado, y una prueba unitaria lo cubre. Tampoco aplica cuando estás probando deliberadamente un algoritmo de forma aislada — esas pruebas son correctas y deben quedarse; esta tarjeta dice que no bastan por sí solas.
Haz
-
Nombra el entrypoint que un usuario realmente toca: el subcomando de la CLI, la ruta HTTP, el bucle de ejecución del agente, el job programado. Anótalo antes de escribir la prueba.
-
Escribe al menos una prueba que empiece ahí y no pase ningún argumento de constructor para tu componente. Si la prueba tiene que nombrar tu clase para que la funcionalidad ocurra, no está probando el cableado.
-
Construye el objeto como lo construye producción — llama a la factory real o al cargador de configuración:
# WRONG — proves the class, not the wiring: the component is handed to the thing under test, # so the test passes whether or not anything in production ever hands it over. assert "reminder" in render(feature=Feature(text="reminder")) # RIGHT — build it the way the entry point builds it, then look for the same observable assert "reminder" in build_the_real_way(config).render()El caso propio de Chimera merece nombrarse porque la clase nunca estuvo rota. Las skill cards tenían un recuperador que funcionaba, un almacén que funcionaba y un inyector que funcionaba — y
chimera/config.py:244diceskill_cards: bool = Field(default=False, ...), así que en un despliegue de serie nunca se inyectaba nada. Todas las pruebas unitarias pasaban. La medición que finalmente lo detectó contó skills acuñadas contra skills inyectadas y encontró 39 contra cero. -
Verifica sobre un observable que solo puede aparecer si el componente fue alcanzado: texto en el prompt renderizado, una fila escrita, una línea de log, un código de salida.
-
Verifica el valor por defecto. Si la funcionalidad se lanza detrás de un flag, añade una prueba aparte que lea el valor por defecto sin ninguna anulación y verifique cuál es. Una suite que solo se ejecuta con el flag forzado a activado no puede decirte qué reciben los usuarios.
Evita
Ensamblar a mano los colaboradores que producción cablea. La forma del fallo es una clase handler con cobertura unitaria completa que el router nunca registra, o una capacidad cuya clave de configuración viene desactivada por defecto — la clase es correcta, las pruebas son correctas, y la funcionalidad no hace nada en el producto. Nada está en rojo, así que nada se investiga, y el hueco sobrevive hasta que un humano prueba la funcionalidad a mano.
Evita también falsear la costura que intentas cubrir. Parchear la factory, o simular el cargador de configuración para que devuelva un objeto que contiene tu componente, borra exactamente el código que la prueba existía para ejercitar:
monkeypatch.setattr(mod, "load_plugins", lambda: [MyPlugin()])
Falsea en la frontera más externa — el cliente de red, el reloj, la llamada al LLM — y deja que todo lo que hay entre el entrypoint y tu componente sea real.
Comprueba
Borra el cableado y ejecuta la suite. Comenta la línea de registro: el decorador @register, la
entrada en el diccionario de despacho, la llamada include_router(...), el valor por defecto en el
esquema de configuración.
Luego la pregunta binaria: ¿se puso alguna prueba en rojo, y era una prueba que nunca menciona tu clase por su nombre?
Si la suite se queda verde, tu cobertura es solo de nivel de clase y el cableado está sin probar. Si
la única prueba en rojo es la que construye la clase directamente, la respuesta es la misma. Restaura
la línea después y confirma el verde — y ejecuta git diff antes de hacer commit, para que el
registro borrado no se publique.
Riesgo
Las pruebas de entrypoint son más lentas, más difíciles de depurar, y localizan peor: cuando una falla sabes que la funcionalidad está rota pero no cuál de diez componentes la rompió. Ese es un costo real, y la respuesta equivocada a esta tarjeta es borrar tus pruebas unitarias a favor de las de extremo a extremo. Conserva ambas — la prueba de cableado te dice que se rompió, la unitaria te dice qué.
Pasar por el entrypoint real también puede tocar cosas que no quieres tocar en CI: una API de pago, una base de datos viva, un sistema de archivos fuera del sandbox. Si la única forma de alcanzar el entrypoint es gastar dinero o mutar producción, no lo fuerces; cubre en su lugar la función ensambladora directamente y acepta que estás a un paso del camino verdadero.
Y esta tarjeta detecta alcanzabilidad, no corrección. Una funcionalidad puede estar perfectamente cableada al entrypoint y aun así producir la respuesta equivocada, así que una prueba de cableado en verde no es licencia para saltarse verificar qué dice realmente la salida.
Cómo usarla
La tarjeta es un dato. Clona el repositorio e impórtala por ruta: lo que llega por la red se trata como contaminado y queda retenido a la espera de aprobación, que es el comportamiento deseable y la razón por la que aquí no hay un instalador de una línea.
git clone https://github.com/brcampidelli/chimera-agent.gitchimera skills-import chimera-agent/skills/chimera-test-the-wiring-not-the-class/SKILL.mdIntegridad
SHA-256 del archivo tal como se publicó. Quien lo importe puede comprobar que lo que recibió es lo que mostró esta página.
564f2b0aaff3bbb51ca9bfa013d89e3d47d92166f498803c688c3b859b378475