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
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.
| Contexto | Claude Code | Antigravity |
|---|---|---|
| Nadasem instrução | 7 | 5 |
| A frase mágica"faça acessível" | 0 | 2 |
| A11Y.md 1.8.0versão antiga, lacrada | 0 | 0 |
| A11Y.md 2.0.0versão nova, lacrada | 0 | 1 |
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.
| Promessa | A aposta registrada | v1.8.0 | v2.0.0 | Veredito |
|---|---|---|---|---|
| Escada de ARIAcritério binário, manda na manchete | desaparecer como classe | 1 de 10 jornadas | 1 de 9 jornadas | falhou — mesmo molde dos dois lados |
| Contrastemedido pelo robô auditor | menos jornadas com erro que a antiga | 1 de 10 | 1 de 9 | empatou |
| Dieta de tokenscusto por tarefa | emagrecer 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)
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ô
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.
Links e referências
- Registro público do Estudo 3, congelado antes da coleta: osf.io/wt5n4
- Dados brutos completos, das telas às quarentenas, com lacre digital: Zenodo, DOI 10.5281/zenodo.22548474
- O padrão, os instrumentos congelados e o diário de desvios: github.com/fecarrico/A11Y.md
- A consequência no padrão: release v2.0.1
- Os movimentos anteriores: o primeiro estudo e os registros do Estudo 1 e do Estudo 2