DIGITAL TOOLS · DEV #3 · 16 JUL 2026
SESIÓN 3 · DEV #3
Estándares
+ tu primer agente

El sistema que trabaja aunque no estéis mirando.

AI Mate · David Ramos Sesión 3 · Dev #3 · Final
EL PROGRAMA COMPLETO
DÓNDE ESTAMOS

Tres sesiones, un equipo autónomo

SESIÓN 1
Usáis la herramienta
Fundamentos, starter kit y SDD sobre ONEDEV-63.
SESIÓN 2
Seguís un método
Liga SDD: propose → spec → design → tasks → apply → verify.
SESIÓN 3 · HOY
Construís el sistema
Estándares que bloquean y tu primer agente. El kit empowered.

Esto os lo prometí en la Sesión 2, slide 2: «Estándar del equipo en el repo y tu primer agente personal». Hoy se cumple.

SESIÓN 3 · DEV #3 · 4 H
PROGRAMA DE HOY

Nueve bloques, dos entregables

15'
Bloque 0 — Rescate + setup del kit
25'
Bloque 1El kit: qué es, de dónde sale, qué cambia
30'
Bloque 2Loop Engineering: por qué está construido así
15'
☕ Pausa 1 — Checkpoint leaderboard #1
35'
Bloque 3Misión 1: Estándares que bloquean (LAB)
40'
Bloque 4Misión 2: Tu primer agente (LAB)
15'
☕ Pausa 2 — Checkpoint leaderboard #2
15'
Bloque 5Misión 3: /spec-mine — demo + falsar
20'
Bloque 6Misión 4: Judgment Day (demo conducida)
15'
Bloque 7Misión 5: ¿Y si mañana cambiamos de herramienta?
15'
Bloque 8 — Cierre + podio + certificados
EL ARCO DE LAS TRES SESIONES
DE DÓNDE VENÍS

Herramienta → método → sistema

SESIÓN 1
Usáis la herramienta
Claude Code en el repo, plan mode, contexto y coste.
SESIÓN 2
Seguís un método
SDD de punta a punta. Un método que hay que acordarse de seguir.
SESIÓN 3 · HOY
Construís el sistema
El que hace que el método se cumpla aunque no estés mirando.

Un método que depende de que te acuerdes de seguirlo no es un método. Es una buena intención.

LIGA SDD · TEMPORADA FINAL
CÓMO PUNTUAMOS HOY

Cinco misiones, 800 XP

800XP Base S3
5Misiones
5Badges
2Pausas
MisiónBloqueXPBadge
M1 · Estándares que bloqueanB3+200🚧 Gatekeeper
M2 · Tu primer agenteB4+250🤖 Agent Maker
M3 · Falsar la spec minadaB5+100⛏️ Spec Miner
M4 · Judgment DayB6+150👁️ Doble Ciego
M5 · PortabilidadB7+100🧳 Nómada

Bonus: +50 haces que un hook te bloquee y sabes explicar por qué · +30 tu agente lo usa otro dev y le funciona · +50 encuentras un error real en la spec minada · +50 Judgment Day con 0 findings confirmados sobre tu código · +20 identificas qué perderías exactamente al migrar de harness. El podio suma S2 + S3. Certificados al cierre.

BLOQUE 0 DE 8
BLOQUE 0 · INICIO

Rescate + Setup

Nadie se queda atrás.

0
BLOQUE 0 · RESCATE + SETUP
INSTALAR EL KIT · 15'

Un comando, cinco harnesses, tres perfiles

# 1 · Observad primero. --dry-run no escribe nada.
node scripts/install.js --harness claude-code --profile empowered --target <repo> --dry-run

# 2 · Y ahora sí.
node scripts/install.js --harness claude-code --profile empowered --target <repo> --apply

# → Done: 113 created, 0 skipped   ← lo que dice la terminal
# → 102 archivos en disco          ← lo que de verdad aterriza
  • 113 y 102 son las dos ciertas. El instalador cuenta operaciones, no archivos: 11 rutas se escriben dos veces. Lo vais a ver en pantalla, así que os lo digo antes.
  • Sesión nueva: no hace falta reiniciar — verificado. Una sesión ya abierta: sin verificar → asumid reinicio.
  • Vuestro CLAUDE.md no se toca (already exists — not overwriting project context). Todo lo demás se reescribe si repetís el --apply.

--dry-run antes de --apply. Siempre. Esto también es loop engineering: observad antes de actuar.

BLOQUE 0 · RESCATE + SETUP
ANTES DE EMPEZAR

Prerequisitos, en la máquina

!
onedev-grid-service clonado
El blocker de día-D más probable: no estaba en la máquina de pruebas. Clonad el repo antes de la sesión.
01
Node ≥ 18 · git
El instalador y los hooks son Node. Sin Node ≥18 no arranca nada.
02
Claude Code actualizado
Última versión. Los hooks dependen del formato de settings.json.

Esto va también en el email previo a la sesión. Si llegáis sin el repo clonado, el Bloque 0 se come el Bloque 1.

BLOQUE 1 DE 8
BLOQUE 1 · EL ENTREGABLE

aimate-empowered-sdd-kit

El cuarto kit del programa. Y el último que os doy hecho.

1
BLOQUE 1 · EL KIT
NO ES LO QUE PENSÁIS

No es un kit de Claude Code

«Not a Claude Code kit. A neutral core/ projected into 5 AI harnesses.» — README del kit, literal.

LA ARQUITECTURA
  • Un core/ neutro — markdown + JS, sin marca
  • Proyectado vía adapters/ a cinco harnesses
  • claude-code · cursor · opencode · gemini · codex
