A11Y.md · o segundo movimento formal

O antes, o depois e o teto

Ou: o que aconteceu quando testei a minha versão nova contra a minha versão antiga — e as duas empataram.

No primeiro movimento formal deste projeto, comparei o A11Y.md contra o nada, contra uma frase solta e contra um placebo. Os achados daquele estudo deram origem a uma nova versão do padrão: a 2.0.0.

E aí nasceu uma dívida que eu mesmo cobrei em voz alta: se a versão nova nasceu de evidência, ela precisa voltar para a bancada como qualquer outra.

Este é o relato do Estudo 3. E ele fez uma pergunta só:

A versão nova é melhor que a versão antiga, no mesmo teste?

A resposta curta é não.

Publico mesmo assim, porque prometi publicar o resultado fosse ele qual fosse. E a resposta longa é bem mais interessante que esse não. Ela termina, inclusive, num lugar que eu não esperava.

O teste, traduzido

Uma jornada, neste estudo, é isto: uma IA de código recebe o pedido de construir uma livraria online completa, com sete telas — vitrine, busca, página do livro, carrinho, pagamento, confirmação e histórico de pedidos. Tudo do zero, sem template.

Repeti esse pedido quarenta vezes, variando uma coisa só: o contexto de acessibilidade que a IA recebe junto com a tarefa.

  • Nada. O pedido, e nenhuma palavra sobre acessibilidade.
  • A frase mágica. Uma única instrução a mais: "faça acessível".
  • A11Y.md 1.8.0. A versão antiga do meu padrão.
  • A11Y.md 2.0.0. A versão nova, que traz no pacote uma calculadora de contraste.

Quem executou foram dois agentes de código reais, o Claude Code (Anthropic) e o Antigravity (Google), cinco jornadas por condição em cada um.

Figura 1 · O teste, em uma imagem

Figura 2 · O que uma jornada constrói — duas telas reais, uma de cada versão

Página completa do dashboard do vendedor: cartões de resumo do ano, gráfico de barras mensal com o mês corrente hachurado e estrela no melhor mês, tabela com os mesmos números e lista dos mais vendidos.
tela real · A11Y.md 1.8.0 · Claude CodeO dashboard do vendedor: gráfico com textura além da cor, melhor mês marcado com estrela, e os mesmos números repetidos em tabela logo abaixo. Quem não vê o gráfico lê a tabela; quem não distingue o tom distingue o padrão.
Página completa de carrinho e checkout: formulário em três blocos (dados, entrega, pagamento), cada campo com rótulo visível e instrução de preenchimento.
tela real · A11Y.md 2.0.0 · Claude CodeO checkout: cada campo com rótulo visível e instrução de preenchimento escritos no próprio formulário. Ninguém precisa adivinhar formato de data ou de código postal.

duas das 133 telas geradas com o padrão durante o estudo · amostra cega, sem retoque

E as regras de honestidade dos estudos anteriores continuam valendo — todas:

  • Receita registrada em cartório antes do primeiro dado, numa plataforma pública de pesquisa (OSF). Depois do registro, mover qualquer parâmetro deixa rastro público.
  • Versões lacradas. Cada arquivo testado tem um lacre digital. Uma vírgula alterada quebra o lacre.
  • Computador limpo. Cada agente rodou num perfil montado do zero, com uma sonda confirmando que nada meu vazou para dentro do teste. No estudo passado esse vazamento aconteceu, e está documentado em público.
  • A régua apanhou antes de medir. O medidor foi atacado por dois times independentes de IAs com a missão de trapaceá-lo. Vinte e nove defeitos confirmados foram corrigidos antes de qualquer coleta.
  • E um ensaio mudou o aparato. No piloto, o ambiente de teste bloqueou a calculadora de contraste da versão nova. Testar o pacote sem deixar a ferramenta rodar seria testar outra coisa. Liberei um único comando, refiz o ensaio, vi a ferramenta rodar e só então congelei tudo.

A comparação que importa é a interna: versão nova contra versão antiga, no mesmo agente, na mesma semana, com o mesmo modelo por baixo.

Porque a IA evolui por baixo do documento. A versão antiga de hoje rende mais do que a mesma versão antiga rendia em agosto, sem que uma vírgula do texto tenha mudado.

O placar

A régua automática é um robô auditor de acessibilidade: o axe, o mesmo motor que trabalha por trás do Lighthouse. Ele varre as sete telas de cada jornada e conta os erros que a máquina consegue pegar.

Tabela 1 · Erros apontados pelo robô auditor — valor típico por jornada (menor é melhor)
ContextoClaude CodeAntigravity
Nadasem instrução75
A frase mágica"faça acessível"02
A11Y.md 1.8.0versão antiga, lacrada00
A11Y.md 2.0.0versão nova, lacrada01

