Surpresas conhecidas
Este arquivo registra pontos de confusão específicos deste repositório que já causaram erros de agentes.
Critérios de entrada
Adicione uma entrada apenas se todos os itens abaixo forem verdadeiros:
- É específico deste repositório (não é um conselho genérico).
- É provável que volte a acontecer com agentes futuros.
- Tem uma mitigação concreta que pode ser seguida.
Na dúvida, pergunte ao desenvolvedor antes de adicionar uma entrada.
Modelo de entrada
### [Short title]
- **Date:** YYYY-MM-DD
- **Observed by:** agent name or contributor
- **Context:** where/when it happened
- **What was surprising:** concrete unexpected behavior
- **Impact:** what went wrong or could go wrong
- **Mitigation:** exact step future agents should take
- **Status:** confirmed | superseded
Entradas
Domínios de produção de apps na Vercel podem voltar a apontar para deploys do master no Git
- Data: 2026-04-28
- Observado por: Tommaso + Codex
- Contexto: Verificação dos espelhos dos apps Seedit e 5chan no diretório de apps do Bitsocial Web.
- O que surpreendeu: Os projetos
seedite5channa Vercel tinhamgitProviderOptions.createDeployments = "enabled", então pushes para omasterno GitHub eram promovidos aos domínios de produção, mesmo que a política do repositório espere que os espelhos de produção sirvam apenas artefatos de release. - Impacto: Os selos de espelho verificado no diretório de apps podem se tornar falsos, porque os domínios de produção servem o commit de desenvolvimento mais recente em vez do ZIP de release do GitHub cujo hash de
index.htmlestá registrado emabout/src/lib/apps-data.ts. - Mitigação: Antes de adicionar ou atualizar metadados de verificação de espelho, inspecione o projeto na Vercel com
vercel api /v9/projects/<project-id>e confirmegitProviderOptions.createDeployments = "disabled". Publique o conteúdo do ZIP de release comvercel deploy --prebuilt --prode useseedit-omega.vercel.appou5chan-omega.vercel.apppara deploys de desenvolvimento. - Status: confirmado
O Portless 0.11 reaproveita estado antigo de proxy a menos que o inicializador force HTTPS
- Data: 2026-04-28
- Observado por: Tommaso + Codex
- Contexto: Migração do fluxo normal do
yarn startda antiga URL de proxyhttp://bitsocial.localhost:1355parahttps://bitsocial.localhost. - O que surpreendeu: Mesmo com o
portless@0.11.1instalado, o Portless reaproveitou o proxy HTTP existente em~/.portless/proxy.port = 1355e imprimiu a URL antiga com:1355. - Impacto: Atualizar versões de pacotes e documentação não basta; o
yarn startainda pode anunciar e usar a URL antiga quando um colaborador tem estado antigo do Portless em execução. - Mitigação: Mantenha os scripts de inicialização subindo explicitamente o proxy HTTPS do Portless na porta
443antes de registrar as rotas do app, para que o fluxo de execução migre para longe do estado persistido em1355em vez de herdá-lo. - Status: confirmado
O Portless muda a URL local canônica do app
- Data: 2026-03-18
- Observado por: Codex
- Contexto: Verificação em navegador e fluxos de smoke test
- O que surpreendeu: A URL local padrão não é a porta habitual do Vite. O repositório espera
https://bitsocial.localhostatravés do Portless, então checarlocalhost:3000oulocalhost:5173pode atingir o app errado ou coisa nenhuma. - Impacto: Verificações em navegador podem falhar ou validar o alvo errado mesmo com o servidor de desenvolvimento saudável.
- Mitigação: Use
https://bitsocial.localhostprimeiro. Só contorne isso comPORTLESS=0 corepack yarn startquando precisar explicitamente de uma porta direta do Vite. - Status: confirmado
Os hooks do Commitizen bloqueiam commits não interativos
- Data: 2026-03-18
- Observado por: Codex
- Contexto: Fluxos de commit conduzidos por agentes
- O que surpreendeu: O
git commitaciona o Commitizen através do Husky e fica esperando entrada interativa em um TTY, o que trava shells de agente não interativos. - Impacto: Agentes podem ficar parados indefinidamente durante o que deveria ser um commit comum.
- Mitigação: Use
git commit --no-verify -m "message"para commits criados por agentes. Pessoas ainda podem usarcorepack yarn commitoucorepack yarn exec cz. - Status: confirmado
O Corepack é necessário para não cair no Yarn classic
- Data: 2026-03-19
- Observado por: Codex
- Contexto: Migração do gerenciador de pacotes para o Yarn 4
- O que surpreendeu: A máquina ainda tem uma instalação global do Yarn classic no
PATH, então rodaryarnpuro pode resolver para a v1 em vez da versão fixada do Yarn 4. - Impacto: Desenvolvedores podem burlar acidentalmente a fixação de gerenciador de pacotes do repositório e obter um comportamento de instalação ou uma saída de lockfile diferentes.
- Mitigação: Use
corepack yarn ...nos comandos de shell, ou rodecorepack enableantes para que oyarnpuro resolva para a versão fixada do Yarn 4. - Status: confirmado
Nomes fixos de app do Portless colidem entre worktrees do Bitsocial Web
- Data: 2026-03-30
- Observado por: Codex
- Contexto: Rodar
yarn startem um worktree do Bitsocial Web enquanto outro worktree já servia através do Portless - O que surpreendeu: Usar o nome literal de app
bitsocialdo Portless em todos os worktrees faz a própria rota colidir, mesmo quando as portas por trás são diferentes, então o segundo processo falha porquebitsocial.localhostjá está registrado. - Impacto: Branches paralelos do Bitsocial Web podem se bloquear mutuamente, embora o Portless exista justamente para permitir que coexistam com segurança.
- Mitigação: Mantenha a inicialização do Portless por trás do
scripts/start-dev.mjs, que agora usa uma rota*.bitsocial.localhostcom escopo de branch fora do caso canônico e recorre a uma rota com escopo de branch quando o nome purobitsocial.localhostjá está ocupado. - Status: confirmado
A pré-visualização da documentação tinha a porta 3001 fixa no código
- Data: 2026-03-30
- Observado por: Codex
- Contexto: Rodar
yarn startjunto de outros repositórios e agentes locais - O que surpreendeu: O comando de desenvolvimento da raiz rodava o workspace de documentação com
docusaurus start --port 3001, então a sessão de desenvolvimento inteira falhava sempre que outro processo já ocupava a3001, mesmo com o app principal já usando o Portless. - Impacto: O
yarn startpodia derrubar o processo web logo depois de ele subir, interrompendo trabalho local não relacionado por causa de uma colisão de porta da documentação. - Mitigação: Mantenha a inicialização da documentação por trás do
yarn start:docs, que agora usa o Portless mais oscripts/start-docs.mjspara respeitar uma porta livre injetada ou recorrer à próxima porta disponível quando executado diretamente. - Status: confirmado
O hostname fixo do Portless para a documentação estava embutido no código
- Data: 2026-04-03
- Observado por: Codex
- Contexto: Rodar
yarn startem um worktree secundário do Bitsocial Web enquanto outro worktree já servia a documentação através do Portless - O que surpreendeu: O
start:docsainda registrava o hostname literaldocs.bitsocial.localhost, então oyarn startpodia falhar mesmo que o app about já soubesse evitar colisões de rota do Portless para o seu próprio hostname. - Impacto: Worktrees paralelos não conseguiam usar o comando de desenvolvimento da raiz de forma confiável, porque o processo da documentação saía primeiro e o
concurrentlyentão derrubava o resto da sessão. - Mitigação: Mantenha a inicialização da documentação por trás do
scripts/start-docs.mjs, que agora deriva o mesmo hostname do Portless com escopo de branch que o app about e injeta essa URL pública compartilhada no alvo do proxy de desenvolvimento/docs. - Status: confirmado
Shells de worktree podem não pegar a versão do Node fixada pelo repositório
- Data: 2026-04-03
- Observado por: Codex
- Contexto: Rodar
yarn startem worktrees do Git, como.claude/worktrees/*ou checkouts de worktree irmãos - O que surpreendeu: Alguns shells de worktree resolviam
nodeeyarn nodepara o Node25.2.1do Homebrew mesmo com o repositório fixando22.12.0no.nvmrc, então oyarn startpodia rodar silenciosamente os inicializadores de desenvolvimento sob o runtime errado. - Impacto: O comportamento do servidor de desenvolvimento pode divergir entre o checkout principal e os worktrees, dificultando a reprodução de bugs e violando a toolchain Node 22 esperada pelo repositório.
- Mitigação: Mantenha os inicializadores de desenvolvimento por trás do
scripts/start-dev.mjse doscripts/start-docs.mjs, que agora se reexecutam sob o binário do Node do.nvmrcquando o shell atual está na versão errada. A configuração do shell ainda deve preferirnvm use. - Status: confirmado
Restos de docs-site/ podem esconder a ausência do código-fonte da documentação após a refatoração
- Data: 2026-04-01
- Observado por: Codex
- Contexto: Limpeza do monorepo depois do merge que moveu o projeto Docusaurus de
docs-site/paradocs/ - O que surpreendeu: A pasta antiga
docs-site/pode continuar em disco com arquivos obsoletos, porém importantes, comoi18n/, mesmo depois de o repositório versionado ter migrado paradocs/. Isso faz a refatoração parecer duplicada localmente e pode esconder o fato de que as traduções versionadas da documentação não foram de fato movidas paradocs/. - Impacto: Agentes podem apagar a pasta antiga achando que é "lixo" e perder acidentalmente a única cópia local das traduções da documentação, ou continuar editando scripts que ainda apontam para o caminho morto
docs-site/. - Mitigação: Trate
docs/como o único projeto canônico de documentação. Antes de apagar quaisquer restos locais dedocs-site/, restaure código versionado comodocs/i18n/e atualize scripts e hooks para pararem de referenciardocs-site. - Status: confirmado
A pré-visualização multilíngue da documentação pode disparar o uso de RAM durante a verificação
- Data: 2026-04-01
- Observado por: Codex
- Contexto: Corrigir i18n da documentação, roteamento de locales e comportamento do Pagefind com
yarn start:docsmais Playwright - O que surpreendeu: O modo padrão de pré-visualização da documentação agora faz um build multilíngue completo mais a indexação do Pagefind antes de servir, e manter esse processo vivo junto de várias sessões do Playwright ou do Chrome pode consumir muito mais RAM do que um loop normal de desenvolvimento do Vite ou do Docusaurus em um único locale.
- Impacto: A máquina pode ficar sem memória, sessões de navegador podem travar, e execuções interrompidas podem deixar para trás servidores de documentação ou navegadores headless obsoletos consumindo memória.
- Mitigação: Para trabalho de documentação que não precisa verificar rotas de locale nem o Pagefind, prefira
DOCS_START_MODE=live yarn start:docs. Use a pré-visualização multilíngue padrão apenas quando precisar validar rotas traduzidas ou o Pagefind. Mantenha uma única sessão do Playwright, feche sessões de navegador antigas antes de abrir novas e pare o servidor de documentação depois da verificação se não precisar mais dele. - Status: confirmado
O translate-docs.py pode deixar locales da documentação pela metade ou com alvos de link quebrados
- Data: 2026-04-06
- Observado por: Codex
- Contexto: Corrigir rotas e conteúdo localizados da documentação depois de o
yarn start:docsservir páginas de detalhe em inglês ou falhar ao gerar a saída de locale - O que surpreendeu: O pipeline de tradução da documentação tinha dois modos de falha específicos deste repositório ao mesmo tempo: o
scripts/translate-docs.pysó extraía um pequeno subconjunto das mensagens deDocsHomequando as chamadastr(...)usavam formas que ele não sabia analisar, e o markdown traduzido emdocs/i18n/**podia conter slugs traduzidos por máquina ou artefatosZXQPLACEHOLDERdentro dos alvos de link. - Impacto: Homepages localizadas podem cair silenciosamente para o inglês, páginas de detalhe localizadas podem aparecer sem tradução, e o
yarn docs:buildcompleto pode falhar por links de locale quebrados mesmo com a documentação de origem válida. - Mitigação: Depois de alterar traduções da documentação ou regerar arquivos de locale, sempre rode
yarn docs:builda partir da raiz do repositório, procure porZXQPLACEHOLDERno markdown emdocs/i18n/**e confirme que os links traduzidos ainda apontam para slugs canônicos como/apps/5chan/em vez de caminhos de URL traduzidos. Se o texto doDocsHomemudou, verifique se oscripts/translate-docs.pyainda extrai todas as mensagensdocs.home.*. - Status: confirmado
As verificações sem JS do site about precisam usar a rota do Portless, não uma pré-visualização SSR isolada
- Data: 2026-04-12
- Observado por: Codex
- Contexto: Verificar o suporte sem JS do site
about/a partir de um worktree de branch - O que surpreendeu: Uma pré-visualização SSR isolada pode parecer saudável enquanto a rota real do Portless com escopo de branch ainda serve o app shell errado ou um processo mais antigo. Neste repositório, o contrato local de verdade é o hostname do Portless vindo do
yarn start, e não um servidor de pré-visualização improvisado. - Impacto: Agentes podem afirmar incorretamente que o suporte sem JS funciona, ou deixar passar regressões que só aparecem em
*.bitsocial.localhost. - Mitigação: Para verificação em navegador do
about/, sempre suba o servidor local real comyarn startouyarn start:aboute teste primeiro a URL do Portless com escopo de branch. Se um hostname do Portless parecer obsoleto, investigue e pare o processo antigo antes de testar de novo. - Status: confirmado
O chain/ estava invisível para o yarn build:verify e o yarn doctor
- Data: 2026-07-05
- Observado por: Codex
- Contexto: Verificar um diff restrito a chain/ depois que o workspace
chain/(app Vite independente parachain.bitsocial.net) foi adicionado ao monorepo. - O que surpreendeu: O
scripts/verify-build.mjssó reconhecia os prefixos de caminhoabout/,docs/estats/, então um diff restrito a chain/ imprimia "No targeted build checks matched the current diff" e não rodava build nenhum, mesmo com obuild:chainjá existindo nopackage.jsonda raiz. Separadamente, oyarn doctorestava fixo emreact-doctor about -y, então mudanças de React emchain/srcficavam sem nenhuma cobertura do React Doctor. - Impacto: Agentes que verificavam mudanças em chain precisavam saber chamar
yarn build:chaindiretamente em vez de confiar noyarn build:verify, e problemas de React emchain/src(efeitos, hooks, código morto) passavam despercebidos peloyarn doctor. - Mitigação: O
scripts/verify-build.mjsagora tem um ramo parachain/espelhando o deabout/, edoctor/doctor:verboseagora rodamreact-doctor --project about,chain -yem uma única invocação. Odoctor:scorecontinua restrito aaboutporque--scoresilenciosamente não imprime nada quando combinado com--projectpara mais de um projeto; useyarn react-doctor --project about,chain --verbose -y(ou--json) se precisar de um score do chain. - Status: confirmado
O P2P no navegador roda sobre WebSockets seguros; o pkc-js nega WebRTC e WebTransport por padrão
- Data: 2026-08-02
- Observado por: Claude
- Contexto: Escrever textos de landing page e de documentação sobre como o P2P do Bitsocial funciona no navegador
- O que surpreendeu: O
@pkcprotocol/pkc-jstraz um connection gater padrão que rejeita dials de WebRTC e WebTransport no navegador —dist/browser/helia/dial-transport-filter.jsexportaDENIED_DIAL_TRANSPORTS_BY_DEFAULT = ["webrtc", "webrtc-direct", "webtransport"]. O comentário no código-fonte dá o motivo: no navegador esses transportes acrescentam caminhos de estabelecimento de conexão longos e que falham com frequência (STUN/ICE, rotação de certhash) e deixam o carregamento lento, enquanto o WebSocket é direto e confiável. Todo peer ao vivo no painel de status P2P do blog aparece como "Secure WebSocket". O gater vive emnode_modules, então nada no repositório dá qualquer pista sobre ele. - Impacto: É muito fácil escrever texto público tecnicamente plausível, porém falso — por exemplo, creditar a chegada do WebTransport ao Baseline dos navegadores em março de 2026 como o que tornou possível o P2P do Bitsocial no navegador. Essa afirmação chegou à landing page, à tabela comparativa e a duas páginas de documentação antes de o desenvolvedor perceber. Afirmações erradas sobre arquitetura em páginas públicas são conferidas exatamente pelo público de desenvolvedores que o site quer alcançar.
- Mitigação: Nunca deduza quais transportes o Bitsocial usa a partir do que o libp2p ou a plataforma do navegador suportam em princípio. Consulte
node_modules/@pkcprotocol/pkc-js/dist/browser/helia/dial-transport-filter.jspara ver a lista de negação atual, confirme que não existe nenhum override deconnectionGateremabout/src/e leia os rótulos de transporte ao vivo no painel "P2P status" do blog antes de fazer qualquer afirmação pública. A mudança upstream que de fato destravou a publicação a partir do navegador foi a correção de seqno monotônico do gossipsub no@libp2p/gossipsub15.0.21 (maio de 2026); o pkc-js hoje entrega a 16.0.4. - Status: confirmado
Links relativos ./page.md em uma página de documentação não traduzida quebram todos os builds localizados
- Data: 2026-08-02
- Observado por: Claude
- Contexto: Adicionar uma página nova só em inglês,
docs/browser-p2p.md, que apontava para documentação existente com./peer-to-peer-protocol.mde./apps/5chan.md - O que surpreendeu: Cada locale em
docs/i18n/<lang>/docusaurus-plugin-content-docs/current/espelha a árvore da documentação. Uma página nova ausente desses espelhos ainda é renderizada em todos os locales via fallback para o inglês, mas seus links markdown relativos deixam de resolver — o Docusaurus emite/ar/browser-p2p/peer-to-peer-protocol.md/e falha o build com "Docusaurus found broken links!". O ponto decisivo é queyarn build:verifyeyarn docs:build:verifyconstroem apenas oene passam sem erro; só umyarn docs:buildcompleto revela o problema, e ele aborta no primeiro locale em ordem alfabética (ar). - Impacto: Uma mudança na documentação pode passar por todas as verificações locais rápidas e ainda assim quebrar o build multilíngue de produção. A falha também parece não ter relação com a mudança, já que o erro aponta um caminho de locale que o autor nunca tocou.
- Mitigação: Em qualquer página de documentação que não esteja espelhada em
docs/i18n/**, use links relativos à raiz (/peer-to-peer-protocol/,/apps/5chan/) em vez de links relativos.md; o Docusaurus acrescenta o prefixo do locale automaticamente. Odocs/build-your-own-client.mdé o exemplo existente. Rode umyarn docs:buildcompleto — não apenas obuild:verify— antes de entregar qualquer mudança que adicione ou aponte para uma página de documentação. - Status: confirmado
O update-translations.js precisa ser rodado a partir de about/, e execuções concorrentes perdem chaves silenciosamente
- Data: 2026-08-02
- Observado por: Claude
- Contexto: Aplicar 26 chaves i18next traduzidas em todos os 36 locales por meio da skill
translate - O que surpreendeu: Duas armadilhas distintas no mesmo script. Primeiro, o
scripts/update-translations.jsresolve seu destino comopath.join(process.cwd(), "public", "translations"), mas este repositório mantém as traduções emabout/public/translations. Rodar o comando documentado a partir da raiz do repositório falha em toda invocação com "Translations directory not found" — odocs/agent-playbooks/translations.mdmostranode scripts/update-translations.js ..., que se lê como um comando da raiz do repositório. Segundo, cada invocação é um ciclo de ler-modificar-escrever sobre todos os 36 arquivos de locale, então duas invocações rodando ao mesmo tempo se sobrescrevem e uma chave desaparece sem nenhum erro. A skilltranslateinstrui explicitamente a criar até 4 subagentes concorrentes, e cada um deles chamaria o script. - Impacto: A forma a partir da raiz do repositório falha de maneira ruidosa e desperdiça uma passada inteira. O problema de concorrência falha em silêncio: chaves somem de locales arbitrários e o diff continua parecendo plausível.
- Mitigação: Rode como
cd about && node ../scripts/update-translations.js --key <key> --map <abs-path> --write. Nunca deixe subagentes tradutores escreverem arquivos de locale de forma concorrente — faça-os emitir apenas arquivos JSON de dicionário e depois aplique cada chave em série a partir do agente pai. Depois de aplicar, verifique programaticamente que cada chave existe em todos os 35 locales não ingleses e que nenhum valor é idêntico byte a byte ao original em inglês. - Status: confirmado