Free

Fazer o Claude escrever threads multilíngues no Twitter sem estourar o limite

Threads multilíngues não são problema de tradução: diga 'write', não 'translate', e filtre os rascunhos com um script .length local.


Hoje publiquei 5 artigos. Cada um vem com thread de tweets em 6 idiomas (en / zh / ja / ko / ar / id), 4 tweets por idioma — 120 tweets no total.

4 dos 5 precisaram de corte no thread em chinês. Os números brutos (o script imprime no formato chars/limit):

zh[1]=160/140 OVER
zh[2]=164/140 OVER
zh[3]=152/140 OVER
...
id[3]=286/280 OVER
zh[2]=163/140 OVER
zh[3]=148/140 OVER
zh[2]=152/140 OVER

Sempre o mesmo padrão: escrevo primeiro os 4 tweets em inglês (cada um com 230–260 caracteres, próximo do teto de 280) e peço ao Claude "gerar a versão em chinês a partir desses quatro". A versão em chinês passa dos 140 quase sempre.

Não é bug, é palavra errada. No momento em que você diz "translate", o Claude começa a ir linha a linha — mas thread multilíngue não é problema de tradução. Cada idioma precisa ser escrito do zero contra seu próprio orçamento de caracteres. Este post mostra como fazer o primeiro rascunho do Claude já sair perto do limite, sem gastar 3–5 rodadas cortando.


Causa raiz: X pesa CJK em dobro × Claude vai para tradução literal por padrão

Como o X conta caracteres

O limite do X não é "número de caracteres", é weighted characters:
- Letras latinas, dígitos, pontuação: 1 weight por caractere
- CJK (chinês/japonês/coreano), alguns emojis: 2 weight por caractere
- Teto total por tweet: 280 weight

Efeito prático:
- Tweet em inglês: 280 caracteres
- Tweet puro em chinês: 140 caracteres (140 × 2 = 280)
- Misto: cada caractere vale 1 ou 2

Então "traduzir um tweet inglês de 260 caracteres para o chinês" não te dá 260 caracteres em chinês — a versão em chinês tem só ~130 caracteres de espaço real. Toda a pontuação, aspas e backticks do original em inglês continuam ocupando espaço, e cada caractere chinês conta em dobro. Traduzir literal praticamente garante o estouro.

A palavra "translate" liga o modo literal do Claude

Quando o Claude vê "translate these 4 EN tweets to ZH", a primeira jogada dele é preservar a estrutura da frase em inglês e só trocar as palavras:

  • EN: "Production 400/500 isn't like local. User's already staring at a blank screen after hitting Pay."
  • ZH literal do Claude: "生产环境的 400/500 和本地并不相同。用户已经点击了『付款』并看着一个空白屏幕。" (40 caracteres chineses)

O significado está certo, mas:
- Preservou "并不相同" (um caractere a mais que "不同")
- Preservou "已经点击了" ("刚点完" é mais curto)
- Preservou "并看着一个空白屏幕" ("看着空白屏" é mais curto)

Cada redundância preservada come caracteres. Acumulado em 4 tweets, 20–40 caracteres a mais sai fácil, e já passou do limite.

O prompt que funciona: "reescrever", não "traduzir"

Compare as duas formulações:

O que não funciona:

"Translate these 4 English tweets to Chinese, Japanese, Korean, Arabic, Indonesian."

O que funciona:

"For each of these 4 points, write a thread in ZH / JA / KO / AR / ID. Each language gets a fresh pass — same argument, adjusted for that language's tweet budget.

  • ZH: ≤ 140 chars per tweet, hook-first, cut detail if needed
  • other languages: ≤ 280 chars
  • use each language's natural phrasing, don't preserve EN sentence structure
  • each tweet must be self-contained but add 🧵 only on tweet 1"

As diferenças:

  1. "write" substitui "translate" — aciona o modo composição do Claude, não o modo tradução.
  2. "fresh pass" / "same argument" — dá permissão para Claude reorganizar as frases.
  3. "don't preserve EN sentence structure" — bloqueia o comportamento padrão de frente.
  4. "cut detail if needed" — autoriza largar conteúdo para caber (sem isso Claude preserva todo fato e estoura).
  5. Orçamento explícito por idioma — "≤ 140 chars" é 100× mais eficaz que "short".