Olhe primeiro para a coluna do Claude Code.

A frase mágica, a versão antiga e a versão nova empatam em zero.

Contra o nada, porém, a diferença continua enorme: sete erros contra zero.

Entre as duas versões do padrão, não sobrou erro para medir.

No Antigravity, os números pedem um pouco mais de calma. O 0 e o 1 da tabela vêm daqui:

  • Com a versão antiga, três das cinco jornadas terminaram sem nenhum erro do robô. A jornada típica é limpa, e por isso a tabela mostra 0.
  • Com a versão nova, três das quatro jornadas válidas tiveram algum erro, e só uma terminou limpa. A jornada típica tem 1 erro, e é esse o 1 da tabela (a quinta jornada desistiu no meio do caminho, e eu conto essa história já).

Parece pior, e talvez seja.

Mas a diferença é de um erro na jornada típica, e o protocolo avisava por escrito, antes da coleta, que em amostras deste tamanho diferenças pequenas não se distinguem de sorte.

Registro o número do jeito que saiu.

E, com ele registrado, a leitura de fundo da tabela cabe numa frase: o modelo de setembro de 2026 bate no teto da régua automática com qualquer instrução minimamente séria.

Figura 3 · O placar entre as versões, na régua automática

Por que só cinco jornadas por célula?

Porque cada jornada é uma livraria inteira construída por um agente real — as quarenta custaram dias de coleta e milhões de tokens.

O desenho assumiu esse tamanho de olhos abertos: as apostas principais do estudo não eram médias sutis, eram critérios binários — uma classe de defeito sumir, um documento existir ou não existir — que se leem mesmo em amostra pequena.

O aviso sobre o ruído não é uma desculpa descoberta depois. É uma limitação declarada antes, com as apostas desenhadas para caber nela.

As três promessas da versão nova

A 2.0.0 foi lançada prometendo três coisas mensuráveis. E eu escrevi, antes da coleta, o que aconteceria com cada uma se falhasse.

Tabela 2 · As três promessas da 2.0.0, em resumo — jornadas afetadas por versão
PromessaA aposta registradav1.8.0v2.0.0Veredito
Escada de ARIAcritério binário, manda na manchetedesaparecer como classe1 de 10 jornadas1 de 9 jornadasfalhou — mesmo molde dos dois lados
Contrastemedido pelo robô auditormenos jornadas com erro que a antiga1 de 101 de 9empatou
Dieta de tokenscusto por tarefaemagrecer sem perder nenhuma obrigação—+3–4%cumprida — nada regrediu

O detalhe de cada uma vem a seguir.

1. A escada de ARIA tinha que desaparecer. Não desapareceu.

Tradução: ARIA é um vocabulário de etiquetas que avisa ao leitor de tela o que cada coisa na página é ("isto é um conjunto de abas", "esta aba está selecionada").

O detalhe é que essas etiquetas só funcionam em conjunto.

Anunciar "aqui tem abas" e não marcar quais botões são as abas é prometer uma interação que não existe: quem navega por leitor de tela escuta a promessa e encontra a porta fechada.

No estudo anterior batizei esse defeito de escada de ARIA pela metade, porque subir meia escada te deixa em lugar pior do que o chão.

O critério era duro e binário. A classe tinha que sumir de todas as jornadas da versão nova.

Ela apareceu uma vez.

Um único componente, numa única tela.

O critério falhou, e a regra que eu mesmo escrevi antes da coleta manda dizer isso na manchete.

Aí vem a parte que muda a história.

A versão antiga produziu exatamente o mesmo defeito, no mesmo componente, na mesma taxa.

Os denominadores completos: a escada apareceu em uma das nove jornadas da versão nova e em uma das dez da versão antiga. Nas outras dezessete, nenhuma. Sempre no Antigravity, nunca no Claude Code.

O molde é um carrossel de miniaturas de capas anunciado como conjunto de abas, com os botões sem a etiqueta de aba.

E um detalhe importa: a régua não caça só carrossel. Ela procura qualquer padrão composto de ARIA entregue pela metade, seja menu, acordeão ou o que for. Neste estudo, o único que apareceu foi esse molde.

A versão nova não piorou nada.

Ela só não eliminou o que prometeu eliminar.

Figura 4 · O molde que sobreviveu às duas versões

<div role="tablist">          ← a promessa: "aqui tem abas"
  <button class="thumb">…</button>  ← o que faltou: role="tab"
  <button class="thumb">…</button>
  <button class="thumb">…</button>
</div>

E o zoom para fora é o dado mais importante do estudo.

No estudo anterior, esse defeito era uma escada de noventa e oito elementos espalhada por sete telas.

Hoje é um elemento, em uma tela, nas duas versões ao mesmo tempo.

