← Back to writing

O X abriu o código da moderação: guia da atualização de agosto de 2026

August 13, 2026 English version

O X abriu o código da moderação: guia da atualização de agosto de 2026

Em janeiro escrevi sobre como funciona realmente o algoritmo do X. Em maio, deitaram fora o livro de regras. O drop de 13 de agosto é o maior até hoje. O repositório passou de cerca de 216 ficheiros para 2.015, em 25 serviços, e desta vez a história não é o ranking. É tudo o que o X faz ao teu post antes e depois do ranking: visibilidade, moderação, deteção de bots, e um relatório de transparência que te mostra a tua própria ficha.

TL;DR

  • Maio foi o lançamento do ranking. Agosto é o da moderação. Os serviços novos são aqueles sobre os quais as pessoas teorizam há anos: visibility-filtering, abuse-enforcement-service, botmaker, scarecrow, e o under-the-hood, o sistema por trás do relatório que podes consultar em x.com/i/under_the_hood.
  • O proto que faltava em maio foi publicado. O ranker vê exatamente seis factos booleanos sobre o teu post. Uma flag de link não é um deles.
  • Os links não são penalizados. São medidos, ao segundo, e abrir um link tem peso positivo. O sinal positivo mais forte de todo o sistema é alguém copiar o link do teu post para o partilhar: +20.0, quatro vezes uma resposta.
  • A tabela completa de pesos do score é pública. Uma denúncia pesa mais do que 468 favorites. Uma resposta de um seguidor mútuo vale 4x uma resposta de qualquer outra pessoa.
  • A deteção de bots e spam corre num motor de regras chamado botmaker, e 20 regras de produção vêm no repo, incluindo uma que isenta explicitamente contas de alta reputação de uma verificação de spam.
  • "Shadowban" sempre foi a palavra errada. O sistema é por label, por dia, comparado com contas do teu tamanho. E agora é parcialmente inspecionável, por ti, sobre ti.

Onde tínhamos ficado

O lançamento de maio substituiu uma década de heurísticas afinadas à mão por um transformer. O Phoenix, portado do Grok-1, lê o teu histórico de engagement como uma sequência e prevê o que vais fazer com um post. O Grox, um serviço separado de compreensão de conteúdo, lê o post em si. As regras feitas à mão (a atenuação de 70% no segundo post, a penalização fixa fora da rede) passaram a parâmetros aprendidos.

Mas maio tinha dois buracos evidentes.

O primeiro era um ficheiro em falta. O código referenciava um crate de protobuf, o xai-recsys-proto, que definia o que o ranker recebe de facto sobre cada post. Esse crate não estava no repo. Quem tentasse responder a "o modelo vê X sobre o meu post?" batia numa parede exatamente onde interessava.

O segundo era tudo o que vem depois da nota. O ranking decide o que o teu post merece. Uma maquinaria separada decide o que cada espectador recebe: filtragem, labels de segurança, veredictos de spam, deteção de bots. Nada disso era público. Era a parte do sistema a que as pessoas se referiam quando diziam "shadowban", e era a parte que não se podia verificar.

Agosto tapa os dois buracos.

O proto que faltava, e o que ele resolve

Em julho, um leitor perguntou-me se escrever "link nos comentários" fazia descer o post. A teoria popular é que o X castiga links, e por isso as pessoas escondem-nos nas respostas. A minha resposta na altura teve de assentar em inferência: o proto não era público, e o código definia quatro flags booleanas seguidas de ..Default::default(), o que provava que havia mais campos sem revelar quais.

O proto está agora no repo, em phoenix/crates/serving/xai-recsys-proto/proto/recsys.proto. Eis o conjunto completo de factos booleanos que o ranker recebe sobre o teu post:

message TweetBoolFeatures {
  bool is_for_you_page = 1;
  bool is_promoted_tweet = 2;
  bool is_reply = 3;
  bool is_retweet = 4;
  bool is_quote = 5;
  bool has_media = 6;
}

Seis campos. As duas metades da minha resposta de julho aguentaram-se: havia mais campos do que os quatro visíveis no código, e não existe flag de link. O modelo não consegue ver, como facto estrutural, se o teu post contém um link.

O mesmo ficheiro confirma o achado de maio que mais surpreendeu. O TweetInfo continua sem tensor de texto. Um candidato é IDs, embeddings, contagens de engagement, estes seis booleanos e um código de língua. O modelo de ranking nunca lê as tuas palavras. A tua conta, ou seja, quem interage contigo e como, continua a ser o conteúdo.

