Rascunho Compartilhado (Shared Scratchpad) é um smell de IA, ou seja, um sinal de problema em sistemas com LLM, do grupo Acopladores. Vários agentes escrevem no mesmo histórico e um polui o raciocínio do outro.
Uma migração de código usa três agentes: um refatora, um escreve testes e um revisa. Os três escrevem e leem o mesmo histórico de conversa (anonimizado):
[refatorador] Vou extrair a lógica de desconto para uma função pura, usando um dicionário de regras em vez de ifs aninhados...[refatorador] Pronto. Agora apply_discount recebe rules: dict.[testador] Vou escrever os testes. Seguindo a mesma abordagem, vou extrair as fixtures para um dicionário de regras...[revisor] O testador mudou a estrutura das fixtures sem necessidade.[refatorador] Concordo com o revisor, vou ajustar também os testes...
O testador passou a imitar as decisões de estilo do refatorador. O refatorador começou a mexer nos testes porque leu a crítica do revisor sobre eles. Ninguém sabe mais qual agente é responsável por qual arquivo.
O mesmo aparece quando o time cria um memory.md ou um canal em que todo agente anexa parágrafos. Cada um relê o raciocínio dos outros e trata esse texto como instrução. A “colaboração” vira contaminação.
Sinais de Rascunho Compartilhado:
Vários agentes leem e escrevem no mesmo histórico ou arquivo de anotações, em texto livre.
O raciocínio de um agente influencia o estilo ou as decisões de outro.
Agentes passam a fazer o trabalho uns dos outros.
O contexto compartilhado cresce rápido, com mensagens de todos.
Não há formato nem dono para o que cada um escreve.
flowchart TD
A(["1. Agente A"]):::llm --> S[("2. Histórico compartilhado em texto livre")]:::store
B(["1. Agente B"]):::llm --> S
C(["1. Agente C"]):::llm --> S
S --> A
S --> B
S --> C
Cada agente tem uma função diferente.
Todos escrevem e leem o mesmo texto, sem formato e sem dono.
O raciocínio de um vira instrução implícita para os outros, e as funções se misturam.
Por que acontece
É o padrão de vários frameworks. Agentes num “grupo de conversa” compartilham o histórico por default. Você sobe três papéis, o framework entrega um chat único, e parece que a equipe nasceu pronta.
Parece colaboração. Ver o trabalho dos outros parece útil, como numa equipe humana. Em time humano, a pessoa escolhe o que ler. O modelo lê tudo o que está no contexto e dá peso a tudo.
Não há contrato entre agentes. Sem formato definido, texto livre é o único meio. O refatorador “conta” o que fez em prosa; o testador “entende”. Isso é o smell vizinho Passagem em Texto Livre no meio de um grupo.
Um arquivo só parece simples.scratchpad.md que todo mundo appenda evita desenhar uma API. Em uma tarde funciona. Em uma semana o arquivo tem o raciocínio de todo mundo e ninguém consegue resumir quem decidiu o quê.
Quanto custa ignorar
Funções contaminadas. Agentes imitam ou corrigem uns aos outros fora do seu escopo. O revisor deixa de achar bug porque comprou a justificativa de quem escreveu.
Contexto inchado. Cada agente lê tudo de todos, e o custo cresce com o produto (agentes × mensagens), não com o trabalho de cada um.
Revisão sem independência. O revisor leu o raciocínio de quem fez e tende a concordar. Em code review humano, você às vezes esconde a intenção de propósito para o revisor julgar o diff. Aqui o diff chega com um ensaio defendendo cada linha.
Responsabilidade difusa. Quando algo dá errado, não dá para saber de quem foi a decisão. Os três traces contam a mesma história misturada.
Uma conta para o histórico único
Os números abaixo são ilustrativos. Suponha três agentes, cada um escreve cerca de 800 tokens por turno, e a tarefa tem quatro turnos.
Desenho
O que cada agente lê por turno
Tokens de leitura no total (aprox.)
Histórico compartilhado
Tudo o que os três já escreveram
cresce 800 × 3 a cada turno, pago três vezes
Contextos isolados, passagem estruturada
Só a instrução e um registro (files, diff_stat)
quase constante por agente
No rascunho compartilhado, o terceiro turno já manda dezenas de milhares de tokens para cada um. No isolado, o testador recebe apply_discount(rules: dict) e a lista de arquivos, uns poucos tokens, e trabalha no contexto dele.
Cada função precisa do seu próprio contexto. Os agentes passam a receber só a instrução e o material de que precisam. Destinos: Delegação a Subagentes e Isolamento de Contexto.
Os agentes precisam mesmo compartilhar informação. Troque o texto livre por registros com dono e formato. Destino: Saída Estruturada.
Na migração, o refatorador devolve algo como schema Change { files: list[string], summary: string, public_api: string }. O testador recebe só isso, num contexto vazio de raciocínio alheio, e escreve testes. O revisor recebe o diff e a rubrica, sem o ensaio do refatorador. O orquestrador é quem lê os três registros e decide o próximo passo.
Não confunda com Multi-Agente Decorativo. Lá os agentes nem deveriam existir separados. Aqui a separação pode ser certa, e o que está errado é o meio: um bloco de prosa que todos editam.
O que você ganha
Cada agente faz o seu trabalho, com o seu contexto.
Informação compartilhada em formato definido, com dono.
Revisão independente de verdade.
Custo que não cresce com o quadrado do número de agentes.
Quando ignorar
Debate com juiz e critério. Quando o objetivo é os agentes lerem o argumento uns dos outros, o compartilhamento é o ponto. Mesmo ali, o juiz decide por critério escrito, e o raciocínio de quem gerou a resposta não entra no julgamento se você quer independência.
Dois agentes com uma interface pequena. Uma troca curta de mensagens entre dois agentes pode funcionar sem estrutura. Se a terceira mensagem já mistura funções, estruture.
Um humano no meio. Se uma pessoa lê o rascunho e cola no próximo agente só o trecho que importa, o humano é o filtro. Isso não escala, e funciona em protótipo.
É esse smell?
Perguntas rápidas
O que é Rascunho Compartilhado?
Rascunho Compartilhado (Shared Scratchpad) é um smell de IA, ou seja, um sinal de problema em sistemas com LLM, do grupo Acopladores. Vários agentes escrevem no mesmo histórico e um polui o raciocínio do outro.