POR QUÉ IMPORTA
  • El kit no es una carpeta .claude/
  • Es un estándar que sobrevive a vuestras decisiones de herramienta
  • Volvemos a esto en el Bloque 7
BLOQUE 1 · EL KIT
TRES FUENTES, DOS DE ELLAS AJENAS

No lo inventamos. Lo elegimos.

01
aimate-sdd-kit (interno)
El kit que sufristeis en la S2. 12 skills, 3 agentes, estándares.
02
gentle-ai (MIT)
Judgment Day, los 9 contratos de orquestación, skill-registry, chained-pr, work-unit-commits.
03
ECC (MIT)
spec-miner, gateguard, code-explorer, planner, tdd-guide.

Aquí no hay nada original nuestro salvo el criterio. Hay un ecosistema abierto ahí fuera — MIT, con licencia y con nombre — y el trabajo no fue escribirlo: fue saber qué coger, qué dejar y cómo encajarlo. Eso vale más que cualquier feature que os enseñe hoy.

BLOQUE 1 · EL KIT
S2 → S3

Lo que cambia respecto al kit que ya usasteis

Kit S2Empowered
Skills1219
Agentes319
Hooks vivos08
Contratos de orquestación010
Validadores CI09
Comandosprestados de openspec15 propios
Harnesses15

Fijaos en la fila de los hooks. De cero a ocho. No es «más de lo mismo»: es la primera vez que hay código que os puede parar las manos.

BLOQUE 1 · EL KIT
CÓMO ESTÁ ORGANIZADO

Cuatro capas, no catorce módulos

01
Guardarraíles
8 hooks vivos, profile-gated.
02
Orquestación SDD
Judgment Day, 9 contratos, skill-registry.
03
Calidad de spec
spec-miner, PRP discipline, planner, tdd-guide.
04
Guardarraíles avanzados
gateguard, context-monitor, validadores CI, hardening.
BLOQUE 1 · EL KIT
CÓMO SE INSTALA

Tres perfiles, cinco harnesses

PERFIL 01
minimal
SDD lean.
PERFIL 02
standard
+ orquestación + calidad de spec.
PERFIL 03
empowered
+ hooks vivos + validadores + hardening.
--preset (S2)
Cambiaba contenido: docs de Python vs TypeScript. Qué te cuenta el kit.
--profile (S3)
Cambia capacidad: qué se te permite hacer. profile ≠ preset — son ejes distintos.
BLOQUE 1 · EL KIT
QUÉ ACABA DE ATERRIZAR

Esto es el qué

19Skills
19Agentes
15Comandos
8Hooks
10Contratos
9Validadores
  • 102 archivos en disco, 0 saltados — contados en el disco, no leídos del informe.
  • El instalador dice 113. Cuenta operaciones, no archivos: 11 rutas se escriben dos veces. Las dos cifras son ciertas; solo una es la que os llevaréis.

Fijaos en lo que acaba de pasar: la cifra que llevaba dos días en mis notas era 102, y la terminal dice 113. Ninguna miente. Contaban cosas distintas y nadie lo comprobó. Llevamos cuatro slides de sesión.

BLOQUE 2 DE 8
BLOQUE 2 · POR QUÉ ASÍ

Loop Engineering

Por qué el kit tiene hooks y no consejos.

2
BLOQUE 2 · LOOP ENGINEERING
PREPARANDO ESTA SESIÓN

«Cuatro de los ocho hooks
estaban muertos

Hice un dry-run del kit que os iba a dar hoy. Cuatro de los ocho hooks estaban muertos. No rotos — muertos. Cableados a eventos que nunca leían. Salían con 0 en cada invocación. El código estaba bien; el cableado estaba mal.

¿Y sabéis qué es lo mejor? Que --dry-run no podía cazarlo jamás. Dry-run nunca escribe settings.json, así que toda la capa de guardarraíles vivía justo en el único camino de código que dry-run se salta.

No me salvó revisar el código. Me salvó ejecutarlo y observar el resultado. Y casi os doy un kit con la mitad de los guardarraíles apagados.

BLOQUE 2 · LOOP ENGINEERING
LO QUE ENCONTRAMOS EN DOS DÍAS

Seis veces. Todas iguales.

01
--dry-run no podía cazar los hooks muertos
Se salta el único camino de código donde vivían.
02
validate-no-personal-paths.js no matcheaba ~/
El validador escrito exactamente para eso.
03
validate-specs.js no validaba ninguno
De los dos formatos que existían. Y se contradecían entre sí.
04
npm run validate en verde era un no-op
Early return: no hay openspec/ en el repo del kit.
05
ripgrep dio un cero falso
Se salta directorios ocultos por defecto; .claude/ y .cursor/ nunca se escanearon.
06
Claude narró un bloqueo que nunca ocurrió
← la peor.

Todo estaba declarado. Nada estaba verificado. El kit que os iba a enseñar loop engineering estaba construido sin un solo loop.

BLOQUE 2 · LOOP ENGINEERING
LA QUE DA MIEDO

«Claude nos dijo que un hook lo había bloqueado.
El hook nunca disparó.»

Le pedimos editar .pre-commit-config.yaml. Se negó, y reportó que el hook lo había bloqueado. Fuimos a mirar: el hook salía con 0. Nunca disparó. Lo que pasó es que leyó el CLAUDE.md del kit, se autocensuró, y narró como hecho un bloqueo que no existía.

Si eso pasa hoy en este aula, vosotros marcáis «hook disparó ✅» y os vais a casa creyendo en un guardarraíl que no existe. Lo cazamos porque alguien miró el git diff en vez de creerse el texto.

La narración del modelo NO es evidencia. Ni cuando dice que falló. Verificad por efecto, nunca por narración.

