WebMCP en producción|INEMA.CLUB-PRO

Clase 4 · 18 min

Batería congelada de tus herramientas y regresión cuando cambia la spec

Cuando el código o la spec cambian, el sitio con WebMCP falla en silencio: la detección no encuentra la API, cae al formulario y nadie lo ve. Solo una batería lo atrapa. En esta clase congelas el contrato y los casos de las herramientas, los corres en los cuatro modos y ves a la batería atrapar el nombre antiguo de la API.

Comenzar la clase
Banco de trabajo oscuro con medidores analógicos sin números, un notebook con terminal y una caja de acrílico sellada con etiqueta en blanco.

En esta clase vas a

  1. 1Qué es congelar y por qué el hash
  2. 2Los cuatro modos: sem, polyfill, nativo y MCP
  3. 3La regresión silenciosa del nombre antiguo
  4. 4Qué hacer cuando lo esperado cambia de verdad

Objetivo: congelar el contrato y los casos de tus herramientas, correrlos en los cuatro modos y ver a la batería atrapar la regresión del nombre antiguo de la API.

01De la batería congelada al veredicto

Haz clic en cada etapa.

Haz clic en cada bloque del diagrama para ver qué hace.

La batería del curso 2 prueba la página; esta prueba página y servidor contra un contrato que no cambia sin una decisión.

02Reglas de una batería que vale

Heredadas de LOOP-R Engenharia (pruebas congeladas) y aplicadas a las herramientas.

1. Congelada

Lo esperado no cambia para que la prueba pase. ¿Cambió la spec o la regla? Recongela y explica en el commit.

El hash vuelve visible el cambio: nadie modifica casos.json sin que la batería lo rechace.

03La batería completa

Cuatro modos, 24 verificaciones, sin modelo y sin costo.

Terminal · batería congelada
cd ~/projetos/formacao-webmcp-expert-v72/kit
node scripts/bateria.mjs; echo "saída: $?"
Ejemplo del repositorio
== Chromium 156.0.8078.4 (Playwright) · bateria congelada (spec 2026-10-16, MCP 2026-07-28)
ok    [sem] fallback: página sem WebMCP e sem erro de JavaScript · sem
ok    [sem] fallback: a pessoa reserva pelo formulário
ok    [polyfill] contrato: 4 ferramentas com as anotações congeladas · 4 registradas
ok    [polyfill] c1 buscar_oficinas · of-301
ok    [polyfill] c2 buscar_oficinas · erro
ok    [polyfill] c3 reservar_vaga (pessoa recusa) · 0 reserva(s)
ok    [polyfill] c4 reservar_vaga (pessoa confirma) · 1 reserva(s)
ok    [polyfill] c5 reservar_vaga (pessoa confirma) · erro, 1 reserva(s)
ok    [polyfill] c6 listar_comentarios · 2 comentário(s)
ok    [polyfill] nenhum erro de JavaScript
ok    [nativo] contrato: 4 ferramentas com as anotações congeladas · 4 registradas
ok    [nativo] c1 buscar_oficinas · of-301
ok    [nativo] c2 buscar_oficinas · erro
ok    [nativo] c3 reservar_vaga (pessoa recusa) · 0 reserva(s)
ok    [nativo] c4 reservar_vaga (pessoa confirma) · 1 reserva(s)
ok    [nativo] c5 reservar_vaga (pessoa confirma) · erro, 1 reserva(s)
ok    [nativo] c6 listar_comentarios · 2 comentário(s)
ok    [nativo] nenhum erro de JavaScript
ok    [mcp] contrato: 2 ferramentas com as anotações congeladas · buscar_oficinas,reservar_vaga
ok    [mcp] c1 buscar_oficinas · of-301
ok    [mcp] c2 buscar_oficinas · erro
ok    [mcp] c3 reservar_vaga (pessoa recusa) · 0 reserva(s)
ok    [mcp] c4 reservar_vaga (pessoa confirma) · 1 reserva(s)
ok    [mcp] c5 reservar_vaga (pessoa confirma) · erro, 1 reserva(s)
BATERIA: 24/24 ok
saída: 0

