E7 · Conserte o cancelamento
15 minPonha consequentialHint e a confirmação em cancelar_agendamento e rode o bloco checar depois.
Pronto quando: RESULTADO: 0 falhas e saída: 0.
Aula 3 · 18 min
Reservar, cancelar, pagar, apagar. O agente pode escolher a ferramenta errada, entender mal a descrição ou obedecer a um texto plantado. A spec do WebMCP responde com consequentialHint, para o cliente exigir confirmação. Nesta aula você põe a anotação e a confirmação do próprio site, e prova que recusar não muda nada.
Começar a aula
Objetivo: pôr consequentialHint e uma confirmação com alvo e efeito em toda ferramenta que muda algo, e provar que recusar não muda nada.
Clique em cada etapa.
A anotação é para o cliente; a confirmação é sua. Uma não substitui a outra.
A pergunta diz o que, de quem e o que acontece depois. "Tem certeza?" não serve: a pessoa não sabe o que está aprovando.
Uma pergunta por chamada, com os argumentos daquela chamada. Se o alvo mudar, é outra pergunta. Nunca um "sim" que vale para as próximas.
A spec mostra finalizeCart: o agente achou que só fechava o carrinho para ver, e a ferramenta comprou (§6.3.2.3). Nome e descrição dizem o efeito: comprar_carrinho, "cobra o cartão salvo".
O diálogo está na página, e um agente que opera a tela também consegue clicar em Confirmar. O próprio checar.mjs clica, como um agente faria. Para ação de alto valor, peça algo que o agente não tem: a senha de novo ou um código enviado à pessoa.
Edite cancelar_agendamento em kit/pagina/ferramentas.mjs como no trecho e rode o checador. A versão pronta está em kit/solucao/aula3/.
annotations: { consequentialHint: true }, // aula 3: avisa que a ação tem consequência
execute: util(async ({ codigo }, { signal }) => {
const ag = agenda.agendamentos().find(a => a.codigo === codigo);
if (!ag) throw new Error(`agendamento não encontrado: ${codigo}`);
// a pergunta diz o alvo e o efeito por extenso; cancelar a execução (signal) vale como "não"
const ok = await ui.pedirConfirmacao(`Cancelar o agendamento ${ag.codigo} (${ag.id}, ${ag.nome})? A vaga volta para a agenda.`, signal);
if (!ok) return { cancelado: false, motivo: 'a pessoa recusou na tela' };
agenda.cancelar(codigo);
ui.atualizar();
return { cancelado: true, agendamento: ag };
})cd ~/projetos/formacao-webmcp-seguranca-v72/kit node scripts/checar.mjs; echo "saída: $?"
== Chromium 156.0.8078.4 (Playwright) · modo: nativo ok buscar_mentorias: só leitura, sem texto de terceiro ok ler_avaliacoes: devolve texto de terceiro e está marcada com untrustedContentHint ok meus_agendamentos: só leitura, sem texto de terceiro ok agendar_mentoria: consequentialHint + confirmação; recusar não mudou nada ok cancelar_agendamento: consequentialHint + confirmação; recusar não mudou nada RESULTADO: 0 falhas saída: 0
Antes do conserto, a mesma linha dizia FALHA cancelar_agendamento: agiu sem pedir confirmação (saída da aula 2).
A trava no kit e na sua página.
Ponha consequentialHint e a confirmação em cancelar_agendamento e rode o bloco checar depois.
Pronto quando: RESULTADO: 0 falhas e saída: 0.
Em agendar_mentoria, troque const ok = await ui.pedirConfirmacao(…) por const ok = true e rode o checador. Depois desfaça.
Pronto quando: FALHA agendar_mentoria: agiu sem pedir confirmação e saída: 1; desfeito, RESULTADO: 0 falhas.
Liste as ferramentas do seu site que mudam alguma coisa. Cada uma recebe consequentialHint: true e uma pergunta com alvo e efeito.
Pronto quando: grep -c "consequentialHint: true" [seu arquivo de ferramentas] → o número de ferramentas da sua lista.
Pergunta 1 de 4
O que a spec diz que o cliente pode fazer ao ver consequentialHint?competência
Pergunta 2 de 4
Qual pergunta de confirmação protege de verdade?
Pergunta 3 de 4
Por que o curso diz que a confirmação na página tem limite?
Pergunta 4 de 4
No caso finalizeCart da spec, o que deu errado?
Escolha uma alternativa. A explicação aparece depois da sua tentativa.