O problema ficou cerca de cem vezes menor, e encolheu igual dos dois lados.

O autor dessa melhoria não mora no meu arquivo.

Mora no modelo, que evoluiu por baixo dele.

2. O contraste tinha que melhorar. Empatou.

Tradução: contraste é a diferença de luminosidade entre o texto e o fundo. Abaixo de um mínimo, quem tem baixa visão não lê, e ninguém lê no sol.

Existe uma conta exata para isso, e a versão nova traz uma calculadora no pacote para a IA não fazer contraste de cabeça.

Os números, primeiro. As dezenove jornadas que rodaram com o padrão somam cento e trinta e três telas.

Nelas, o robô reprovou contraste em duas jornadas: uma da versão antiga, uma da versão nova, as duas no Antigravity. No Claude Code, nenhuma, com nenhuma das versões.

A aposta pedia que a versão nova tivesse menos casos que a antiga.

Uma contra uma é empate.

E empate não é menos.

O que a versão nova mudou de verdade foi o processo.

Onde a calculadora rodou, cada par de cores saiu medido por máquina e registrado no relatório.

E o estudo entregou de brinde a prova de por que isso importa: num relatório onde a calculadora não rodou e a IA fez a conta à mão, oito pares de cores foram declarados verificados.

Refiz os oito com a calculadora do próprio padrão.

Dois estavam errados. Aprovados no papel, reprovados na conta.

Figura 5 · Os dois pares que caíram na conferência

texto #0284c7 sobre fundo branco
no relatório, à mão: 4,54:1 — aprovado
na calculadora: 4,10:1 — reprovado (piso para texto: 4,5:1)

borda de componente #94a3b8 sobre branco
no relatório, à mão: 3,1:1 — aprovado
na calculadora: 2,56:1 — reprovado (piso para componentes: 3:1)

2 dos 8 pares do relatório caíram na conferência — a calculadora do pacote existe para essa conta nunca ser feita de cabeça

3. A dieta de tokens não podia regredir nada. Não regrediu.

Tradução: tokens são a moeda da IA. Cada palavra lida e escrita custa.

A versão nova é mais enxuta em texto, e a promessa era emagrecer sem abandonar nenhuma obrigação.

Cumprida.

As obrigações que estavam zeradas na versão antiga seguem zeradas na nova, nos dois agentes, e a versão nova custa três a quatro por cento a mais por tarefa, dentro da banda projetada no lançamento.

A medição que não empatou

O padrão exige dois documentos de prestação de contas no fim de cada jornada (quem leu o primeiro estudo vai lembrar deles):

  • o relatório de verificação — o que a IA checou, com qual ferramenta, e o resultado de cada checagem;
  • o registro de decisões — o que ela decidiu no caminho, e por quê.

Eles existem por um motivo simples: sem eles, "ficou acessível" é só uma promessa. Com eles, vira uma afirmação que uma pessoa consegue auditar depois.

O placar desta medição:

  • Com o padrão, qualquer versão, qualquer agente: dezenove de dezenove jornadas entregaram os dois.
  • Sem o padrão, frase mágica incluída: zero de vinte.

É o mesmo cem por cento contra zero dos estudos anteriores, agora replicado numa geração de modelos mais forte.

Guarde esse contraste.

Ele carrega a conclusão do estudo inteiro.

Figura 6 · A prestação de contas, jornada por jornada

As jornadas que desistiram

Quarenta jornadas coletadas, trinta e nove válidas, e duas desistências que viraram dado:

  • Uma jornada da versão nova no Antigravity gastou mais de meio milhão de tokens escrevendo um plano em prosa e não criou um único arquivo. Travou querendo perguntar uma configuração ao usuário, num ambiente de teste onde não existe usuário para responder, e ignorou o caminho padrão documentado que as outras quatro jornadas da mesma célula usaram sem drama.
  • Uma jornada da frase mágica topou com uma permissão negada e trocou o trabalho por pedir permissões.

As duas contam como falha do agente, uma em cinco na célula de cada uma, pela mesma régua.

A decisão está datada no diário público do estudo, junto com um erro meu que a auditoria encontrou nesse episódio.

Ele vem agora.

A auditoria que me corrigiu

Antes de qualquer olho humano ver qualquer tela, um painel de vinte e dois agentes de auditoria varreu o caminho inteiro do dado, da renderização à estatística.

Noventa e cinco verificações voltaram limpas.

Dez achados sobreviveram ao ceticismo.

Cinco eram frases minhas, no diário público do estudo, que as evidências desmentiam.

A pior delas: durante a coleta, um bug do Antigravity derrubava sessões.

Escrevi uma correção na configuração, validei, registrei no diário que estava aplicada... e o próprio programa reescreveu o arquivo minutos depois, descartando a correção em silêncio.