Os links não são penalizados. São medidos.

E aqui tenho de me corrigir a mim próprio.

A 18 de julho publiquei que os meus posts com link tinham metade das impressões medianas dos sem link, e tirei a regra: "O algoritmo quer dwell. Um link é uma saída. Regra nova: a ideia no post, o link na primeira resposta".

Os dados eram reais. A interpretação era grosseira de mais. A taxonomia de ações do proto mostra o que o sistema mede de facto sobre links:

CLIENT_TWEET_OPEN_LINK
CLIENT_TWEET_EXTERNAL_LINK_LONG_DWELLED
CLIENT_EXTERNAL_LINK_SESSION_LESS_THAN_3_SEC
CLIENT_EXTERNAL_LINK_SESSION_LESS_THAN_5_SEC
CLIENT_EXTERNAL_LINK_SESSION_LESS_THAN_10_SEC
CLIENT_EXTERNAL_LINK_SESSION_MORE_THAN_30_SEC
CLIENT_EXTERNAL_LINK_SESSION_MORE_THAN_60_SEC

Não há nenhum interruptor "post com link, logo desce". Há "a sessão do link durou 3 segundos ou 60". O sistema distingue um link que leva alguém para um sítio onde vale a pena ficar de um link que devolve a pessoa de imediato.

E não é só medido. É recompensado. Nos pesos do score (já lá vamos), o open_link tem peso positivo de +0.2: metade de um click, 40% de um favorite. Melhor ainda, o share_via_copy_link, que dispara quando alguém copia o URL do teu post para o enviar noutro sítio, vale +20.0, o maior peso positivo de todo o sistema.

O retrato honesto tem duas camadas. O ranker recompensa o engagement com links. A camada de spam polícia a qualidade dos links: há uma regra de produção (chegamos ao botmaker já a seguir) que marca posts como spam quando a cadeia de redirecionamentos do URL recebe um veredicto LOW_QUALITY. Links bons são recompensados, links maus são policiados. "Os links são penalizados" sempre foi a compressão errada destes dois factos.

Portanto, regra revista: não escondas os teus links. Merece-os. Se os meus posts com link renderam menos, a leitura mais provável é que o post mediano com link, os meus incluídos, manda as pessoas para sítios onde elas não ficam.

A tabela de preços completa é pública

Os pesos do score vivem em home-mixer/params/param.rs, como valores por omissão da soma ponderada final. É a tabela que toda a gente tentou adivinhar durante anos:

SinalPeso
Partilha por cópia de link+20.0
Resposta+5.0
Quote+5.0
Partilha por DM+5.0
Seguir o autor+4.0
Partilha+2.0
Retweet+1.0
Favorite+0.5
Click+0.4
Abrir link+0.2
Expandir foto / abrir vídeo+0.05
Tempo de dwell (contínuo)+0.004 por segundo
Não parou no post−0.02
Bloquear o autor−31.2
"Não tenho interesse"−43.2
Silenciar o autor−58.8
Denúncia−234.0

Desta tabela saltam algumas coisas.

Uma denúncia anula 468 favorites. Um mute anula cerca de 118. Em janeiro escrevi que "um block pode anular dezenas de likes". Era um eufemismo. A assimetria entre irritar pessoas e agradar-lhes é mais brutal do que qualquer um imaginava.

O dwell passou a contínuo. A cabeça binária do dwell, a que perguntava "esta pessoa parou no teu post?", está pesada exatamente a 0.0. O que tem peso é o tempo de dwell contínuo, a 0.004 por segundo. Deixaram de perguntar se paraste e passaram a contar quanto tempo ficaste. Sessenta segundos de leitura a sério valem mais do que um favorite em passagem.

As relações passaram a ser um número. Existe um parâmetro chamado BidirectionalFollowReplyWeightBoost, definido em +15. Se tu e o autor se seguirem mutuamente, uma resposta vale 20 em vez de 5. Uma conversa entre mútuos é, mecanicamente, a interação comum mais valiosa da plataforma. Todos os chavões sobre "constrói relações reais" têm agora uma taxa de câmbio.

Existe um travão de clickbait, e está desligado. O ClickDwellLowFavRatePenalty despromove posts com muito click-dwell mas poucos favorites, a assinatura de conteúdo que prende a atenção sem merecer aprovação. Vem desativado por omissão. Presente, armado, desligado. A vigiar nos próximos drops.