BLOQUE 2 · LOOP ENGINEERING
DÓNDE ESTÁ LA VENTAJA

Prompt → Context → Loop

2023
Prompt engineering
Cómo pedís. Ya no os diferencia.
2024-25
Context engineering
Qué sabe. Aquí estáis.
2026
Loop engineering
Cómo verifica y se corrige sin vosotros. Aquí vamos.

Todos tenéis el mismo Claude. Literalmente el mismo. Lo que os diferencia no es el modelo — es el loop en el que lo metéis.

BLOQUE 2 · LOOP ENGINEERING
JUNIO DE 2026 · HACE UN MES

Loop Engineering no es mío. Ni es viejo.

01
7 jun 2026 — Peter Steinberger (OpenClaw)
«la habilidad ya no es promptear agentes; es diseñar los loops que los promptean». ~6,5 M de visitas en una semana.
02
Addy Osmani (Google)
Publica el ensayo «Loop Engineering»: le da el nombre a la práctica y una anatomía (automatizaciones, worktrees, skills, conectores, sub-agentes, estado externo).
03
Boris Cherny — lead de Claude Code en Anthropic
«mi trabajo ahora es escribir loops, no promptear el modelo».

Ojo a la tercera. El tipo que dirige la herramienta que tenéis abierta ahora mismo dice que su trabajo ya no es hablarle al modelo — es construirle el bucle. Esto no es una opinión mía: tiene un mes y ya cambió a qué se dedica la gente que hace las herramientas.

Fuentes: Addy Osmani — addyosmani.com/blog/loop-engineering/ · LangChain — langchain.com/blog/the-art-of-loop-engineering · O'Reilly Radar — oreilly.com/radar/loop-engineering/

BLOQUE 2 · LOOP ENGINEERING
ANATOMÍA DE UN LOOP

Siete pasos, uno innegociable

01
INTENCIÓN
02
PLAN
03
ACTO
04
OBSERVA
Sin esto, nada de lo que viene después existe.
05
VERIFICA
06
CORRIGE
07
PARA

Si el agente no puede observar el resultado de lo que hizo, todo lo que viene después es ficción. Verifica qué. Corrige contra qué.

BLOQUE 2 · LOOP ENGINEERING
LA FRASE

«Un agente sin señal de verificación no es un agente.
Es un generador de texto con permisos de escritura.»

BLOQUE 2 · LOOP ENGINEERING
LOS TRES FALLOS

Por qué se rompen los loops

01
Sin señal
Sin tests, tipos ni linter → alucina progreso. Los 4 hooks muertos: nadie comprobaba que comprobaran.
02
Señal lenta
Llega en CI 20 min después → el agente ya se fue. Un loop lento no es un loop: es un post-mortem.
03
Señal blanda
«¿estás seguro?». Pedirle autoevaluación solo le pide que genere más texto seguro de sí mismo.
BLOQUE 2 · LOOP ENGINEERING
DE PEOR A MEJOR

No todas las señales valen lo mismo

Autoevaluación («¿estás seguro?»)
Inútil.
🟠
Opinión de otro modelo
Sigue siendo opinión.
🟡
Linter / typechecker
Determinista, rápido.
🟢
Test que falla
Determinista y específico.
🔵
Hook que bloquea (exit 2)
Determinista, inmediato, no negociable.

En vez de pedir autoevaluación, gateguard exige hechos concretos antes de dejarte editar: quién importa esto, cuál es el esquema, qué te pidió el usuario. +2,25 puntos de calidad medida frente a agentes sin gate. El acto de investigar crea una consciencia que la autoevaluación nunca creó.

BLOQUE 2 · LOOP ENGINEERING
CONTEXT ENGINEERING: EL COMBUSTIBLE

La ventana no es memoria. Es un presupuesto.

Más contexto ≠ mejor
El contexto irrelevante es ruido que compite con la señal.
El agente no lee tu repo
Lee lo que le pusiste delante. Estándares y specs en el repo son context engineering.
BLOQUE 2 · LOOP ENGINEERING
EL REFRAME

Volved a mirar el kit. No es una bolsa de features.
Es un loop cerrado.

hooks
La señal — determinista, inmediata.
contratos
Las reglas — escritas, versionadas.
Judgment Day
El juez — independiente, y son dos.
validadores CI
El último gate.

Los comandos cambian. Los kits caducan. El loop no. Si os lleváis una cosa, que sea el loop — y hoy os lleváis además el kit que lo implementa.

CHECKPOINT LEADERBOARD #1
☕ PAUSA 1 · 15'

Pausa y marcador

Quince minutos. Al volver: los estándares que bloquean — el primer LAB de la sesión.

BLOQUE 3 DE 8
MISIÓN 1 · +200 XP · BADGE GATEKEEPER

Estándares que bloquean

«Estándar del equipo en el repo» — la primera mitad de lo que os prometí.

3
BLOQUE 3 · ESTÁNDARES QUE BLOQUEAN
POR QUÉ NINGÚN ESTÁNDAR SE CUMPLE

Tres formas de no cumplir

01
La wiki
Nadie la abre.
02
El PR review
Llega tarde y depende de quién revise.
03
La buena voluntad
Se evapora un viernes a las 19:00.

Un estándar que depende de que alguien se acuerde no es un estándar. Es folclore.

BLOQUE 3 · ESTÁNDARES QUE BLOQUEAN
LA CAPA DE GUARDARRAÍLES

Los 8 hooks

