WebMCP em produção|INEMA.CLUB-PRO

Aula 4 · 18 min

Bateria congelada das suas ferramentas e regressão quando a spec muda

Quando o código ou a spec mudam, o site com WebMCP falha em silêncio: a detecção não acha a API, cai no formulário e ninguém vê. Só uma bateria pega. Nesta aula você congela o contrato e os casos das ferramentas, roda nos quatro modos e vê a bateria pegar o nome antigo da API.

Começar a aula
Bancada escura com medidores analógicos sem números, um notebook com terminal e uma caixa de acrílico lacrada com etiqueta em branco.

Nesta aula você vai

  1. 1O que é congelar e por que o hash
  2. 2Os quatro modos: sem, polyfill, nativo e MCP
  3. 3A regressão silenciosa do nome antigo
  4. 4O que fazer quando o esperado muda de verdade

Objetivo: congelar contrato e casos das suas ferramentas, rodar nos quatro modos e ver a bateria pegar a regressão do nome antigo da API.

01Da bateria congelada ao veredito

Clique em cada etapa.

Clique em cada bloco do diagrama para ver o que ele faz.

A bateria do curso 2 testa a página; esta testa página e servidor contra um contrato que não muda sem decisão.

02Regras de uma bateria que vale

Herdadas da LOOP-R Engenharia (testes congelados) e aplicadas às ferramentas.

1. Congelada

O esperado não muda para o teste passar. Mudou a spec ou a regra? Recongele e explique no commit.

O hash torna a mudança visível: ninguém altera casos.json sem a bateria recusar.

03A bateria completa

Quatro modos, 24 verificações, sem modelo e sem custo.

Terminal · bateria congelada
cd ~/projetos/formacao-webmcp-expert-v72/kit
node scripts/bateria.mjs; echo "saída: $?"
Exemplo do repositório
== 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 pede a pessoa e confirma, mas a regra recusa (of-102 sem vaga): erro e nenhuma reserva nova. No MCP a pergunta ao usuário vem antes da recusa da regra.

04A regressão silenciosa: o nome antigo

navigator.modelContext é o nome antigo (antes do PR #177, aceito em 19/05/2026). Uma cópia da página com ele: o site continua funcionando, e só a bateria percebe.

Terminal · página com o nome antigo
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]}"
Exemplo do repositório
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

O modo sem passa: a pessoa reserva normalmente. No nativo, a detecção não acha navigator.modelContext no Chromium 156, a página cai no fallback e as quatro ferramentas somem. Nenhum erro de JavaScript: sem a bateria, ninguém veria.

05O ensaio do esperado mudado

Numa cópia descartável do 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ática

A bateria verde, a regressão pega e um caso seu. Cada exercício termina num pronto quando.

E1 · Bateria verde

5 min

Rode a bateria completa.

Pronto quando: node scripts/bateria.mjs; echo "saída: $?" → BATERIA: 24/24 ok e saída: 0.

E2 · Pegar o nome antigo

5 min

Rode o ensaio da página com navigator.modelContext.

Pronto quando: O bloco imprime FALHA [nativo] contrato: 4 ferramentas com as anotações congeladas · 0 registradas, BATERIA: 3/10 ok e saída: 1.

E3 · A bateria se recusa

3 min

Rode o ensaio do casos.json alterado.

Pronto quando: O bloco imprime BATERIA RECUSADA: casos.json ou contrato.json mudou depois de congelado. e saída: 2.

E4 · Um caso seu

15 min

Numa cópia do kit (bash scripts/copia.sh e4), acrescente um caso c7 em bateria/casos.json (ex.: buscar_oficinas com tema mcp, esperando of-302), recongele com --recongelar e rode a bateria na cópia.

Pronto quando: Na cópia, node scripts/bateria.mjs; echo "saída: $?" → BATERIA: 27/27 ok e saída: 0 (c7 em polyfill, nativo e mcp).

07Teste da aula

A explicação aparece depois da resposta.

Pergunta 1 de 4

A página usa navigator.modelContext. O que o visitante vê no Chromium 156?

08Em três frases

CongeladaContrato e casos com hash: o esperado só muda com decisão.
Quatro modosSem, polyfill, nativo e MCP: o fallback primeiro, depois cada porta.
SilêncioNome antigo da API não quebra a tela; a bateria é o que vê.

Para ir além

Aula anteriorPróxima aula