O número de cabeças cresceu de 15 para 26 desde maio. Interações com posts citados, partilhas por DM, partilhas por cópia de link e sinais de tempo contínuo passaram todos a previsões de primeira classe.

Uma ressalva, dita com clareza: estes são os defaults do open source. Os valores de produção podem diferir através de feature switches, e o X não os publica. Mas os rácios são a melhor evidência pública que existe, e a forma da tabela (positivos minúsculos, negativos catastróficos) não é um acidente de afinação.

Botmaker: o maior diretório do repo

O maior diretório do drop de agosto não é o modelo de ranking. É o botmaker: 492 ficheiros, maior do que o próprio Phoenix, mais um diretório companheiro com regras de produção reais.

O botmaker é um motor de regras. As regras de deteção escrevem-se numa linguagem própria, guardam-se em ficheiros .bot, e são avaliadas contra eventos em tempo real. Vinte regras de produção vêm em botmaker-rules/scarecrow/bot/, e lê-las é a coisa mais próxima que já existiu de ver o sistema imunitário do X a funcionar:

  • As cadeias de redirecionamento de URLs recebem veredictos de qualidade. Posts com links LOW_QUALITY que mencionam não-seguidores são marcados SPAM_HIGH_RECALL. É o padrão clássico do spam de resposta, codificado numa regra.
  • A deteção de texto duplicado apanha contas que publicam a mesma resposta vezes sem conta.
  • Modelos de imagem classificam conteúdo NSFW e de violência antes da distribuição.
  • O X polícia o output do próprio modelo. Há uma regra específica para detetar imagens NSFW geradas pelo Grok (NSFW_Grok_Generated_Image_To_URL_Verdict). A plataforma corre moderação contra o seu próprio gerador.

E depois há o detalhe sobre o qual ainda não vi ninguém escrever. A regra dos URLs de baixa qualidade isenta explicitamente certas contas da verificação:

!IsHighPageRankUser(spammerId) &&
!IsUserGrayVerified(spammerId)

Se a tua conta tem PageRank alto (o X corre pontuação de reputação sobre o grafo de follows) ou verificação cinzenta, esta regra de spam não se aplica a ti. A rede anti-spam tem buracos recortados para contas com estatuto. Para ser preciso: esta regra recorta essas isenções, e não posso afirmar que todas o façam. Vinte regras são também a amostra que o X escolheu publicar, não o conjunto completo de produção. Mas o mecanismo está agora registado. A reputação compra a saída de pelo menos alguma da aplicação automática.

Visibility filtering: o pipeline entre a nota e o ecrã

O ranking decide o que o teu post merece. O visibility-filtering decide o que cada espectador vê de facto.

O serviço lê labels de segurança por post a partir de um armazém dedicado (com cache à frente e um caminho de recurso atrás), hidrata-as nos candidatos e aplica políticas de visibilidade antes de qualquer coisa aparecer no ecrã. É esta a maquinaria que as pessoas apontavam há anos com a palavra "shadowban": um post que pontua bem mas não aparece, ou aparece para uns espectadores e não para outros.

Dois detalhes importam.

Primeiro, a moderação não é só um portão depois da nota. É uma feature durante a nota. O TweetInfo, a mensagem que o ranker recebe, transporta um campo safetyLabelMask. O conjunto de labels viaja para dentro do Phoenix. Um post com label não é apenas filtrado a jusante, é pontuado de forma diferente a montante.

Segundo, a taxonomia de labels continua a não ser pública. O enum SafetyLabelType vive num crate de proto (xai_visibility_filtering_proto) que não está no repo. É exatamente o padrão de retenção de maio, quando o xai-recsys-proto faltava e acabou publicado três meses depois. Se o padrão se repetir, a taxonomia sai num próximo drop; toma isto como uma previsão com data. Entretanto, nomes individuais vazam pelas regras e pelo código: SpamHighRecall, NsfwHighPrecision, UserNsfwAgathaScore, TweetNsfwAdminDropRule. A forma vê-se, mesmo onde o enum não se vê.

Under the Hood: o X mostra-te a tua própria ficha

O drop de agosto inclui o serviço por trás de uma funcionalidade que a maioria ainda não reparou que existe: x.com/i/under_the_hood, um relatório pessoal de transparência que podes pedir sobre a tua própria conta, servido pelo diretório under-the-hood do repo.