HookEventoNivelQué hace¿Probado?
block-no-verifyPreToolUse(Bash)standard+BLOQUEA git commit/push --no-verifybloqueo observado
config-protectionPreToolUse(Edit|Write|MultiEdit)standard+BLOQUEA ediciones a config de linter/formatterbloqueo observado
pre-deploy-guardPreToolUse(Bash)standard+BLOQUEA comandos de deploy hasta pasar la puerta de calidad⬜ sin probar
secret-scanPreToolUseminimal+Avisa de secretos⚠️ no-op si lo escribe Claude
session-startSessionStartminimal+Inyecta contexto vivo: rama, último commit, recordatorio✅ dispara
context-monitorPostToolUse(*)standard+Avisa de scope creep y bucles de herramienta✅ advisory (exit 0 siempre)
post-edit-accumulatePostToolUse(Edit|Write|MultiEdit)standard+Acumula rutas editadas; sin latencia por edición⬜ sin probar
stop-format-typecheckStopstrictFormatea + typechequea UNA vez al cerrar⬜ sin probar

Cuatro de estos estaban muertos hace tres días. Ahora no. Y fijaos en la última columna: tres siguen sin probar, y os lo estoy diciendo. Eso es lo único que distingue esta tabla de la que había en el README.

Distinguid señal de gate: context-monitor y stop-format-typecheck siempre salen 0 — avisan, no paran. Solo tres bloquean de verdad. · ⚠️ secret-scan es no-op si el secreto lo escribe Claude (la clave aterriza en disco; verificado): solo avisa si lo tecleáis vosotros. No lo demostréis como si protegiera — es un agujero real y se cuenta como tal.

BLOQUE 3 · ESTÁNDARES QUE BLOQUEAN
LOS 3 PERFILES

De avisar a parar las manos

PERFIL 01
minimal
Avisos.
PERFIL 02
standard
Bloquea lo grave.
PERFIL 03
strict
+ format y typecheck al salir.

Dato del dry-run: había dos vocabularios (empowered vs strict) y nadie los traducía → --profile empowered no activaba los hooks empowered. Arreglado. Buen ejemplo de «el estándar existía en dos sitios y se contradecían».

BLOQUE 3 · ESTÁNDARES QUE BLOQUEAN
LAB 1 · QUE TE BLOQUEE Y DEMUÉSTRALO · 20'

Haz que te pare.
Y luego prueba que te paró.

# Paso 1 — que te bloquee. La forma IMPORTA: flag al final.
git commit -m "chore: wip" --no-verify   # → exit 2. El commit NO ocurre.

# Paso 2 — NO te lo creas. Demuéstralo. ← AQUÍ ESTÁ EL XP.
git log --oneline -1     # ¿hay commit nuevo? NO.

# Paso 3 — otra vez, con un archivo: pedidle a Claude editar ruff.toml
git diff ruff.toml       # ¿cambió? NO.

# Paso 4 — la trampa del perfil ★ EL MEJOR MOMENTO DEL LAB
export HOOK_PROFILE=minimal   # → NO hace absolutamente nada.

# Paso 5 — el mecanismo real: cambiar el perfil en settings.json
#          → repetir el commit del paso 1 → ahora pasa. Probadlo con git log.

Paso 4, verificado: la shell dice minimal, el hook sigue viendo strict. El gating solo funciona vía settings.json. El modelo mental obvio es falso. «¿Veis? Otra vez. Está documentado como variable de entorno. Nadie lo comprobó nunca. Acabáis de encontrar el séptimo caso, vosotros solos, en directo.»

Nunca git commit --no-verify -m "..." (flag antes del mensaje): lo bloquea permissions.deny por match de prefijo incluso en perfil minimal, y el lab no enseña nada. · ⚠ Honestidad: secret-scan es no-op si el secreto lo escribe Claude. Solo avisa si lo tecleáis vosotros. NO demostrarlo como si protegiera.

BLOQUE 3 · ESTÁNDARES QUE BLOQUEAN
LAB 1 · PASO 6 · RÓMPELO · 5'

Ahora quiero que lo rompáis.

# Paso 6 — RÓMPELO. Cinco minutos. +50 XP al primero que encuentre uno nuevo.
# Bypasses YA endurecidos (verificados pasando ANTES del endurecimiento):
git -c core.hooksPath=/dev/null commit -m "..."   # ← pasaba
printf '...' > ruff.toml                          # ← pasaba (config-protection
                                                #    bloqueaba apply_patch, no la shell)

# Buscad uno NUEVO. Y comprobad por efecto, siempre:
git log --oneline -1

«Ya confiáis en el hook. Lo habéis visto pararos y lo habéis probado en el git log. Ahora quiero que lo rompáis. Tenéis cinco minutos.» Hemos endurecido los bypasses conocidos. Buscad uno nuevo — y lo va a encontrar alguien: es un juego que no se gana.

Paso 7 — ¿y entonces dónde está el gate? «Acabáis de derrotar vuestro propio guardarraíl en cinco minutos. Y gpt-5.4-mini lo hizo sin que nadie se lo pidiera — solo le dijimos que commiteara. ¿Dónde está el gate de verdad?» Respuesta: donde el agente no llega. CI. Branch protection. Checks obligatorios en el servidor. Los hooks cazan el error honesto — el --no-verify que tecleáis por costumbre a las 19:00 un viernes. No paran a un agente decidido, y no pretenden hacerlo.

No es un aviso. Es un exit 2: la acción no ocurre. Pero no me creáis a mí tampoco — miradlo en el git log. Hoy ya hemos visto a Claude jurar que un hook lo paró cuando el hook ni siquiera existía… y al minuto siguiente, saltárselo sin avisar.

✅ Verificado: una sesión NUEVA tras --apply no necesita reinicio; una ya abierta, sin verificar → asumir reinicio. · Esta lista se reparte impresa — es el reto del paso 6 y el material más honesto del deck.

