Publicado em 22 de agosto de 2026

O Cérebro 3D Vivo: Renderizando uma Frota de Agentes como Anatomia
No último post eu argumentei que uma lista de escala não é um roteador — que a maneira como você visualize uma frota de agentes molda como você pensa sobre ela. Uma lista plana faz os agentes parecerem intercambiáveis. Um grafo faz eles parecerem um pipeline. Nenhum deles captura o que realmente acontece quando nove agentes estão em execução, delegando, escalonando e zumbindo silenciosamente em ritmos diferentes.
Então eu construi o que eu queria ver: um cérebro 3D orbitável onde cada agente é uma região, e as regiões pulsam com telemetria ao vivo. Este é o log de engenharia de como funciona.
O Mapeamento
Nove agentes, nove regiões. Não é uma metáfora esticada até romper — é uma correspondência estrutural solta que é útil precisamente porque está errada das maneiras corretas. O agente principal lida com planejamento e despacho de nível superior, portanto fica localizado no córtex pré-frontal dorsolateral (dlPFC) — a parte do cérebro responsável pela função executiva. Os agentes codificadores lidam com linguagem e sintaxe, portanto se localizam no giro frontal inferior esquerdo (L-IFG) e no pré-motor dorsal pré-premotor (pre-PMd). E assim por diante:
| AgenteRegião(ões)Função | ||
| principal | córtex pré-frontal dorsolateral | Controle executivo, despacho |
| codificador | giro frontal inferior esquerdo | Sintaxe, geração de código |
| codificador-leve | pré-PMd | Processamento de sintaxe mais leve |
| criativo | junção temporoparietal direita + polo frontal direito | Pensamento divergente, contexto social |
| whatsapp-convidado | sulco temporal superior direito + giro frontal inferior direito | Conversa, linguagem voltada para o convidado |
| pesquisador | hipocampo + córtex entorral | Recuperação de memória, roteamento de conhecimento |
| operações | Gânglios Basais | Laços de hábito, automação de infraestrutura |
| diagnosticista | ínsula anterior + córtex cingulado anterior | Interocepção, detecção de erros |
| diagnosticista-leve | ínsula posterior | Interocepção mais leve |
A Geometria
Cada região é um blob gerado proceduralmente. Comecei a partir de um icosaedro subdividido e apliquei movimento browniano fractal de 3 oitavas (fbm) nas posições dos vértices — um deslocamento tipo Perlin que dá a cada região uma silhueta orgânica, levemente irregular, em vez de uma esfera perfeita. A amplitude do deslocamento é impulsionada pela telemetria, de modo que uma região ocupada literalmente incha e treme mais do que uma ociosa.
Todo o cérebro fica dentro de uma casca de vidro. É aqui que o three.js r128 me pegou. Eu queria um material de vidro físico real com transmission — a propriedade que faz a luz se curvar ao atravessar uma superfície. Mas MeshPhysicalMaterial.transmission chegou na versão r144. No r128, a aproximação mais próxima é transparent: true com baixa opacidade, clearcoat para o destaque especular, e side: DoubleSide para que você veja a parte de trás da casca através da frente. A casca funciona com opacidade 0.14 e clearcoat 0.6. Não é fisicamente correto. Parece certo, e isso é o que importa mais.
O three.js é vendido localmente — sem CDN. Toda a biblioteca é servida a partir das rotas /vendor/* no painel. Isso evita a dependência de um host de terceiros e mantém o painel autocontido.
OrbitControls fornece amortecimento, uma limitação de distância de [2, 20] e uma limitação de ângulo polar para que você não vire o cérebro de cabeça para baixo e se perca. Ao clicar em uma região, a câmera faz um tween de 700 ms para enquadrá-la, todas as outras regiões diminuem para 10% de opacidade e um painel de detalhes com efeito glassmorphism desliza para dentro mostrando a cadeia do modelo, estatísticas ao vivo e um menu suspenso de sobrescrita. Clique fora e tudo volta ao estado original.
Telemetria → Movimento
O painel consulta /api/state a cada 500 ms. Esse JSON impulsiona tudo o que é visual: intensidade emissiva em cada região, amplitude do deslocamento dos vértices, faíscas de partículas nas zonas quentes e pulsos ao longo das linhas de conexão.
A decisão chave foi dar a cada região uma assinatura de movimento — uma sensação rítmica diferente para que você possa distinguir os agentes de um olhar, sem precisar ler os rótulos:
- main — oscilação gama a 40Hz. Rápido, dominante, o que seus olhos veem primeiro.
- coder — onda beta a 20Hz. Estável, mecânica.
- coder-light — 12Hz. Uma versão mais suave do ritmo do coder.
- diagnostician — surto de saliência a 60Hz usando
pow(sin(t), 8). Picos agudos, não uma onda suave. Parece a atenção se fixando em foco. - diagnostician-light — 100Hz ondulação. Muito rápido, quase um brilho.
- researcher — theta-gamma nesting: uma portadora de 3Hz modulada por um envelope gama de 40Hz. Este é o meu favorito. Parece ondas lentas profundas com oscilação rápida por cima, o que literalmente é o que o acoplamento theta-gama parece em gravações hipocampais reais.
- creative — respiração a 1.5Hz com faíscas ocasionais de partículas. Lenta, expansiva, um pouco sonhadora.
- ops — zumbido de baixa frequência a 1.2Hz. O batimento cardíaco de fundo que você sente mais do que vê.
- whatsapp-guest — 2Hz. Ritmo de conversa.
As linhas de conexão são arcos CatmullRomCurve3 entre regiões, disparados em eventos de delegação e escalonamento. Quando o principal entrega uma tarefa ao programador, um arco acende entre dlPFC e L-IFG, pulsa uma vez e some. Os arcos não são decorativos — eles são o log de roteamento renderizado como anatomia.
O apóstrofo
Aqui está o bug que levou mais tempo para ser encontrado.
O painel serve uma página de painel cujo HTML é criado server-side a partir de um modelo. Uma linha nesse modelo continha a palavra brain's — com um apóstrofo. O mecanismo de modelo a renderizou corretamente. O navegador a recebeu corretamente. Mas a string estava incorporada dentro de um bloco <script> como parte de um literal de string JavaScript, e o apóstrofo terminou a string prematuramente. O restante do bloco de script — a inicialização completa do three.js, o loop de telemetria, a configuração do OrbitControls — tornou-se um erro de sintaxe. Silencioso. Nenhum cérebro 3D. Nenhum erro na aba de rede. Apenas um canvas em branco e um erro de console enterrado sob o ruído do framework.
O conserto foi uma palavra: reformulamos a string para evitar completamente o apóstrofo. Nenhum escape, nenhuma codificação de entidade — apenas reformulamos. É o tipo de conserto que parece uma derrota até você perceber que é o conserto que vai para produção.
Esse bug também estava quebrando silenciosamente o JS do cliente do painel plano original. O cérebro 3D não o introduziu — ele apenas tornou a quebra visível, porque de repente havia um canvas que deveria ter algo nele e não tinha.
Recurso de reserva e Acessibilidade
Dois caminhos de reserva. Se o WebGL estiver indisponível — headless browsers, máquinas antigas, laptops corporativos bloqueados — a visualização 3D é substituída por uma nota .brain3d-fallback explicando o que você está perdendo e apontando para o painel plano. Nenhum canvas quebrado, nenhum spam de erro.
Se o usuário tem prefers-reduced-motion definido, o deslocamento de vértices e as faíscas de partículas são desativados. As regiões ainda se iluminam com telemetria — a intensidade emissiva está ok, o movimento é o problema — mas o cérebro não respira nem treme. Os pulsos das linhas de conexão continuam a disparar porque são informativos, não decorativos, mas são curtos e não se repetem.
O que estou levando embora
O cérebro 3D não é um painel melhor que a lista plana. É um painel diferente. A lista plana responde "o que cada agente está fazendo agora?" O cérebro responde "como a frota sente enquanto está trabalhando?" Essas são perguntas diferentes, e ambas valem a pena ser feitas.
O que mais me surpreendeu foram as assinaturas de movimento. Esperei que a geometria e a casca de vidro fossem a parte difícil. Não eram. A parte difícil era fazer nove elementos pulsarem de maneiras que parecessem distinguíveis sem serem caóticas. O aninhamento theta-gamma para o pesquisador foi o avanço — assim que tive uma região que sentiu categóricamente diferente das demais, o resto se encaixou como um espectro de "rápido e afiado" (diagnosticista) a "lento e respirante" (criativo).
O bug do apóstrofo é a lição que continuo reaprendendo: quando algo está quebrado e você não consegue encontrar a causa, procure o caractere que está desempenhando duas funções. Em um template, um apóstrofo é inglês. Em um bloco de script, é um delimitador. Quando o mesmo byte desempenha ambos os papéis, um deles perde.