O esquema dos dados (é um ficheiro thrift, under-the-hood/thrift/uth_serving.thrift) revela do que é feito o relatório:

  • Agregados mensais por conta: posts elegíveis por dia, labels de segurança ao nível do post (com contagens mantidas e removidas por dia), e labels ao nível da conta com os dias em que estiveram ativas.
  • As labels têm janela de observação. As labels de um post são acompanhadas durante um número de dias (postObservationDays, com um marcador isFinal). Uma label pode ser aplicada e mais tarde removida, e o relatório distingue as duas coisas. A moderação, neste sistema, é reversível e datada, não uma marca permanente.
  • És comparado com contas do teu tamanho. As estatísticas de referência estão divididas por escalão de seguidores (menos de 1K, 1K–10K, 10K–100K, mais de 100K) com percentis do p10 ao p99. Quando o X diz que a tua taxa de labels é normal ou elevada, "normal" significa relativo à tua coorte.
  • Existe uma categorização de brand safety no esquema, mas está marcada como experimental e não usada. Vem sempre vazia nos relatórios servidos.

Pedi o meu relatório de julho: 181 posts, zero labels de post, zero labels de conta. O que é também a limitação honesta desta secção. Um relatório limpo significa que as partes interessantes do esquema me são invisíveis. Se o teu relatório tiver labels, esse JSON tem agora um esquema público para o descodificar, e regras públicas a montante que explicam como as labels são aplicadas.

Isto é também o enterro discreto de uma palavra. "Shadowban" implicava um interruptor secreto único. O que o código mostra é contabilidade por label, por dia, relativa à coorte, parcialmente reversível, mais um relatório onde podes verificar a tua. A maioria das queixas sobre alcance passou a ter resposta testável, e para a maioria das contas a resposta vai ser a que foi para a minha: zero labels. O teu problema de alcance é de fit com a audiência, não de moderação.

O que isto significa para quem quer crescer

Deixa de esconder links. Passa a merecê-los. O remédio caseiro de julho, o link na primeira resposta, resolve um problema que o ranker não tem. O que ele mede é se o link valeu a pena abrir. Manda as pessoas para coisas que as segurem um minuto, e o link é um ativo: aberto (+0.2), com dwell longo (medido), e talvez copiado e partilhado (+20, o jackpot).

Otimiza para a partilha, não para o like. Um favorite vale +0.5. Alguém copiar o teu link para o mandar para um grupo vale +20. O post mais valioso é o que as pessoas reencaminham, não o que aplaudem. Escreve coisas que valham reencaminhar.

Fala com os teus mútuos. Uma resposta de um seguidor mútuo vale 20. As conversas dentro da tua rede são, pelos números, o sinal comum mais forte que consegues gerar.

A assimetria negativa foi quantificada. Respeita-a. Uma denúncia desfaz 468 favorites. Um mute desfaz 118. O conselho de janeiro mantém-se, com números mais duros: não irritar as pessoas conta mais do que agradar-lhes.

A media continua a contar estruturalmente. O has_media é um de apenas seis factos booleanos que o ranker vê sobre o teu post. Mereceu o lugar numa struct de seis campos, e isso diz alguma coisa.

Verifica a tua ficha todos os meses. Pede o under_the_hood. Se vier limpo, e provavelmente vem, eliminaste a moderação como explicação. Podes parar de culpar o shadowban e começar a corrigir o conteúdo.

O quadro maior

Cada lançamento moveu a fronteira do que é verificável. Janeiro abriu as regras. Maio abriu o modelo. Agosto abriu a moderação: a camada sobre a qual mais se teorizou e menos se podia verificar, aquela onde todas as queixas de alcance iam morar porque ninguém conseguia provar nada em nenhum sentido.

O que continua retido: os valores de produção dos pesos, a taxonomia completa de labels, o conjunto completo de regras, e os dados de treino do Grox. A taxonomia, se o padrão de maio se repetir, está a um lançamento de distância.

O repo atualiza com cadência. Volto cá quando sair o próximo.

Em resumo

  • A camada de moderação deixou de ser uma caixa negra. É a maior parte do repo público: regras, labels, isenções e tudo.
  • Não existe penalização de link. Existe medição de link, e uma recompensa de +20 para o link que as pessoas partilham. Escreve em conformidade.
  • Já podes ler a tua própria ficha de moderação. Para a maioria das contas vai estar vazia, o que é uma resposta em si: o algoritmo não te está a esconder. A audiência é que está a escolher.