BLOQUE 3 · ESTÁNDARES QUE BLOQUEAN
LO QUE ACABÁIS DE HACER

«Os enseñé que era no negociable.
Lo habéis negociado en cinco minutos.»

Hace una hora os puse una jerarquía de señales y os dije que el escalón 5 — el hook con exit 2 — era no negociable. Me lo creía. Acabáis de demostrarme que estaba mal, con las manos, en cinco minutos. Eso que os acaba de pasar es exactamente lo que nos ha pasado con este kit durante dos días. Yo declaro. Vosotros verificáis. Se cae.

--no-verify
exit 2
-n
exit 2
core.hooksPath=/dev/null
exit 0(el 15 de julio. Hoy: exit 2 — lo arreglamos anoche)

Los dieciocho casos de esta mañana eran declarado pero no verificado. Este es una clase nueva, y es peor: verificado — pero verificando lo que no era. El hook SÍ bloquea --no-verify. Probado, observado, real. Y no sirve de nada, porque matchea la ortografía, no el efecto.

Y no fuimos nosotros los primeros: gpt-5.4-mini, en un fixture limpio, bloqueado en --no-verify, usó git -c core.hooksPath=/dev/null por iniciativa propia y commiteó. Nadie le pidió que lo rodeara. · El modelo no era adversario. Era obediente. Le dijimos «commitea». El guardarraíl estaba entre él y el objetivo que le dimos nosotros. Rodearía un test que falla con la misma naturalidad. · Y no se arregla añadiendo hooksPath a la lista — whack-a-mole, siempre hay otra ortografía. Un hook ve una llamada a herramienta, no una syscall. El techo es estructural.

BLOQUE 3 · ESTÁNDARES QUE BLOQUEAN
AHORA SÍ

Solo hay un gate que no se negocia

La jerarquía no tiene un eje. Tiene tres, y los tres los hemos pagado con cicatrices.

1
¿Mira la FORMA o el COMPORTAMIENTO?
❌ Autoevaluación — ni forma · 🟠 Opinión de otro modelo — opinión · 🟡 Linter / typechecker / validadores estáticossolo FORMA · 🟢 Test de comportamiento — el único que ve la verdad.

«Todos los defectos que importaban eran texto bien formado, que parsea, que resuelve, y que estaba mal. Tres de nuestros ocho validadores parseaban cero archivos y decían OK.»
2
¿Lo alcanza el agente?
Hook en tu máquina → badén. Lo rodea — lo habéis hecho vosotros hace diez minutos.

Check en el servidor → gate. No corre en su máquina; no puede tocarlo.
3
¿Lo has visto fallar alguna vez?
Verde que nadie vio en rojo → decoración. Nuestra suite estuvo verde a través de 40 errores.

Verde que has visto ponerse rojo → señal.

«Un hook que deniega todo saca 100% si solo lo pruebas con ataques. Por eso hacen falta controles negativos.»

La única señal que vale es un test de comportamiento, que corre donde el agente no llega, y que has visto fallar. Falla uno de los tres ejes y tenéis decoración. Nosotros fallábamos los tres, y el kit decía 8 de 8.

El dato que lo sostiene: de los ~20 defectos reales de este kit, la suite estática arreglada cazaría 4. Los otros 16, no. test:guardrails y test:cursor — dos suites de comportamiento — valen más que los ocho validadores juntos. · Los 8 validadores de CI no son el cinturón, son el airbag. · Los hooks no sobran: cazan el --no-verify de un viernes a las 19:00. Eso lo hacen bien. Lo que no hacen es lo que yo os dije hace una hora.

BLOQUE 3 · ESTÁNDARES QUE BLOQUEAN
EL LUNES

Elegid vuestro perfil

  • Decisión de equipo, no del formador: qué HOOK_PROFILE va al repo.
  • Va commiteado.
  • Se discute en PR como cualquier otra cosa.

No os voy a decir cuál. Es vuestro repo y vuestras guardias. Pero elegidlo explícitamente — no por defecto.

Verificado hoy, y os va a morder: si volvéis a lanzar --apply (para actualizar el kit), el instalador reescribe env.HOOK_PROFILE al valor del perfil que le paséis. Puse minimal a mano, relancé --apply --profile empowered, y volvió a strict sin avisar. Vuestras claves propias en settings.json sí sobreviven — se hace merge, no clobber. Pero la del perfil no. Otra más: estaba declarado como «idempotente», y en disco no lo es.

LIGA SDD · TEMPORADA FINAL
MISIÓN 1 COMPLETADA

🚧 Gatekeeper

+200XP Misión 1
🚧Badge Gatekeeper

Bonus disponible: +50 XP si haces que un hook te bloquee y sabes explicar por qué.

BLOQUE 4 DE 8
MISIÓN 2 · +250 XP · BADGE AGENT MAKER

Tu primer agente

La segunda mitad de lo que os prometí. Y lo único de hoy que no os doy yo.

4
BLOQUE 4 · TU PRIMER AGENTE
ANTES DE EMPEZAR, UNA PALABRA

«Os prometí tu primer agente. Vamos a construirlo.
Y os voy a quitar la palabra.»

Lo que vais a escribir en veinticinco minutos es un markdown con frontmatter. Claude Code lo despacha, le da un contexto en blanco, le deja unas herramientas concretas, y cuando devuelve su respuesta se muere. No tiene loop propio. No tiene memoria entre invocaciones. No se despliega. No se despierta solo. Vive dentro del loop de Claude.

Llevamos toda la tarde cazando cosas que decían ser lo que no eran. Pues bien: esto es una de ellas, y está en la portada de mi propio deck.

LO QUE NO ES

❌ No es autónomo · no persiste · no tiene loop propio · no se despliega · no se programa · no ficha.