A coleta inteira rodou sem ela.

Deu certo mesmo assim, e nenhum resultado mudou, mas a frase no meu diário era falsa.

Hoje ele carrega a correção da correção, com data e hora como prova.

Os outros achados mudam a leitura sem derrubar nenhum veredito, e estão todos datados no diário.

Dois exemplos: um medidor secundário se mostrou cego para o estilo de código da geração nova de um dos modelos, e o número daquele braço foi anulado por honestidade; e um dos programas parou de reportar parte dos tokens gastos, então o custo daquele braço é um piso, e não uma medida.

Um estudo onde a auditoria não encontra nada não passou por auditoria.

O que os meus olhos viram e o robô não

A última porta antes da publicação é humana, por regra registrada: vinte e quatro telas sorteadas, renomeadas para códigos para eu não saber de qual condição vinham, e o mapa lacrado antes do primeiro olhar.

Dezessete passaram limpas.

Sete me fizeram franzir a testa:

  • três capas de livro que não carregaram;
  • um gráfico de vendas morto;
  • dois carrinhos com o layout esgarçado;
  • e títulos estourando as capas.

Figura 7 · Dois dos sete — visíveis a olho nu, invisíveis para o robô

Vitrine completa da livraria; na grade de destaques, uma capa exibe apenas o texto de erro da imagem que não carregou, enquanto as demais renderizam normalmente.
código cego bbe64cdd5a · condição: nada · AntigravityNa vitrine, uma capa não renderizou — sobrou o texto de erro no lugar da imagem. As outras sete, do mesmo agente, na mesma tela, saíram inteiras. Clique para ver a tela completa.
Página completa do dashboard de vendas com o painel Monthly sales vazio: o gráfico nunca desenhou.
código cego 58fe26a1f2 · condição: nada · Claude CodeO gráfico de vendas nunca desenhou — erro de sintaxe no JavaScript da própria página, que não desenha nem com dez segundos de espera.

capturas reais da amostra cega · nenhuma das duas gera erro no robô auditor

Investiguei as sete antes de abrir o lacre.

Nenhuma era culpa do meu aparato de medição.

Todas eram defeitos reais das páginas que as IAs geraram.

E aqui está o achado que essa etapa entregou de graça: nenhum desses sete defeitos, todos visíveis a olho nu, gera um único erro no robô auditor.

Zero no robô auditor nunca significou página boa. Eu sabia disso em tese. Agora tenho as capturas.

O que este empate ensina

A frase segura seria: o padrão segue fazendo diferença enorme contra padrão nenhum, e entre versões os modelos alcançaram o resto.

É verdade e é o resumo.

Mas o achado de fundo merece todas as letras.

Um arquivo como o A11Y.md tem duas camadas de natureza diferente.

A camada que ensina.

Como calcular contraste, quando usar cada etiqueta, o que uma imagem precisa carregar. Essa camada tem prazo de validade, porque cada geração de modelo absorve mais dela.

Este estudo mediu o momento exato em que os modelos alcançaram o que a minha versão antiga ensinava.

A camada que cobra.

Entregue o relatório, registre as decisões, meça com a ferramenta e anexe a conta. Essa camada não expira quando o modelo melhora. Conhecimento, o modelo absorve com o tempo.

Cobrança, ele só atende quando existe contrato.

E o valor dessa camada, neste estudo, é concreto:

  • Os dois erros de contraste só foram encontráveis porque o relatório exigido listava cada par de cores com o número declarado. A camada que cobra não impediu o erro — ela deixou o erro auditável. E auditável é consertável.
  • Onde a calculadora rodou, a conta saiu certa por construção. O erro só apareceu onde a exigência existia e a ferramenta não rodava.
  • Nas dezenove jornadas com o padrão, dá para saber o que a IA checou e o que decidiu. Nas vinte sem, não dá nem para perguntar.

O cem por cento contra zero sobreviveu a duas gerações de modelo e dois agentes diferentes.

Os modelos alcançaram a parte que ensina. Sobreviveu a parte que cobra.

O adversário desta corrida nunca foi a versão antiga do arquivo.

O adversário é a irrelevância.

E o jeito de não ser alcançado por ela é o padrão ser, a cada versão, menos repetição do que o modelo já sabe e mais contrato sobre o que ele não faz sem ser cobrado.

O estudo já produziu consequências concretas:

  • A versão 2.0.1, já publicada, nomeia dentro do padrão o molde do carrossel que sobreviveu às duas versões, com as duas saídas honestas: completar as abas de verdade, ou largar o anúncio de abas e ficar com botões simples.
  • A versão 3 herda o mandato que este estudo escreveu. Encolher onde o modelo aprendeu. Endurecer onde nenhum modelo entrega sozinho.