E1 · Bateria verde
5 minRode a bateria completa.
Pronto quando: node scripts/bateria.mjs; echo "saída: $?" → BATERIA: 24/24 ok e saída: 0.
Aula 4 · 18 min
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
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.
Clique em cada etapa.
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.
Herdadas da LOOP-R Engenharia (testes congelados) e aplicadas às ferramentas.
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.
Os casos chamam as ferramentas direto (executeTool, tools/call), como um agente faria.
Nada de modelo no circuito: o mesmo código dá o mesmo veredito.
A rodada sem API prova que a pessoa reserva pelo formulário.
É a primeira linha da bateria, antes de qualquer agente.
Spec nova, Chrome novo ou SDK novo: rode a bateria antes de tudo.
A vigia da aula 6 avisa quando é hora.
vigia acusa → bateria → ler o que mudou → corrigir ou recongelar com motivo
Quatro modos, 24 verificações, sem modelo e sem custo.
cd ~/projetos/formacao-webmcp-expert-v72/kit node scripts/bateria.mjs; echo "saída: $?"
== 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.
BATERIA RECUSADA: casos.json ou contrato.json mudou depois de congelado. Se o esperado mudou de verdade (spec nova, regra nova), rode --recongelar e explique no commit. saída: 2
Alguém trocou "reservas": 0 por 1 no caso c3 para "o teste passar". A bateria nem roda: o hash não bate com bateria/CONGELADA e a saída é 2.
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.
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]}"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.
Numa cópia descartável do kit.
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: $?"
A bateria verde, a regressão pega e um caso seu. Cada exercício termina num pronto quando.
Rode a bateria completa.
Pronto quando: node scripts/bateria.mjs; echo "saída: $?" → BATERIA: 24/24 ok e saída: 0.
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.
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.
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).
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?
Pergunta 2 de 4
Para que serve o arquivo bateria/CONGELADA?
Pergunta 3 de 4
Por que a bateria roda o modo sem antes dos outros?
Pergunta 4 de 4
A spec mudou e a anotação esperada de uma ferramenta passou a ser outra. O certo é:
Escolha uma alternativa. A explicação aparece depois da sua tentativa.