LO QUE SÍ ES

✅ Un rol especializado que Claude adopta · con contexto fresco · y herramientas restringidas.

Es un especialista al que Claude llama. No un empleado que ficha.

BLOQUE 4 · TU PRIMER AGENTE
LO QUE SÍ TENÉIS

Su poder no es lo que puede hacer.
Es lo que NO puede.

01
Contexto fresco
No arrastra el ruido de la conversación padre. Eso es context engineering, del bloque 2, aplicado.
02
Herramientas restringidas
No puede tocar lo que no le diste. Es un sub-loop más pequeño y más pobre, y por eso es fiable.
03
Conocimiento que no está en el repo
Vuestra trampa de dominio, vuestro bug de marzo.

Un sub-agente es un loop dentro de otro loop, con menos contexto y menos manos. Todo lo del bloque 2 vale aquí: ¿cuál es su señal? ¿la ve? ¿cuándo para? Solo que ahora el que diseña el loop sois vosotros.

Por eso tools es la decisión más importante del frontmatter — no es una lista de permisos, es el tamaño del loop.

BLOQUE 4 · TU PRIMER AGENTE
EL ROSTER

Los 10 agentes

YA LOS CONOCÍAIS
  • backend-developer
  • frontend-developer
  • product-strategy-analyst
NUEVOS
  • jd-judge-a · jd-judge-b · jd-fix-agent
  • spec-miner · code-explorer
  • planner · tdd-guide
BLOQUE 4 · TU PRIMER AGENTE
ANATOMÍA DE UN AGENTE

Un markdown con frontmatter. Eso es todo.

# .claude/agents/capacity-reviewer.md
---
name: capacity-reviewer
description: Revisa cambios en el cálculo de capacidad de red.
model: sonnet
tools: ["Read", "Grep", "Glob", "Bash"]
---

# Conocimiento de dominio que no está en ninguna wiki:
# - Las fuentes mezclan MW y kW. REE publica MW; las distribuidoras, kW.
# - El bug de marzo: un factor 1000 se coló por no normalizar en ingesta.
# - NUNCA aprobar cambios en capacity_readings sin test de regresión.
name
Cuándo se invoca.
description
Cómo se autoselecciona.
model
Cuánto cerebro merece.
tools
Qué NO puede hacer. ← la más importante.

Esto no es magia. Es un markdown. Lo que lo hace potente no es el modelo — es que vosotros sabéis qué preguntar y la wiki no.

Esquema verificado el 2026-07-16 contra los 20 agentes del kit y los 40 globales: name (20/20 · 40/40) · description (20/20 · 40/40) · tools (19/20 · 40/40, formato ["Read", "Grep"]) · model (20/20 · 30/40). Cuatro claves, ni una más. color es cosmético. metadata y license son convención del kit, no de Claude Code. No inventéis claves.

BLOQUE 4 · TU PRIMER AGENTE
LA DIFERENCIA

El agente bueno vs el inútil

Inútil
«revisa mi código y dime si está bien». Eso ya lo hace Claude sin agente.
Bueno
Codifica el bug que os comisteis, la convención no escrita, la trampa del dominio, el paso que siempre se olvida. Conocimiento tribal → ejecutable.

El mejor agente que vais a escribir hoy sale de una pregunta: ¿qué le explico a cada dev nuevo que entra, una y otra vez?

BLOQUE 4 · TU PRIMER AGENTE
LAB 2 · TU AGENTE · 25'

Escribid el vuestro. Ahora.

01
Pensad en la tarea recurrente que más os aburre, o el error que más se repite
02
Escribid .claude/agents/<vuestro-agente>.md a mano
Las 4 claves, ni una más.
03
Restringid tools al mínimo
Es el tamaño del loop, no una lista de permisos.
04
Metedle el conocimiento que no está en ningún sitio
05
/agents → ¿aparece en la Library? ← verificad por efecto
Habéis escrito un archivo; no os creáis que funciona: comprobad que ha cargado.
06
Invocadlo en vuestro repo
07
Pasádselo al de al lado (+30 XP si le funciona)

Paso 5: «Esto es el bloque 2 aplicado a vuestro propio trabajo. Escribir el archivo es declarar. Verlo en la Library es verificar. Son cosas distintas, y llevamos toda la tarde pagando la diferencia. Hoy hemos visto a Claude jurar que un hook lo bloqueó cuando el hook no existía — y negar que unos agentes hubieran cargado cuando sí. No os creáis el archivo: miradlo.»

Cada uno se lleva un agente escrito por sí mismo. Ese es el entregable real de hoy — el kit os lo doy yo, el agente lo escribís vosotros.

/agents existe, pero desde la v2.1.198 ya NO abre asistente de creación — es un visor. No prometáis un wizard: no lo hay. Y eso mejora el lab: el asistente les habría escondido la anatomía y saltado la verificación.

BLOQUE 4 · TU PRIMER AGENTE
EL SIGUIENTE PASO

Del agente personal al agente del equipo

  • El que funcione → al repo.
  • Lo hereda quien entre.
  • .claude/agents/ está versionado.

Un agente en tu portátil es un truco. Un agente en el repo es una decisión de equipo.

LIGA SDD · TEMPORADA FINAL
MISIÓN 2 COMPLETADA

🤖 Agent Maker

+250XP Misión 2
🤖Badge Agent Maker

Bonus disponible: +30 XP si tu agente lo usa otro dev y le funciona.

CHECKPOINT LEADERBOARD #2
☕ PAUSA 2 · 15'

Pausa y marcador

Quince minutos. Los dos labs ya están hechos. Lo que queda es lo que hace que el sistema se sostenga solo.