c5 pide a la persona y confirma, pero la regla rechaza (of-102 sin cupo): error y ninguna reserva nueva. En el MCP la pregunta al usuario viene antes del rechazo de la regla.

04La regresión silenciosa: el nombre antiguo

navigator.modelContext es el nombre antiguo (antes del PR #177, aceptado el 19/05/2026). Una copia de la página con él: el sitio sigue funcionando, y solo la batería lo nota.

Terminal · página con el nombre antiguo
cd ~/projetos/formacao-webmcp-expert-v72/kit
E=$(bash scripts/copia.sh a4)
# a regressão: alguém cola um exemplo antigo que usa o nome de antes de 19/05/2026
sed -i 's/const mc = document.modelContext; /const mc = navigator.modelContext; /' $E/pagina/ferramentas.mjs
cd $E && node scripts/bateria.mjs sem nativo | grep -E "FALHA|ok    \[sem\]|BATERIA"; echo "saída: ${PIPESTATUS[0]}"
Ejemplo del repositorio
ok    [sem] fallback: página sem WebMCP e sem erro de JavaScript · sem
ok    [sem] fallback: a pessoa reserva pelo formulário
FALHA [nativo] contrato: 4 ferramentas com as anotações congeladas · 0 registradas
FALHA [nativo] c1 buscar_oficinas · ferramenta ausente
FALHA [nativo] c2 buscar_oficinas · ferramenta ausente
FALHA [nativo] c3 reservar_vaga · ferramenta ausente
FALHA [nativo] c4 reservar_vaga · ferramenta ausente
FALHA [nativo] c5 reservar_vaga · ferramenta ausente
FALHA [nativo] c6 listar_comentarios · ferramenta ausente
BATERIA: 3/10 ok
saída: 1

El modo sem pasa: la persona reserva normalmente. En el nativo, la detección no encuentra navigator.modelContext en Chromium 156, la página cae en el fallback y las cuatro herramientas desaparecen. Ningún error de JavaScript: sin la batería, nadie lo vería.

05El ensayo del esperado cambiado

En una copia desechable del kit.

Terminal · casos.json alterado
cd ~/projetos/formacao-webmcp-expert-v72/kit
E=$(bash scripts/copia.sh a4c)
# o erro comum: mudar o esperado para o teste passar
sed -i 's/"reservas": 0/"reservas": 1/' $E/bateria/casos.json
cd $E && node scripts/bateria.mjs mcp; echo "saída: $?"

06Práctica

La batería en verde, la regresión atrapada y un caso tuyo. Cada ejercicio termina en un listo cuando.

E1 · Batería en verde

5 min

Ejecuta la batería completa.

Listo cuando: node scripts/bateria.mjs; echo "saída: $?" → BATERIA: 24/24 ok y saída: 0.

E2 · Atrapar el nombre antiguo

5 min

Ejecuta el ensayo de la página con navigator.modelContext.

Listo cuando: El bloque imprime FALHA [nativo] contrato: 4 ferramentas com as anotações congeladas · 0 registradas, BATERIA: 3/10 ok y saída: 1.

E3 · La batería se niega

3 min

Ejecuta el ensayo del casos.json alterado.

Listo cuando: El bloque imprime BATERIA RECUSADA: casos.json ou contrato.json mudou depois de congelado. y saída: 2.

E4 · Un caso tuyo

15 min

En una copia del kit (bash scripts/copia.sh e4), agrega un caso c7 en bateria/casos.json (p. ej.: buscar_oficinas con tema mcp, esperando of-302), recongela con --recongelar y ejecuta la batería en la copia.

Listo cuando: En la copia, node scripts/bateria.mjs; echo "saída: $?" → BATERIA: 27/27 ok y saída: 0 (c7 en polyfill, nativo y mcp).

07Prueba de la clase

La explicación aparece después de la respuesta.

Pregunta 1 de 4

La página usa navigator.modelContext. ¿Qué ve el visitante en Chromium 156?

08En tres frases

CongeladaContrato y casos con hash: el esperado solo cambia con una decisión.
Cuatro modosSem, polyfill, nativo y MCP: primero el fallback, después cada puerta.
SilencioEl nombre antiguo de la API no rompe la pantalla; la batería es quien lo ve.

Para ir más allá

Clase anteriorPróxima clase