Sanity check local: Ruby + .length

Não conte no olho. Escreva um script que roda em todo rascunho:

tweets.each do |loc, list|
  list.each_with_index do |t, i|
    len = t.length
    limit = loc == "zh" ? 140 : 280
    status = len > limit ? "OVER" : "ok"
    puts "#{loc}[#{i}]=#{len}/#{limit} #{status}"
  end
end

O String#length do Ruby retorna codepoints Unicode — cada caractere CJK conta como 1. O X pesa CJK em 2, mas o limite de um tweet em chinês é 140 codepoints (porque 140 × 2 = 280 weighted), então .length se alinha diretamente com o teto do X. Os casos-limite:

  • Contagem de codepoints de emojis (🧵 é 1 codepoint, mas alguns emojis são sequências de vários)
  • Caracteres de largura zero (ZWJ, etc.)

Para a vasta maioria dos tweets CJK, o .length do Ruby fica dentro de ±1 da contagem do X. Usar isso como portão local vence publicar de teste no X por 100×.

Armadilhas de emoji e backtick

Quando tweets em chinês precisam de corte, essas duas categorias caem primeiro:

Backticks

Referências de código tipo `kamal exec` comem 1 caractere por backtick em tweet chinês — 2 caracteres por referência, zero valor semântico. Correções:

  • Use dois-pontos: "命令 kamal exec" bate "`kamal exec`"
  • Se precisa mesmo manter backticks, só no identificador-chave, nunca na linha de shell inteira

Emojis

🧵 só no tweet 1. Outros emojis em tweets em chinês — pense duas vezes. Cada emoji custa basicamente 2 caracteres (1 codepoint + em alguns casos modificadores ZWJ).

Pontuação fullwidth vs. halfwidth

  • Pontuação CJK (「」、,。——): 2 weight cada
  • Pontuação ASCII ("",-): 1 weight cada
  • Quando um tweet em chinês mistura aspas: use aspas halfwidth ('X') — economiza 2 caracteres por par em comparação com fullwidth (「X」)

Quatro padrões do Claude para interceptar

Ao gerar threads multilíngues, bloqueie estes quatro:

1. Tradução literal preservando estrutura EN

Sintoma: frases em chinês com expressões como "并不相同", "已经点击了", "一个空白屏幕" — calcos óbvios do inglês.

Bloqueio: escreva "don't preserve EN sentence structure" / "use natural ZH phrasing" direto no prompt.

2. Sem verificação de tamanho por iniciativa

Sintoma: Claude termina e fala "done", a saída passa do limite, e ele não nota.

Bloqueio: peça ao Claude para contar o tamanho de cada tweet ("count each tweet's char length and flag any over the limit"), ou coloque script local como portão. Eu prefiro o script — Ruby é mais preciso que Claude contando.

3. Ignorar weight de aspas e emojis

Sintoma: quando Claude conta, esquece o weight extra de emojis e aspas fullwidth.

Bloqueio: não pergunte "passou do limite?" — rode .length local e peça para cortar com base nos números.

4. Inconsistência na posição do 🧵

Sintoma: às vezes todo tweet ganha 🧵, às vezes só o 1, às vezes pousa no 4/4.

Bloqueio: fixe no prompt — "🧵 only on tweet 1". Claude não conhece por padrão as convenções visuais de thread.

Checklist

Seis regras para tirar um primeiro rascunho multilíngue colado no limite:

  1. Diga "write", não "translate". Traduzir aciona literal = estrutura EN preservada = estouro.
  2. Orçamento explícito por idioma. "≤ 140 chars" supera "short" em 100×.
  3. Permissão para cortar conteúdo. "cut detail if needed" avisa ao Claude que pode perder fatos para caber.
  4. Ruby .length local como portão. Mais preciso que Claude contando, mais rápido que testar no X.
  5. Em chinês, cortar backticks e emojis primeiro. Cada backtick come 1 caractere, cada emoji come 2.
  6. Fixe a posição do 🧵 no prompt. Claude não sabe por padrão as convenções de thread.

O insight real: Claude consegue escrever threads multilíngues certinho — mas a reação padrão dele é "traduzir". Seu trabalho é girar para "compor independentemente por idioma" via prompt. Com o portão .length, o thread chinês do último artigo de hoje saiu 140/140 no primeiro rascunho. Sem corte.