BLOQUE 5 DE 8
MISIÓN 3 · +100 XP · BADGE SPEC MINER

El código que ya tenéis

SDD asume que empezáis de cero. Vosotros no empezáis de cero.

5
BLOQUE 5 · /SPEC-MINE
EL ELEFANTE EN LA SALA

Miles de líneas, cero specs

En la S2 hicimos SDD sobre un ticket nuevo, en verde. Perfecto. Pero onedev-grid-service ya existe. Miles de líneas, cero specs. ¿Las escribís a mano? ¿Los ocho? ¿Este trimestre?

QUÉ HACE SPEC-MINER
  • Lee el código → extrae specs de comportamiento
  • Escribe en openspec/specs/<capability>/spec.md
  • Metadatos parseables + ancla Last verified: <git-hash>
SUS LÍMITES SON EL PUNTO
  • Write sandboxeado a esa ruta y solo a esa ruta
  • Bash solo lectura
  • Es lo único del kit que ataca el código que ya tenéis. Todo lo demás asume campo verde.
BLOQUE 5 · /SPEC-MINE
DEMO EN VIVO + FALSAR · 12'

La spec generada no es la verdad.
Es una hipótesis.

FORMADOR · 8'

Lanza /spec-mine dedup-sha256 sobre la deduplicación por SHA-256 — la que construisteis vosotros en la Sesión 2 (ONEDEV-218). En vivo.

ELLOS · 10'

Reciben la spec generada. Trabajo: falsarla contra el código. ¿Dónde se equivocó el agente? +50 XP al que encuentre un error real.

🎯 Por qué esa y no otra: esa spec la escribisteis vosotros a mano hace un mes. Tenéis la verdad de referencia en la cabeza. No estáis falsando a ciegas: estáis viendo qué entendió la máquina de algo que vosotros mismos especificasteis. En la S2 escribisteis la spec y de ahí salió el código; hoy la máquina lee el código y os devuelve la spec. Vamos a ver si coinciden.

Vuestro trabajo no es ejecutar el comando — eso lo hace cualquiera. Vuestro trabajo es no creéroslo. La corrección que hagáis es vuestro conocimiento de dominio entrando al repo.

Por qué demo y no lab: 5–10 min por run × 8 devs = rate limits de Opus (medido en el dry-run) + espera muerta. Falsar es la habilidad valiosa, no teclear.

BLOQUE 5 · /SPEC-MINE
EL LUNES

Una capability por sprint

01
Elegid la que más duele
02
/spec-mine
03
Falsad y corregid
04
PR
05
Esa parte del repo ya tiene contrato ejecutable
06
Repetid

No minéis el repo entero. Nadie revisa 40 specs. Una por sprint, la que más duele. En seis meses tenéis el sistema documentado por el propio sistema.

Misión 3 completada · +100 XP · ⛏️ Spec Miner — Bonus: +50 XP si encuentras un error real en la spec minada.

BLOQUE 6 DE 8
MISIÓN 4 · +150 XP · BADGE DOBLE CIEGO

Judgment Day

El boss fight de la S2 tenía un agujero. Hoy lo tapamos.

6
BLOQUE 6 · JUDGMENT DAY
LA CONFESIÓN #2

«La IA no puede corregir
su propio examen.»

En la S2 os enseñé /adversarial-review. Un juez, una pasada. Estaba bien. Tenía un agujero.

BLOQUE 6 · JUDGMENT DAY
EL AGUJERO

Tres razones por las que un juez no basta

01
Un juez tiene un ángulo
Encuentra lo que su prompt le hace mirar. Lo que no mira, no existe.
02
Una pasada no converge
Arregla los findings… ¿y quién revisa el arreglo? Nadie.
03
Sin contraste no hay confianza
Si nadie contradice, no sabes si el finding es real o el modelo se lo inventó para parecer útil.

Conecta con el Bloque 2: esto es señal blanda — capa 2 de la jerarquía. Opinión de un modelo.

BLOQUE 6 · JUDGMENT DAY
DOS JUECES CIEGOS

Solo se actúa si los dos coinciden

01
jd-judge-a y jd-judge-b revisan en paralelo e independientemente
Ninguno ve los findings del otro.
02
Un finding solo se acciona si ambos lo confirman
Si solo lo ve uno → ruido, se descarta.
03
jd-fix-agent aplica únicamente los confirmados
No improvisa.
04
Los jueces vuelven a revisar tras el fix
05
Loop hasta que no queda nada confirmado

Mirad lo que acaba de pasar: convertimos una opinión (capa 2) en algo parecido a una señal (capa 4). No porque el modelo sea mejor — porque el loop es mejor. Mismo modelo. Mejor loop. Eso es todo lo que os quería enseñar hoy, y está aquí, en un comando.

DEMO conducida: un run real. Enseñar findings de A, findings de B, la intersección, y qué se cae.

BLOQUE 6 · JUDGMENT DAY
CUÁNDO VALE LA PENA

Pagas tokens, compras confianza

Vale
Difícil de revertir, toca dinero/datos/auth, nadie domina esa zona. Pagas tokens, compras confianza.
Es quemar tokens
Un typo, un copy, un rename mecánico.

Regla: >400 líneas → chained-pr primero, después juzgas cada slice. Un juez frente a un diff gigante es un juez que no lee.

Misión 4 completada · +150 XP · 👁️ Doble Ciego — Bonus: +50 XP si Judgment Day sale con 0 findings confirmados sobre tu código.

BLOQUE 7 DE 8
MISIÓN 5 · +100 XP · BADGE NÓMADA

¿Y si mañana cambiamos de herramienta?

La pregunta que os va a hacer vuestro manager. Y hoy la vais a saber contestar.

7
BLOQUE 7 · PORTABILIDAD
LA MATRIZ

