tdd (Matt Pocock)
Desarrolla funciones y corrige errores con test-first, mediante rojo-verde-refactor y pruebas de integración.
mattpocock tdd: sin mejora cuando el prompt ya pide escribir primero las pruebas, y alrededor de 1.7x los tokens
Codex CLI · gpt-6-astra
22.7 / 30
Mejora frente a sin skill: +0.00 · Según el caso · 18 ejecuciones
Según el caso: la mejora +0.00 está por debajo de +1.0. Para ser recomendada hace falta un total de 22/30, una calidad de salida de 3.5 y una mejora de +1.0.
SOTA
AprobadaProbada con Codex.
Cubre Codex, Claude Code
Codex CLI 0.166 (nivel SOTA): 18 ejecuciones puntuadas. Una pasada aquí también cubre Claude Code según nuestra regla de niveles; no dice nada sobre el segundo nivel.
Puntuaciones
Cada dimensión va de 0 a 5 y las seis suman el total sobre 30. 5 es mejor en todas las dimensiones. Coste 5 significa barato y rápido. Instalación 5 significa fácil.
- Fiabilidad de activación
- 5.0
- Mejora frente a sin skill
- 2.0
- Calidad de salida
- 4.7
- Coste en tokens y tiempo
- 2.0
- Instalación y portabilidad
- 4.0
- Seguridad
- 5.0
Revisión de seguridad
SeguraEscaneo estático: 0 CRITICAL / 0 HIGH / 0 MEDIUM. Revisión manual: Segura de ejecutar en un sandbox sin red (sin hallazgos). Un escaneo limpio no demuestra que una skill sea segura.
Instalar
npx skills@latest add mattpocock/skills --skill tdd
Commit fijado: 4ae2317ddb22b046e26455e4f9c9b3aaaf62212d
Probada: 2026-11-02
Qué probamos
- Implementa una función a partir de una especificación precisa — Implementa slugify(text, max_length=None) en slug.py (Python 3, solo biblioteca estándar) usando TDD. Especificación: pasa el texto a minúsculas; sustituye cada secuencia de caracteres que no sean letras o dígitos ASCII por un único '-'; elimina los '-' iniciales y finales; un resultado vacío…
- Implementa una clase con estado pequeña — Escribe ratelimiter.py (Python 3, solo biblioteca estándar) aplicando primero las pruebas (red-green-refactor), con la clase RateLimiter(limit, window_seconds, clock=time.monotonic): un limitador de ventana deslizante por clave. allow(key) devuelve True y registra la llamada si hay menos de limit…
- Corrige un bug de redondeo — Los clientes dicen que cart_total en cart.py a veces se desvía un céntimo respecto a nuestro sistema contable, que redondea los medios céntimos al alza en cada paso (el total de cada línea, el subtotal con descuento y los impuestos). Por ejemplo, cart_total([(1.005, 1)]) debería devolver 1.09 y…
Ventajas
- La skill se activó sin nombrarla: se leyó el archivo de la skill en 6/6 ejecuciones con skill.
- Calidad absoluta alta con la skill: 4.67 sobre 5.
Inconvenientes
- Sin mejora medible frente a sin skill (+0.00, dentro del ruido).
- Un prompt de una frase puntuó 4.67, frente a 4.67 con la skill (+0.00).
- Usa 1.7x los tokens de sin skill.
- Salvedad de la prueba: la rama del prompt de una frase (6 ejecuciones) se añadió después en una máquina distinta de las ramas de control y con skill.
- n=2 por tarea y rama; las diferencias de menos de aproximadamente 1 punto son ruido.
Reseña
Codex CLI 0.166 (gpt-6-astra, razonamiento bajo) en una máquina de pruebas Mac, con un proyecto temporal nuevo y HOME/TMPDIR/cachés temporales en cada ejecución, la skill instalada (grupo con skill), ausente (control) o ausente con el requisito central de la skill comprimido en una frase añadida al prompt (grupo del prompt de una frase), 2 ejecuciones por grupo y tarea, sin red y con las escrituras en /tmp bloqueadas. Los prompts nunca mencionan la skill (salvo la redacción indicada abajo). Como la descripción de esta skill solo se activa cuando el usuario pide TDD o escribir primero las pruebas, los prompts lo indican («usando TDD», «primero las pruebas (red-green-refactor)», «hazlo con las pruebas primero»). Las mismas palabras se dan al grupo de control, así que la prueba consiste en ver si la skill mejora una petición simple de TDD.
Comparación de tres ramas
| Rama | Puntuación media (0-5) | Tokens por ejecución |
|---|---|---|
| Sin la skill | 4.67 | 86k |
| Prompt de una frase | 4.67 | 178k |
| Con la skill | 4.67 | 146k |
Medido con Codex CLI en 18 ejecuciones, puntuado con comprobaciones basadas en reglas y sin juez LLM. Total 22.7 / 30, veredicto Según el caso.
Aviso: La rama de una frase (6 ejecuciones) se añadió más tarde en una máquina distinta de las ramas de control y con skill.
Veredicto: Según el caso (22.7 / 30). Fuente: mattpocock/skills, skills/engineering/tdd, fijada en el commit 4ae2317. Instalación: npx skills@latest add mattpocock/skills --skill tdd. Licencia: MIT (LICENSE del repositorio).
Qué es
La skill tdd del repositorio de skills de Matt Pocock (engineering/tdd): el ciclo rojo-verde más dos archivos de referencia sobre qué es una buena prueba y cuándo usar mocks. Unas 570 palabras en SKILL.md; Markdown puro, sin scripts. Se activa cuando el usuario quiere trabajar con las pruebas primero.
Cómo lo probamos
Codex CLI 0.166 (gpt-6-astra, razonamiento bajo) en un Mac de pruebas, un proyecto temporal nuevo y HOME/TMPDIR/cachés temporales por ejecución, skill instalada (tratamiento) o ausente (control) o ausente con el requisito central de la skill comprimido en una frase añadida al final del prompt (grupo de una frase), 2 ejecuciones por grupo y tarea, red desactivada, escrituras en /tmp bloqueadas. Los prompts nunca mencionan la skill (salvo la formulación indicada abajo).
Como la descripción de esta skill solo se activa cuando el usuario pide TDD o pruebas primero, los prompts lo dicen («usando TDD», «primero las pruebas (rojo-verde-refactor)», «Hazlo con las pruebas primero»). Las mismas palabras se dan al grupo de control, así que la prueba consiste en ver si la skill mejora una petición simple de TDD.
- Implementar una función a partir de una especificación precisa — Implementa
slugify(text, max_length=None)en slug.py (Python 3, solo biblioteca estándar) usando TDD. Especificación: pasa el texto a minúsculas; sustituye cada secuencia de caracteres que no sean letras ASCII o dígitos por un único '-'; elimina los '-' iniciales y finales; un resultado vacío… - Implementar una clase con estado pequeña — Escribe ratelimiter.py (Python 3, solo biblioteca estándar) con las pruebas primero (rojo-verde-refactor) con la clase
RateLimiter(limit, window_seconds, clock=time.monotonic): un limitador de ventana deslizante por clave.allow(key)devuelve True y registra la llamada si hay menos delimit… - Arreglar un error de redondeo — Los clientes dicen que
cart_totalen cart.py a veces se desvía un céntimo respecto a nuestro sistema contable, que redondea al alza al céntimo en cada paso (cada total de línea, el subtotal con descuento y los impuestos). Por ejemplo, cart_total([(1.005, 1)]) debería devolver 1.09 y…
La puntuación es programática (pruebas ocultas / detección de problemas sembrados / comprobaciones de restricciones / renderizado+OCR cuando corresponde), 0–5 por ejecución. Ningún juez LLM decidió ninguna puntuación.
Resultados
La frase única que recibió el tercer grupo: "Trabaja con las pruebas primero en porciones verticales: escribe una prueba fallida a través de la interfaz pública, confirma que falla, escribe el código mínimo para pasarla, repite y refactoriza solo cuando esté en verde; no escribas todas las pruebas de antemano."
| Tarea | Puntuación del control | Frase única | Con la skill | Tokens del control | Tokens de una frase | Tokens con la skill | Skill leída |
|---|---|---|---|---|---|---|---|
| t1-slugify | 5.0 | 5.0 | 5.0 | 79k | 184k | 135k | 2/2 |
| t2-ratelimiter | 5.0 | 5.0 | 5.0 | 99k | 183k | 169k | 2/2 |
| t3-cart-bugfix | 4.0 | 4.0 | 4.0 | 79k | 164k | 133k | 2/2 |
Puntuación media: 4.67 sin vs 4.67 con la skill (delta +0.0). Tokens por ejecución: 86k vs 146k (1.70x); tiempo 50s vs 67s. Grupo de una frase: 4.67 (ganancia de la skill sobre la frase única: +0.0; ganancia de la frase única sobre sin skill: +0.0); tokens de la frase única 178k por ejecución, así que la skill cuesta 0.82x la frase única.
Qué ocurrió
- Con el prompt ya pidiendo pruebas primero, el grupo de control también lo hizo: en las dos tareas de construcción, todas las ejecuciones de ambos grupos pasaron todas las comprobaciones, incluida la de «prueba escrita antes de la implementación». La skill no añadió nada medible ahí.
- En la tarea de arreglo (redondeo del carrito), las cuatro ejecuciones, con y sin la skill, corrigieron el error y pasaron las pruebas ocultas, y las cuatro fallaron la misma comprobación de proceso: el arreglo o la prueba llegaron en el mismo paso que el otro, en lugar de una prueba fallida primero. La skill no cambió eso.
- La skill se leyó en 6/6 ejecuciones de tratamiento. Hizo que el agente trabajara mucho más (24-26 comandos frente a 8-10 en las tareas de construcción) para el mismo resultado: alrededor de 1.7x los tokens.
- La corrección en las pruebas ocultas fue del 100% en ambos grupos.
- La versión de una frase (trabajar con las pruebas primero en porciones verticales, una prueba fallida cada vez): puntuación media 4.67, idéntica al control y a la skill, con 178k tokens por ejecución frente a 86k del control (2.1x) y 146k de la skill. Los agentes de la frase única ejecutaron 27 comandos por ejecución de media frente a 9 del control y 23 de la skill, porque repitieron el bucle de pruebas una y otra vez.
- Todos los grupos escribieron sus propias pruebas en todas las ejecuciones y pasaron todas las pruebas ocultas; la condición de pruebas antes de la implementación se cumplió en 4 de 6 ejecuciones en los tres grupos, así que la petición del prompt «pruebas primero» ya hacía lo que se supone que hace la skill.
Puntuaciones por dimensión
| Dimensión | Puntuación | Motivo |
|---|---|---|
| 1. Calidad del resultado | 4.67 | Puntuación media 4.67/5 con la skill (comprobaciones programáticas; consulta la tabla por tarea). |
| 2. Mejora frente a no usar skill | 2.0 | +0.00 puntos frente a 4.67 sin la skill (n=2 por tarea; menos de ~1 punto es ruido). |
| 3. Activación | 5.0 | Archivo de la skill leído en 6/6 ejecuciones de tratamiento. |
| 4. Portabilidad de las instrucciones | 4 | |
| 5. Eficiencia | 2 | 1.70x tokens (146k vs 86k por ejecución) y 1.34x tiempo (67s vs 50s). |
| 6. Seguridad e higiene | 5 |
Límites de esta prueba
- Cada prompt de prueba pedía TDD, lo que da al grupo de control la mayor parte del beneficio; un usuario que no lo pidiera no activaría en absoluto la descripción de la skill.
- Solo tareas pequeñas de Python; no se puntuó la calidad de las pruebas.
- n = 2 por grupo y tarea: las diferencias de menos de 1 punto son ruido.
- La puntuación basada en reglas mide lo que las comprobaciones pueden ver; no puede juzgar el gusto ni si un resultado es el mejor posible.
Seguridad
Consulta security.md. Escaneo: 0 CRITICAL / 0 HIGH / 0 MEDIUM. Veredicto: seguro para ejecutar (sandbox sin red). Un escaneo limpio no demuestra que una skill sea segura.
En resumen
Por encima de una petición de pruebas primero, esta skill no aporta ninguna ganancia extra en tareas pequeñas: control, la versión de una frase y la skill obtuvieron 4.67, mientras que la skill usó 1.7x y la frase 2.1x los tokens del control. Puede ayudar a mantener las pruebas centradas en el comportamiento durante una sesión más larga, algo que no medimos.
Transcripción
Registro de ejecuciones: tdd (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.) Columnas: tarea, grupo-ejecución, puntuación (0-5), tokens, segundos, comprobaciones superadas, archivos de la skill que abrió el agente. t1-slugify control-1: puntuación 5.0, tokens 78904, s 50.3, comprobaciones 3/3, no abrió nada t1-slugify control-2: puntuación 5.0, tokens 79205, s 47.1, comprobaciones 3/3, no abrió nada t1-slugify oneliner-1: puntuación 5.0, tokens 199600, s 74.7, comprobaciones 3/3, no abrió nada t1-slugify oneliner-2: puntuación 5.0, tokens 168650, s 68.2, comprobaciones 3/3, no abrió nada t1-slugify treatment-1: puntuación 5.0, tokens 144538, s 57.6, comprobaciones 3/3, abrió tdd t1-slugify treatment-2: puntuación 5.0, tokens 126047, s 50.7, comprobaciones 3/3, abrió tdd t2-ratelimiter control-1: puntuación 5.0, tokens 99439, s 60.2, comprobaciones 3/3, no abrió nada t2-ratelimiter control-2: puntuación 5.0, tokens 99611, s 54.3, comprobaciones 3/3, no abrió nada t2-ratelimiter oneliner-1: puntuación 5.0, tokens 159969, s 70.9, comprobaciones 3/3, no abrió nada
18 ejecuciones, 3 artefactos
Resultado de ejemplo
SOTA · With the skill: test_slug.py (t1-slugify, run 1, Codex)
import unittest from slug import slugify class SlugifyTests(unittest.TestCase): def test_hard_cuts_first_word_when_it_exceeds_limit(self): self.assertEqual(slugify('Supercalifragilistic', 5), 'super') def test_truncates_at_word_boundary(self): self.assertEqual(slugify('Hello, World!', 8), 'hello') def test_normalizes_text(self): self.assertEqual(slugify('Hello, World!'), 'hello-world') def test_preserves_only_ascii_letters_and_digits(self): self.assertEqual(slugify(' -- CAFÉ_42\t中文 / Test!! '), 'caf-42-test') def test_lowercases_before_filtering(self): self.assertEqual(slugify('\u212aELVIN'), 'kelvin') def test_keeps_slug_that_fits_limit(self): for limit in (11, 20, None): with self.subTest(limit=limit): self.assertEqual(slugify('Hello, World!', limit), 'hello-world') def test_keeps_complete_words_without_trailing_separator(self): for limit, expected in ((3, 'one'), (4, 'one'), (6, 'one'), (7, 'one-two'), (8, 'one-two')): with self.subTest(limit=limit): self.assertEqual(slugify('one two three', limit), expected) def test_hard_cuts_long_first_word_even_with_later_words(self): self.assertEqual(slugify('Supercalifragilistic hello', 5), 'super') def test_applies_limit_to_fallback(self): self.assertEqual(slugify('', 2), 'n') def test_empty_normalized_text_has_fallback(self): for text in ('', ' !!! ', '中文'): with self.subTest(text=text): self.assertEqual(slugify(text), 'n-a') if __name__ == '__main__': unittest.main()