Camada C2 do estudo WebTestPilot · v2.2 · corte 27 ago 2026 Público: quem vai desenhar ou revisar MRs. Critério de qualidade: cada afirmação rastreável a
pesquisa/bibliografia.md, com nível de evidência. Pressupõe o vocabulário do C1.
1 · Escopo e formalização
Teste metamórfico (MT) troca a pergunta. Em vez de "qual é a saída correta para esta entrada?" — que ninguém responde para uma página inteira — pergunta-se "que relação deve valer entre a saída desta entrada e a de uma entrada derivada dela?". A técnica nasce em Chen, Cheung & Yiu (1998) — o survey de referência é Chen, Kuo, Liu, Poon, Towey, Tse & Zhou (CSUR 2018) — e tem três peças: caso-fonte, transformação que produz seguidores, e a relação metamórfica que serve de oráculo. Violação indica defeito em algum lugar do conjunto; conformidade não conclui nada.
Barr et al. (TSE 2015) colocam MT entre os oráculos derivados, com a ressalva de que "poderiam ser considerados mecanismo de oráculo especificado, porque MRs são propriedades da verdade de base" — e a formalização que importa aqui: uma MR é "a constraint on the values of stimulating the single SUT f at least twice, observing the responses, and imposing a constraint on how they interrelate" (N1). Mesmo sistema, ao menos duas execuções, entradas relacionadas. É esse trio que distingue MT do teste diferencial (dois sistemas, mesma entrada) e do de regressão (duas versões, mesma entrada).
1.1 Os três moldes
| Molde | Definição (Zhou, Sun, Chen & Towey, TSE 2020 — N1) | Lado |
|---|---|---|
| MRP | "an abstraction that characterizes a set of (possibly infinitely many) metamorphic relations" | relação inteira |
| MRIP | "an abstraction that characterizes the relations among the source and follow-up inputs" — ex.: change direction, change sequence in time | entrada — que perturbação produz seguidor válido |
| MROP | Segura et al. (2018): operações de conjunto entre saídas — equivalence, equality, subset, disjoint, complete, difference | saída |
Para E2E, o lado da entrada é o problema difícil:
"que perturbação do fluxo gravado ainda é um fluxo válido?" é uma pergunta de MRIP, e Zhou
et al. já oferecem dois MRIPs aplicáveis a fluxos: change direction (ordenação) e
change sequence in time — "the change of time sequence of some input events (such as
in the context of testing an interactive system)". O catálogo do § 4 traz a coluna MRIP
por isso: um gerador, humano ou LLM, consome primeiro a transformação do fluxo, depois a
relação sobre R(·).
1.2 As árvores de MRPs
Ying, Towey, Bellotti, Chua & Zhou (STVR 2025, N1) organizam os MRPs publicados em duas árvores de família, com raízes Symmetry ("diferentes pontos de vista dos quais o sistema parece o mesmo") e Sets ("entradas e saídas representáveis como conjuntos, relacionadas por operações de conjunto"). Para sistemas de consulta, os sete MRPs de Segura et al. (MET 2019) — Input Equivalence, Shuffling, Conjunctive Conditions, Disjunctive Conditions, Disjoint Partitions, Complete Partitions, Partition Difference — são nós da árvore Sets.
O que as árvores mostram sobre o catálogo deste estudo (§ 4): o grupo A tem nó publicado para cada MR; o grupo B (estado e navegação) só cabe sob a raiz abstrata Symmetry, sem nó; o grupo C (derivado do MST-wi, apresentado no § 3) não tem nó nenhum. A originalidade do catálogo está nos grupos B e C — e tem fonte que a delimita, não só afirmação nossa. (Detalhe das árvores lido na tese aberta de Ying, 2024; a equivalência com o artigo STVR, fechado, é inferência nossa.)
2 · O achado central
Existe um corpo maduro de MT para a web, e ele é quase inteiramente API-level. Web services são o domínio de aplicação mais popular no survey de Segura et al. (TSE 2016): 16% dos 58 estudos de aplicação, cerca de nove trabalhos, numa categoria que o survey chama de "web services and applications", com corte em novembro de 2015 (N1). O corpo cresceu desde então — RESTest, AGORA, ARMeta — e continua presumindo requisição isolada, sem estado de UI.
O oráculo metamórfico sobre fluxo E2E em navegador real tem uma linha do tempo curta e três artefatos, todos de tese:
| Ano | Artefato | O que faz | Projeção R(·) |
Estado |
|---|---|---|---|---|
| 2020–23 | Morfify (Nápoles, tese de graduação, AGPL-3.0) | Seguidor por regra de substituição de clique/valor sobre gravação Selenium IDE; Spring PetClinic | Levenshtein sobre HTML bruto, limiar fixo 0,75 | 1 ★, sem push desde nov/2023 |
| 2025 | Zahid (Åbo Akademi, mestrado, grupo do ARMeta) | MRs à mão sobre telas do PetClinic e de um WebShop próprio; Playwright; validação por falhas injetadas à mão | Asserção com valor literal em código | Tese aberta (Doria.fi); repos Xahidian/*, 0–1 ★, sem push desde jun/2025 |
| 2026 | metamorph (Múrcia, mestrado, sem licença) | Quatro famílias travadas (idempotence, subset, permutation, inverse); LLM instancia molde com one-shot e saída Zod; replay determinístico | 1–8 observáveis tipados, escolhidos pelo LLM após ver a fonte | 0 ★, 122 commits em 6 semanas, sem push desde 12/07/2026 |
Morfify define a similaridade na tese (§ 3.5; StringSimilarity.java). O metamorph é
lido em detalhe no § 5 e no § 6.4.
Zahid, em detalhe (tese lida, N1; código, N4). Oito MRs sobre o Spring PetClinic,
instanciadas por 18 testes; 18 MRs escritas sobre um WebShop Django/React próprio, quatro
mostradas. A avaliação em E2E é por injeção manual de falhas — 6 + 4, uma por MR: o
Stryker gerou 551 mutantes no WebShop e foi abandonado por tempo; mutação automática só no
terceiro caso, uma API REST sem UI (185 mutantes: MR 77,3 % contra 62,5 % do teste
funcional). Resultado E2E: MR 10/10, baseline 1/10 — com viés de seleção declarado
pelo próprio autor (§ 5.1, § 6.1: "we needed to modify MT test cases after injecting
the fault"). No código, textContent('body'), count() de classe CSS e waitForTimeout
fixo; a relação é descrita como "equal, subset, superset"; banco reiniciado antes de cada
teste. Dos 16 testes rotulados "MR" no WebShop, 15 são asserções com valor literal e
1 é relação genuína entre duas execuções (contagem sob variação de caixa). É o único
ponto de dados de MR validada em E2E web, e é fraco: as faltas foram escolhidas por MR e
as relações ajustadas depois; não há taxa de falso positivo.
Nenhum dos três define a projeção como decisão registrada: Morfify e MST-wi usam
similaridade sobre HTML inteiro (o MST-wi: "We rely on edit distance to determine if Web
pages are equal", colapsando estados abaixo de 5% do comprimento — N1); o metamorph
escolhe os observáveis depois de ver a fonte; Zahid escreve valores literais em código —
a priori, mas asserção especificada, não projeção tipada. O que existe de projeção
pensada a priori está em outra literatura: a de abstração de estado de GUI para
inferência de modelo — Genie (OOPSLA 2021) define "a GUI state (abstracted from a set
of structurally equivalent GUI runtime layouts)" com critério por tipo de widget; Odin
(FSE 2022) usa pool de regras de abstração; Yandrapally, Stocco & Mesbah (ICSE 2020)
estudam quais diferenças de DOM são near-duplicates; Liu et al. (2026) comparam seis
abstrações. É dela que R(·) deve herdar (C4 § 5) — e é, com a linha X-PERT (§ 7.2), a
evidência N1 para a escolha de projeção por locator tipado. [protocolo · A18]
Vizinhos que não são o alvo mas que um revisor cobra: ASSURE (2025, N2) faz MT no navegador, sobre a saída de extensões com LLM, não sobre o fluxo da aplicação; Tu & Lee (JISE 2025; arXiv jul/2026) instanciam os sete MRPs de Segura sobre uma app web real (busca de cursos da NCKU) com execução e comparação automáticas — crawler, PICT, fuzz — sem LLM e sem ground truth. O espaço não está vazio: está despovoado, e povoado só por teses e estudos de caso.
A ação ficou barata; o julgamento não. A onda de 2026 em teste E2E — agentes LLM dirigindo o navegador — resolveu a ação e não o julgamento. O WebTestBench (Kong et al., 2026, N2) mede isso: sem o checklist ground-truth, nenhum dos dez modelos de fronteira chega a um terço de F1; com ele, o mesmo modelo quase dobra (números no C1 § 1). Três ressalvas sobre esse número: o corpus é de aplicações geradas por IA (Lovable.dev) e curado por densidade de defeito; a tarefa medida é "gerar checklist aberto + dirigir o browser em horizonte longo + detectar defeito", não "avaliar uma relação entre duas execuções"; e metade do erro sobrevive ao oráculo perfeito. Daí a divergência D1 (gerar o critério é o gargalo — ou a execução ainda é?), mantida: gerar o critério é um gargalo, o maior isolado medido — não o único. O roadmap de Molina, Gorla & d'Amorim (TOSEM 2025) aponta na mesma direção. O oráculo metamórfico é a técnica mais adequada ao E2E e a menos automatizada.
O WebTestPilot de Teoh et al. (FSE 2026) é homônimo deste estudo e sem relação com ele (C1 § 3); é a linha rival, descrita no § 7.4.
3 · Mapa do campo
Maturidade: ● consolidado, ferramenta usável, validação em campo · ◐ replicado, ferramenta de pesquisa · ○ emergente · ◌ ocupado só nominalmente.
| Frente | Mat. | O que entrega | Transferível para E2E de navegador? |
|---|---|---|---|
| Sistemas de consulta — Zhou/Chen TSE 2016; Segura MET 2019; Ying STVR 2025 | ● | MRs de consistência sobre Google/Bing/Baidu e 65 sites comerciais; sete MRPs; árvores de família | Sim, e é a melhor fonte. Toda tela com busca, filtro, faceta ou ordenação é um sistema de consulta. Daqui sai o grupo A inteiro. |
| Segurança de web interactions — Bayati Chaleshtari, Pastore, Goknil & Briand, TSE 2023 (MST-wi) | ● | 76 MRs agnósticas de sistema (Zenodo 7702754, CC-BY-4.0), DSL compilada para Java, Crawljax + Selenium para casos-fonte; 39% das atividades OWASP não automatizadas | Sim — é o corpo mais maduro. 22 das 76 têm gêmea funcional direta (§ 4, grupo C). A maquinaria — replay com credencial trocada, ResetSUTAction, pré-condições formais — é o modelo de referência. |
| REST / web APIs — Segura et al., TSE 2018; RESTest; AGORA; ARMeta | ● | MROPs; falhas em Spotify e YouTube; oráculo por invariante; agentes LLM com 78,6%/56,9% de TP (N2) | Teoria transfere inteira; execução não — presume requisição isolada. Camada abaixo do E2E. |
| Busca em e-commerce e sistemas baseados em consulta (QBS, query-based systems) na web — Nagai & Tsuchiya PRDC 2018; ISRITI 2019; Tu & Lee JISE 2025; MRG (Segura et al., MET 2022) | ◐ | MT sobre busca de produto em sites reais; os sete MRPs sobre app web com comparação automática (Tu & Lee); instanciação automática de MRPs a partir de spec leve dos parâmetros de consulta — "hundreds of MRs can be automatically identified in real-world systems like IMDb, SkyScanner, or YouTube in just a few seconds" (MRG, código em ssegura/MRG) |
Sim, já é E2E — restrito à superfície de consulta. MRG é a linha de base contra a qual "LLM instancia MRP" tem de ser comparado: dada a spec, instanciar é barato; o que resta ao LLM é descobrir a spec da tela. |
| MT sobre GUI móvel — Genie (OOPSLA 2021), SetDroid (ISSTA 2021), Odin (FSE 2022), MVTE (JSS 2025), Xiong et al. (2026) | ● | MRs sobre sequência de eventos de GUI Android, com MRIP nomeado (independent view), taxa de TP medida e abstração de estado a priori — um trabalho por linha abaixo da tabela | Sim — é a linhagem mais madura. Ressalva: três das hostilidades do § 6 pesam menos em app Android instrumentado do que numa SPA com CDN, A/B e ranking. "Trocar Android por navegador é engenharia" é N5 arriscado, não ponte. |
| Geração de MR por LLM — ARMeta; MetaFOE; 2608.03337; 2401.17019; 2607.28775 | ○ | Ver § 5 | Método sim, alvo não. Nenhum executa fonte e seguidor em navegador. |
| MT sobre E2E de navegador — Morfify, Zahid, metamorph | ◌ | Ver § 2 | É o alvo. Três teses, nenhuma ferramenta de referência, nenhuma define a projeção como decisão registrada. |
| Juízes LLM de GUI — MobileJudgeBench, IRA, CUARewardBench | ○ | Ver § 7.3 | Linha rival da família F, com números; define o que o triador pode e não pode fazer. |
A linhagem de GUI móvel, trabalho a trabalho:
- Genie (OOPSLA 2021): "leverage the commonly-held independent view property … to manufacture property-preserving mutant tests" — 34 bugs em 12 apps, TP 40,9%, abstração de estado por tipo de widget.
- SetDroid (ISSTA 2021): setting-wise metamorphic fuzzing, 42 defeitos em 26 apps.
- Odin (FSE 2022): bugs como comportamento desviante em estados profundos.
- MVTE (JSS 2025): 5 MRs de autenticação, 159 vulnerabilidades.
- Xiong et al. (2026): LLM gera propriedades por exploração, executa e refina por feedback.
4 · Catálogo de MRs para fluxo E2E
Os exemplos numéricos vêm da aplicação de referência do C4 § 9 — uma loja Vendure com seed de 54 produtos.
Convenções. R(x) é a projeção observável da tela após executar o fluxo x — conjunto
de itens com chave estável, um total, o estado de um formulário. Nunca o DOM inteiro,
nunca um screenshot. Cada cartão traz: molde (MRIP → MROP, nó na árvore de Ying quando
existe), fonte/seguidor/relação, o que pega, pré-condições, e classe de custo:
K0 (sem estado — roda contra produção desde que R(·) exclua ranking, personalização
e promoção), K1 (par com estado, contexto próprio), K2 (fan-out n+1).
Quatro regras que valem para o catálogo inteiro:
- Enumeração completa. As MRs de conjunto (MR-A1, MR-A2, MR-A4, MR-A6, MR-A7, MR-A8) exigem que
R(·)enumere o resultado até a última página, com condição de parada por locator (o link "próxima" deixa de existir), não por contagem estimada. Onde a enumeração for cara, degradar para cardinalidade|R(seg)| ≤ |R(fonte)|— foi o que Zhou et al. usaram em motores de busca. Contador declarado ≠ itens enumerados é erro de setup do oráculo, não violação. - A relação é fixada antes de executar, e falsificada por mutante. Numa MR os dois
operandos vêm do sistema por definição — o que precisa estar fixado fora dele é a
relação: operador, direção, lista de observáveis, guardas e exclusões, registrados
em arquivo (
anchoredOn) antes da primeira execução, e alterados depois só comrevisionNotes. Uma MR é propriedade necessária, não suficiente (Chen 1998): a falha que a preserva passa. A resposta clássica é análise de mutação —falsifiedByé isso, com ferramenta (Stryker, PIT) onde há código. Onde não há (SaaS de terceiro, K0 em produção) a MR é admitida comanchoredOn: observede peso menor — como Zhou et al. (TSE 2016) fizeram em motores de busca sem especificação, e acharam falhas reais. Os erros de especificação da relação que o metamorph documenta (§ 6.4) são todos pegáveis por um mutante; o argumento está no § 6.5. - Requisito declarado, não suposição. MR-B2 (idempotência) e MR-C4 (one-shot) são mutuamente exclusivas por ação; MR-A5 (normalização) e MR-C8 (validação) só são MR se a regra for requisito. A escolha é dado da MR, não descoberta da execução.
- Fallback de consulta alargada. Sites que, ao zerar o resultado, mostram "similares"
violam
⊆corretamente. MR-A1 precisa de guarda: seguidor com resultado vazio e aviso de alargamento não é violação.
Grupo A — consulta e coleção
Fonte: sistemas baseados em consulta. Toda tela com busca, filtro, faceta ou ordenação.
MR-A1 · Refinar filtro só pode encolher · MRIP add condition → MROP Subset · nó Conjunctive Conditions · K0
fonte busca(q) + filtro A
seguidor busca(q) + filtro A ∧ B
relação R(seg) ⊆ R(fonte)
Pega faceta que aplica OR onde deveria AND, e contador dessincronizado da lista. Pré-condições: a semântica ∧ está declarada (código do filtro ou schema); guarda de alargamento (regra 4); B ⊄ A no seed — com B ⊂ A (Electronics ∧ Computers) a instância é vácua: A ∨ B = A, e o mutante OR real não viola (20 ⊆ 20, medido na app de referência, C4 § 9.2); Computers ∧ Photo viola (11 → 20).
MR-A2 · Alargar filtro só pode crescer · MRIP relax condition → MROP Superset · nó Disjunctive Conditions · K0
fonte busca(q) + filtro A
seguidor busca(q) + filtro A ∨ B
relação R(seg) ⊇ R(fonte)
Ressalva de UI: storefronts headless de 2026 costumam ANDar facetas do mesmo grupo — a instância canônica não existe na tela. Instância substituta legítima: hierarquia de coleções (Electronics ⊇ Computers), ancorada no seed. Exercita a camada de dados, não a de filtro; declarar qual.
MR-A3 · Ordem de aplicação é irrelevante (comutatividade de ações) · MRIP change sequence in time → MROP Equality · extensão nossa (N5), sem nó · K0
fonte aplica A, depois B, depois ordena
seguidor ordena, depois B, depois A
relação R(seg) = R(fonte) (como lista, se a ordenação faz parte do estado)
Não confundir com o Shuffling de Segura, que é sobre critério de ordenação (→ MR-A7);
MR-A3 é comutatividade da composição de filtros — propriedade diferente e mais
interessante para SPA com estado acumulado.
Pré-condições: A e B independentes e co-disponíveis nas duas ordens; nenhum é aba,
rádio ou faceta mutuamente exclusiva — o metamorph tem o caso literal ("'Playas' and
'Ciudades' are mutually exclusive tabs … reversing their order should produce different
states. The MR is therefore semantically invalid"). E o estado tem de ser acumulado na
UI: num storefront onde o estado é a URL (?facets=1&facets=2), a ordem é irrelevante
por construção do URLSearchParams e MR-A3 é tautologia (medido na app de referência,
C4 § 9.2). Vale em SPA com estado em memória.
MR-A4 · As partes somam o todo · MRIP partition attribute → MROP Complete · nó Complete Partitions · K2 (n+1)
fonte lista sem filtro de categoria
seguidor lista filtrada por cada categoria cᵢ
relação ⋃ᵢ R(segᵢ) = R(fonte) ∧ Σᵢ |R(segᵢ)| = |R(fonte)|
Detecta item órfão, categoria fantasma e paginação que descarta a última página.
Pré-condições: a partição é provada no seed, não observada na tela (no Vendure: 54 =
20 + 20 + 14, nenhum órfão; marca não particiona — 25 sem marca).
Amostragem sob orçamento: para qualquer S ⊆ {cᵢ}, valem ⋃ᵢ∈S R(segᵢ) ⊆
R(fonte) e Σᵢ∈S |R(segᵢ)| ≤ |R(fonte)| — perde-se só a completude. k+1 execuções por
noite com S rotativo recuperam a completude ao longo de dias sem tornar a relação
incorreta. O custo real é em page loads, não em execuções: MR-A4 no Vendure são 4
navegações e 11 loads.
MR-A5 · Entradas equivalentes, saída idêntica · MRIP Query-Meaning → MROP Equality · nó Input Equivalence · K0
fonte busca("cadeira")
seguidor busca(" CADEIRA ")
relação R(seg) = R(fonte)
Pré-condições: normalização é requisito declarado do componente (plugin de busca +
banco), não "da app" — no Vendure a caixa é insensível nos dois deploys, mas o trim
diverge entre a demo pública (0 resultados) e a instância local (1) — medido na app de
referência (C4 § 9.2). Atenção à tautologia: se o cliente faz trim() antes de navegar, a
variante com espaços via UI não testa nada — testar via URL.
MR-A6 · Apresentação não altera conteúdo · MRIP change view → MROP Equivalence (Segura 2018, escopo REST; sem nó próprio na subárvore de QBS) · K0
fonte lista em grade, 20/página
seguidor mesma lista em tabela, 50/página
relação R(seg) = R(fonte) (como conjunto)
Isola bug de virtualização e paginação. Ressalva de UI: grade/tabela e itens por página são raros em 2026; substitutos legítimos — viewport, moeda, locale — isolam bugs diferentes (responsividade, filtro por moeda). Declarar qual.
MR-A7 · Critério de ordenação não altera o conjunto · MRIP change direction → MROP Equivalence · nó Shuffling · K0
fonte lista ordenada por preço
seguidor mesma lista ordenada por relevância / nome / inverso
relação R(seg) = R(fonte) (como conjunto)
O Shuffling de Segura, agora no lugar certo. A mais barata do catálogo: dois page loads, sem estado. Zhou et al. (TSE 2020) validaram em 65 sites comerciais: "sorting the results in ascending and descending orders should return the same set of results in reverse order" — a variante forte, como lista invertida, também vale quando a chave de ordenação é única.
MR-A8 · Diferença de partição · MRIP partition attribute → MROP Difference · nó Partition Difference · K2 (n+1; 3 se houver faceta negada)
∀ k ∈ 1..n−1 : R(fonte) − ⋃ᵢ≤k R(segᵢ) = ⋃ⱼ>k R(segⱼ)
Segura et al. (MET 2019, § III-G): "the outputs of the follow-up test cases are pairwise
disjoint and their union contains the same items as the source output". Detecta o mesmo
bug de partição que MR-A4, mas localiza qual categoria vazou. Pela fórmula literal o
custo é n+1, igual ao de MR-A4 — só cai para 3 execuções quando a UI
oferece filtro negado ("todas menos v₁"), instância condicional que muitas facetas
exclude permitem. O "not exploited" de Segura já foi datado por Tu & Lee (JISE 2025).
Grupo B — estado e navegação
O espaço em branco da literatura, com fonte que o delimita: nenhum nó nas árvores de Ying (2025); só a raiz Symmetry. Todas exigem a camada de isolamento de estado, exceto MR-B3.
MR-B1 · Ida e volta retorna ao início · MRIP inverse action → Equality · K1
fonte estado S
seguidor S → adiciona(i) → remove(i)
relação R(seg) = R(fonte)
Carrinho, favoritos, seleção múltipla, follow/unfollow. Vaza estado residual — contador
que não decrementa, badge que não some, total com frete fantasma.
Pré-condição: i ∉ S — se o item já estiver no estado, "adicionar" soma quantidade
e "remover" apaga a linha inteira, e a relação falha sem bug.
Ancoragem: "vazio" é definido pelo requisito (lines.length === 0 no código), não pela
tela. Existência de um pedido interno com zero linhas é estado legítimo e sai de R.
MR-B2 · Repetir não acumula · MRIP duplicate action → Equality · K1
fonte aplica ação idempotente a uma vez
seguidor aplica a duas vezes
relação R(seg) = R(fonte)
Duplo-clique em submit, F5 sobre POST, cupom já aplicado, marcar como lido.
Pré-condição obrigatória: a ação é declaradamente idempotente —
adicionar o mesmo item ao carrinho duas vezes deve somar quantidade e não serve. No
Vendure o cupom é idempotente por código (order.service.ts:1086). fc.scheduledModelRun
do fast-check aplica-se diretamente aqui para corrida de duplo-submit.
Dual: ação de uso único → MR-C4.
MR-B3 · Rotas diferentes, mesmo destino · MRIP path independence → Equality · K0
fonte home → categoria → produto p
seguidor URL direta de p | busca → p
relação R(seg) = R(fonte)
Encontra tela que só monta corretamente quando herdou estado da navegação anterior.
Ancoragem: breadcrumb que reflete o caminho é legitimamente diferente e sai de R;
breadcrumb que reflete a coleção canônica entra. Decidir pelo código, não pelo resultado.
Dual: pular passo obrigatório → MR-C3; a relação inverte.
MR-B4 · Grandeza acumulada não regride · MRIP add element → Order (≥) · K1
fonte carrinho: n itens, subtotal T
seguidor mesmo carrinho + item de preço p > 0
relação subtotal(seg) ≥ T ∧ n+1 itens
Relação de ordem, não de igualdade. Desconto progressivo quebra a MR sobre o
total — acrescentar item pode destravar faixa e baixar. Projetar o subtotal antes de
desconto (subTotalWithTax), com pré-condição "nenhuma promoção ativa no canal".
Pré-condições adicionais: p ∉ carrinho (senão a quantidade
incrementa e o número de linhas não muda) e estoque(p) ≥ 1 — ou projetar a quantidade
total em vez do número de linhas.
MR-B5 · Sessão reconstruída é a mesma · MRIP session cycle → Equality · K1
fonte logado, em estado S
seguidor logout → login → navega até S
relação R(seg) = R(fonte)
Pré-condições: R exclui o que é legitimamente por-sessão (tokens, timestamps, "visto
por último"); ordenar pedidos por código, não por updatedAt; guestOrder = ∅ — a
app de referência faz merge de carrinho no login (regra em C4 § 9.2); sem a
pré-condição a relação vira R(seg).cart = merge(guest, R(fonte).cart).
Reforço: logout invalida o estado antigo → MR-C6.
MR-B6 · Mesma ação, outro usuário · MRIP change subject → Inequality ∨ Error · MST-wi CWE_266_…_OTG_AUTHZ_002 · K1
fonte usuário A executa ação autorizada
seguidor usuário B (sem permissão, não supervisor de A) replica
relação isError(R(seg)) ∨ R(seg) ≠ R(fonte) ← disjunção, como no paper
pré !isSupervisorOf(B, A) · cannotReachThroughGUI(B, url) · afterLogin
· notTried(B, url) · !isError(R(fonte))
!isError(fonte) existe porque "it is impossible
with these inputs to characterize the output that should be observed for User(2)";
cannotReachThroughGUI exige dados de navegação dos dois usuários — sem crawler, é
declaração manual. Implementa-se com dois storageState e o mesmo fluxo; desde o
Playwright 1.61, BrowserContext.credentials cobre passkey. No MST-wi, 8 das 76 MRs
têm essa forma. Guarda de tempo: o Vendure expõe pedido anônimo por 2 h após criação (shop.api.graphql);
page.clock resolve.
Grupo C — derivadas do MST-wi
Mineração das 76 MRs (sobre o Catalog of MRs.pdf do Zenodo 7702754): 22 têm gêmea
funcional direta (29%), 39 colapsam em três MRs de robustez (51%), 15 são só segurança
— canal, certificado, CSRF, path traversal (20%). A classificação é editorial (N5) sobre
lista completa verificada (N1/N4). Todas exigem isolamento de estado, exceto MR-C7 e
MR-C10.
MR-C1 · Mesmo papel, mesmo resultado (isolamento de tenant) · troca de sujeito, forma de igualdade · K1
fonte usuário A (papel P) executa fluxo f
seguidor usuário B (mesmo papel P) executa f com seus próprios dados
relação R(seg) = R(fonte) módulo campos por-usuário
Gêmea da MR-B6. Pega dado de A que aparece para B, feature flag presa a usuário, permissão
herdada. Pré: mesmo papel declarado; nenhum é supervisor do outro; R exclui os campos
por-usuário antes de executar.
MR-C2 · Identificador de outro usuário (IDOR) · mutação de parâmetro com valor de outro sujeito · CWE_15_639_OTG_AUTHZ_004 · K1
fonte A navega até seu recurso r_A → URL /pedidos/{id_A} (sessão de A)
seguidor B abre a mesma URL /pedidos/{id_A} (sessão de B)
relação R(seg) ∈ { erro/404 , conteúdo que B já viu pela GUI } ∧ R(seg) ≠ R(fonte)
Pré: inventário de ids por usuário coletado nas execuções de A; relação disjuntiva — igualdade estrita com "tela de erro" gera falso positivo quando a app redireciona.
MR-C3 · Guarda de workflow: pular passo obrigatório é recusado · remoção de passo · CWE_841, OTG_SESS_008 · K1
fonte s1 → s2 (obrigatório) → s3 → estado S
seguidor s1 → s3, em contexto novo
relação R(seg) ≠ R(fonte) ∧ R(seg) mostra bloqueio ∧ backend inalterado
Checkout sem endereço, wizard que aceita ?step=3, ação sem login.
Pré: a precedência é requisito documentado — senão é MR-B3 (atalho legítimo) e a
relação inverte.
MR-C4 · Ação de uso único recusa repetição · ação duplicada · OTG_BUSLOGIC_005 · K1
fonte aplica ação one-shot a (cupom único, voto, token de reset)
seguidor aplica a duas vezes
relação R(seg) ≠ R(fonte) ∧ segunda tentativa exibe recusa ∧ saldo = o da fonte
Dual exato de MR-B2. Pré: a ação é declarada one-shot — no MST-wi o sinal é
urlOfActionChangesOverMultipleExecutions (URL com nonce). Sem a declaração, MR-B2 e
MR-C4 são contraditórias e uma delas é falso positivo garantido.
MR-C5 · Expiração por relógio · Wait(Δt) inserido · CWE_262_…, OTG_SESS_007 · K1
fonte estado S com prazo T → ação a
seguidor page.clock avança Δt > T → ação a
relação R(seg) ≠ R(fonte) ∧ R(seg) mostra expiração
dual Δt < T ⇒ R(seg) = R(fonte)
Sessão eterna, reserva de estoque sem fim, oferta relâmpago que não acaba. Pré: T declarado; o relógio do backend também precisa ser controlável, ou a MR só testa o cliente — o MST-wi muda a data do sistema.
MR-C6 · Logout invalida o estado antigo · replay de credencial antiga · CWE_613_OTG_SESS_006 · K1
fonte login → captura storageState₁ → navega até S
seguidor logout → novo contexto com storageState₁ → tenta S
relação R(seg) ≠ R(fonte) ∧ R(seg) é tela pública/login
Logout só de cliente, cookie que sobrevive, id de sessão que não roda.
MR-C7 · Redundância não altera o resultado · parâmetro duplicado · OTG_INPVAL_004 · K0
fonte busca(q) + filtro A
seguidor busca(q) + filtro A + filtro A (?cat=x&cat=x)
relação R(seg) = R(fonte)
Extensão de MR-A5. Filtro acumulativo que soma em vez de idempotir; parser de querystring que pega o último valor.
MR-C8 · Entrada fora do domínio é recusada e o estado não muda · mutação de campo · CWE_521, CWE_434, CWE_611 · K1
fonte submete formulário F válido → sucesso, estado S'
seguidor mesmo F com um campo fora da regra
relação R(seg) ≠ R(fonte) ∧ erro junto ao campo ∧ estado = S
Validação só no cliente, upload que aceita qualquer extensão. Pré: regra de validação documentada; uma mutação por seguidor.
MR-C9 · Entrada hostil degrada graciosamente · string de ataque, "igual ou erro controlado" · 35 MRs colapsadas (CWE_79*, CWE_89*, CWE_792_* …) · K0/K1
fonte busca(q) / formulário com valor v
seguidor mesmo fluxo com v' = v + caractere especial | string longa | marcação
relação R(seg) ∈ { R(fonte), erro controlado } ∧ sem 5xx, stack trace, console error, alert
É MR + oráculo implícito: sozinha é frouxa; com a família E anexada, pega busca que quebra com aspas e campo que ecoa HTML. Não substitui DAST.
MR-C10 · Canonicalização de URL · codificação alternativa · CWE_289*, CWE_647 · K0
fonte abre /produto/123
seguidor abre /produto/123/ , /produto/%31%32%33 , /PRODUTO/123
relação R(seg) = R(fonte) ∨ R(seg) = 404 (nunca um terceiro recurso)
Pré: política de canonicalização declarada.
Resumo, priorização — e quem escreve
| Fase | MRs | Classe | Pré-requisito de infra |
|---|---|---|---|
| Fase 1 | (oráculo implícito, sem MR — inclui MR-C9 com q=<script>) |
— | nenhum |
| Fase 2 | MR-A5 (só caixa), MR-A7, MR-B3, MR-C10 · condicionais: MR-A3 e MR-C7, só em SPA com estado acumulado na UI | K0 | nenhum — produção, com R(·) endurecida |
| Fase 3 | MR-A1, -A2, -A6, -A8 amostrada | K0/K2 | clock + HAR + storageState |
| Fase 4 | MR-A4 completa, MR-B1, -B2, -B4, -B5, -B6, MR-C1–C6, -C8 | K1/K2 | + banco isolado por execução |
Esta tabela é a lista de referência das fases para C3 e C4. MR-C9 fica na Fase 1 porque é oráculo implícito com MR anexada; MR-A3 e MR-C7 são condicionais porque, em UI cujo estado é a URL, são tautologia (cartão MR-A3).
Quem escreve — leitura de um QA lead que executou MR-A1 e MR-B1 na app de referência
(relato em pesquisa/revisoes/v2/R6-qa-lead.md). De 24, um time de QA escreveria
9: MR-A1 (com B ⊄ A), MR-A4 amostrada, MR-A7, MR-B1, MR-B3, MR-B6/MR-C2, MR-C3,
MR-C6 e MR-A5 só para caixa. Sete se explicam em cinco minutos: MR-A1, MR-A7, MR-B1,
MR-B3, MR-B6, MR-C3, MR-C6. Cortaria: MR-A2 (não existe na UI), MR-A3 e MR-C7 (tautologia
em UI de URL pura), MR-A6 (sem grade/moeda no seed), MR-A8 (fórmula que ninguém lê; MR-A4
amostrada localiza igual), MR-B4, a disjunção de MR-B6, MR-C2 com inventário, MR-C4 e
MR-C8 (asserção com valor esperado é mais curta e mais forte), MR-B5 sem a pré-condição
guestOrder = ∅ (o merge substitui, não soma), MR-C1 (o excludes fica maior que R),
MR-C5 (não move o relógio do backend), MR-C9 (é oráculo implícito), MR-C10 (é do
framework). Onde a MR é genuinamente melhor: enumeração completa embutida (página 2
perdida, item órfão — bugs que ninguém caça à mão), amortização por projeção, ausência de
valor esperado que envelhece com o seed. Onde é só mais complicada: tudo com valor
esperado barato. A MR soma à suíte; não a substitui.
Na aplicação de referência (Vendure + starter Next.js), 12 das 12 MRs avaliadas na
instanciação são instanciáveis, três com ressalva de UI (MR-A2, MR-A5, MR-A6); R(·) de
todas foi escrita a partir de código, schema, seed ou HTML estático, nenhuma a partir de
execução (N4). O formato
de arquivo que carrega tudo isso — owner, costClass, anchoredOn, excludes,
falsifiedBy, setupErrors, revisionNotes — está no C4.
5 · Geração de MRs — onde o LLM entra e onde não
Escrever a MR à mão exige conhecimento de domínio, e é esse custo que impede adoção. Li et al. (TOSEM 2025, N1) classificam 81 estudos de geração; as contagens da tabela abaixo são do artigo. (Atenção: o preprint arXiv 2406.05397 tem outro título e não contém as contagens.)
| Abordagem | N | Como funciona | O que exige | Aplicável a E2E? |
|---|---|---|---|---|
| Padrões (MRP) | 30 | MRP por classe de sistema; MRs por instanciação | conhecimento do molde | Sim — é a única aplicada (MST-wi, MVTE, Genie, Tu & Lee). Não descobre a spec da tela. |
| IA / aprendizado (inclui LLM) | 19 | Infere de execuções, código ou spec. Com prompt aberto, Zhang, Towey et al. (2025) comparam MRs de humano e de GPT, e Zhang, Sun, Liu & Dong (SANER 2025) perguntam se LLMs descobrem MRs; Zheng et al. (2026) sistematizam a via de mão dupla MT ↔ LLM | ver os vizinhos abaixo | Método sim, alvo não |
| Busca / SBSE (GenMorph) | 12 | Evolui MRs contra mutantes | mutantes baratos | Não — execução custa minutos |
| Composição de MRs | (6, não verificado) | Combina MRs validadas | estoque inicial | Sim, depois de haver estoque |
| Category-choice (METRIC/METRIC+, em Li et al.) | ~14 restantes, com "misc." | MRs de categorias/escolhas da spec | especificação categorizada | Raramente — fluxo E2E não vem categorizado |
Os vizinhos diretos — trabalhos que fazem uma das peças do que este estudo propõe:
| Trabalho | O que faz | Distância do alvo |
|---|---|---|
| MRG (Segura et al., MET 2022) | Dada uma spec leve dos parâmetros de consulta, gera centenas de MRs de QBS em segundos (IMDb, SkyScanner, YouTube); sem LLM | Sim, para a superfície de consulta. A linha de base do LLM: instanciar é barato quando a spec existe |
| Pei et al. (2026, N2) | "Conditioned on the component profile and the predefined UI MR taxonomy, an LLM instantiates component-specific metamorphic relations"; 214 componentes React/Vue; 88,6% utilizáveis | O vizinho mais próximo. Componente de biblioteca, não tela de aplicação; sem execução em navegador; mede cobertura de suíte, não julga |
| metamorph (2026, N2) | Família fixa no prompt, one-shot, saída Zod, element_id só do inventário |
A implementação mais próxima da brecha. Sem validação contra baseline; R(·) a posteriori (números e triagem no § 6.4) |
| Zahid (Åbo 2025, tese lida) | MRs à mão sobre tela, Playwright, falhas injetadas à mão (§ 2) | Faz as três coisas — tela, navegador, validação no original — à mão, e admite ajustar a relação depois de ver a falta. Sem LLM; R é asserção literal |
| Xiong et al. (2026, N2) | 985 propriedades geradas por LLM com exploração, 912 válidas, 118/127 reparadas por feedback de execução; 25 bugs novos em apps Android | O desenho "propõe → executa → corrige" mais próximo do C4 § 6, em móvel e não metamórfico |
| MetaFOE (2026, N2) | Oracle instantiation formalizada: ϕ(D,R) = Oₑ; 6.228 de 12.351 meta drivers válidos (50,4%), com compilação + fuzzing de 5 min |
Domínio C/C++; instanciar ≠ gerar, e metade das instâncias cai mesmo com verificação por execução |
Mais distantes, em uma linha cada: MR-Scout minera pares fonte/seguidor implícitos em suítes unitárias; MR-Coupler usa análise estática de dependências; MeMo (JSS 2021) faz NLP sobre Javadoc, só equivalência, 91% P / 69% R — reconhece MR em texto, não inventa; Shin et al. (QUATIC 2024) geram EMRs na DSL do MST-wi por few-shot, 78,6% dos statements corretos por anotação manual, sem executar; Bose et al. (2026, N2) fazem prompt aberto sobre classe/método, 141 validadas de 14.916 — grounding em código, não em GUI.
Formulações mais fortes da lacuna — "ninguém instancia MRP por LLM sobre tela concreta"; "ninguém instancia sobre tela, executa em navegador e valida contra baseline antes de julgar" — não se sustentam: Pei et al. instanciam taxonomia predefinida sobre componente, o metamorph instancia molde travado sobre tela, Zahid faz o ciclo completo à mão, e "validar no original" é o protocolo-padrão de toda avaliação por mutação, não uma lacuna. O que sobrevive é menor e mais honesto:
A brecha. Não há trabalho publicado que descreva um pipeline automatizado em que um LLM instancia MRPs sobre tela de aplicação, o harness executa fonte e seguidor em navegador, e a MR só é promovida após passar no baseline e ser falsificada por mutante. Cada peça existe separada (MRG instancia sem LLM; metamorph instancia com LLM e não valida; Zahid valida por falhas manuais e instancia à mão; Xiong executa e refina, em móvel e sem MR). A contribuição possível é a automação do filtro, não o filtro — engenharia, não lacuna de literatura. [protocolo · A15]
A evidência que reordena a prioridade é a do metamorph: MR gerada por LLM e não validada, com nenhuma violação confirmada como bug do site (números e triagem no § 6.4). É suficiente para o C4: validação contra baseline e relação fixada a priori são pré-requisito de existência (decisão fechada no C4 § 2, ADR-13), não recomendação.
A assimetria que torna a camada construível continua verdadeira, mas com número e com o risco à vista: errar na proposta custa uma execução de validação (≈ US$ 0,05 e 10 min de parede por MR com modelo barato, no metamorph); errar no julgamento entra no relatório. MetaFOE mostra que metade das instâncias cai mesmo com verificação por execução (compilação + fuzzing) — o que torna a validação indispensável e é, ao mesmo tempo, o risco direto de E9a (que fração das MRs instanciadas por LLM sobrevive à validação?): se metade cai, o custo de descoberta dobra.
6 · Por que o navegador é hostil — cinco frentes
MT presume, na formulação original, que fonte e seguidor são execuções independentes de uma função. Um fluxo E2E viola isso em quatro frentes ao mesmo tempo; há uma quinta que não vem do navegador, mas da forma do oráculo.
6.1 Estado compartilhado. Fonte e seguidor tocam o mesmo backend. Adicionar ao carrinho na fonte contamina o seguidor. Ou se isola o estado por execução — a decisão de arquitetura mais cara do C4 — ou as MRs precisam ser robustas a interferência, o que reduz o catálogo utilizável ao grupo A com K0.
6.2 Não-determinismo. Timestamps, IDs gerados, ranking personalizado, A/B, anúncios,
ordem de resolução de requisições, animação. R(·) precisa excluir tudo isso explicitamente
— e a exclusão é registrada com motivo, senão vira ancoragem por outro caminho ("excluir o
que deu diferente"). Número (metamorph, N2): sem page.clock, HAR ou storageState,
35 MRs em replay duplo deram 45,7% estáveis, 20% de drift de observação, 34,3% de falha
de execução — em sites de produção maduros.
6.3 Custo de execução. Mínimo 2 execuções por MR; n+1 para partição. A literatura de
priorização de MRs existe — Srinivasan & Kanewala (STVR 2022): critérios de falta,
cobertura e diversidade de dados; redução no tempo até a primeira falta de 23–61% (BBMap)
e 10–40% (LingPipe) — mas os sujeitos custam milissegundos por execução, e dois dos três
critérios exigem cobertura de código ou histórico de faltas, que um oráculo E2E
caixa-preta não tem. Em MT de sistema web pelo navegador há um trabalho de seleção
sob orçamento: AIM (Bayati Chaleshtari, Marquer, Pastore & Briand, TSE 2024) minimiza
o conjunto de entradas do MST-wi por clustering e algoritmo genético — 84% (Jenkins) e
82% (Joomla) de redução de tempo mantendo a detecção. É sobre entradas, não sobre MRs, e
é o ponto de partida. Seleção sob orçamento é condição de existência, e as classes
K0/K1/K2 do catálogo são a primeira resposta.
6.4 Violação ≠ bug. Bug or not Bug? (SANER 2023) propõe distinção binária por ARM num toy example — não há taxonomia de causas. A linha de constraints de MR (MetaTrimmer, 2310.00338) e as classes de veredito de 2606.17529 (pass / fail / skip / out-of-relation-domain / inconclusive) são as pistas. A taxa de violação→bug depende do processo de autoria, não do domínio — e há pontos suficientes para dizê-lo: com MR gerada por LLM e não validada, 0 confirmados em 26 (metamorph, N2, um batch — detalhe abaixo); com MR humana de ordenação e projeção de contagem sobre 65 grandes sites comerciais, 60 dos 65 violaram ao menos uma vez, com inconsistências reproduzíveis 10× em dias diferentes (Zhou et al., TSE 2020, N1 — Amazon devolvendo 160 resultados por preço crescente e 851.077 por decrescente); com propriedade de vista independente em GUI Android, TP 40,9% (Genie, N1); em MT de NLP, ~60% de TP em 937 violações analisadas à mão (Cho, Ruberto & Terragni, ICSME 2025). Em E2E web com MR validada há um ponto, fraco: Zahid detecta 10/10 faltas manuais contra 1/10 do baseline, com faltas escolhidas por MR e relações ajustadas depois, sem taxa de falso positivo (§ 2). E9c (com MR validada em E2E web, que fração das violações é bug?) continua aberto e exige app própria com defeitos semeados antes de escrever as MRs. Sem triagem, o falso positivo inviabiliza CI; e a triagem, em 2026, virou produto (Momentic, Datadog, Checkly, mabl — ver C3).
O batch do metamorph, em detalhe: de 100 tentativas, 63 compilam; de 48 pares executados,
26 violam; das 26 violações, nenhuma foi confirmada como bug do site — 17 eram
oráculo mal especificado, 7 harness (autocomplete, passo perdido, corrida), 1 MR inválida,
e 2 ficaram sem resolução (Amazon, filtro dependente de ordem; GitHub, repositório
ausente na primeira página). A reclassificação é nossa (N5) sobre a prosa do autor em
analysis.md — a coluna triage do CSV bruto está vazia. Um batch, um modelo barato, um
locale, 48 h. O autor conclui, sobre este oráculo: "strict failures are triage
triggers". Há ainda 2 falsos negativos e ≥ 7 passes vácuos. Os quatro modos de falha
que o batch mostra — direção do operador invertida, not_equal frouxo, igualdade vácua
sobre lista vazia, observável auxiliar frágil — são erros de especificação da
relação, todos pegáveis por um mutante (§ 6.5). O que o dado mostra é a qualidade de
MR gerada e não validada; não é taxa-base de nada.
6.5 O oráculo que não pode falhar. Uma MR é propriedade necessária da função correta, não suficiente (Chen, Cheung & Yiu, 1998): defeito que preserva a relação passa. Se o motor de filtro estiver quebrado de modo independente de ordem, MR-A3 obtém o mesmo resultado errado duas vezes e conclui que está tudo bem. É a falha mais silenciosa das cinco — o painel fica verde.
Canedo (2026, N2, autor único, um sistema) dá vocabulário recente ao problema —
specification-anchored (expectativa fixada fora do código sob mutação) versus
state-anchored (flui dele) — e inclui MRs entre duas execuções nas suítes que
analisa, tratando-as como legítimas; o que ele não faz é estudar a ancoragem de MRs em
separado, e a condição de escopo é explícita: "State anchoring cancels only when the
source of the observed state lies inside the mutate target." A transposição para o
catálogo é nossa, e tem uma armadilha: um "teste" que reprovasse toda projeção lida de
page.* reprovaria toda MR, inclusive as que este estudo chama de spec-anchored. Numa MR
os dois operandos vêm do sistema por definição; o que precisa estar fixado fora dele é a
relação — regra 2 do catálogo. A tese de Zahid é o caso documentado da hostilidade em
fonte primária: "we needed to modify MT test cases after injecting the fault", e a MR de
controle de acesso foi recodificada em 0/1 depois de a igualdade valer sob a falta.
A resposta não é ferramenta nova: é análise de mutação, que Zahid faz à mão e que
falsifiedBy operacionaliza; mais dois testes baratos — observável obrigatório não vazio
(rejeitar [] como pass) e direção do operador vinda do molde, não do modelo. Os quatro
modos de falha do metamorph (§ 6.4) são erros de especificação da relação, e todos
cairiam num mutante.
7 · A vizinhança não-metamórfica
7.1 Propriedade temporal sobre um trace — e a fronteira porosa com MR. Quickstrom
(O'Connor & Wickström, PLDI 2022) — LTL sobre traço de navegador; parado desde ago/2024.
Sucedido pelo Bombadil (Antithesis, MIT, jan/2026, 1.451 ★, 197 arquivos em 24 repos
consumidores): "I consider Bombadil the successor of Quickstrom" (Wickström); Rust +
CDP, spec em TypeScript, roda em CI e dentro do Antithesis. É propriedade temporal sobre
um trace de sessão única — o que o C1 registra como família P, fora da tabela de seis
porque não julga por comparação de execuções. A fronteira com MR, porém, é porosa:
next(x) com closure sobre o estado atual expressa "estado após ação = f(estado
antes)", e o playground do próprio autor contém filterFromAllShowsFewerItems /
filterToAllShowsMoreItems / filterChangeDoesNotCreateItems — MR-A1, MR-A2 e MR-A6
como propriedades sobre trace; um consumidor de código aberto (LibreChat) usa
next(now(…)).implies(…) em E2E de produto. Toda MR cujo seguidor é a próxima ação da
mesma sessão (MR-A1/-A2 por refinamento, MR-A6, -A7, -B1, -B2, -C7, -C10 — entre elas as
K0 da Fase 2) é expressável no Bombadil hoje, com custo de autoria menor (uma
propriedade, um gerador de ações, sem par). O que ele não faz: par em contextos separados
(MR-A4/-A8 n+1, MR-B5, -B6, MR-C1–C6), validação contra baseline, falsificação.
Classificado como P ∩ D: concorrente direto da Fase 2 e candidato a motor de relação
da camada 3 (arquitetura do C3 § 2) para MRs de sessão única (C3 § 3.3; experimento em
C4 § 12).
7.2 Diferencial. A família C tem literatura própria em web, e ela é evidência N1 para
a escolha de projeção por locator tipado (C4 § 5): WebDiff (ICSM 2010) começou com DOM + histograma de screenshot e
registrou falso positivo por "small shifts"; CrossCheck (ICST 2012) separou visual, DOM
e trace; X-PERT (ICSE 2013 / ISSTA 2014) abandonou imagem como detector primário —
"use of image-comparison techniques for detecting structure and content XBIs had a high
false positive rate" — e migrou para posição relativa + conteúdo textual, com 76% de
precisão e 95% de recall. A projeção R(·) deste estudo (locator tipado, ARIA snapshot)
é herdeira direta disso. No mercado: Meticulous (base × head, respostas gravadas, US$ 15M
em jul/2026), Diffy (primary/secondary/candidate — o protocolo de calibrar o ruído
rodando a mesma versão duas vezes é a arte prévia exata do falso positivo de MR;
licença CC BY-NC-ND, só ler), Keploy e GoReplay (replay de tráfego, família B/C). Todos
compartilham "mesma entrada, dois lados"; MT é "entradas relacionadas, um sistema".
[protocolo · A18]
Comparação cabeça a cabeça: replay diferencial só acha regressão entre versões; MT acha bug que já estava lá, em versão única — Zhou et al. (TSE 2020) o fizeram em 60 de 65 sites. É o argumento de venda mais forte do estudo e, em E2E com MR validada, ainda uma promessa com um único ponto fraco (E9c; § 6.4): o comprador de Meticulous paga custo de autoria ≈ 0 e aceita não ver o bug antigo; o estudo ainda precisa mostrar qual bug antigo D acha que C (Meticulous) e P (Bombadil) não acham, e quanto vale — é o enunciado E12.
7.3 Juízes LLM de GUI — e a regra "o veredito é código". Três trabalhos de 2025–26 (N2) mostram o que um juiz LLM faz e não faz:
| Paper | Tarefa | Entrada | Número | O que sustenta |
|---|---|---|---|---|
| MobileJudgeBench (2608.11434) | sucesso de tarefa de agente móvel, 931 trajetórias | só screenshots | 90,9% acc / 91,8 F1, acima da concordância humana (88,4%) | juiz por pixel funciona para sucesso de tarefa; modo de falha nomeado: "surface UI match … without verifying the actual answer" |
| IRA (2607.25904) | sucesso de tarefa GUI desktop | estado do ambiente via ferramentas | 86,9% | "judgments often require access to environment states … beyond the screenshots" |
| CUARewardBench / UPE (2510.18596) | recompensa para agentes de computador | screenshot único | 89,8% precisão | 30% dos erros são de compreensão visual; "Screenshots provide only partial observations" |
| AgentRewardBench (2504.08942) · Online-Mind2Web/WebJudge (2504.01382) | sucesso de trajetória web — 12 juízes, 1.302 trajetórias | trajetória + screenshots | ~85% de concordância com humano | "rule-based evaluation … tends to underreport the success rate of web agents" — o determinístico também erra, para o outro lado |
| Trident / VisionDroid (2407.03037) — o único juiz de bug, não de tarefa | bug funcional não-crash em GUI Android; 590 bugs | transições de tela | precisão 50–72%, recall 42–65%; 43 bugs reais, 31 corrigidos | Acha bug de verdade — e com precisão que nenhum CI aceita como oráculo primário |
A regra: o veredito é código. O C1 § 3 a enuncia; os números acima dizem por que é regra e não preferência. Não porque juiz LLM "não funcione" — em sucesso-de-tarefa passa de 90% só com screenshots; em detecção de bug (Trident) fica em 50–72% de precisão, que é o número que decide, porque nenhum CI o aceita como oráculo primário. O SLR de Mughal & Bilal (2026) mostra o padrão do campo: "just over half of the corpus reaches a verdict with no specification at all". O agente descobre o caso-fonte e propõe; o LLM tria depois. O que distingue a família D é a origem do predicado (relação entre execuções, não especificação inferida), e é essa origem que precisa de evidência (E9c): a linha rival já mostra 96/96 com spec inferida, e os dados E2E de relação são 0/26 (metamorph, MR não validada) e 10/10 (Zahid, faltas manuais escolhidas por MR). O verde silencioso existe dos dois lados: surface UI match no juiz, pass vácuo e
not_equalfrouxo na MR (§ 6.4). [protocolo · A20]
7.4 Agentes que inferem oráculo de spec. WebTestPilot (FSE 2026): pré/pós-condições sobre elementos simbolizados; 96/96; 4 apps com 100 bugs injetados. Temac (2025) e HxAgent (2026) atacam planejamento multiagente sem tratar do oráculo. Todos são a linha rival: melhor experiência de autoria, oráculo especificado por trás.
8 · Problemas abertos
Ordenados pelo quanto bloqueiam um sistema real, com o que já se sabe sobre cada um.
- MRIPs para fluxo gravado. Que perturbação de um fluxo E2E produz um seguidor válido? Publicados: change direction, change sequence in time (Zhou 2020) e independent view — inserir eventos independentes no fluxo (Genie, OOPSLA 2021, validado em 12 apps). O catálogo usa mais nove sem nome publicado (inverse action, duplicate, path independence, change subject, remove step, wait, encode…). Nomear e validar esses MRIPs em web é contribuição possível deste projeto.
- Projeção
R(·)como decisão registrada. Os três artefatos de MT E2E não a definem como decisão; a literatura de abstração de estado de GUI (Genie, Odin, Yandrapally 2020, Liu 2026) o faz para inferência de modelo, com seis abstrações comparadas. O que falta é transpor isso para oráculo metamórfico com registro (anchoredOn/excludes). Há doze instâncias na app de referência e sete regras (C4 § 5) — começo de resposta ao E10 (como se defineR(·)numa app real, e quanto custa?). Custo estimado: ~35–40% do esforço de um piloto. - Seleção sob orçamento onde a execução custa minutos. Priorização de MRs só em domínios de milissegundos; em MT web pelo navegador só AIM (TSE 2024), e sobre entradas. Classes K0/K1/K2 e amostragem de MR-A4/MR-A8 são a primeira resposta; diversidade de dados é o critério transplantável.
- Taxa de violação→bug e triagem. Pontos existentes: 0/26 (MR gerada, não validada), 60/65 sites (MR humana, Zhou 2020), 40,9% TP (Genie), ~60% (MT de NLP), 10/10 vs 1/10 (Zahid, faltas manuais escolhidas por MR — fraco). Nenhum com mutantes semeados antes das MRs. Não existe taxonomia de causas; existem constraints e classes de veredito. A resposta exige app própria com defeitos semeados — E9c.
- Isolamento de estado a custo aceitável. Entre mockar tudo (perde integração) e resetar backend a cada par (caro), a resposta do C4 é sidecar por execução; o teto de paralelismo e o custo são as perguntas do E11 (implantação em AWS e escalabilidade?).
- Métricas de qualidade de MR em E2E. Mutation score e cobertura são herança de teste unitário. Candidatos: poder de detecção sobre mutantes semeados × estabilidade sob não-determinismo × custo em page loads.
- Instabilidade de MRs geradas por LLM. ARMeta e metamorph relatam: equivalência
semântica inconsistente entre sessões,
not_equalfrouxo, passes vácuos. Mitigação conhecida: molde travado, saída tipada, validação por execução.
Fontes desta camada em pesquisa/bibliografia.md. Protocolo de busca das asserções de
ausência (36 consultas em 5 bases + 6 em chinês) em pesquisa/exploracao/X1-literatura.md
§ 4–5; mineração do MST-wi e leitura do metamorph em X2-mstwi-metamorph.md; instanciação
de R(·) em X5-app-referencia-projecao.md.
Registro das revisões e explorações que produziram esta camada: pesquisa/protocolo.md
§ 6; nota de leitura da tese de Zahid: pesquisa/exploracao/X6-tese-zahid.md.