El mismo kit, cinco herramientas

HarnessArchivos en discoGuardarraílesSlash commands
Claude Code102Hooks vivos que bloquean
Cursor87Hooks vivos que bloqueanNo
OpenCode94Hooks vivos que bloquean
Gemini71Reglas + CI (advisory)No
Codex71Reglas + CI (advisory)No

Mismo kit. Mismo estándar. Mismo modelo. Y en Gemini se convierte en un consejo. ¿Veis por qué llevo toda la tarde insistiendo con la señal dura? Aquí lo tenéis medido en cinco herramientas. La línea divisoria no es la marca — es si el harness te deja poner un gate que bloquee.

Medido hoy, instalador real, perfil empowered, sobre fixtures desechables. Las cifras que llevaba en las notas (85·75·90·68·69) estaban todas caducadas: los adaptadores cambiaron después. · Y ojo con lo que esta tabla NO dice: es lo que el instalador proyecta — las tres últimas columnas salen de los skips que el propio adaptador declara («Gemini CLI: no live hooks»). No hemos ejecutado Gemini (sin autenticar) ni el dispatch de Cursor en el IDE. Proyección verificada ≠ runtime verificado. Os lo digo yo antes de que me lo preguntéis vosotros.

BLOQUE 7 · PORTABILIDAD
LA VERDAD SIN MARKETING

Qué sobrevive, qué degrada, qué muere

Sobrevive — los 5
El core/ neutro: skills, agentes, contratos, estándares y los 8 validadores de CI. Son markdown y Node: no dependen del harness. El airbag viaja entero.
⚠️
Degrada — Cursor, Gemini, Codex
Los slash commands no existen (el instalador los salta: «no slash command support»). El contenido llega igual — vía AGENTS.md, GEMINI.md o .cursor/rules/*.mdc — pero lo invocáis a mano.
💀
Muere — Gemini y Codex
Los hooks vivos. El adaptador ni los escribe: «Gemini CLI: no live hooks». El estándar se convierte en un consejo y lo único que puede pararos es el CI. De 102 archivos a 71.

Fijaos en qué se cae y qué no: se cae el badén, nunca el gate. Los validadores de CI llegan intactos a las cinco herramientas porque no corren en la máquina del agente. Es la slide 30c otra vez, ahora medida en cinco productos distintos.

Contexto persistente, verificado por lo que se escribe en disco: CLAUDE.md (Claude Code) · AGENTS.md + .cursor/rules/ (Cursor) · AGENTS.md + opencode.json (OpenCode) · GEMINI.md (Gemini) · AGENTS.md (Codex). Equipo mixto: el estándar es el mismo archivo para todos; lo que cambia es quién lo puede hacer cumplir. · ⚠ Esto es proyección verificada, no runtime: Gemini no se ha ejecutado (sin autenticar) y el dispatch de Cursor en el IDE está sin verificar. Lo demás sale de correr el instalador de verdad.

BLOQUE 7 · PORTABILIDAD
MINI-LAB · 5' DE TECLADO + DISCUSIÓN

Cuenta qué perderías

--dry-run contra el harness que elijas, sobre tu repo. Cuenta qué perderías. Cinco minutos de teclado y lo discutimos.

# Cambiad solo --harness. Nunca contra un repo de verdad sin --dry-run.
node scripts/install.js --harness gemini --profile empowered --target <repo> --dry-run

# Archivos en disco por harness (medidos hoy, no leídos del README):
#   claude-code 102 · opencode 94 · cursor 87 · gemini 71 · codex 71
# La pregunta no es cuántos archivos pierdes. Es CUÁL de ellos.

Misión 5 · +100 XP · 🧳 Nómada — Bonus: +20 XP si identificas exactamente qué perderías al migrar de harness. · Las cifras que traía este deck (85·75·90·68·69) eran de antes de tocar los adaptadores: caducadas las cinco. Estas son de hoy.

BLOQUE 8 · CIERRE
EL LOOP COMPLETO, YA MONTADO

Ocho comandos, un loop cerrado

intención/enrich-us/new + /ff/applyhooks              # señal inmediata/judgment-day      # juez independiente/verify            # contra la specvalidadores CI     # el último gate/archive + /commitPARA

Ocho comandos. No os los aprendáis — los comandos cambian. Aprendeos las cuatro preguntas: ¿cuál es mi señal? ¿llega rápido? ¿es dura o blanda? ¿cuándo paro?

BLOQUE 8 · CIERRE
EL PROBLEMA DE LA PARADA

¿Cuándo para?

01
Condición explícita
Tests verdes, validadores en 0, jueces sin findings.
02
Presupuesto
Tokens, iteraciones, tiempo.
03
Detección de bucle
context-monitor.

La autonomía no se gana con confianza. Se gana con gates.

LIGA SDD · TEMPORADA FINAL
PODIO FINAL DEL PROGRAMA

Acumulado S2 + S3

800XP Base S3
5Badges S3
8Certificados
  • Leaderboard acumulado S2 + S3.
  • Badges.
  • Certificados para los 8.
×
PRÓXIMOS PASOS
El sistema
que ya es vuestro

El kit instalado en onedev-grid-service con perfil elegido por el equipo · una capability minada y falsada · ocho agentes escritos por vosotros. El lunes: decidid el HOOK_PROFILE del equipo y commiteadlo — es decisión vuestra. Este sprint: una capability con /spec-mine. Este trimestre: los agentes que funcionen, al repo.

1 · El lunes: HOOK_PROFILE del equipo, commiteado 2 · Este sprint: una capability con /spec-mine 3 · Este trimestre: los agentes que funcionen, al repo Digital Tools · One Hub Energy